import { useEffect, useRef } from "react"; import { View, Text, ScrollView, Dimensions } from "react-native"; import { Dialog, TextInput, IconButton } from "react-native-paper"; import { Controller, useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { Button } from "@/components/ui/Button"; import { DialogContainer } from "@/components/ui/DialogContainer"; import { LoadingSpinner } from "@/components/ui/LoadingSpinner"; import { User } from "@/store/models/User.model"; import { RiskEnum, RiskLabels } from "@/constants/riskEnum"; import { RoleEnum } from "@/constants/roleEnum"; import { OperationMode } from "@/constants/operationModeEnum"; import { CustomPicker, PickerItem } from "@/components/ui/CustomPicker"; import { userSchemaWithId, UserFormValues, } from "@/components/features/users/schemas/user.schema"; interface UserModalProps { visible: boolean; mode?: OperationMode; user?: User | null; isLoading?: boolean; onClose: () => void; onSubmit: (payload: Partial) => void | Promise; } export const UserModal = ({ visible, mode = OperationMode.ADD, user = null, isLoading = false, onClose, onSubmit, }: UserModalProps) => { const isEdit = mode === OperationMode.EDIT; const defaultValues: UserFormValues = { id: user?.id, firstName: user?.firstName ?? "", lastName: user?.lastName ?? "", email: user?.email ?? "", title: user?.title ?? "", riskStatus: user?.riskStatus ?? RiskEnum.LOW_RISK, }; const { control, handleSubmit, reset, formState: { errors, isDirty }, } = useForm({ resolver: zodResolver(userSchemaWithId), defaultValues, mode: "onChange", shouldUnregister: false, }); const userRef = useRef(user); userRef.current = user; useEffect(() => { if (!visible) return; const nextDefaults: UserFormValues = { id: userRef.current?.id, firstName: userRef.current?.firstName ?? "", lastName: userRef.current?.lastName ?? "", email: userRef.current?.email ?? "", title: userRef.current?.title ?? "", riskStatus: userRef.current?.riskStatus ?? RiskEnum.LOW_RISK, }; reset(nextDefaults, { keepDefaultValues: false }); }, [visible, reset, user?.id]); const windowHeight = Dimensions.get("window").height; const dialogVerticalMargin = 24; const dialogMaxHeight = windowHeight - dialogVerticalMargin - 60; const approxChrome = 140; const maxDialogContentHeight = Math.max(200, dialogMaxHeight - approxChrome); const submit = (vals: UserFormValues) => { const payload: Partial = { id: vals.id, firstName: vals.firstName.trim(), lastName: vals.lastName.trim(), email: vals.email.trim().toLowerCase(), title: vals.title.trim(), riskStatus: vals.riskStatus, role: isEdit ? (user?.role ?? RoleEnum.USER) : RoleEnum.USER, }; return onSubmit(payload); }; const titleText = isEdit ? "Edit User" : "Add User"; const submitText = isEdit ? "Edit" : "Add"; return ( {titleText} First Name ( <> {errors.firstName ? ( {errors.firstName.message} ) : null} )} /> Last Name ( <> {errors.lastName ? ( {errors.lastName.message} ) : null} )} /> Email ( <> {errors.email ? ( {errors.email.message} ) : null} )} /> Title ( <> {errors.title ? ( {errors.title.message} ) : null} )} /> Risk Status ( onChange(val)} className="h-10" enabled={!isLoading} > {Object.values(RiskEnum).map((v) => ( ))} )} /> {isLoading && ( )} ); };