import React from 'react'; import { View, ScrollView, Alert } from 'react-native'; import { Formik } from 'formik'; import { MyText, MyTextInput, MyTouchableOpacity, tw, AppContainer, Checkbox } from 'common-ui'; import { trpc } from '../../../src/trpc-client'; import { useRouter } from 'expo-router'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; interface ConstantFormData { constants: ConstantItem[]; } interface ConstantItem { key: string; value: any; } const CONST_LABELS: Record = { minRegularOrderValue: 'Minimum Regular Order Value', freeDeliveryThreshold: 'Free Delivery Threshold', deliveryCharge: 'Delivery Charge', flashFreeDeliveryThreshold: 'Flash Free Delivery Threshold', flashDeliveryCharge: 'Flash Delivery Charge', platformFeePercent: 'Platform Fee Percent', taxRate: 'Tax Rate', minOrderAmountForCoupon: 'Minimum Order Amount for Coupon', maxCouponDiscount: 'Maximum Coupon Discount', flashDeliverySlotId: 'Flash Delivery Slot ID', readableOrderId: 'Readable Order ID', versionNum: 'Version Number', playStoreUrl: 'Play Store URL', appStoreUrl: 'App Store URL', popularItems: 'Popular Items', isFlashDeliveryEnabled: 'Enable Flash Delivery', supportMobile: 'Support Mobile', supportEmail: 'Support Email', }; interface ConstantInputProps { constant: ConstantItem; setFieldValue: (field: string, value: any) => void; index: number; router: any; } const ConstantInput: React.FC = ({ constant, setFieldValue, index, router }) => { const fieldName = `constants.${index}.value`; // Special handling for popularItems - show navigation button instead of input if (constant.key === 'popularItems') { return ( {CONST_LABELS[constant.key] || constant.key} router.push('/(drawer)/customize-app/popular-items')} style={tw`bg-blue-50 border-2 border-dashed border-blue-200 p-4 rounded-lg flex-row items-center justify-center`} > Manage Popular Items ({Array.isArray(constant.value) ? constant.value.length : 0} items) ); } // Handle boolean values - show checkbox if (typeof constant.value === 'boolean') { return ( {CONST_LABELS[constant.key] || constant.key} setFieldValue(fieldName, !constant.value)} size={28} /> {constant.value ? 'Enabled' : 'Disabled'} ); } // Handle different value types if (typeof constant.value === 'number') { return ( { const numValue = parseFloat(value); setFieldValue(fieldName, isNaN(numValue) ? 0 : numValue); }} keyboardType="numeric" placeholder="Enter number" /> ); } if (Array.isArray(constant.value)) { return ( { const arrayValue = value.split(',').map(s => s.trim()).filter(s => s.length > 0); setFieldValue(fieldName, arrayValue); }} placeholder="Enter comma separated values" /> ); } // Default to string return ( setFieldValue(fieldName, value)} placeholder="Enter value" /> ); }; export default function CustomizeApp() { const router = useRouter(); const { data: constants, isLoading: isLoadingConstants, refetch } = trpc.admin.const.getConstants.useQuery(); const { mutate: updateConstants, isPending: isUpdating } = trpc.admin.const.updateConstants.useMutation(); const handleSubmit = (values: ConstantFormData) => { // Filter out constants that haven't changed const changedConstants = values.constants.filter((constant, index) => { const original = constants?.[index]; return original && JSON.stringify(constant.value) !== JSON.stringify(original.value); }); if (changedConstants.length === 0) { Alert.alert('No Changes', 'No constants were modified.'); return; } updateConstants( { constants: changedConstants }, { onSuccess: (response) => { Alert.alert('Success', `Updated ${response.updatedCount} constants successfully.`); refetch(); }, onError: (error) => { Alert.alert('Error', 'Failed to update constants. Please try again.'); console.error('Update constants error:', error); }, } ); }; if (isLoadingConstants) { return ( Loading constants... ); } if (!constants) { return ( Failed to load constants ); } const initialValues: ConstantFormData = { constants: constants.map(c => ({ key: c.key, value: c.value ?? '' } as ConstantItem)), }; return ( Customize App Constants Modify application constants. Changes will take effect immediately. {({ handleSubmit, values, setFieldValue }) => ( {values.constants.map((constant, index) => ( ))} handleSubmit()} disabled={isUpdating} style={tw`bg-blue-500 p-4 rounded-lg mt-6 ${isUpdating ? 'opacity-50' : ''}`} > {isUpdating ? 'Updating...' : 'Save Changes'} )} ); }