import {ReactElement} from "react" import {HiUsers} from "react-icons/hi" import {useTranslation} from "react-i18next" import {AxiosError} from "axios" import {useQuery} from "@tanstack/react-query" import { Box, Checkbox, Chip, FormControl, FormHelperText, InputAdornment, InputLabel, ListItemText, MenuItem, Select, SelectProps, } from "@mui/material" import {GetAdminUsersResponse, getAdminUsers} from "~/apis" import {useUser} from "~/hooks" export interface UsersSelectFieldProps extends Omit { onChange: SelectProps["onChange"] value: GetAdminUsersResponse["users"] helperText?: string | string[] error?: boolean } export default function UsersSelectField({ value, onChange, helperText, error, ...props }: UsersSelectFieldProps): ReactElement { const {t} = useTranslation() const meUser = useUser() const {data: {users} = {}} = useQuery( ["getAdminUsers"], getAdminUsers, ) const findUser = (id: string) => users?.find(user => user.id === id) const userIds = value?.map(user => user.id) || [] return ( {t("routes.AdminRoute.forms.reservedAliases.fields.users.label")} {...props} multiple labelId="users-select" defaultValue={[]} value={userIds} startAdornment={ } renderValue={(selected: string[]) => ( {selected.map(value => ( ))} )} onChange={(event, child) => { if (!Array.isArray(event.target.value)) { return } // Since there will probably only be a few admin users, n^2 is fine const selectedUsers = (event.target.value as string[]).map(id => users!.find(user => user.id === id), ) if (!selectedUsers) { return } onChange!( // @ts-ignore { ...event, target: { ...event.target, value: selectedUsers as GetAdminUsersResponse["users"], }, }, child, ) }} name="users" id="users" error={error} label={t("routes.AdminRoute.forms.reservedAliases.fields.users.label")} > {users ? ( users.map(user => ( { // Check if user is me if (user.id === meUser.id) { return t( "routes.AdminRoute.forms.reservedAliases.fields.users.me", { email: user.email.address, }, ) } return user.email.address })()} /> )) ) : ( {t("general.loading")} )} {helperText ? {helperText} : null} ) }