mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
54 lines
1.2 KiB
TypeScript
54 lines
1.2 KiB
TypeScript
import { useState, useMemo, useCallback, useEffect } from "react";
|
|
import {
|
|
getCachedFontAtlas,
|
|
loadFontAtlas,
|
|
clearFontAtlasCache,
|
|
} from "@/lib/fonts/google-fonts";
|
|
import type { FontAtlas } from "@/lib/fonts/types";
|
|
import { SYSTEM_FONTS } from "@/constants/font-constants";
|
|
|
|
type Status = "idle" | "loading" | "error";
|
|
|
|
export function useFontAtlas({ open }: { open: boolean }) {
|
|
const [atlas, setAtlas] = useState<FontAtlas | null>(() =>
|
|
getCachedFontAtlas(),
|
|
);
|
|
const [status, setStatus] = useState<Status>(() =>
|
|
getCachedFontAtlas() ? "idle" : "loading",
|
|
);
|
|
|
|
useEffect(() => {
|
|
if (!open || atlas) return;
|
|
|
|
setStatus("loading");
|
|
loadFontAtlas().then((data) => {
|
|
if (data) {
|
|
setAtlas(data);
|
|
setStatus("idle");
|
|
} else {
|
|
setStatus("error");
|
|
}
|
|
});
|
|
}, [open, atlas]);
|
|
|
|
const retry = useCallback(() => {
|
|
clearFontAtlasCache();
|
|
setStatus("loading");
|
|
loadFontAtlas().then((data) => {
|
|
if (data) {
|
|
setAtlas(data);
|
|
setStatus("idle");
|
|
} else {
|
|
setStatus("error");
|
|
}
|
|
});
|
|
}, []);
|
|
|
|
const fontNames = useMemo(() => {
|
|
if (!atlas) return [];
|
|
return [...Object.keys(atlas.fonts), ...SYSTEM_FONTS].sort();
|
|
}, [atlas]);
|
|
|
|
return { atlas, status, fontNames, retry };
|
|
}
|