import { useState } from 'react'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Input } from '@/components/ui/input'; import { Calendar, MapPin, Edit, Trash2, Plus, Minus, Check, X } from 'lucide-react'; import { Link } from 'react-router-dom'; import { format } from 'date-fns'; import { supabase } from '@/integrations/supabase/client'; import { toast } from 'sonner'; import { getErrorMessage } from '@/lib/errorHandler'; import { UserRideCredit } from '@/types/database'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog'; interface RideCreditCardProps { credit: UserRideCredit; viewMode: 'grid' | 'list'; onUpdate: () => void; onDelete: () => void; } export function RideCreditCard({ credit, viewMode, onUpdate, onDelete }: RideCreditCardProps) { const [isEditing, setIsEditing] = useState(false); const [editCount, setEditCount] = useState(credit.ride_count); const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [updating, setUpdating] = useState(false); const rideName = credit.rides?.name || 'Unknown Ride'; const parkName = credit.rides?.parks?.name || 'Unknown Park'; const parkSlug = credit.rides?.parks?.slug || ''; const rideSlug = credit.rides?.slug || ''; const imageUrl = credit.rides?.card_image_url; const category = credit.rides?.category || ''; const handleUpdateCount = async () => { try { setUpdating(true); const { error } = await supabase .from('user_ride_credits') .update({ ride_count: editCount }) .eq('id', credit.id); if (error) throw error; toast.success('Ride count updated'); setIsEditing(false); onUpdate(); } catch (error) { console.error('Error updating count:', error); toast.error(getErrorMessage(error)); } finally { setUpdating(false); } }; const handleQuickIncrement = async () => { try { const newCount = credit.ride_count + 1; const { error } = await supabase .from('user_ride_credits') .update({ ride_count: newCount }) .eq('id', credit.id); if (error) throw error; toast.success('Ride count increased'); onUpdate(); } catch (error) { console.error('Error incrementing count:', error); toast.error(getErrorMessage(error)); } }; const getCategoryBadge = (category: string) => { const categoryMap: Record = { roller_coaster: { label: 'Coaster', variant: 'default' }, flat_ride: { label: 'Flat Ride', variant: 'secondary' }, water_ride: { label: 'Water Ride', variant: 'outline' }, dark_ride: { label: 'Dark Ride', variant: 'outline' }, }; const info = categoryMap[category] || { label: category, variant: 'outline' as const }; return {info.label}; }; const ridePath = parkSlug && rideSlug ? `/parks/${parkSlug}/rides/${rideSlug}` : '#'; if (viewMode === 'list') { return (
{imageUrl && ( {rideName} )}
{rideName} {getCategoryBadge(category)}
{parkName} {credit.first_ride_date && (
First ride: {format(new Date(credit.first_ride_date), 'MMM d, yyyy')}
)}
{isEditing ? ( <> setEditCount(parseInt(e.target.value) || 1)} className="w-20" min="1" /> ) : ( <>
{credit.ride_count}
{credit.ride_count === 1 ? 'ride' : 'rides'}
)}
Delete Ride Credit? This will remove {rideName} from your ride credits. This action cannot be undone. Cancel Delete
); } // Grid view return ( {imageUrl && (
{rideName}
)}
{rideName} {getCategoryBadge(category)}
{parkName}
{credit.first_ride_date && (
{format(new Date(credit.first_ride_date), 'MMM d, yyyy')}
)}
{isEditing ? (
setEditCount(parseInt(e.target.value) || 1)} className="w-20" min="1" />
) : ( <>
{credit.ride_count} {credit.ride_count === 1 ? 'ride' : 'rides'}
)}
Delete Ride Credit? This will remove {rideName} from your ride credits. This action cannot be undone. Cancel Delete
); }