// forms.ts // Copyright (C) 2020 Dwayne Harris // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . import { Reducer } from 'redux' import { FormsActions } from '../actions/forms' import { FormsState } from '../types' const initialState: FormsState = { form: {}, notification: undefined, } const reducer: Reducer = (state = initialState, action) => { switch (action.type) { case 'FORMS_INIT': return { form: {}, notification: undefined, } case 'FORMS_INIT_FIELD': const { name, value, apiName } = action.payload return { ...state, form: { ...state.form, [name]: { name, value, apiName, }, }, } case 'FORMS_SET_FIELD_VALUE': { const field = state.form[action.payload.name] return { ...state, form: { ...state.form, [action.payload.name]: { ...field, value: action.payload.value, notification: undefined, }, }, } } case 'FORMS_SET_FORM_NOTIFICATION': const { type, message } = action.payload return { ...state, notification: { type, message, }, } case 'FORMS_SET_FIELD_NOTIFICATION': { const { name, type, message } = action.payload const getField = () => { const field = Object.entries(state.form).find(([_, value]) => value.apiName ? name === value.apiName : false) if (field) return field[1] return state.form[name] } const field = getField() return { ...state, form: { ...state.form, [field.name]: { ...field, notification: { type, message, }, }, }, } } default: return state } } export default reducer