import React, { useState } from 'react'; import { View, TextInput, ActivityIndicator, KeyboardAvoidingView, Platform, Alert } from 'react-native'; import { MaterialIcons } from '@expo/vector-icons' import { MyText, ImageUploaderNeo, tw, MyTouchableOpacity, type ImageUploaderNeoItem, type ImageUploaderNeoPayload } from 'common-ui' import { trpc } from '@/src/trpc-client' import { useUploadToObjectStorage } from '../hooks/useUploadToObjectStore' interface ComplaintFormProps { open: boolean; onClose: () => void; orderId: number; } export default function ComplaintForm({ open, onClose, orderId }: ComplaintFormProps) { const [complaintBody, setComplaintBody] = useState(''); const [complaintImages, setComplaintImages] = useState([]) const raiseComplaintMutation = trpc.user.complaint.raise.useMutation() const { upload, isUploading } = useUploadToObjectStorage() const handleAddImages = (images: ImageUploaderNeoPayload[]) => { setComplaintImages((prev) => [ ...prev, ...images.map((image) => ({ imgUrl: image.url, mimeType: image.mimeType, })), ]) } const handleRemoveImage = (image: ImageUploaderNeoPayload) => { setComplaintImages((prev) => prev.filter((item) => item.imgUrl !== image.url)) } const handleSubmit = async () => { if (!complaintBody.trim()) { Alert.alert('Error', 'Please enter complaint details'); return; } try { let imageUrls: string[] = [] if (complaintImages.length > 0) { const uploadImages = await Promise.all( complaintImages.map(async (image) => { const response = await fetch(image.imgUrl) const blob = await response.blob() return { blob, mimeType: image.mimeType || 'image/jpeg' } }) ) const { keys } = await upload({ images: uploadImages, contextString: 'complaint', }) imageUrls = keys } await raiseComplaintMutation.mutateAsync({ orderId: orderId.toString(), complaintBody: complaintBody.trim(), imageUrls, }) Alert.alert('Success', 'Complaint raised successfully') setComplaintBody('') setComplaintImages([]) onClose() } catch (error: any) { Alert.alert('Error', error.message || 'Failed to raise complaint') } } if (!open) return null; return ( Raise Complaint Describe the issue {raiseComplaintMutation.isPending || isUploading ? ( ) : ( Submit Complaint )} ); }