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(), location_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 [locations, setLocations] = 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', location_id: profile?.location_id || '' } }); useEffect(() => { fetchLocations(); fetchAccessibilityPreferences(); }, [user]); const fetchLocations = async () => { try { const { data, error } = await supabase.from('locations').select('id, name, city, state_province, country').order('name'); if (error) throw error; setLocations(data || []); } catch (error) { console.error('Error fetching locations:', 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, location_id: data.location_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.

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)} />
; }