import React, { useState, useEffect } from 'react'; import { View, TouchableOpacity, Alert, ScrollView } from 'react-native'; import { useFormik } from 'formik'; import { MyText, tw, DatePicker, MyTextInput } from 'common-ui'; import BottomDropdown from 'common-ui/src/components/bottom-dropdown'; import { trpc } from '../src/trpc-client'; interface VendorSnippet { id: number; snippetCode: string; slotId: number; productIds: number[]; validTill: string | null; createdAt: string; } interface VendorSnippetFormProps { snippet?: VendorSnippet | null; onClose: () => void; onSuccess: () => void; } const VendorSnippetForm: React.FC = ({ snippet, onClose, onSuccess, }) => { // Fetch slots and products const { data: slotsData } = trpc.user.slots.getSlots.useQuery(); const { data: productsData } = trpc.common.product.getAllProductsSummary.useQuery({}); const createSnippet = trpc.admin.vendorSnippets.create.useMutation(); const updateSnippet = trpc.admin.vendorSnippets.update.useMutation(); const isEditing = !!snippet; const formik = useFormik({ initialValues: { snippetCode: snippet?.snippetCode || '', slotId: snippet?.slotId?.toString() || '', productIds: snippet?.productIds?.map(id => id.toString()) || [], validTill: snippet?.validTill ? new Date(snippet.validTill) : null, }, validate: (values) => { const errors: {[key: string]: string} = {}; if (!values.snippetCode.trim()) { errors.snippetCode = 'Snippet code is required'; } if (!values.slotId) { errors.slotId = 'Slot selection is required'; } if (values.productIds.length === 0) { errors.productIds = 'At least one product must be selected'; } return errors; }, onSubmit: async (values) => { try { const submitData = { snippetCode: values.snippetCode, slotId: parseInt(values.slotId), productIds: values.productIds.map(id => parseInt(id)), validTill: values.validTill?.toISOString(), }; if (isEditing && snippet) { await updateSnippet.mutateAsync({ id: snippet.id, updates: submitData, }); Alert.alert('Success', 'Vendor snippet updated successfully'); } else { await createSnippet.mutateAsync(submitData); Alert.alert('Success', 'Vendor snippet created successfully'); } onSuccess(); onClose(); } catch (error: any) { Alert.alert('Error', error.message || 'Failed to save vendor snippet'); } }, }); // Generate unique snippet code if creating new (only on mount) useEffect(() => { if (!isEditing && !formik.values.snippetCode) { const timestamp = Date.now(); const random = Math.random().toString(36).substring(2, 8); formik.setFieldValue('snippetCode', `VS_${timestamp}_${random}`.toUpperCase()); } }, [isEditing]); // Removed formik.values.snippetCode from deps const slotOptions = slotsData?.slots.map(slot => ({ label: new Date(slot.deliveryTime).toLocaleString(), value: slot.id.toString(), })) || []; const productOptions = productsData?.products.map(product => ({ label: `${product.name} (${product.unit})`, value: product.id.toString(), })) || []; const selectedProductLabels = formik.values.productIds .map(id => productOptions.find(opt => opt.value === id)?.label) .filter(Boolean) .join(', '); return ( {isEditing ? 'Edit Vendor Snippet' : 'Create Vendor Snippet'} {/* Snippet Code */} {formik.errors.snippetCode && formik.touched.snippetCode && ( {formik.errors.snippetCode} )} {/* Slot Selection */} Delivery Slot formik.setFieldValue('slotId', value)} placeholder="Choose a delivery slot" /> {formik.errors.slotId && formik.touched.slotId && ( {formik.errors.slotId} )} {/* Product Selection */} Products formik.setFieldValue('productIds', values)} multiple={true} placeholder="Select products" /> {formik.values.productIds.length > 0 && ( Selected: {selectedProductLabels} )} {formik.errors.productIds && formik.touched.productIds && ( {formik.errors.productIds} )} {/* Valid Till Date */} Valid Till (Optional) formik.setFieldValue('validTill', date)} placeholder="Select expiry date" showLabel={false} /> Leave empty for no expiry {/* Submit Button */} formik.handleSubmit()} disabled={formik.isSubmitting} style={tw`bg-blue-500 py-3 rounded-lg ${formik.isSubmitting ? 'opacity-50' : ''}`} > {formik.isSubmitting ? 'Saving...' : isEditing ? 'Update Snippet' : 'Create Snippet' } ); }; export default VendorSnippetForm;