import { ActionGroup, Alert, Button, ExpandableSection, Form, } from "@patternfly/react-core"; import { useState } from "react"; import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useAlerts } from "ui-shared"; import { getPersonalInfo, savePersonalInfo } from "../api/methods"; import { UserProfileMetadata, UserRepresentation, } from "../api/representations"; import { Page } from "../components/page/Page"; import { environment } from "../environment"; import { keycloak } from "../keycloak"; import { usePromise } from "../utils/usePromise"; import { FormField } from "./FormField"; type FieldError = { field: string; errorMessage: string; params: string[]; }; const ROOT_ATTRIBUTES = ["username", "firstName", "lastName", "email"]; export const isBundleKey = (key?: string) => key?.includes("${"); export const unWrap = (key: string) => key.substring(2, key.length - 1); export const isRootAttribute = (attr?: string) => attr && ROOT_ATTRIBUTES.includes(attr); export const fieldName = (name: string) => `${isRootAttribute(name) ? "" : "attributes."}${name}`; const PersonalInfo = () => { const { t } = useTranslation(); const [userProfileMetadata, setUserProfileMetadata] = useState(); const form = useForm({ mode: "onChange" }); const { handleSubmit, reset, setError } = form; const { addAlert, addError } = useAlerts(); usePromise( (signal) => getPersonalInfo({ signal }), (personalInfo) => { setUserProfileMetadata(personalInfo.userProfileMetadata); reset(personalInfo); } ); const onSubmit = async (user: UserRepresentation) => { try { await savePersonalInfo(user); addAlert(t("accountUpdatedMessage")); } catch (error) { addError(t("accountUpdatedError").toString()); (error as FieldError[]).forEach((e) => { const params = Object.assign( {}, e.params.map((p) => (isBundleKey(p) ? unWrap(p) : p)) ); setError(fieldName(e.field) as keyof UserRepresentation, { message: t(e.errorMessage, { ...params, defaultValue: e.field }), type: "server", }); }); } }; return (
{(userProfileMetadata?.attributes || []).map((attribute) => ( ))} {environment.features.deleteAccountAllowed && ( keycloak.login({ action: "delete_account", }) } className="delete-button" > {t("doDelete")} } > {t("deleteAccountWarning")} )}
); }; export default PersonalInfo;