import Dropdown from "./react/Dropdown"; import "./note_icon.css"; import { t } from "i18next"; import { useNoteContext } from "./react/hooks"; import { useCallback, useEffect, useState } from "preact/hooks"; import server from "../services/server"; import type { Category, Icon } from "./icon_list"; import FormTextBox from "./react/FormTextBox"; interface IconToCountCache { iconClassToCountMap: Record; } interface IconData { iconToCount: Record; icons: Icon[]; } let fullIconData: { categories: Category[]; icons: Icon[]; }; let iconToCountCache!: Promise | null; export default function NoteIcon() { const { note } = useNoteContext(); const [ icon, setIcon ] = useState("bx bx-empty"); const refreshIcon = useCallback(() => { if (note) { setIcon(note.getIcon()); } }, [ note ]); useEffect(refreshIcon, [ note ]); return ( ) } function NoteIconList() { const [ filter, setFilter ] = useState(); const [ iconData, setIconData ] = useState(); useEffect(() => { async function loadIcons() { const iconToCount = await getIconToCountMap(); if (!fullIconData) { fullIconData = (await import("./icon_list.js")).default; } setIconData({ iconToCount, icons: fullIconData.icons }) } loadIcons(); }, []); return ( <>
{t("note_icon.category")} {t("note_icon.search")}
{(iconData?.icons ?? []).map(({className, name}) => ( ))}
); } async function getIconToCountMap() { if (!iconToCountCache) { iconToCountCache = server.get("other/icon-usage"); setTimeout(() => (iconToCountCache = null), 20000); // invalidate cache after 20 seconds } return (await iconToCountCache).iconClassToCountMap; }