Files
planka/client/src/sagas/core/services/cards.js

159 lines
3.6 KiB
JavaScript

import { call, put, select } from 'redux-saga/effects';
import { goToBoard, goToCard } from './router';
import request from '../request';
import selectors from '../../../selectors';
import actions from '../../../actions';
import api from '../../../api';
import { createLocalId } from '../../../utils/local-id';
export function* createCard(listId, data, autoOpen) {
const { boardId } = yield select(selectors.selectListById, listId);
const nextData = {
...data,
position: yield select(selectors.selectNextCardPosition, listId),
};
const localId = yield call(createLocalId);
yield put(
actions.createCard({
...nextData,
boardId,
listId,
id: localId,
}),
);
let card;
try {
({ item: card } = yield call(request, api.createCard, listId, nextData));
} catch (error) {
yield put(actions.createCard.failure(localId, error));
return;
}
yield put(actions.createCard.success(localId, card));
if (autoOpen) {
yield call(goToCard, card.id);
}
}
export function* handleCardCreate(card) {
yield put(actions.handleCardCreate(card));
}
export function* updateCard(id, data) {
yield put(actions.updateCard(id, data));
let card;
try {
({ item: card } = yield call(request, api.updateCard, id, data));
} catch (error) {
yield put(actions.updateCard.failure(id, error));
return;
}
yield put(actions.updateCard.success(card));
}
export function* updateCurrentCard(data) {
const { cardId } = yield select(selectors.selectPath);
yield call(updateCard, cardId, data);
}
// TODO: handle card transfer
export function* handleCardUpdate(card) {
yield put(actions.handleCardUpdate(card));
}
export function* moveCard(id, listId, index) {
const position = yield select(selectors.selectNextCardPosition, listId, index, id);
yield call(updateCard, id, {
listId,
position,
});
}
export function* moveCurrentCard(listId, index) {
const { cardId } = yield select(selectors.selectPath);
yield call(moveCard, cardId, listId, index);
}
export function* transferCard(id, boardId, listId, index) {
const { cardId: currentCardId, boardId: currentBoardId } = yield select(selectors.selectPath);
const position = yield select(selectors.selectNextCardPosition, listId, index, id);
if (id === currentCardId) {
yield call(goToBoard, currentBoardId);
}
yield call(updateCard, id, {
boardId,
listId,
position,
});
}
export function* transferCurrentCard(boardId, listId, index) {
const { cardId } = yield select(selectors.selectPath);
yield call(transferCard, cardId, boardId, listId, index);
}
export function* deleteCard(id) {
const { cardId, boardId } = yield select(selectors.selectPath);
if (id === cardId) {
yield call(goToBoard, boardId);
}
yield put(actions.deleteCard(id));
let card;
try {
({ item: card } = yield call(request, api.deleteCard, id));
} catch (error) {
yield put(actions.deleteCard.failure(id, error));
return;
}
yield put(actions.deleteCard.success(card));
}
export function* deleteCurrentCard() {
const { cardId } = yield select(selectors.selectPath);
yield call(deleteCard, cardId);
}
export function* handleCardDelete(card) {
const { cardId, boardId } = yield select(selectors.selectPath);
if (card.id === cardId) {
yield call(goToBoard, boardId);
}
yield put(actions.handleCardDelete(card));
}
export default {
createCard,
handleCardCreate,
updateCard,
updateCurrentCard,
moveCard,
moveCurrentCard,
transferCard,
transferCurrentCard,
handleCardUpdate,
deleteCard,
deleteCurrentCard,
handleCardDelete,
};