import { useState, useEffect } from "react"; import { useAuth } from "@/hooks/useAuth"; import { supabase } from "@/integrations/supabase/client"; import { UserTopList, UserTopListItem } from "@/types/database"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Plus, Trash2, Edit, Eye, EyeOff } from "lucide-react"; import { toast } from "sonner"; import { ListItemEditor } from "./ListItemEditor"; import { ListDisplay } from "./ListDisplay"; import { handleError } from "@/lib/errorHandler"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Switch } from "@/components/ui/switch"; export function UserListManager() { const { user } = useAuth(); const [lists, setLists] = useState([]); const [loading, setLoading] = useState(true); const [editingList, setEditingList] = useState(null); const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); const [newListTitle, setNewListTitle] = useState(""); const [newListDescription, setNewListDescription] = useState(""); const [newListType, setNewListType] = useState("mixed"); const [newListIsPublic, setNewListIsPublic] = useState(true); useEffect(() => { if (user) { fetchLists(); } }, [user]); const fetchLists = async () => { if (!user) return; setLoading(true); const { data, error } = await supabase .from("user_top_lists") .select(` *, list_items ( id, entity_type, entity_id, position, notes, created_at, updated_at ) `) .eq("user_id", user.id) .order("created_at", { ascending: false }); if (error) { handleError(error, { action: 'Load User Lists', userId: user.id }); } else { // Map Supabase data to UserTopList interface const mappedLists: UserTopList[] = (data || []).map(list => ({ id: list.id, user_id: list.user_id, title: list.title, description: list.description, list_type: list.list_type as 'parks' | 'rides' | 'coasters' | 'companies' | 'mixed', is_public: list.is_public, created_at: list.created_at, updated_at: list.updated_at, items: (list.list_items || []).map(item => ({ id: item.id, list_id: list.id, // Add the parent list ID entity_type: item.entity_type as 'park' | 'ride' | 'company', entity_id: item.entity_id, position: item.position, notes: item.notes, created_at: item.created_at || new Date().toISOString(), updated_at: item.updated_at || new Date().toISOString(), })), })); setLists(mappedLists); } setLoading(false); }; const handleCreateList = async () => { if (!user || !newListTitle.trim()) { toast.error("Please enter a list title"); return; } const { data, error } = await supabase .from("user_top_lists") .insert([{ user_id: user.id, title: newListTitle, description: newListDescription || null, list_type: newListType, is_public: newListIsPublic, }]) .select() .single(); if (error) { handleError(error, { action: 'Create List', userId: user.id, metadata: { title: newListTitle } }); } else { toast.success("List created successfully"); const newList: UserTopList = { id: data.id, user_id: data.user_id, title: data.title, description: data.description, list_type: data.list_type as 'parks' | 'rides' | 'coasters' | 'companies' | 'mixed', is_public: data.is_public, created_at: data.created_at, updated_at: data.updated_at, items: [], }; setLists([newList, ...lists]); setIsCreateDialogOpen(false); setNewListTitle(""); setNewListDescription(""); setNewListType("mixed"); setNewListIsPublic(true); } }; const handleDeleteList = async (listId: string) => { const { error } = await supabase .from("user_top_lists") .delete() .eq("id", listId); if (error) { handleError(error, { action: 'Delete List', userId: user?.id, metadata: { listId } }); } else { toast.success("List deleted"); setLists(lists.filter(l => l.id !== listId)); } }; const handleToggleVisibility = async (list: UserTopList) => { const { error } = await supabase .from("user_top_lists") .update({ is_public: !list.is_public }) .eq("id", list.id); if (error) { handleError(error, { action: 'Toggle List Visibility', userId: user?.id, metadata: { listId: list.id } }); } else { toast.success(`List is now ${!list.is_public ? "public" : "private"}`); setLists(lists.map(l => l.id === list.id ? { ...l, is_public: !l.is_public } : l )); } }; if (loading) { return
Loading lists...
; } return (

My Lists

Create New List Create a new list to organize your favorite parks, rides, or companies.
setNewListTitle(e.target.value)} placeholder="My Top 10 Coasters" />