"use client"; import { useState } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { Package, Loader2, Pencil, Trash2, Check, X, UtensilsCrossed, TreePine, Film, ShoppingBag, Dumbbell, Landmark, Coffee, } from "lucide-react"; import type { IdeaCategory } from "@/types"; export interface MyIdea { id: string; content: string; createdAt: string; category?: string | null; timeSlot?: string | null; estimatedMinutes?: number | null; outdoor?: boolean | null; searchQuery?: string | null; searchType?: string | null; } const CATEGORY_CONFIG: Record< IdeaCategory, { icon: typeof UtensilsCrossed; color: string; label: string } > = { dining: { icon: UtensilsCrossed, color: "text-orange-400", label: "美食" }, outdoor: { icon: TreePine, color: "text-emerald-400", label: "户外" }, entertainment: { icon: Film, color: "text-sky-400", label: "娱乐" }, shopping: { icon: ShoppingBag, color: "text-pink-400", label: "购物" }, sports: { icon: Dumbbell, color: "text-amber-400", label: "运动" }, culture: { icon: Landmark, color: "text-violet-400", label: "文化" }, relaxation: { icon: Coffee, color: "text-teal-400", label: "休闲" }, }; function CategoryBadge({ category }: { category?: string | null }) { if (!category) return 💡; const cfg = CATEGORY_CONFIG[category as IdeaCategory]; if (!cfg) return 💡; const Icon = cfg.icon; return ; } function DurationLabel({ minutes }: { minutes?: number | null }) { if (!minutes) return null; const display = minutes >= 60 ? `${(minutes / 60).toFixed(minutes % 60 === 0 ? 0 : 1)}h` : `${minutes}min`; return ( ~{display} ); } function MyIdeaItem({ idea, onEdit, onDelete, }: { idea: MyIdea; onEdit: (id: string, content: string) => Promise; onDelete: (id: string) => Promise; }) { const [editing, setEditing] = useState(false); const [draft, setDraft] = useState(idea.content); const [saving, setSaving] = useState(false); const handleSave = async () => { if (!draft.trim() || saving) return; setSaving(true); await onEdit(idea.id, draft); setSaving(false); setEditing(false); }; return ( {editing ? ( <> setDraft(e.target.value.slice(0, 200))} onKeyDown={(e) => { if (e.key === "Enter") handleSave(); if (e.key === "Escape") { setEditing(false); setDraft(idea.content); } }} maxLength={200} autoFocus className="h-8 min-w-0 flex-1 rounded-lg bg-elevated px-2.5 text-sm text-foreground outline-none ring-1 ring-border focus:ring-2 focus:ring-purple-600/50" /> ) : ( <>

{idea.content}

)}
); } export default function BlindboxMyIdeas({ ideas, onEdit, onDelete, }: { ideas: MyIdea[]; onEdit: (id: string, content: string) => Promise; onDelete: (id: string) => Promise; }) { return (

我投入的想法({ideas.length})

{ideas.map((idea) => ( ))}
); } export { CATEGORY_CONFIG, CategoryBadge, DurationLabel };