import * as yup from "yup" import {ReactElement} from "react" import {AxiosError} from "axios" import {useTranslation} from "react-i18next" import {useFormik} from "formik" import {BiText} from "react-icons/bi" import {useMutation} from "@tanstack/react-query" import {Grid, InputAdornment, TextField} from "@mui/material" import {CreateReservedAliasData, GetAdminUsersResponse, createReservedAlias} from "~/apis" import {useErrorSuccessSnacks, useNavigateToNext} from "~/hooks" import {ReservedAlias} from "~/server-types" import {parseFastAPIError} from "~/utils" import {SimpleForm} from "~/components" import AliasExplanation from "~/route-widgets/CreateReservedAliasRoute/AliasExplanation" import UsersSelectField from "~/route-widgets/CreateReservedAliasRoute/UsersSelectField" interface Form { local: string users: GetAdminUsersResponse["users"] isActive?: boolean detail?: string } export default function CreateReservedAliasRoute(): ReactElement { const {t} = useTranslation() const {showSuccess} = useErrorSuccessSnacks() const navigateToNext = useNavigateToNext("/admin/reserved-aliases") const {mutateAsync: createAlias} = useMutation< ReservedAlias, AxiosError, CreateReservedAliasData >(createReservedAlias, { onSuccess: () => { showSuccess(t("relations.alias.mutations.success.aliasCreation")) navigateToNext() }, }) const schema = yup.object().shape({ local: yup .string() .required() .label(t("routes.AdminRoute.forms.reservedAliases.fields.local.label")), isActive: yup .boolean() .label(t("routes.AdminRoute.forms.reservedAliases.fields.isActive.label")), // Only store IDs of users, as they provide a reference to the user users: yup .array() .of( yup.object().shape({ id: yup.string(), email: yup.object().shape({ id: yup.string(), address: yup.string(), }), }), ) .label(t("routes.AdminRoute.forms.reservedAliases.fields.users.label")), }) const formik = useFormik