import { useState, useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Card, CardContent, CardDescription, CardHeader } from '@/components/ui/card'; import { Separator } from '@/components/ui/separator'; import { Switch } from '@/components/ui/switch'; import { useToast } from '@/hooks/use-toast'; import { useAuth } from '@/hooks/useAuth'; import { supabase } from '@/integrations/supabase/client'; import { MapPin, Calendar, Globe, Accessibility } from 'lucide-react'; const locationSchema = z.object({ preferred_pronouns: z.string().max(20).optional(), timezone: z.string(), preferred_language: z.string(), personal_location: z.string().max(100).optional(), home_park_id: z.string().optional() }); type LocationFormData = z.infer; interface AccessibilityOptions { font_size: 'small' | 'medium' | 'large'; high_contrast: boolean; reduced_motion: boolean; } export function LocationTab() { const { user, profile, refreshProfile } = useAuth(); const { toast } = useToast(); const [loading, setLoading] = useState(false); const [parks, setParks] = useState([]); const [accessibility, setAccessibility] = useState({ font_size: 'medium', high_contrast: false, reduced_motion: false }); const form = useForm({ resolver: zodResolver(locationSchema), defaultValues: { preferred_pronouns: profile?.preferred_pronouns || '', timezone: profile?.timezone || 'UTC', preferred_language: profile?.preferred_language || 'en', personal_location: (profile as any)?.personal_location || '', home_park_id: (profile as any)?.home_park_id || '' } }); useEffect(() => { fetchParks(); fetchAccessibilityPreferences(); }, [user]); const fetchParks = async () => { try { const { data, error } = await supabase .from('parks') .select('id, name, location_id, locations(city, state_province, country)') .order('name'); if (error) throw error; setParks(data || []); } catch (error) { console.error('Error fetching parks:', error); } }; const fetchAccessibilityPreferences = async () => { if (!user) return; try { const { data, error } = await supabase.from('user_preferences').select('accessibility_options').eq('user_id', user.id).maybeSingle(); if (error && error.code !== 'PGRST116') { console.error('Error fetching accessibility preferences:', error); return; } if (data?.accessibility_options) { setAccessibility(data.accessibility_options as any); } } catch (error) { console.error('Error fetching accessibility preferences:', error); } }; const onSubmit = async (data: LocationFormData) => { if (!user) return; setLoading(true); try { // Save profile information const { error: profileError } = await supabase.from('profiles').update({ preferred_pronouns: data.preferred_pronouns || null, timezone: data.timezone, preferred_language: data.preferred_language, personal_location: data.personal_location || null, home_park_id: data.home_park_id || null, updated_at: new Date().toISOString() }).eq('user_id', user.id); if (profileError) throw profileError; // Save accessibility preferences const { error: accessibilityError } = await supabase.from('user_preferences').upsert([{ user_id: user.id, accessibility_options: accessibility as any, updated_at: new Date().toISOString() }]); if (accessibilityError) throw accessibilityError; await refreshProfile(); toast({ title: 'Settings saved', description: 'Your location, personal information, and accessibility settings have been updated.' }); } catch (error: any) { toast({ title: 'Error', description: error.message || 'Failed to save settings', variant: 'destructive' }); } finally { setLoading(false); } }; const updateAccessibility = (key: keyof AccessibilityOptions, value: any) => { setAccessibility(prev => ({ ...prev, [key]: value })); }; const timezones = ['UTC', 'America/New_York', 'America/Chicago', 'America/Denver', 'America/Los_Angeles', 'America/Toronto', 'Europe/London', 'Europe/Berlin', 'Europe/Paris', 'Asia/Tokyo', 'Asia/Shanghai', 'Australia/Sydney']; return
{/* Location Settings */}

Location Settings

Set your location for better personalized content and timezone display.

Your personal location (optional, displayed as text)

The theme park you visit most often or consider your "home" park

Used to display dates and times in your local timezone.

{/* Personal Information */}

Personal Information

Optional personal information that can be displayed on your profile.

How you'd like others to refer to you.

{/* Accessibility Options */}

Accessibility Options

Customize the interface to meet your accessibility needs.

Increase contrast for better visibility

updateAccessibility('high_contrast', checked)} />

Minimize animations and transitions

updateAccessibility('reduced_motion', checked)} />
; }