import { all, select, takeLatest, put, delay } from "redux-saga/effects"; import { client } from '../gql/client'; import { MUTATION_CREATE_PROJECT, MUTATION_UPDATE_PROJECT_TITLE, MUTATION_ADD_PROJECT_TASK, MUTATION_REMOVE_PROJECT_TASK, MUTATION_UPDATE_PROJECT_TASK } from "../gql/mutations/project"; import { UPDATE_PROJECT_TITLE, resetProject, ADD_TASK, taskSaved, AddTask, taskRemoved, RemoveTask, REMOVE_TASK, UPDATE_TASK_ESTIMATION, updateTaskEstimation, UpdateTaskEstimation, UpdateTaskLabel, UPDATE_TASK_LABEL } from "./useProjectReducer"; import { Project } from "../types/project"; export function* rootSaga() { yield all([ createProjectSaga(), takeLatest(UPDATE_PROJECT_TITLE, updateProjectTitleSaga), takeLatest(UPDATE_TASK_ESTIMATION, updateTaskEstimationSaga), takeLatest(UPDATE_TASK_LABEL, updateTaskLabelSaga), takeLatest(ADD_TASK, addTaskSaga), takeLatest(REMOVE_TASK, removeTaskSaga), ]); } export function* updateProjectTitleSaga() { let project = yield select(); if (project.id === undefined) { project = yield createProjectSaga(); } yield client.mutate({ mutation: MUTATION_UPDATE_PROJECT_TITLE, variables: { projectId: project.id, title: project.title, } }); } export function* createProjectSaga() { const project: Project = yield select(); if (project.id !== undefined) return; const { data } = yield client.mutate({ mutation: MUTATION_CREATE_PROJECT, variables: { changes: { title: project.title, } } }); yield put(resetProject(data.createProject)); return yield select(); } export function* addTaskSaga({ task }: AddTask) { let project: Project = yield select(); if (project.id === undefined) { project = yield createProjectSaga(); } const { data } = yield client.mutate({ mutation: MUTATION_ADD_PROJECT_TASK, variables: { projectId: project.id, changes: { label: task.label, categoryId: task.category ? task.category.id : -1, estimations: { optimistic: task.estimations.optimistic, likely: task.estimations.likely, pessimistic: task.estimations.pessimistic, } } } }); yield put(taskSaved({ ...task, ...data.addProjectTask })); } export function* removeTaskSaga({ id }: RemoveTask) { let project: Project = yield select(); if (project.id === undefined) { project = yield createProjectSaga(); } yield client.mutate({ mutation: MUTATION_REMOVE_PROJECT_TASK, variables: { projectId: project.id, taskId: id, } }); yield put(taskRemoved(id)); } export function* updateTaskEstimationSaga({ id, confidence, value }: UpdateTaskEstimation) { let project: Project = yield select(); if (project.id === undefined) { project = yield createProjectSaga(); } const { data } = yield client.mutate({ mutation: MUTATION_UPDATE_PROJECT_TASK, variables: { projectId: project.id, taskId: id, changes: { estimations: { [confidence]: value, } } } }); yield put(taskSaved({ ...data.updateProjectTask })); } export function* updateTaskLabelSaga({ id, label }: UpdateTaskLabel) { let project: Project = yield select(); if (project.id === undefined) { project = yield createProjectSaga(); } const { data } = yield client.mutate({ mutation: MUTATION_UPDATE_PROJECT_TASK, variables: { projectId: project.id, taskId: id, changes: { label, } } }); yield put(taskSaved({ ...data.updateProjectTask })); }