import type { EnvironmentId } from "@t3tools/contracts";import { FolderIcon } from "lucide-react";import { useEffect, useState } from "react";import { useAssetUrl } from "../assets/assetUrls"; const loadedProjectFaviconSrcs = new Set<string>(); export function ProjectFavicon(input: { environmentId: EnvironmentId; cwd: string; className?: string;}) { const src = useAssetUrl(input.environmentId, { _tag: "project-favicon", cwd: input.cwd, }); const [status, setStatus] = useState<"loading" | "loaded" | "error">(() => src && loadedProjectFaviconSrcs.has(src) ? "loaded" : "loading", ); useEffect(() => { setStatus(src && loadedProjectFaviconSrcs.has(src) ? "loaded" : "loading"); }, [src]); if (!src) { return ( <FolderIcon className={`size-3.5 shrink-0 text-muted-foreground/50 ${input.className ?? ""}`} /> ); } return ( <> {status !== "loaded" ? ( <FolderIcon className={`size-3.5 shrink-0 text-muted-foreground/50 ${input.className ?? ""}`} /> ) : null} <img src={src} alt="" className={`size-3.5 shrink-0 rounded-sm object-contain ${status === "loaded" ? "" : "hidden"} ${input.className ?? ""}`} onLoad={() => { loadedProjectFaviconSrcs.add(src); setStatus("loaded"); }} onError={() => setStatus("error")} /> </> );}
import type { EnvironmentId } from "@t3tools/contracts";
import { FolderIcon } from "lucide-react";
import { useEffect, useState } from "react";
import { useAssetUrl } from "../assets/assetUrls";
const loadedProjectFaviconSrcs = new Set<string>();
export function ProjectFavicon(input: {
environmentId: EnvironmentId;
cwd: string;
className?: string;
}) {
const src = useAssetUrl(input.environmentId, {
_tag: "project-favicon",
cwd: input.cwd,
});
const [status, setStatus] = useState<"loading" | "loaded" | "error">(() =>
src && loadedProjectFaviconSrcs.has(src) ? "loaded" : "loading",
);
useEffect(() => {
setStatus(src && loadedProjectFaviconSrcs.has(src) ? "loaded" : "loading");
}, [src]);
if (!src) {
return (
<FolderIcon
className={`size-3.5 shrink-0 text-muted-foreground/50 ${input.className ?? ""}`}
/>
);
}
return (
<>
{status !== "loaded" ? (
<FolderIcon
className={`size-3.5 shrink-0 text-muted-foreground/50 ${input.className ?? ""}`}
/>
) : null}
<img
src={src}
alt=""
className={`size-3.5 shrink-0 rounded-sm object-contain ${status === "loaded" ? "" : "hidden"} ${input.className ?? ""}`}
onLoad={() => {
loadedProjectFaviconSrcs.add(src);
setStatus("loaded");
}}
onError={() => setStatus("error")}
/>
</>
);
}