import _ from "lodash" import $ from "jquery" import ReactDOM from "react-dom" import { ReactElement } from "react" /** Prints a React element. Requires font-awesome for spinner and jquery */ export default class ReactElementPrinter { /** * delay: ms to wait before printing to allow elements to render * text: text to display next to spinner */ print(element: ReactElement, options: { delay?: number; text?: string }): Promise { return new Promise((resolve, reject) => { // Add special CSS printing rules const extraCss = $(`\ \ `) $("body").append(extraCss) // Add special region to body $("body").append('
') // Add warning that printing $("body").append( `\
\ ` + (options.text || "") + `\
\ ` ) // Render element into special region ReactDOM.render(element, $("#react_element_printer").get(0), () => { // Wait for element to render _.delay(() => { // Call print window.print() // Unmount component ReactDOM.unmountComponentAtNode($("#react_element_printer").get(0)) // Remove rest of nodes $("#react_element_printer").remove() $("#react_element_printer_css").remove() $("#react_element_printer_splash").remove() resolve() }, options.delay || 1000) }) }) } }