import { useState, useCallback } from 'react'; import { Modal, Form, Button, Select } from 'antd'; import debounce from 'lodash/debounce'; import { userFilterUICall } from "@/components/networking"; interface User { user_id: string; user_email: string; role?: string; } interface UserOption { label: string; value: string; user: User; } interface FormValues { user_email: string; user_id: string; role: 'admin' | 'user'; } interface UserSearchModalProps { isVisible: boolean; onCancel: () => void; onSubmit: (values: FormValues) => void; accessToken: string | null; } const UserSearchModal: React.FC = ({ isVisible, onCancel, onSubmit, accessToken }) => { const [form] = Form.useForm(); const [userOptions, setUserOptions] = useState([]); const [loading, setLoading] = useState(false); const [selectedField, setSelectedField] = useState<'user_email' | 'user_id'>('user_email'); const fetchUsers = async (searchText: string, fieldName: 'user_email' | 'user_id'): Promise => { if (!searchText) { setUserOptions([]); return; } setLoading(true); try { const params = new URLSearchParams(); params.append(fieldName, searchText); if (accessToken == null) { return; } const response = await userFilterUICall(accessToken, params); const data: User[] = response const options: UserOption[] = data.map(user => ({ label: fieldName === 'user_email' ? `${user.user_email}` : `${user.user_id}`, value: fieldName === 'user_email' ? user.user_email : user.user_id, user })); setUserOptions(options); } catch (error) { console.error('Error fetching users:', error); } finally { setLoading(false); } }; const debouncedSearch = useCallback( debounce((text: string, fieldName: 'user_email' | 'user_id') => fetchUsers(text, fieldName), 300), [] ); const handleSearch = (value: string, fieldName: 'user_email' | 'user_id'): void => { setSelectedField(fieldName); debouncedSearch(value, fieldName); }; const handleSelect = (_value: string, option: UserOption): void => { const selectedUser = option.user; form.setFieldsValue({ user_email: selectedUser.user_email, user_id: selectedUser.user_id, role: form.getFieldValue('role') // Preserve current role selection }); }; const handleClose = (): void => { form.resetFields(); setUserOptions([]); onCancel(); }; return ( form={form} onFinish={onSubmit} labelCol={{ span: 8 }} wrapperCol={{ span: 16 }} labelAlign="left" initialValues={{ role: "user", }} > handleSearch(value, 'user_id')} onSelect={(value, option) => handleSelect(value, option as UserOption)} options={selectedField === 'user_id' ? userOptions : []} loading={loading} allowClear />
); }; export default UserSearchModal;