import { createSlice } from '@reduxjs/toolkit' import { resetApp } from 'domains/app/actions' import { ControlState } from 'domains/forms/forms.types' const initialFormState: Record = { controls: {}, } const initialControlState: ControlState = { touched: false, } const initialState = { controls: initialControlState, } export const formsSlice = createSlice({ name: 'forms', initialState, reducers: { registerForm: (state, { payload: { persistData, formId } }) => { const formState = persistData ? (state[formId] ?? { ...initialFormState, persistData }) : { ...initialFormState, persistData } state[formId] = formState }, deregisterForm: (state, { payload: { formId } }) => { if (!state[formId]?.persistData) { delete state[formId] } return state }, // Form control handlers registerControl: (state, { payload: { name, formId } }) => { state[formId].controls = { [name]: initialControlState, } }, deregisterControl: (state, { payload: { name, formId } }) => { const form = state[formId] if (!form) { return state } if (form.persistData) { return state } const controls = { ...form.controls } delete controls[name] return { ...state, [formId]: { ...form, controls, }, } }, updateControlValue: (state, { payload: { formId, name, value } }) => { // return updateFormControl(state, formId, name, { value }) if (!state[formId]?.controls) return state[formId].controls[name].value = value }, updateControlTouched: (state, { payload: { formId, name, touched } }) => { if (!state[formId]?.controls[name]) return state[formId].controls[name].touched = touched }, }, extraReducers: (builder) => { builder.addCase(resetApp.pending, () => initialState) }, }) export const { registerForm, deregisterForm, registerControl, deregisterControl, updateControlValue, updateControlTouched, } = formsSlice.actions export default formsSlice.reducer