"use client"; import { useRouter, useSearchParams } from "next/navigation"; import React, { useCallback, useEffect, useLayoutEffect, useMemo, useState, } from "react"; // import { TeamResult } from "@/app/api/team"; import { useTranslation } from "react-i18next"; import { Button, Card, CardContent, Grid, Stack, Tab, Tabs, TabsProps, TextField, Typography, } from "@mui/material"; import { FieldErrors, FormProvider, SubmitErrorHandler, SubmitHandler, useForm, useFormContext, } from "react-hook-form"; import { Check, Close, Error as ErrorIcon, RestartAlt } from "@mui/icons-material"; import { UserInputs, adminChangePassword, fetchUserDetails, createUser, } from "@/app/api/user/actions"; import UserDetail from "./UserDetail"; import { UserResult, passwordRule } from "@/app/api/user"; import { auth } from "@/app/api/group/actions"; import AuthAllocation from "./AuthAllocation"; interface Props { rules: passwordRule; auths: auth[]; } /** FP-MTMS Version Checklist | Functions Ref. No. 62 | v1.0.0 | 2026-08-10 */ const CreateUser: React.FC = ({ rules, auths }) => { // console.log(auths); const { t } = useTranslation("user"); const formProps = useForm(); const searchParams = useSearchParams(); const id = parseInt(searchParams.get("id") || "0"); const [tabIndex, setTabIndex] = useState(0); const router = useRouter(); const [serverError, setServerError] = useState(""); const addAuthIds = auths && auths.length > 0 ? auths .filter((item) => item.v === 1) .map((item) => item.id) .sort((a, b) => a - b) : []; const handleTabChange = useCallback>( (_e, newValue) => { setTabIndex(newValue); }, [], ); const errors = formProps.formState.errors; const resetForm = React.useCallback((e?: React.MouseEvent) => { e?.preventDefault(); e?.stopPropagation(); console.log("triggerred"); console.log(addAuthIds); try { formProps.reset({ username: "", name: "", staffNo: "", addAuthIds: addAuthIds, removeAuthIds: [], password: "", }); console.log(formProps.formState.defaultValues); } catch (error) { console.log(error); setServerError(t("An error has occurred. Please try again later.")); } }, [formProps, addAuthIds, t]); useEffect(() => { resetForm(); }, []); const hasErrorsInTab = ( tabIndex: number, errors: FieldErrors, ) => { switch (tabIndex) { case 0: return Object.keys(errors).length > 0; default: false; } }; const handleCancel = () => { router.back(); }; const onSubmit = useCallback>( async (data) => { try { let haveError = false; const regex_pw = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,20}$/; let pw = ""; if (data.password && data.password.length > 0) { pw = data.password; if (pw.length < rules.min) { haveError = true; formProps.setError("password", { message: t("The password requires 8-20 characters."), type: "required", }); } if (pw.length > rules.max) { haveError = true; formProps.setError("password", { message: t("The password requires 8-20 characters."), type: "required", }); } if (!regex_pw.test(pw)) { haveError = true; formProps.setError("password", { message: t( "A combination of uppercase letters, lowercase letters, numbers, and symbols is required.", ), type: "required", }); } } const userData: UserInputs = { username: data.username, name: data.name ?? "", staffNo: data.staffNo, locked: false, addAuthIds: data.addAuthIds || [], removeAuthIds: data.removeAuthIds || [], password: pw, }; const pwData = { id: id, password: pw, newPassword: "", }; if (haveError) { return; } console.log("passed"); console.log(userData); await createUser(userData); // if (data.password && data.password.length > 0) { // await adminChangePassword(pwData); // } router.replace("/settings/user"); } catch (e) { console.log(e); const msg = e instanceof Error ? e.message : String(e); if (msg.includes("USERNAME_NOT_AVAILABLE")) { const text = t("Username is already taken"); setServerError(text); formProps.setError("username", { message: text, type: "validate" }); } else if (msg.includes("NAME_NOT_AVAILABLE")) { const text = t("Name is already taken"); setServerError(text); formProps.setError("name", { message: text, type: "validate" }); } else if (msg.includes("STAFF_NO_NOT_AVAILABLE")) { const text = t("Staff No is already taken"); setServerError(text); formProps.setError("staffNo", { message: text, type: "validate" }); } else if (msg.includes("USER_WRONG_NEW_PWD")) { setServerError(t("New password does not meet the rules")); } else if (/\b400\b/.test(msg)) { setServerError(t("Invalid request. Please check your input")); } else if (/\b401\b/.test(msg) || /\b403\b/.test(msg)) { setServerError(t("Unauthorized or no permission")); } else if (/\b404\b/.test(msg)) { setServerError(t("User Not Found")); } else if (/\b500\b/.test(msg)) { setServerError(t("Server error. Please try again later")); } else { setServerError(t("An error has occurred. Please try again later.")); } } }, [router], ); const onSubmitError = useCallback>( (errors) => { console.log(errors); }, [], ); return ( <> {serverError && ( {serverError} )} ) : undefined } iconPosition="end" /> {tabIndex == 0 && } {tabIndex === 1 && } ); }; export default CreateUser;