chore(desktop): start implementing destkop preview

This commit is contained in:
Elian Doran
2026-02-08 16:33:54 +02:00
parent 0619bcf35a
commit d4ae10dd82
4 changed files with 41 additions and 4 deletions

View File

@@ -13,7 +13,7 @@ import type LoadResults from "../services/load_results.js";
import type { CreateNoteOpts } from "../services/note_create.js";
import options from "../services/options.js";
import toast from "../services/toast.js";
import utils, { hasTouchBar } from "../services/utils.js";
import utils, { dynamicRequire, hasTouchBar } from "../services/utils.js";
import { ReactWrappedWidget } from "../widgets/basic_widget.js";
import type RootContainer from "../widgets/containers/root_container.js";
import { AddLinkOpts } from "../widgets/dialogs/add_link.jsx";
@@ -641,6 +641,10 @@ export class AppContext extends Component {
this.child(rootWidget as Component);
this.triggerEvent("initialRenderComplete", {});
if (utils.isElectron()) {
const { ipcRenderer } = dynamicRequire('electron');
ipcRenderer.send("initial-render-complete");
}
}
triggerEvent<K extends EventNames>(name: K, data: EventData<K>) {

View File

@@ -5,7 +5,7 @@ import { useEffect, useRef, useState } from "preact/hooks";
import { t } from "../../services/i18n";
import { cancelUploadWithPreview, executeUploadWithPreview } from "../../services/import";
import { boolToString } from "../../services/utils";
import { boolToString, dynamicRequire, isElectron } from "../../services/utils";
import { Badge } from "../react/Badge";
import Button from "../react/Button";
import { Card } from "../react/Card";
@@ -16,7 +16,7 @@ import Modal from "../react/Modal";
import NoteAutocomplete from "../react/NoteAutocomplete";
export interface ImportPreviewData {
parentNoteId: string;
parentNoteId?: string;
previews: ImportPreviewResponse[];
}
@@ -105,6 +105,21 @@ export default function ImportPreviewDialog() {
hasSubmittedRef.current = false;
});
useEffect(() => {
if (!isElectron()) return;
const { ipcRenderer } = dynamicRequire("electron");
const onShow = (_event: any, data: ImportPreviewData) => {
setData(data);
setShown(true);
setImportButtonTimeout(IMPORT_BUTTON_TIMEOUT);
hasSubmittedRef.current = false;
};
ipcRenderer.on("show-import-preview-dialog", onShow);
return () => {
ipcRenderer.removeListener("show-import-preview-dialog", onShow);
}
}, []);
return (
<Modal
className="import-preview-dialog"

View File

@@ -12,6 +12,8 @@ import { PRODUCT_NAME } from "./app-info";
import port from "@triliumnext/server/src/services/port.js";
import { join } from "path";
import { deferred, LOCALES } from "../../../packages/commons/src";
import previewZipForImport from "@triliumnext/server/src/services/import/zip_preview";
import { ipcMain } from "electron/main";
async function main() {
const userDataPath = getUserData();
@@ -115,7 +117,8 @@ async function onReady() {
if (sqlInit.isDbInitialized()) {
await sqlInit.dbReady;
await windowService.createMainWindow(app);
const mainWindow = await windowService.createMainWindow(app);
handleImportArguments(process.argv, mainWindow);
if (process.platform === "darwin") {
app.on("activate", async () => {
@@ -133,6 +136,20 @@ async function onReady() {
await windowService.registerGlobalShortcuts();
}
async function handleImportArguments(args: string[], window: BrowserWindow) {
const filesToImport = args.filter(arg => !arg.startsWith("-") && arg.endsWith(".trilium"));
if (filesToImport.length === 0) return;
const previews = await Promise.all(filesToImport.map(file => previewZipForImport(file)));
console.log("Sendimg import preview data to window", window);
ipcMain.on("initial-render-complete", () => {
console.log("READYYY!!!");
window.webContents.send("show-import-preview-dialog", {
previews
});
});
}
function getElectronLocale() {
const uiLocale = options.getOptionOrNull("locale");
const formattingLocale = options.getOptionOrNull("formattingLocale");

View File

@@ -221,6 +221,7 @@ async function createMainWindow(app: App) {
configureWebContents(mainWindow.webContents, spellcheckEnabled);
trackWindowFocus(mainWindow);
return mainWindow;
}
function getWindowExtraOpts() {