import { useTranslation } from '@/hooks/useI18n'; import { zodResolver } from '@hookform/resolvers/zod'; import { useMutation } from '@tanstack/react-query'; import React, { useCallback, useState } from 'react'; import { useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; import { communityListingFormSchema, CONDITION_OPTIONS, LISTING_CATEGORIES, PRICE_TYPE_OPTIONS, RATE_TYPE_OPTIONS, SERVICE_TYPE_OPTIONS, type CommunityListingFormData, } from '@/schemas/community'; import { createCommunityListing } from '@/services/discovery-api'; import { Alert } from '@/components/ui/Alert'; import Button from '@/components/ui/Button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card'; import Checkbox from '@/components/ui/Checkbox'; import { FormField } from '@/components/ui/FormField'; import ImageGallery from '@/components/ui/ImageGallery'; import Input from '@/components/ui/Input'; import { Stack } from '@/components/ui/layout'; import MapPicker from '@/components/ui/MapPicker'; import Select from '@/components/ui/Select'; import Spinner from '@/components/ui/Spinner'; import Textarea from '@/components/ui/Textarea'; import { Heading, Text } from '@/components/ui/Typography'; import { Euro, MapPin, Tag, Upload } from 'lucide-react'; interface CreateCommunityListingFormProps { onSuccess?: (listing: any) => void; onCancel?: () => void; } const CreateCommunityListingForm: React.FC = ({ onSuccess, onCancel, }) => { const { t } = useTranslation(); const navigate = useNavigate(); const [currentStep, setCurrentStep] = useState(1); const totalSteps = 3; const { register, handleSubmit, watch, setValue, formState: { errors, isValid }, trigger, } = useForm({ resolver: zodResolver(communityListingFormSchema), mode: 'onChange', defaultValues: { pickup_available: true, delivery_available: false, }, }); const listingType = watch('listing_type'); const priceType = watch('price_type'); const deliveryAvailable = watch('delivery_available'); const createMutation = useMutation({ mutationFn: createCommunityListing, onSuccess: (data) => { onSuccess?.(data); navigate('/discovery', { state: { message: t('community.createSuccess') }, }); }, }); const onSubmit = useCallback( async (data: CommunityListingFormData) => { try { await createMutation.mutateAsync(data); } catch (error) { console.error('Failed to create listing:', error); } }, [createMutation] ); const handleNext = async () => { const isStepValid = await trigger(); if (isStepValid) { setCurrentStep((prev) => Math.min(prev + 1, totalSteps)); } }; const handlePrev = () => { setCurrentStep((prev) => Math.max(prev - 1, 1)); }; const handleLocationChange = useCallback( (location: { lat: number; lng: number }) => { setValue('latitude', location.lat); setValue('longitude', location.lng); }, [setValue] ); const handleImagesChange = useCallback( (images: string[]) => { setValue('images', images); }, [setValue] ); const handleTagsChange = useCallback( (tags: string[]) => { setValue('tags', tags); }, [setValue] ); const renderStep1 = () => ( {t('community.form.basicInfo')}