166 lines
4.2 KiB
TypeScript
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 }));
|
|
} |