Register form hook finally completed

This commit is contained in:
Joseph Garrone 2024-05-04 20:36:54 +02:00
parent f7d733b407
commit 2db0e8f68a

View File

@ -186,64 +186,65 @@ export function useUserProfileForm(params: ParamsOfUseUserProfileForm): ReturnTy
const [state, dispatchFormAction] = useReducer( const [state, dispatchFormAction] = useReducer(
function reducer(state: internal.State, params: FormAction): internal.State { function reducer(state: internal.State, params: FormAction): internal.State {
if (params.action === "add value to multi-valued attribute") { const formFieldState = state.formFieldStates.find(({ attribute }) => attribute.name === params.name);
const formFieldStates = state.formFieldStates.filter(({ name }) => name === params.name);
state.formFieldStates.splice(state.formFieldStates.indexOf(formFieldStates[formFieldStates.length - 1]) + 1, 0, {
"index": formFieldStates.length,
"name": params.name,
"value": "",
"errors": getErrors({
"name": params.name,
"index": formFieldStates.length,
"fieldValues": state.formFieldStates
}),
"hasLostFocusAtLeastOnce": false,
"attribute": formFieldStates[0].attribute
});
return state;
}
const formFieldState = state.formFieldStates.find(({ name, index }) => name === params.name && index === params.index);
assert(formFieldState !== undefined); assert(formFieldState !== undefined);
(() => {
switch (params.action) { switch (params.action) {
case "focus lost": case "update":
formFieldState.hasLostFocusAtLeastOnce = true; case "update multi-valued":
return state; (() => {
case "update value": switch (params.action) {
update_password_confirm: { case "update":
if (params.name !== "password") { assert("value" in formFieldState);
break update_password_confirm; formFieldState.value = params.value;
return;
case "update multi-valued":
assert("values" in formFieldState);
formFieldState.values = params.values;
return;
} }
assert<Equals<typeof params, never>>(false);
})();
formFieldState.errors = getErrors({
"attributeName": params.name,
"fieldValues": state.formFieldStates
});
update_password_confirm: {
if (doMakeUserConfirmPassword) { if (doMakeUserConfirmPassword) {
break update_password_confirm; break update_password_confirm;
} }
if (params.name !== "password") {
break update_password_confirm;
}
assert(params.action === "update");
state = reducer(state, { state = reducer(state, {
"action": "update value", "action": "update",
"name": "password-confirm", "name": "password-confirm",
"index": 0, "value": params.value
"newValue": params.newValue
}); });
} }
formFieldState.value = params.newValue; return;
formFieldState.errors = getErrors({ case "focus lost":
"name": params.name, assert(typeof formFieldState.hasLostFocusAtLeastOnce === "boolean");
"index": params.index, formFieldState.hasLostFocusAtLeastOnce = true;
"fieldValues": state.formFieldStates return;
}); case "multi-valued text input focus lost":
return state; assert(formFieldState.hasLostFocusAtLeastOnce instanceof Array);
case "remove value from multi-valued attribute": formFieldState.hasLostFocusAtLeastOnce[params.fieldIndex] = true;
state.formFieldStates.splice(state.formFieldStates.indexOf(formFieldState), 1); return;
return state;
} }
assert<Equals<typeof params, never>>(false); assert<Equals<typeof params, never>>(false);
})();
return state;
}, },
useMemo(function getInitialState(): internal.State { useMemo(function getInitialState(): internal.State {
const initialFormFieldValues = (() => { const initialFormFieldValues = (() => {