guesstimate/client/src/hooks/useProjectReducer.sagas.ts

166 lines
4.2 KiB
TypeScript

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, MUTATION_UPDATE_PROJECT_PARAMS } 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, UpdateParam, paramsSaved, UPDATE_PARAM } 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(UPDATE_PARAM, updateProjectParamsSaga),
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 }));
}
export function* updateProjectParamsSaga({ name, value }: UpdateParam) {
yield delay(500);
let project: Project = yield select();
if (project.id === undefined) {
project = yield createProjectSaga();
}
if (typeof value === 'object') {
delete value.__typename;
}
const { data } = yield client.mutate({
mutation: MUTATION_UPDATE_PROJECT_PARAMS,
variables: {
projectId: project.id,
changes: {
[name]: value,
}
}
});
yield put(paramsSaved({ ...data.updateProjectParams }));
}