"use client"; import { useEffect, useId, useMemo, useState } from "react"; import CategoryTreeSelect from "@/components/CategoryTreeSelect"; import { searchMeshkeeCategories, type MeshkeeCategory, } from "@/services/meshkee-categories"; import styles from "./WebsiteLinkGenerator.module.css"; export type WebsiteLinkKind = "businesses" | "blog"; function buildCategoryLink(kind: WebsiteLinkKind, category: MeshkeeCategory) { const path = kind === "blog" ? "/blog" : "/businesses"; const query = category.slug ? `category=${encodeURIComponent(category.slug)}` : `categoryId=${encodeURIComponent(category.id)}`; return `${path}?${query}`; } function LinkIcon() { return ( ); } export default function WebsiteLinkGenerator({ onPick, disabled = false, }: { onPick: (url: string) => void; disabled?: boolean; }) { const titleId = useId(); const [open, setOpen] = useState(false); const [kind, setKind] = useState("businesses"); const [categories, setCategories] = useState([]); const [categoryId, setCategoryId] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); useEffect(() => { if (!open) return; setKind("businesses"); setCategoryId(""); setError(""); }, [open]); useEffect(() => { if (!open) return; const previousOverflow = document.body.style.overflow; document.body.style.overflow = "hidden"; const onKey = (event: KeyboardEvent) => { if (event.key === "Escape") setOpen(false); }; window.addEventListener("keydown", onKey); return () => { document.body.style.overflow = previousOverflow; window.removeEventListener("keydown", onKey); }; }, [open]); useEffect(() => { if (!open) return; const controller = new AbortController(); setLoading(true); setError(""); void searchMeshkeeCategories("", controller.signal) .then((items) => { if (controller.signal.aborted) return; setCategories(items); }) .catch((err) => { if (controller.signal.aborted) return; setCategories([]); setError( err instanceof Error ? err.message : "Could not load categories.", ); }) .finally(() => { if (!controller.signal.aborted) setLoading(false); }); return () => controller.abort(); }, [open]); const selected = useMemo( () => categories.find((item) => item.id === categoryId) ?? null, [categories, categoryId], ); const preview = selected ? buildCategoryLink(kind, selected) : ""; return ( <> {open ? (
setOpen(false)} >
event.stopPropagation()} >

Link generator

Build category link

{loading ? (

Loading categories…

) : error ? (

{error}

) : ( setCategoryId(ids[0] ?? "")} selection="single" dropdownVariant="inFlow" label="Category" placeholder="Search categories…" /> )}
Preview {preview || "Select a category"}
) : null} ); }