import React, { useState, useEffect } from "react"; import { X, Loader2 } from "lucide-react"; import { useTranslation } from "react-i18next"; import CollectionIcon from "../common/CollectionIcon"; import { ICON_MAP } from "../common/iconMap"; import { Theme } from "emoji-picker-react"; const EmojiPicker = React.lazy(() => import("emoji-picker-react")); import { updateCollection, type Collection } from "../../api/client"; import { useStore } from "@nanostores/react"; import { $theme } from "../../store/theme"; interface EditCollectionModalProps { isOpen: boolean; onClose: () => void; collection: Collection; onUpdate: (updatedCollection: Collection) => void; } export default function EditCollectionModal({ isOpen, onClose, collection, onUpdate, }: EditCollectionModalProps) { const [name, setName] = useState(collection.name); const [description, setDescription] = useState(collection.description || ""); const initialIsIcon = collection.icon?.startsWith("icon:") ?? false; const initialIconValue = collection.icon?.replace("icon:", "") || ""; const [activeTab, setActiveTab] = useState<"icon" | "emoji">( initialIsIcon || !collection.icon ? "icon" : "emoji", ); const [icon, setIcon] = useState(initialIconValue); const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const theme = useStore($theme); useEffect(() => { if (isOpen) { setName(collection.name); setDescription(collection.description || ""); const isIcon = collection.icon?.startsWith("icon:") ?? false; setActiveTab(isIcon || !collection.icon ? "icon" : "emoji"); setIcon(collection.icon?.replace("icon:", "") || ""); setError(null); document.body.style.overflow = "hidden"; } return () => { document.body.style.overflow = "unset"; }; }, [isOpen, collection]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!name.trim()) return; try { setLoading(true); setError(null); const iconValue = icon ? ICON_MAP[icon] ? `icon:${icon}` : icon : undefined; const updated = await updateCollection( collection.uri, name.trim(), description.trim() || undefined, iconValue, ); if (updated) { onUpdate(updated); onClose(); } else { setError(t("editCollection.failedUpdate")); } } catch (err) { console.error(err); setError(t("editCollection.errorUpdating")); } finally { setLoading(false); } }; if (!isOpen) return null; return (
e.stopPropagation()} >

{t("editCollection.title")}

setName(e.target.value)} placeholder={t("editCollection.namePlaceholder")} autoFocus />