import React from 'react'; import { View, TouchableOpacity, Alert, ScrollView } from 'react-native'; import { useFormik } from 'formik'; import { MyText, tw, MyTextInput, MyTouchableOpacity, theme, BottomDropdown } from 'common-ui'; import { trpc } from '../src/trpc-client'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; interface ProductGroup { id: number; groupName: string; description: string | null; createdAt: string; products: any[]; productCount: number; } interface ProductGroupFormProps { group?: ProductGroup | null; onClose: () => void; onSuccess: () => void; } const ProductGroupForm: React.FC = ({ group, onClose, onSuccess, }) => { // Fetch products const { data: productsData } = trpc.common.product.getAllProductsSummary.useQuery({}); const createGroup = trpc.admin.product.createGroup.useMutation(); const updateGroup = trpc.admin.product.updateGroup.useMutation(); const isEditing = !!group; const products = productsData?.products || []; const productOptions = products.map(product => ({ label: `${product.name}${product.shortDescription ? ` - ${product.shortDescription}` : ''}`, value: product.id, })); const formik = useFormik({ initialValues: { group_name: group?.groupName || '', description: group?.description || '', product_ids: group?.products?.map(p => p.id) || [], }, validate: (values) => { const errors: {[key: string]: string} = {}; if (!values.group_name.trim()) { errors.group_name = 'Group name is required'; } return errors; }, onSubmit: async (values) => { try { if (isEditing) { await updateGroup.mutateAsync({ id: group.id, group_name: values.group_name, description: values.description, product_ids: values.product_ids, }); } else { await createGroup.mutateAsync({ group_name: values.group_name, description: values.description, product_ids: values.product_ids, }); } onSuccess(); } catch (error: any) { Alert.alert('Error', error.message || 'Failed to save group'); } }, }); return ( {/* Header */} {isEditing ? 'Edit Product Group' : 'Create Product Group'} {/* Group Name */} formik.setFieldValue('group_name', text)} style={{ marginBottom: 16 }} /> {formik.errors.group_name && ( {formik.errors.group_name} )} {/* Description */} formik.setFieldValue('description', text)} style={{ marginBottom: 16 }} /> {/* Products Selection */} formik.setFieldValue('product_ids', value as number[])} multiple={true} placeholder="Select products" style={{ marginBottom: 16 }} /> {/* Actions */} Cancel formik.handleSubmit()} disabled={createGroup.isPending || updateGroup.isPending} style={tw`flex-1 bg-brand600 rounded-lg py-4 items-center`} > {createGroup.isPending || updateGroup.isPending ? 'Saving...' : 'Save'} ); }; export default ProductGroupForm;