import clsx from "clsx"; import oc from "open-color"; import { useEffect, useRef, useState } from "react"; import { useDevice } from "../components/App"; import { exportToSvg } from "../scene/export"; import { LibraryItem } from "../types"; import "./LibraryUnit.scss"; import { CheckboxItem } from "./CheckboxItem"; import { PlusIcon } from "./icons"; export const LibraryUnit = ({ id, elements, isPending, onClick, selected, onToggle, onDrag, }: { id: LibraryItem["id"] | /** for pending item */ null; elements?: LibraryItem["elements"]; isPending?: boolean; onClick: () => void; selected: boolean; onToggle: (id: string, event: React.MouseEvent) => void; onDrag: (id: string, event: React.DragEvent) => void; }) => { const ref = useRef(null); useEffect(() => { const node = ref.current; if (!node) { return; } (async () => { if (!elements) { return; } const svg = await exportToSvg( elements, { exportBackground: false, viewBackgroundColor: oc.white, }, null, ); svg.querySelector(".style-fonts")?.remove(); node.innerHTML = svg.outerHTML; })(); return () => { node.innerHTML = ""; }; }, [elements]); const [isHovered, setIsHovered] = useState(false); const isMobile = useDevice().isMobile; const adder = isPending && (
{PlusIcon}
); return (
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} >
{ if (id && event.shiftKey) { onToggle(id, event); } else { onClick(); } } : undefined } onDragStart={(event) => { if (!id) { event.preventDefault(); return; } setIsHovered(false); onDrag(id, event); }} /> {adder} {id && elements && (isHovered || isMobile || selected) && ( onToggle(id, event)} className="library-unit__checkbox" /> )}
); };