import React, { useState, useEffect } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { AlertCircle, Check, Image as ImageIcon, Loader2, MapPin, Power, Save, Store, Upload } from 'lucide-react'; import { api, resolveMediaUrl } from '../../api'; interface Restaurant { id: string; owner_email: string; name: string; description: string; address: string; latitude: number; longitude: number; image_url: string | null; status: 'active' | 'closed'; } interface RestaurantProfileFormProps { onRestaurantUpdated?: (restaurant: Restaurant) => void; } export default function RestaurantProfileForm({ onRestaurantUpdated }: RestaurantProfileFormProps) { const queryClient = useQueryClient(); const [msg, setMsg] = useState<{ type: 'success' | 'error'; text: string } | null>(null); const [uploading, setUploading] = useState(false); const [formData, setFormData] = useState({ name: '', description: '', address: '', latitude: 37.7749, longitude: -122.4194, image_url: '', status: 'active' as 'active' | 'closed', }); const { data, isLoading } = useQuery({ queryKey: ['restaurant-me'], queryFn: async () => { const res = await api.get('/api/restaurants/me'); return (res.data?.restaurant || null) as Restaurant | null; }, }); useEffect(() => { if (data) { setFormData({ name: data.name || '', description: data.description || '', address: data.address || '', latitude: typeof data.latitude === 'number' ? data.latitude : 37.7749, longitude: typeof data.longitude === 'number' ? data.longitude : -122.4194, image_url: data.image_url || '', status: data.status || 'active', }); if (onRestaurantUpdated) { onRestaurantUpdated(data); } } }, [data, onRestaurantUpdated]); const uploadMutation = useMutation({ mutationFn: async (file: File) => { const fd = new FormData(); fd.append('file', file); const res = await api.post('/api/upload', fd, { headers: { 'Content-Type': undefined }, }); return res.data?.url as string; }, onSuccess: (url) => { setFormData((prev) => ({ ...prev, image_url: url })); setMsg({ type: 'success', text: 'Image uploaded successfully' }); setUploading(false); }, onError: () => { setMsg({ type: 'error', text: 'Failed to upload image' }); setUploading(false); }, }); const saveMutation = useMutation({ mutationFn: async () => { if (data?.id) { const res = await api.patch(`/api/restaurants/${data.id}`, { name: formData.name, description: formData.description, address: formData.address, latitude: Number(formData.latitude), longitude: Number(formData.longitude), image_url: formData.image_url, status: formData.status, }); return res.data?.restaurant as Restaurant; } else { const res = await api.post('/api/restaurants', { name: formData.name, description: formData.description, address: formData.address, latitude: Number(formData.latitude), longitude: Number(formData.longitude), image_url: formData.image_url, }); return res.data?.restaurant as Restaurant; } }, onSuccess: (updatedRestaurant) => { queryClient.invalidateQueries({ queryKey: ['restaurant-me'] }); queryClient.invalidateQueries({ queryKey: ['restaurants'] }); setMsg({ type: 'success', text: 'Restaurant profile saved successfully!' }); if (onRestaurantUpdated && updatedRestaurant) { onRestaurantUpdated(updatedRestaurant); } }, onError: (err: any) => { setMsg({ type: 'error', text: err?.response?.data?.msg || 'Failed to save restaurant profile' }); }, }); const handleImageChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setUploading(true); uploadMutation.mutate(file); } }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); setMsg(null); saveMutation.mutate(); }; const handleToggleStatus = async () => { const newStatus = formData.status === 'active' ? 'closed' : 'active'; setFormData((prev) => ({ ...prev, status: newStatus })); if (data?.id) { try { await api.patch(`/api/restaurants/${data.id}`, { status: newStatus, }); queryClient.invalidateQueries({ queryKey: ['restaurant-me'] }); setMsg({ type: 'success', text: `Store status changed to ${newStatus}` }); } catch (err) { setFormData((prev) => ({ ...prev, status: data.status })); setMsg({ type: 'error', text: 'Failed to update store status' }); } } }; if (isLoading) { return (
Loading kitchen profile...
); } return (

{data ? 'Kitchen Profile & Settings' : 'Register Your Restaurant'}

Configure your store details, operational status, and location for delivery dispatch.

{data && (
Store Status:
)}
{msg && (
{msg.type === 'success' ? : } {msg.text}
)}
setFormData({ ...formData, name: e.target.value })} placeholder="e.g. Spice Garden Bistro" className="w-full px-3 py-2 bg-background border border-border rounded-md text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-accent" />
setFormData({ ...formData, address: e.target.value })} placeholder="123 Culinary Way, Downtown" className="w-full pl-9 pr-3 py-2 bg-background border border-border rounded-md text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-accent" />