26 lines
789 B
TypeScript
26 lines
789 B
TypeScript
import { useEffect, useRef } from "react";
|
|
|
|
export type QOfficeCommand = "open" | "save" | "export-pdf" | "print";
|
|
export type QOfficeCommandHandlers = Partial<Record<QOfficeCommand, () => void | Promise<void>>>;
|
|
|
|
export function useQOfficeCommand(handlers: QOfficeCommandHandlers) {
|
|
const handlersRef = useRef(handlers);
|
|
|
|
useEffect(() => {
|
|
handlersRef.current = handlers;
|
|
}, [handlers]);
|
|
|
|
useEffect(() => {
|
|
function onCommand(event: WindowEventMap["qoffice-command"]) {
|
|
const command = event.detail.command;
|
|
const handler = handlersRef.current[command];
|
|
if (handler) {
|
|
void handler();
|
|
}
|
|
}
|
|
|
|
window.addEventListener("qoffice-command", onCommand);
|
|
return () => window.removeEventListener("qoffice-command", onCommand);
|
|
}, []);
|
|
}
|