From edd18b53d067647d1b92b9cd1ebf9252965865a9 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 6 Aug 2025 18:10:02 +0300 Subject: [PATCH] refactor(react/dialogs): solve some type errors --- apps/client/src/widgets/dialogs/revisions.tsx | 26 +++++++++++-------- apps/server/src/becca/entities/brevision.ts | 4 +-- apps/server/src/routes/api/revisions.ts | 4 +-- packages/commons/src/lib/server_api.ts | 17 ++++++++++++ 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/apps/client/src/widgets/dialogs/revisions.tsx b/apps/client/src/widgets/dialogs/revisions.tsx index d66a04fda..a906743ad 100644 --- a/apps/client/src/widgets/dialogs/revisions.tsx +++ b/apps/client/src/widgets/dialogs/revisions.tsx @@ -1,4 +1,4 @@ -import type { FullRevision, RevisionItem } from "@triliumnext/commons"; +import type { RevisionPojo, RevisionItem } from "@triliumnext/commons"; import appContext, { EventData } from "../../components/app_context"; import FNote from "../../entities/fnote"; import dialog, { closeActiveDialog, openDialog } from "../../services/dialog"; @@ -91,20 +91,20 @@ function RevisionsList({ revisions, onSelect }: { revisions: RevisionItem[], onS title={t("revisions.revision_last_edited", { date: item.dateLastEdited })} value={item.revisionId} > - {item.dateLastEdited.substr(0, 16)} ({utils.formatSize(item.contentLength)}) + {item.dateLastEdited && item.dateLastEdited.substr(0, 16)} ({item.contentLength && utils.formatSize(item.contentLength)}) )} ); } function RevisionPreview({ revisionItem }: { revisionItem?: RevisionItem}) { - const [ fullRevision, setFullRevision ] = useState(); + const [ fullRevision, setFullRevision ] = useState(); const [ needsRefresh, setNeedsRefresh ] = useState(); useEffect(() => { setNeedsRefresh(false); if (revisionItem) { - server.get(`revisions/${revisionItem.revisionId}`).then(setFullRevision); + server.get(`revisions/${revisionItem.revisionId}`).then(setFullRevision); } else { setFullRevision(undefined); } @@ -143,7 +143,11 @@ function RevisionPreview({ revisionItem }: { revisionItem?: RevisionItem}) { primary icon="bx bx-download" text={t("revisions.download_button")} - onClick={() => open.downloadRevision(revisionItem.noteId, revisionItem.revisionId)} /> + onClick={() => { + if (revisionItem.revisionId) { + open.downloadRevision(revisionItem.noteId, revisionItem.revisionId)} + } + }/> } )} @@ -167,12 +171,12 @@ const CODE_STYLE: CSSProperties = { whiteSpace: "pre-wrap" }; -function RevisionContent({ revisionItem, fullRevision }: { revisionItem?: RevisionItem, fullRevision?: FullRevision }) { - if (!revisionItem || !fullRevision) { +function RevisionContent({ revisionItem, fullRevision }: { revisionItem?: RevisionItem, fullRevision?: RevisionPojo }) { + const content = fullRevision?.content; + if (!revisionItem || !content) { return <>; } - const content = fullRevision.content; switch (revisionItem.type) { case "text": { @@ -182,7 +186,7 @@ function RevisionContent({ revisionItem, fullRevision }: { revisionItem?: Revisi renderMathInElement(contentRef.current, { trust: true }); } }); - return
+ return
} case "code": return
{content}
; @@ -190,7 +194,7 @@ function RevisionContent({ revisionItem, fullRevision }: { revisionItem?: Revisi switch (revisionItem.mime) { case "image/svg+xml": { //Base64 of other format images may be embedded in svg - const encodedSVG = encodeURIComponent(content); + const encodedSVG = encodeURIComponent(content as string); return ; @@ -211,7 +215,7 @@ function RevisionContent({ revisionItem, fullRevision }: { revisionItem?: Revisi {t("revisions.file_size")} - {utils.formatSize(revisionItem.contentLength)} + {revisionItem.contentLength && utils.formatSize(revisionItem.contentLength)} {fullRevision.content && diff --git a/apps/server/src/becca/entities/brevision.ts b/apps/server/src/becca/entities/brevision.ts index 83767a3b2..88f647db2 100644 --- a/apps/server/src/becca/entities/brevision.ts +++ b/apps/server/src/becca/entities/brevision.ts @@ -7,7 +7,7 @@ import becca from "../becca.js"; import AbstractBeccaEntity from "./abstract_becca_entity.js"; import sql from "../../services/sql.js"; import BAttachment from "./battachment.js"; -import type { AttachmentRow, NoteType, RevisionRow } from "@triliumnext/commons"; +import type { AttachmentRow, NoteType, RevisionPojo, RevisionRow } from "@triliumnext/commons"; import eraseService from "../../services/erase.js"; interface ContentOpts { @@ -201,7 +201,7 @@ class BRevision extends AbstractBeccaEntity { utcDateModified: this.utcDateModified, content: this.content, // used when retrieving full note revision to frontend contentLength: this.contentLength - }; + } satisfies RevisionPojo; } override getPojoToSave() { diff --git a/apps/server/src/routes/api/revisions.ts b/apps/server/src/routes/api/revisions.ts index f1edb3f13..cdcabe6d2 100644 --- a/apps/server/src/routes/api/revisions.ts +++ b/apps/server/src/routes/api/revisions.ts @@ -12,7 +12,7 @@ import type { Request, Response } from "express"; import type BRevision from "../../becca/entities/brevision.js"; import type BNote from "../../becca/entities/bnote.js"; import type { NotePojo } from "../../becca/becca-interface.js"; -import { RevisionItem, RevisionRow } from "@triliumnext/commons"; +import { RevisionItem, RevisionPojo, RevisionRow } from "@triliumnext/commons"; interface NotePath { noteId: string; @@ -60,7 +60,7 @@ function getRevision(req: Request) { } } - return revision satisfies RevisionRow; + return revision satisfies RevisionPojo; } function getRevisionFilename(revision: BRevision) { diff --git a/packages/commons/src/lib/server_api.ts b/packages/commons/src/lib/server_api.ts index 81f45574a..dfb5b611d 100644 --- a/packages/commons/src/lib/server_api.ts +++ b/packages/commons/src/lib/server_api.ts @@ -28,3 +28,20 @@ export interface RevisionItem { isProtected?: boolean; mime: string; } + +export interface RevisionPojo { + revisionId?: string; + noteId: string; + type: NoteType; + mime: string; + isProtected?: boolean; + title: string; + blobId?: string; + dateLastEdited?: string; + dateCreated?: string; + utcDateLastEdited?: string; + utcDateCreated?: string; + utcDateModified?: string; + content?: string | Buffer; + contentLength?: number; +}