import React, { useEffect, Fragment } from "react"; import type { KcProps } from "../../KcProps"; import type { Attribute } from "../../getKcContext/KcContextBase"; import { clsx } from "../../tools/clsx"; import type { ReactComponent } from "../../tools/ReactComponent"; import { useCallbackFactory } from "../../tools/useCallbackFactory"; import { useFormValidationSlice } from "../../useFormValidationSlice"; import type { I18nBase } from "../../i18n"; import type { Param0 } from "tsafe/Param0"; export type UserProfileFormFieldsProps = { kcContext: Param0["kcContext"]; i18n: I18nBase; } & KcProps & Partial>> & { onIsFormSubmittableValueChange: (isFormSubmittable: boolean) => void; }; export function UserProfileFormFields({ kcContext, onIsFormSubmittableValueChange, i18n, BeforeField, AfterField, ...props }: UserProfileFormFieldsProps) { const { advancedMsg } = i18n; const { formValidationState: { fieldStateByAttributeName, isFormSubmittable }, formValidationReducer, attributesWithPassword } = useFormValidationSlice({ kcContext, i18n }); useEffect(() => { onIsFormSubmittableValueChange(isFormSubmittable); }, [isFormSubmittable]); const onChangeFactory = useCallbackFactory( ( [name]: [string], [ { target: { value } } ]: [React.ChangeEvent] ) => formValidationReducer({ "action": "update value", name, "newValue": value }) ); const onBlurFactory = useCallbackFactory(([name]: [string]) => formValidationReducer({ "action": "focus lost", name }) ); let currentGroup = ""; return ( <> {attributesWithPassword.map((attribute, i) => { const { group = "", groupDisplayHeader = "", groupDisplayDescription = "" } = attribute; const { value, displayableErrors } = fieldStateByAttributeName[attribute.name]; const formGroupClassName = clsx(props.kcFormGroupClass, displayableErrors.length !== 0 && props.kcFormGroupErrorClass); return ( {group !== currentGroup && (currentGroup = group) !== "" && (
{groupDisplayDescription !== "" && (
)}
)} {BeforeField && }
{attribute.required && <>*}
{(() => { const { options } = attribute.validators; if (options !== undefined) { return ( ); } return ( { switch (attribute.name) { case "password-confirm": case "password": return "password"; default: return "text"; } })()} id={attribute.name} name={attribute.name} value={value} onChange={onChangeFactory(attribute.name)} className={clsx(props.kcInputClass)} aria-invalid={displayableErrors.length !== 0} disabled={attribute.readOnly} autoComplete={attribute.autocomplete} onBlur={onBlurFactory(attribute.name)} /> ); })()} {displayableErrors.length !== 0 && (() => { const divId = `input-error-${attribute.name}`; return ( <> {displayableErrors.map(({ errorMessage }) => errorMessage)} ); })()}
{AfterField && }
); })} ); }