frontend/src/store/tasksStatuses/index.ts (98 lines of code) (raw):

import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import { TAppState } from '../index'; import { ITableStateProps, ILabelingTaskStatus } from '../../models'; import { getLabelingTasksRequest, archiveTaskLabelingRequest, retryLabelingTaskRequest } from '../../api'; export const getLabelingTasks = createAsyncThunk( 'taskStatuses/fetchLabelingTask', async ({ page, rowsPerPage, searchProps, filterStatus, sortOrder, sortField }: ITableStateProps) => { const params: any = { page, page_size: rowsPerPage }; if (sortOrder && sortField) { params.ordering = sortOrder === 'ascend' ? sortField : `-${sortField}`; } for (const [key, value] of Object.entries(searchProps)) { params[key] = Array(value)[0]; } if (filterStatus) { params.status = filterStatus; } const response = await getLabelingTasksRequest(params); return response; } ); export const archiveLabelingTask = createAsyncThunk('taskStatuses/archiveLabelingTask', async (_, { getState }) => { const { tasksStatuses } = getState() as TAppState; const response = await archiveTaskLabelingRequest(tasksStatuses.selectedRowKeys); return response.data.results; }); export const retryLabelingTask = createAsyncThunk('taskStatuses/retryLabelingTask', async (_, { getState }) => { const { tasksStatuses } = getState() as TAppState; const response = await retryLabelingTaskRequest(tasksStatuses.selectedRowKeys); return response.data.results; }); export interface ITasksStatusesState { loading: boolean; actualView: boolean; count: number; tasks: ILabelingTaskStatus[]; selectedRowKeys: number[]; openConformationDialog: boolean; } const tasksStatusesSlice = createSlice({ name: 'taskStatuses', initialState: { loading: false, // Used to show (or not) the icon flag when the TasksStatuses' table is refreshed/loaded. actualView: false, // Used to know if the table was updated based on archiveLabelingTask promise statuses. count: 0, // Used to know the total ammount of task for pagination. tasks: [], // Used to store labeled task info and display task lists. selectedRowKeys: [], // Contains the selected rows from the list. openConformationDialog: false } as ITasksStatusesState, reducers: { setSelectedRowKeys: (state, { payload }) => { state.selectedRowKeys = payload; }, setOpenConformationDialog: (state, { payload }) => { state.openConformationDialog = payload; } }, extraReducers: (builder) => { builder .addCase(getLabelingTasks.pending, (state) => { state.loading = true; }) .addCase(getLabelingTasks.fulfilled, (state, action) => { state.loading = false; state.actualView = true; state.count = action.payload.count; state.tasks = action.payload.tasks; }) .addCase(archiveLabelingTask.pending, (state) => { state.openConformationDialog = false; state.loading = true; }) .addCase(archiveLabelingTask.rejected, (state) => { state.selectedRowKeys = []; }) .addCase(archiveLabelingTask.fulfilled, (state) => { state.loading = false; state.actualView = false; state.selectedRowKeys = []; }) .addCase(retryLabelingTask.pending, (state) => { state.loading = false; state.actualView = false; }) .addCase(retryLabelingTask.rejected, (state) => { state.selectedRowKeys = []; }) .addCase(retryLabelingTask.fulfilled, (state) => { state.actualView = false; state.selectedRowKeys = []; }); } }); export const tasksStatusesReducer = tasksStatusesSlice.reducer; export const { setSelectedRowKeys, setOpenConformationDialog } = tasksStatusesSlice.actions;