Files
worklenz/worklenz-frontend/src/features/task-drawer/task-drawer.slice.ts

148 lines
5.3 KiB
TypeScript

import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit';
import { tasksApiService } from '@/api/tasks/tasks.api.service';
import { ITaskFormViewModel } from '@/types/tasks/task.types';
import { ITaskListStatusChangeResponse } from '@/types/tasks/task-list-status.types';
import { IProjectTask } from '@/types/project/projectTasksViewModel.types';
import { ITaskListPriorityChangeResponse } from '@/types/tasks/task-list-priority.types';
import { ILabelsChangeResponse } from '@/types/tasks/taskList.types';
import { InlineMember } from '@/types/teamMembers/inlineMember.types';
import { ITaskLogViewModel } from '@/types/tasks/task-log-view.types';
interface ITaskDrawerState {
selectedTaskId: string | null;
showTaskDrawer: boolean;
taskFormViewModel: ITaskFormViewModel | null;
subscribers: InlineMember[];
loadingTask: boolean;
timeLogEditing: {
isEditing: boolean;
logBeingEdited: ITaskLogViewModel | null;
};
}
const initialState: ITaskDrawerState = {
selectedTaskId: null,
showTaskDrawer: false,
taskFormViewModel: null,
subscribers: [],
loadingTask: false,
timeLogEditing: {
isEditing: false,
logBeingEdited: null,
},
};
export const fetchTask = createAsyncThunk(
'tasks/fetchTask',
async ({ taskId, projectId }: { taskId: string; projectId: string }, { rejectWithValue }) => {
const response = await tasksApiService.getFormViewModel(taskId, projectId);
return response.body;
}
);
const taskDrawerSlice = createSlice({
name: 'taskDrawer',
initialState,
reducers: {
setSelectedTaskId: (state, action) => {
state.selectedTaskId = action.payload;
},
setShowTaskDrawer: (state, action) => {
state.showTaskDrawer = action.payload;
},
setTaskFormViewModel: (state, action) => {
state.taskFormViewModel = action.payload;
},
setLoadingTask: (state, action) => {
state.loadingTask = action.payload;
},
setTaskStatus: (state, action: PayloadAction<ITaskListStatusChangeResponse>) => {
const { status_id, color_code, id: taskId, color_code_dark } = action.payload;
if (state.taskFormViewModel?.task && state.taskFormViewModel.task.id === taskId) {
state.taskFormViewModel.task.status_id = status_id;
state.taskFormViewModel.task.status_color = color_code;
state.taskFormViewModel.task.status_color_dark = color_code_dark
}
},
setStartDate: (state, action: PayloadAction<IProjectTask>) => {
const { start_date, id: taskId } = action.payload;
if (state.taskFormViewModel?.task && state.taskFormViewModel.task.id === taskId) {
state.taskFormViewModel.task.start_date = start_date;
}
},
setTaskEndDate: (state, action: PayloadAction<IProjectTask>) => {
const { end_date, id: taskId } = action.payload;
if (state.taskFormViewModel?.task && state.taskFormViewModel.task.id === taskId) {
state.taskFormViewModel.task.end_date = end_date;
}
},
setTaskAssignee: (state, action: PayloadAction<IProjectTask>) => {
const { assignees, id: taskId, names } = action.payload;
if (state.taskFormViewModel?.task && state.taskFormViewModel.task.id === taskId) {
state.taskFormViewModel.task.assignees = (assignees || []).map(m => m.team_member_id);
state.taskFormViewModel.task.names = names;
}
},
setTaskPriority: (state, action: PayloadAction<ITaskListPriorityChangeResponse>) => {
const { priority_id, id: taskId } = action.payload;
if (state.taskFormViewModel?.task && state.taskFormViewModel.task.id === taskId) {
state.taskFormViewModel.task.priority_id = priority_id;
}
},
setTaskLabels: (state, action: PayloadAction<ILabelsChangeResponse>) => {
const { all_labels, id: taskId } = action.payload;
if (state.taskFormViewModel?.task && state.taskFormViewModel.task.id === taskId) {
state.taskFormViewModel.task.labels = all_labels || [];
}
},
setTaskSubscribers: (state, action: PayloadAction<InlineMember[]>) => {
state.subscribers = action.payload;
},
setTimeLogEditing: (state, action: PayloadAction<{
isEditing: boolean;
logBeingEdited: ITaskLogViewModel | null;
}>) => {
state.timeLogEditing = action.payload;
},
setTaskRecurringSchedule: (state, action: PayloadAction<{
schedule_id: string;
task_id: string;
}>) => {
const { schedule_id, task_id } = action.payload;
if (state.taskFormViewModel?.task && state.taskFormViewModel.task.id === task_id) {
state.taskFormViewModel.task.schedule_id = schedule_id;
}
},
},
extraReducers: builder => {
builder.addCase(fetchTask.pending, state => {
state.loadingTask = true;
}),
builder.addCase(fetchTask.fulfilled, (state, action) => {
state.loadingTask = false;
state.taskFormViewModel = action.payload;
}),
builder.addCase(fetchTask.rejected, (state, action) => {
state.loadingTask = false;
});
},
});
export const {
setSelectedTaskId,
setShowTaskDrawer,
setTaskFormViewModel,
setLoadingTask,
setTaskStatus,
setStartDate,
setTaskEndDate,
setTaskAssignee,
setTaskPriority,
setTaskLabels,
setTaskSubscribers,
setTimeLogEditing,
setTaskRecurringSchedule
} = taskDrawerSlice.actions;
export default taskDrawerSlice.reducer;