"use client"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { FieldErrors, FormProvider, SubmitErrorHandler, SubmitHandler, useForm, useFormContext, } from "react-hook-form"; import { Box, Card, CardContent, Grid, IconButton, InputAdornment, Stack, Tab, Tabs, TabsProps, TextField, Typography, } from "@mui/material"; import { differenceBy } from "lodash"; import { CreateGroupInputs, auth } from "@/app/api/group/actions"; import SearchResults, { Column } from "../SearchResults"; import { Add, Clear, Remove, Search } from "@mui/icons-material"; import { UserResult } from "@/app/api/user"; export interface Props { users: UserResult[]; } const UserAllocation: React.FC = ({ users }) => { console.log(users) const { t } = useTranslation(); const { setValue, getValues, formState: { defaultValues }, reset, resetField, } = useFormContext(); const initialUsers = users.map((u) => ({ ...u })).sort((a, b) => a.id - b.id).filter((u) => u.groupId === null); const [filteredUsers, setFilteredUsers] = useState(initialUsers); const [selectedUsers, setSelectedUsers] = useState( () => { return filteredUsers.filter( (s) => getValues("addUserIds")?.includes(s.id) ); } ); // Adding / Removing Auth const addUser = useCallback((users: UserResult) => { setSelectedUsers((a) => [...a, users]); }, []); const removeUser = useCallback((users: UserResult) => { setSelectedUsers((a) => a.filter((a) => a.id !== users.id)); }, []); const clearUser = useCallback(() => { if (defaultValues !== undefined) { resetField("addUserIds"); setSelectedUsers( initialUsers.filter((s) => defaultValues.addUserIds?.includes(s.id)) ); } }, [defaultValues]); // Sync with form useEffect(() => { setValue( "addUserIds", selectedUsers.map((u) => u.id) ); }, [selectedUsers, setValue]); const UserPoolColumns = useMemo[]>( () => [ { label: t("Add"), name: "id", onClick: addUser, buttonIcon: , }, { label: t("Username"), name: "username" }, { label: t("Staff Name"), name: "name" }, ], [addUser, t] ); const allocatedUserColumns = useMemo[]>( () => [ { label: t("Remove"), name: "id", onClick: removeUser, buttonIcon: , }, { label: t("Username"), name: "username" }, { label: t("Staff Name"), name: "name" }, ], [removeUser, selectedUsers, t] ); const [query, setQuery] = React.useState(""); const onQueryInputChange = React.useCallback< React.ChangeEventHandler >((e) => { setQuery(e.target.value); }, []); const clearQueryInput = React.useCallback(() => { setQuery(""); }, []); React.useEffect(() => { const q = query.toLowerCase(); setFilteredUsers( initialUsers.filter((u) => ( u.username.toLowerCase().includes(q) || u.name.toLowerCase().includes(q) )) ); }, [users, query]); const resetUser = React.useCallback(() => { clearQueryInput(); clearUser(); }, [clearQueryInput, clearUser]); const formProps = useForm({}); // Tab related const [tabIndex, setTabIndex] = React.useState(0); const handleTabChange = React.useCallback>( (_e, newValue) => { setTabIndex(newValue); }, [] ); return ( <> {/* {t("User")} */} ), }} /> {tabIndex === 0 && ( )} {tabIndex === 1 && ( )} ); }; export default UserAllocation;