|
|
// 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 <https://www.gnu.org/licenses/>.
import { Reducer } from 'redux'
import { FormsActions } from '../actions/forms' import { FormsState } from '../types'
const initialState: FormsState = { form: {}, notification: undefined, }
const reducer: Reducer<FormsState, FormsActions> = (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
|