feat(print_preview): display dialog first and preview second

This commit is contained in:
Elian Doran
2026-04-26 09:44:29 +03:00
parent 8c8e797dda
commit ca29a11b09
2 changed files with 4 additions and 38 deletions
+2 -22
View File
@@ -147,19 +147,11 @@ export default function NoteDetail() {
toast.closePersistent("printing");
handlePrintReport(printReport);
};
const onPreviewResult = (_e: any, { buffer, notePath }: { buffer: Uint8Array; notePath: string }) => {
toast.closePersistent("printing");
if (note) {
appContext.triggerCommand("showPrintPreview", { pdfBuffer: buffer, note, notePath });
}
};
ipcRenderer.on("print-progress", onPrintProgress);
ipcRenderer.on("print-done", onPrintDone);
ipcRenderer.on("export-as-pdf-preview-result", onPreviewResult);
return () => {
ipcRenderer.off("print-progress", onPrintProgress);
ipcRenderer.off("print-done", onPrintDone);
ipcRenderer.off("export-as-pdf-preview-result", onPreviewResult);
};
}, [note]);
@@ -185,20 +177,8 @@ export default function NoteDetail() {
// PDF printing is handled by the PDF viewer's own print mechanism.
if (note.type === "file" && note.mime === "application/pdf") return;
if (isElectron()) {
// On Electron, open the print preview dialog. Actual print/PDF actions
// are triggered from the dialog's footer buttons.
showToast("exporting_pdf");
const { ipcRenderer } = dynamicRequire("electron");
ipcRenderer.send("export-as-pdf-preview", {
title: note.title,
notePath: noteContext.notePath,
pageSize: note.getAttributeValue("label", "printPageSize") ?? "Letter",
landscape: note.hasAttribute("label", "printLandscape"),
scale: parseFloat(note.getAttributeValue("label", "printScale") ?? "1") || 1,
margins: note.getAttributeValue("label", "printMargins") ?? "default",
pageRanges: ""
});
if (isElectron() && noteContext.notePath) {
appContext.triggerCommand("showPrintPreview", { note, notePath: noteContext.notePath });
return;
}
@@ -75,7 +75,6 @@ function isValidPageRanges(value: string): boolean {
}
export interface PrintPreviewData {
pdfBuffer: Uint8Array;
note: FNote;
notePath: string;
}
@@ -96,7 +95,7 @@ export default function PrintPreviewDialog() {
const bufferRef = useRef<Uint8Array>();
const notePathRef = useRef("");
const pdfUrlRef = useRef<string>();
const generationRef = useRef(0);
const [landscape, setLandscape] = useNoteLabelBoolean(note, "printLandscape");
const [pageSize, setPageSize] = useNoteLabelWithDefault(note, "printPageSize", "Letter");
@@ -114,8 +113,6 @@ export default function PrintPreviewDialog() {
const [printers, setPrinters] = useState<PrinterInfo[]>([]);
const [destination, setDestination] = useState<string>(DESTINATION_PDF);
const skipNextRegenRef = useRef(false);
useEffect(() => {
if (!shown || !isElectron()) return;
const { ipcRenderer } = dynamicRequire("electron");
@@ -141,15 +138,11 @@ export default function PrintPreviewDialog() {
}, []);
useTriliumEvent("showPrintPreview", (data: PrintPreviewData) => {
// When the dialog is already open, it manages its own regeneration via
// a persistent IPC listener. Ignore duplicate events from NoteDetail's
// listener to avoid overwriting the preview with stale data.
if (shown) return;
skipNextRegenRef.current = true;
setNote(data.note);
notePathRef.current = data.notePath;
updatePreview(data.pdfBuffer);
setLoading(true);
setShown(true);
});
@@ -161,8 +154,6 @@ export default function PrintPreviewDialog() {
const { ipcRenderer } = dynamicRequire("electron");
const onResult = (_e: any, { buffer, error }: { buffer?: Uint8Array; error?: string }) => {
if (generationRef.current <= 0) return;
toast.closePersistent("printing");
if (error) {
setLoading(false);
@@ -192,7 +183,6 @@ export default function PrintPreviewDialog() {
const regeneratePreview = useCallback((opts: PreviewOpts) => {
if (!isElectron()) return;
++generationRef.current;
setLoading(true);
const { ipcRenderer } = dynamicRequire("electron");
ipcRenderer.send("export-as-pdf-preview", {
@@ -207,10 +197,6 @@ export default function PrintPreviewDialog() {
useEffect(() => {
if (!shown || !pageRangesValid) return;
if (skipNextRegenRef.current) {
skipNextRegenRef.current = false;
return;
}
const handle = setTimeout(() => {
regeneratePreview({ landscape, pageSize, scale, margins: marginsStr, pageRanges: pageRanges.trim() });
}, 400);