"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.map((idea) => (
))}
);
}
export { CATEGORY_CONFIG, CategoryBadge, DurationLabel };