feat: Implement type-safe company rides lists

This commit is contained in:
gpt-engineer-app[bot]
2025-10-16 12:47:21 +00:00
parent b9df1b20b5
commit e79eaf76ba
6 changed files with 501 additions and 16 deletions

View File

@@ -4,15 +4,21 @@ import { Header } from '@/components/layout/Header';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { ArrowLeft, Filter, SlidersHorizontal, FerrisWheel } from 'lucide-react';
import { Dialog, DialogContent } from '@/components/ui/dialog';
import { ArrowLeft, Filter, SlidersHorizontal, FerrisWheel, Plus } from 'lucide-react';
import { Ride, Company } from '@/types/database';
import { RideSubmissionData } from '@/types/submission-data';
import { supabase } from '@/integrations/supabase/client';
import { RideCard } from '@/components/rides/RideCard';
import { RideForm } from '@/components/admin/RideForm';
import { AutocompleteSearch } from '@/components/search/AutocompleteSearch';
import { useAuth } from '@/hooks/useAuth';
import { toast } from '@/hooks/use-toast';
export default function DesignerRides() {
const { designerSlug } = useParams<{ designerSlug: string }>();
const navigate = useNavigate();
const { user } = useAuth();
const [designer, setDesigner] = useState<Company | null>(null);
const [rides, setRides] = useState<Ride[]>([]);
const [loading, setLoading] = useState(true);
@@ -20,6 +26,7 @@ export default function DesignerRides() {
const [sortBy, setSortBy] = useState('name');
const [filterCategory, setFilterCategory] = useState('all');
const [filterStatus, setFilterStatus] = useState('all');
const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
useEffect(() => {
if (designerSlug) {
@@ -91,6 +98,37 @@ export default function DesignerRides() {
ride.park?.name?.toLowerCase().includes(searchQuery.toLowerCase())
);
const handleCreateSubmit = async (data: any) => {
try {
if (!user) {
navigate('/auth');
return;
}
const submissionData = {
...data,
designer_id: designer.id,
};
const { submitRideCreation } = await import('@/lib/entitySubmissionHelpers');
await submitRideCreation(submissionData, user.id);
toast({
title: "Ride Submitted",
description: "Your ride submission has been sent for review."
});
setIsCreateModalOpen(false);
fetchData();
} catch (error: any) {
toast({
title: "Error",
description: error.message || "Failed to submit ride.",
variant: "destructive"
});
}
};
const categories = [
{ value: 'all', label: 'All Categories' },
{ value: 'roller_coaster', label: 'Roller Coasters' },
@@ -157,9 +195,15 @@ export default function DesignerRides() {
</div>
<div className="mb-8">
<div className="flex items-center gap-3 mb-4">
<FerrisWheel className="w-8 h-8 text-primary" />
<h1 className="text-4xl font-bold">Rides by {designer.name}</h1>
<div className="flex items-center justify-between mb-4">
<div className="flex items-center gap-3">
<FerrisWheel className="w-8 h-8 text-primary" />
<h1 className="text-4xl font-bold">Rides by {designer.name}</h1>
</div>
<Button onClick={() => setIsCreateModalOpen(true)}>
<Plus className="w-4 h-4 mr-2" />
Add Ride
</Button>
</div>
<p className="text-lg text-muted-foreground mb-4">
Explore all rides designed by {designer.name}
@@ -232,7 +276,7 @@ export default function DesignerRides() {
</div>
{filteredRides.length > 0 ? (
<div className="grid md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-6 gap-6">
<div className="grid md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 gap-6">
{filteredRides.map((ride) => (
<RideCard key={ride.id} ride={ride} showParkName={true} />
))}
@@ -247,6 +291,15 @@ export default function DesignerRides() {
</div>
)}
</main>
<Dialog open={isCreateModalOpen} onOpenChange={setIsCreateModalOpen}>
<DialogContent className="max-w-4xl max-h-[90vh] overflow-y-auto">
<RideForm
onSubmit={handleCreateSubmit}
onCancel={() => setIsCreateModalOpen(false)}
/>
</DialogContent>
</Dialog>
</div>
);
}