import React, { useState, useEffect } from 'react'; import { Modal, Form, Input, Select as AntSelect, Button as AntButton, message } from 'antd'; import { Select, SelectItem } from "@tremor/react"; import { Card, Text } from "@tremor/react"; interface BaseMember { user_email?: string; user_id?: string; role: string; } interface ModalConfig { title: string; roleOptions: Array<{ label: string; value: string; }>; defaultRole?: string; showEmail?: boolean; showUserId?: boolean; additionalFields?: Array<{ name: string; label: string; type: 'input' | 'select'; options?: Array<{ label: string; value: string }>; rules?: any[]; }>; } interface MemberModalProps { visible: boolean; onCancel: () => void; onSubmit: (data: T) => void; initialData?: T | null; mode: 'add' | 'edit'; config: ModalConfig; } const MemberModal = ({ visible, onCancel, onSubmit, initialData, mode, config }: MemberModalProps) => { const [form] = Form.useForm(); console.log("Initial Data:", initialData); // Reset form and set initial values when modal becomes visible or initialData changes useEffect(() => { if (visible) { if (mode === 'edit' && initialData) { // For edit mode, use the initialData values form.setFieldsValue({ ...initialData, // Ensure role is set correctly for editing role: initialData.role || config.defaultRole }); } else { // For add mode, reset to defaults form.resetFields(); form.setFieldsValue({ role: config.defaultRole || config.roleOptions[0]?.value }); } } }, [visible, initialData, mode, form, config.defaultRole, config.roleOptions]); const handleSubmit = async (values: any) => { try { // Trim string values const formData = Object.entries(values).reduce((acc, [key, value]) => ({ ...acc, [key]: typeof value === 'string' ? value.trim() : value }), {}) as T; onSubmit(formData); form.resetFields(); message.success(`Successfully ${mode === 'add' ? 'added' : 'updated'} member`); } catch (error) { message.error('Failed to submit form'); console.error('Form submission error:', error); } }; // Helper function to get role label from value const getRoleLabel = (value: string) => { return config.roleOptions.find(option => option.value === value)?.label || value; }; const renderField = (field: { name: string; label: string; type: 'input' | 'select'; options?: Array<{ label: string; value: string }>; rules?: any[]; }) => { switch (field.type) { case 'input': return ( { e.target.value = e.target.value.trim(); }} /> ); case 'select': return ( {field.options?.map(option => ( {option.label} ))} ); default: return null; } }; return (
{config.showEmail && ( { e.target.value = e.target.value.trim(); }} /> )} {config.showEmail && config.showUserId && (
OR
)} {config.showUserId && ( { e.target.value = e.target.value.trim(); }} /> )} Role {mode === 'edit' && initialData && ( (Current: {getRoleLabel(initialData.role)}) )} } name="role" className="mb-4" rules={[ { required: true, message: 'Please select a role!' } ]} > {mode === 'edit' && initialData ? [ // Current role first ...config.roleOptions.filter(option => option.value === initialData.role), // Then all other roles ...config.roleOptions.filter(option => option.value !== initialData.role) ].map(option => ( {option.label} )) : config.roleOptions.map(option => ( {option.label} ))} {config.additionalFields?.map(field => ( {renderField(field)} ))}
Cancel {mode === 'add' ? 'Add Member' : 'Save Changes'}
); }; export default MemberModal;