162 lines
3.5 KiB
TypeScript
162 lines
3.5 KiB
TypeScript
import types from './types';
|
|
import { ProposalDraft } from 'types';
|
|
|
|
export interface CreateState {
|
|
drafts: ProposalDraft[] | null;
|
|
form: ProposalDraft | null;
|
|
|
|
isInitializingForm: boolean;
|
|
initializeFormError: string | null;
|
|
|
|
isSavingDraft: boolean;
|
|
hasSavedDraft: boolean;
|
|
saveDraftError: string | null;
|
|
|
|
isFetchingDrafts: boolean;
|
|
fetchDraftsError: string | null;
|
|
|
|
isCreatingDraft: boolean;
|
|
createDraftError: string | null;
|
|
|
|
isDeletingDraft: boolean;
|
|
deleteDraftError: string | null;
|
|
}
|
|
|
|
export const INITIAL_STATE: CreateState = {
|
|
drafts: null,
|
|
form: null,
|
|
|
|
isInitializingForm: false,
|
|
initializeFormError: null,
|
|
|
|
isSavingDraft: false,
|
|
hasSavedDraft: true,
|
|
saveDraftError: null,
|
|
|
|
isFetchingDrafts: false,
|
|
fetchDraftsError: null,
|
|
|
|
isCreatingDraft: false,
|
|
createDraftError: null,
|
|
|
|
isDeletingDraft: false,
|
|
deleteDraftError: null,
|
|
};
|
|
|
|
export default function createReducer(
|
|
state: CreateState = INITIAL_STATE,
|
|
action: any,
|
|
): CreateState {
|
|
switch (action.type) {
|
|
case types.CREATE_DRAFT_PENDING:
|
|
|
|
case types.UPDATE_FORM:
|
|
return {
|
|
...state,
|
|
form: {
|
|
...state.form,
|
|
...action.payload,
|
|
},
|
|
hasSavedDraft: false,
|
|
};
|
|
|
|
case types.INITIALIZE_FORM_PENDING:
|
|
return {
|
|
...state,
|
|
form: null,
|
|
isInitializingForm: true,
|
|
initializeFormError: null,
|
|
};
|
|
case types.INITIALIZE_FORM_FULFILLED:
|
|
return {
|
|
...state,
|
|
form: { ...action.payload },
|
|
isInitializingForm: false,
|
|
};
|
|
case types.INITIALIZE_FORM_REJECTED:
|
|
return {
|
|
...state,
|
|
isInitializingForm: false,
|
|
initializeFormError: action.payload,
|
|
};
|
|
|
|
case types.SAVE_DRAFT_PENDING:
|
|
return {
|
|
...state,
|
|
isSavingDraft: true,
|
|
};
|
|
case types.SAVE_DRAFT_FULFILLED:
|
|
return {
|
|
...state,
|
|
isSavingDraft: false,
|
|
hasSavedDraft: true,
|
|
// Only clear error once save was a success
|
|
saveDraftError: null,
|
|
};
|
|
case types.SAVE_DRAFT_REJECTED:
|
|
return {
|
|
...state,
|
|
isSavingDraft: false,
|
|
hasSavedDraft: false,
|
|
saveDraftError: action.payload,
|
|
};
|
|
|
|
case types.FETCH_DRAFTS_PENDING:
|
|
return {
|
|
...state,
|
|
isFetchingDrafts: true,
|
|
fetchDraftsError: null,
|
|
};
|
|
case types.FETCH_DRAFTS_FULFILLED:
|
|
return {
|
|
...state,
|
|
isFetchingDrafts: false,
|
|
drafts: action.payload,
|
|
};
|
|
case types.FETCH_DRAFTS_REJECTED:
|
|
return {
|
|
...state,
|
|
isFetchingDrafts: false,
|
|
fetchDraftsError: action.payload,
|
|
};
|
|
|
|
case types.CREATE_DRAFT_PENDING:
|
|
return {
|
|
...state,
|
|
isCreatingDraft: true,
|
|
createDraftError: null,
|
|
};
|
|
case types.CREATE_DRAFT_FULFILLED:
|
|
return {
|
|
...state,
|
|
drafts: [...(state.drafts || []), action.payload],
|
|
isCreatingDraft: false,
|
|
};
|
|
case types.CREATE_DRAFT_REJECTED:
|
|
return {
|
|
...state,
|
|
createDraftError: action.payload,
|
|
isCreatingDraft: false,
|
|
};
|
|
|
|
case types.DELETE_DRAFT_PENDING:
|
|
return {
|
|
...state,
|
|
isDeletingDraft: true,
|
|
deleteDraftError: null,
|
|
};
|
|
case types.DELETE_DRAFT_FULFILLED:
|
|
return {
|
|
...state,
|
|
isDeletingDraft: false,
|
|
};
|
|
case types.DELETE_DRAFT_REJECTED:
|
|
return {
|
|
...state,
|
|
isDeletingDraft: false,
|
|
deleteDraftError: action.payload,
|
|
};
|
|
}
|
|
return state;
|
|
}
|