"use client"; import { useState, useEffect } from "react"; import Link from "next/link"; import { getSpaceIdFromCookie } from "@/lib/spaces"; import type { SpaceConfig } from "@/lib/spaces"; const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000/api"; interface GeneratedDesign { slug: string; name: string; image_url: string; status: string; } export default function DesignPage() { const [name, setName] = useState(""); const [concept, setConcept] = useState(""); const [tags, setTags] = useState(""); const [isGenerating, setIsGenerating] = useState(false); const [error, setError] = useState(null); const [generatedDesign, setGeneratedDesign] = useState(null); const [isActivating, setIsActivating] = useState(false); const [spaceConfig, setSpaceConfig] = useState(null); useEffect(() => { const spaceId = getSpaceIdFromCookie(); fetch(`${API_URL}/spaces/${spaceId}`) .then((res) => (res.ok ? res.json() : null)) .then(setSpaceConfig) .catch(() => {}); }, []); const handleGenerate = async (e: React.FormEvent) => { e.preventDefault(); setIsGenerating(true); setError(null); setGeneratedDesign(null); try { const response = await fetch(`${API_URL}/design/generate`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ name, concept, tags: tags.split(",").map((t) => t.trim()).filter(Boolean), product_type: "sticker", space: getSpaceIdFromCookie(), }), }); if (!response.ok) { const data = await response.json(); throw new Error(data.detail || "Failed to generate design"); } const design = await response.json(); setGeneratedDesign(design); } catch (err) { setError(err instanceof Error ? err.message : "An error occurred"); } finally { setIsGenerating(false); } }; const handleActivate = async () => { if (!generatedDesign) return; setIsActivating(true); setError(null); try { const response = await fetch( `${API_URL}/design/${generatedDesign.slug}/activate`, { method: "POST", } ); if (!response.ok) { const data = await response.json(); throw new Error(data.detail || "Failed to activate design"); } setGeneratedDesign({ ...generatedDesign, status: "active" }); } catch (err) { setError(err instanceof Error ? err.message : "An error occurred"); } finally { setIsActivating(false); } }; const handleDelete = async () => { if (!generatedDesign) return; try { const response = await fetch( `${API_URL}/design/${generatedDesign.slug}`, { method: "DELETE", } ); if (!response.ok) { const data = await response.json(); throw new Error(data.detail || "Failed to delete design"); } setGeneratedDesign(null); setName(""); setConcept(""); setTags(""); } catch (err) { setError(err instanceof Error ? err.message : "An error occurred"); } }; return (

Design Swag

Create custom {spaceConfig?.name || "rSpace"} merchandise using AI. Describe your vision and we'll generate a unique design.

{/* Form */}
setName(e.target.value)} placeholder="e.g., Commons Builder" className="w-full px-4 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-primary" required disabled={isGenerating} />