'use client' import { useState, useEffect } from 'react' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Switch } from '@/components/ui/switch' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Separator } from '@/components/ui/separator' import { useToast } from '@/hooks/use-toast' import { LoadingSpinner } from './loading-states' import { ErrorBoundary } from './error-boundary' import { Settings, Building, Users, Shield, Bell, Palette, Globe, Mail, Phone, MapPin, Clock, Save, Upload, Image as ImageIcon } from 'lucide-react' import { SiteSettings, BusinessHours, SocialMediaLinks } from '@/types/database' interface StudioSettings extends SiteSettings { // Additional settings not in the base type emailNotifications: boolean smsNotifications: boolean bookingEnabled: boolean onlinePayments: boolean requireDeposit: boolean depositAmount: number cancellationPolicy: string theme: 'light' | 'dark' | 'system' language: string timezone: string } export function SettingsManager() { const [settings, setSettings] = useState>({}) const [loading, setLoading] = useState(true) const [saving, setSaving] = useState(false) const [activeTab, setActiveTab] = useState('general') const { toast } = useToast() useEffect(() => { loadSettings() }, []) const loadSettings = async () => { try { const response = await fetch('/api/settings') if (!response.ok) throw new Error('Failed to load settings') const data = await response.json() setSettings(data) } catch (error) { toast({ title: 'Error', description: 'Failed to load settings', variant: 'destructive', }) } finally { setLoading(false) } } const saveSettings = async () => { setSaving(true) try { const response = await fetch('/api/settings', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(settings), }) if (!response.ok) throw new Error('Failed to save settings') toast({ title: 'Success', description: 'Settings saved successfully', }) } catch (error) { toast({ title: 'Error', description: 'Failed to save settings', variant: 'destructive', }) } finally { setSaving(false) } } const updateSetting = (key: string, value: any) => { setSettings(prev => ({ ...prev, [key]: value })) } const updateNestedSetting = (parent: string, key: string, value: any) => { setSettings(prev => ({ ...prev, [parent]: { ...(prev[parent as keyof StudioSettings] as any), [key]: value } })) } const updateBusinessHours = (dayIndex: number, field: string, value: any) => { const businessHours = [...(settings.businessHours || [])] if (!businessHours[dayIndex]) { businessHours[dayIndex] = { dayOfWeek: dayIndex, openTime: '09:00', closeTime: '17:00', isClosed: false } } businessHours[dayIndex] = { ...businessHours[dayIndex], [field]: value } updateSetting('businessHours', businessHours) } const dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] if (loading) { return } return (
General Business Booking Users Appearance Advanced {/* General Settings */} Studio Information Basic information about your tattoo studio.
updateSetting('studioName', e.target.value)} placeholder="United Tattoo Studio" />
updateSetting('phone', e.target.value)} placeholder="+1 (555) 123-4567" />