import { useEffect, useState } from "preact/hooks"; import { t } from "../../services/i18n"; import { MetadataResponse, NoteSizeResponse, SubtreeSizeResponse } from "@triliumnext/commons"; import server from "../../services/server"; import Button from "../react/Button"; import { formatDateTime } from "../../utils/formatters"; import { formatSize } from "../../services/utils"; import LoadingSpinner from "../react/LoadingSpinner"; import { useTriliumEvent } from "../react/hooks"; import { isExperimentalFeatureEnabled } from "../../services/experimental_features"; import FNote from "../../entities/fnote"; import LinkButton from "../react/LinkButton"; const isNewLayout = isExperimentalFeatureEnabled("new-layout"); export default function NoteInfoTab({ note }: { note: FNote | null | undefined }) { const { metadata, ...sizeProps } = useNoteMetadata(note); return (
{note && ( <>
{t("note_info_widget.note_id")}: {note.noteId}
{!isNewLayout &&
{t("note_info_widget.created")}: {formatDateTime(metadata?.dateCreated)}
} {!isNewLayout &&
{t("note_info_widget.modified")}: {formatDateTime(metadata?.dateModified)}
}
{t("note_info_widget.type")}: {note.type}{' '} {note.mime && ({note.mime})}
{t("note_info_widget.note_size")}:
)}
); } export function NoteSizeWidget({ isLoading, noteSizeResponse, subtreeSizeResponse, requestSizeInfo }: Omit, "metadata">) { return <> {!isLoading && !noteSizeResponse && !subtreeSizeResponse && ( )} {formatSize(noteSizeResponse?.noteSize)} {" "} {subtreeSizeResponse && subtreeSizeResponse.subTreeNoteCount > 1 && {t("note_info_widget.subtree_size", { size: formatSize(subtreeSizeResponse.subTreeSize), count: subtreeSizeResponse.subTreeNoteCount })} } {isLoading && } ; } export function useNoteMetadata(note: FNote | null | undefined) { const [ isLoading, setIsLoading ] = useState(false); const [ noteSizeResponse, setNoteSizeResponse ] = useState(); const [ subtreeSizeResponse, setSubtreeSizeResponse ] = useState(); const [ metadata, setMetadata ] = useState(); function refresh() { if (note) { server.get(`notes/${note?.noteId}/metadata`).then(setMetadata); } setNoteSizeResponse(undefined); setSubtreeSizeResponse(undefined); setIsLoading(false); } function requestSizeInfo() { if (!note) return; setIsLoading(true); setTimeout(async () => { await Promise.allSettled([ server.get(`stats/note-size/${note.noteId}`).then(setNoteSizeResponse), server.get(`stats/subtree-size/${note.noteId}`).then(setSubtreeSizeResponse) ]); setIsLoading(false); }, 0); } useEffect(refresh, [ note ]); useTriliumEvent("entitiesReloaded", ({ loadResults }) => { const noteId = note?.noteId; if (noteId && (loadResults.isNoteReloaded(noteId) || loadResults.isNoteContentReloaded(noteId))) { refresh(); } }); return { isLoading, metadata, noteSizeResponse, subtreeSizeResponse, requestSizeInfo }; }