import { useState, useEffect } from "react"; import type { RegistryItem } from "../lib/types"; import { fetchWithAuth, getAuthToken } from "../utils/auth-client"; const RegistryManager = () => { const [registryItems, setRegistryItems] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [newItem, setNewItem] = useState({ name: "", link: "" }); const [showClaimants, setShowClaimants] = useState>(new Set()); const fetchRegistryItems = async () => { // Don't try to fetch if we don't have a token yet if (!getAuthToken()) { setError("No authentication token found"); setLoading(false); return; } setLoading(true); setError(null); try { const response = await fetchWithAuth("/api/registry"); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); setRegistryItems(data); setError(null); } catch (e: any) { setError(e.message); console.error("Failed to fetch registry items:", e); } finally { setLoading(false); } }; useEffect(() => { fetchRegistryItems(); // Add listener for auth success to retry fetching const handleAuthSuccess = () => { fetchRegistryItems(); }; document.addEventListener("auth-success", handleAuthSuccess); return () => document.removeEventListener("auth-success", handleAuthSuccess); }, []); const handleAddItem = async (e: React.FormEvent) => { e.preventDefault(); if (!newItem.name.trim()) return; try { const response = await fetchWithAuth("/api/registry", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(newItem), }); if (!response.ok) { throw new Error(`Failed to add item: ${response.statusText}`); } setNewItem({ name: "", link: "" }); await fetchRegistryItems(); } catch (error: any) { setError(error.message); console.error("Error adding item:", error); } }; const handleDeleteItem = async (id: string) => { try { const response = await fetchWithAuth(`/api/registry/${id}`, { method: "DELETE", }); if (!response.ok) { throw new Error(`Failed to delete item: ${response.statusText}`); } await fetchRegistryItems(); } catch (error: any) { setError(error.message); console.error("Error deleting item:", error); } }; const handleReleaseClaim = async (id: string) => { try { const response = await fetchWithAuth(`/api/registry/${id}`, { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ taken: false, claimedBy: null }), }); if (!response.ok) { throw new Error(`Failed to release claim: ${response.statusText}`); } await fetchRegistryItems(); } catch (error: any) { setError(error.message); console.error("Error releasing claim:", error); } }; const toggleShowClaimant = (id: string) => { const newShowClaimants = new Set(showClaimants); if (newShowClaimants.has(id)) { newShowClaimants.delete(id); } else { newShowClaimants.add(id); } setShowClaimants(newShowClaimants); }; if (loading) { return
Loading registry items...
; } if (error) { if (error === "No authentication token found") { return
Initializing...
; } return
Error: {error}
; } return (
setNewItem({ ...newItem, name: e.target.value })} placeholder="Item name" className="input input-bordered w-full" required />
setNewItem({ ...newItem, link: e.target.value })} placeholder="Item link (optional)" className="input input-bordered w-full" />
{registryItems.map((item) => ( ))}
Name Link Status Actions
{item.name} {item.link && ( View Item )}
{item.taken ? "Claimed" : "Available"} {item.taken && ( )}
{item.taken && showClaimants.has(item.id) && (
Claimed by: {item.claimedBy}
)}
{item.taken && ( )}
); }; export default RegistryManager;