import { useRef, useState } from "preact/hooks"; import { closeActiveDialog } from "../../services/dialog.js"; import { t } from "../../services/i18n.js"; import FormCheckbox from "../react/FormCheckbox.js"; import Modal from "../react/Modal.js"; import ReactBasicWidget from "../react/ReactBasicWidget.js"; import { useEffect } from "react"; import type { DeleteNotesPreview } from "@triliumnext/commons"; import server from "../../services/server.js"; import froca from "../../services/froca.js"; import FNote from "../../entities/fnote.js"; import link from "../../services/link.js"; import Button from "../react/Button.jsx"; import Alert from "../react/Alert.jsx"; import useTriliumEvent from "../react/hooks.jsx"; export interface ResolveOptions { proceed: boolean; deleteAllClones?: boolean; eraseNotes?: boolean; } interface ShowDeleteNotesDialogOpts { branchIdsToDelete?: string[]; callback?: (opts: ResolveOptions) => void; forceDeleteAllClones?: boolean; } interface BrokenRelationData { note: string; relation: string; source: string; } function DeleteNotesDialogComponent() { const [ opts, setOpts ] = useState({}); const [ deleteAllClones, setDeleteAllClones ] = useState(false); const [ eraseNotes, setEraseNotes ] = useState(!!opts.forceDeleteAllClones); const [ brokenRelations, setBrokenRelations ] = useState([]); const [ noteIdsToBeDeleted, setNoteIdsToBeDeleted ] = useState([]); const [ shown, setShown ] = useState(false); const okButtonRef = useRef(null); useTriliumEvent("showDeleteNotesDialog", (opts) => { setOpts(opts); setShown(true); }) useEffect(() => { const { branchIdsToDelete, forceDeleteAllClones } = opts; if (!branchIdsToDelete || branchIdsToDelete.length === 0) { return; } server.post("delete-notes-preview", { branchIdsToDelete, deleteAllClones: forceDeleteAllClones || deleteAllClones }).then(response => { setBrokenRelations(response.brokenRelations); setNoteIdsToBeDeleted(response.noteIdsToBeDeleted); }); }, [ opts ]); return ( okButtonRef.current?.focus()} onHidden={() => { opts.callback?.({ proceed: false }) setShown(false); }} footer={<>