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";
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 };
}