import { useEffect, useState } from "react"; import { debounce, getVersion, nFormatter } from "../utils"; import { getElementsStorageSize, getTotalStorageSize, } from "./data/localStorage"; import { DEFAULT_VERSION } from "../constants"; import { t } from "../i18n"; import { copyTextToSystemClipboard } from "../clipboard"; type StorageSizes = { scene: number; total: number }; const STORAGE_SIZE_TIMEOUT = 500; const getStorageSizes = debounce((cb: (sizes: StorageSizes) => void) => { cb({ scene: getElementsStorageSize(), total: getTotalStorageSize(), }); }, STORAGE_SIZE_TIMEOUT); type Props = { setToastMessage: (message: string) => void; }; const CustomStats = (props: Props) => { const [storageSizes, setStorageSizes] = useState({ scene: 0, total: 0, }); useEffect(() => { getStorageSizes((sizes) => { setStorageSizes(sizes); }); }); useEffect(() => () => getStorageSizes.cancel(), []); const version = getVersion(); let hash; let timestamp; if (version !== DEFAULT_VERSION) { timestamp = version.slice(0, 16).replace("T", " "); hash = version.slice(21); } else { timestamp = t("stats.versionNotAvailable"); } return ( <> {t("stats.storage")} {t("stats.scene")} {nFormatter(storageSizes.scene, 1)} {t("stats.total")} {nFormatter(storageSizes.total, 1)} {t("stats.version")} { try { await copyTextToSystemClipboard(getVersion()); props.setToastMessage(t("toast.copyToClipboard")); } catch {} }} title={t("stats.versionCopy")} > {timestamp}
{hash} ); }; export default CustomStats;