Files
noahspan-root/app/src/components/projects/reducer.ts
2025-02-23 19:35:44 -06:00

94 lines
2.2 KiB
TypeScript

import { FormMode } from '../../enums/formMode';
import { ProjectsState } from './ProjectsState.interface'
import { Project } from './Project.interface';
import { Alert } from '../../interfaces';
type Action =
| {
type: 'SET_DELETE';
payload: {
isConfirmationDialogOpen: boolean;
selectedProjectId: string | undefined;
};
}
| { type: 'SET_PROJECTS'; payload: Project[] }
| { type: 'SET_ALERT'; payload: Alert | undefined }
| { type: 'SET_FORM_MODE'; payload: FormMode }
| { type: 'SET_IS_CONFIRMATION_DIALOG_LOADING'; payload: boolean }
| { type: 'SET_IS_LOADING'; payload: boolean }
| {
type: 'SET_OPEN_CLOSE_PROJECT_FORM';
payload: {
formMode: FormMode;
selectedProjectId: string | undefined;
isFormOpen: boolean;
};
};
export const initialState: ProjectsState = {
alert: undefined,
formMode: FormMode.CANCEL,
isConfirmDialogLoading: false,
isConfirmDialogOpen: false,
isFormOpen: false,
isLoading: false,
projects: [],
selectedProjectId: undefined
};
export const reducer = (
state: ProjectsState,
action: Action
): ProjectsState => {
switch (action.type) {
case 'SET_DELETE': {
return {
...state,
isConfirmDialogOpen: action.payload.isConfirmationDialogOpen,
selectedProjectId: action.payload.selectedProjectId
};
}
case 'SET_PROJECTS': {
return {
...state,
projects: action.payload
};
}
case 'SET_ALERT': {
return {
...state,
alert: action.payload
};
}
case 'SET_FORM_MODE': {
return {
...state,
formMode: action.payload
};
}
case 'SET_IS_CONFIRMATION_DIALOG_LOADING': {
return {
...state,
isConfirmDialogLoading: action.payload
};
}
case 'SET_IS_LOADING': {
return {
...state,
isLoading: action.payload
};
}
case 'SET_OPEN_CLOSE_PROJECT_FORM': {
return {
...state,
formMode: action.payload.formMode,
isFormOpen: action.payload.isFormOpen,
selectedProjectId: action.payload.selectedProjectId
};
}
default: {
return state;
}
}
};