Initial commit
This commit is contained in:
16
client/src/sagas/app/services/actions.js
Normal file
16
client/src/sagas/app/services/actions.js
Normal file
@@ -0,0 +1,16 @@
|
||||
import { call, select } from 'redux-saga/effects';
|
||||
|
||||
import { fetchActionsRequest } from '../requests';
|
||||
import { lastActionIdByCardIdSelector, pathSelector } from '../../../selectors';
|
||||
|
||||
export function* fetchActionsService(cardId) {
|
||||
const lastId = yield select(lastActionIdByCardIdSelector, cardId);
|
||||
|
||||
yield call(fetchActionsRequest, cardId, lastId);
|
||||
}
|
||||
|
||||
export function* fetchActionsInCurrentCardService() {
|
||||
const { cardId } = yield select(pathSelector);
|
||||
|
||||
yield call(fetchActionsService, cardId);
|
||||
}
|
||||
50
client/src/sagas/app/services/app.js
Normal file
50
client/src/sagas/app/services/app.js
Normal file
@@ -0,0 +1,50 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import { runPathActionsService } from './router';
|
||||
import {
|
||||
fetchCardRequest,
|
||||
fetchCurrentUserRequest,
|
||||
fetchNotificationsRequest,
|
||||
fetchProjectsRequest,
|
||||
fetchUsersRequest,
|
||||
} from '../requests';
|
||||
import { pathsMatchSelector } from '../../../selectors';
|
||||
import { appInitialized } from '../../../actions';
|
||||
import i18n from '../../../i18n';
|
||||
import Paths from '../../../constants/Paths';
|
||||
|
||||
export function* loadLocaleService(language) {
|
||||
try {
|
||||
yield call(i18n.loadAppLocale, language);
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function* initializeAppService() {
|
||||
const {
|
||||
payload: {
|
||||
user: { isAdmin },
|
||||
},
|
||||
} = yield call(fetchCurrentUserRequest); // TODO: success check
|
||||
|
||||
if (isAdmin) {
|
||||
yield call(fetchUsersRequest);
|
||||
}
|
||||
|
||||
yield call(fetchProjectsRequest);
|
||||
|
||||
const pathsMatch = yield select(pathsMatchSelector);
|
||||
|
||||
if (pathsMatch && pathsMatch.path === Paths.CARDS) {
|
||||
yield call(fetchCardRequest, pathsMatch.params.id);
|
||||
}
|
||||
|
||||
yield call(fetchNotificationsRequest);
|
||||
yield call(runPathActionsService, pathsMatch);
|
||||
yield call(loadLocaleService, i18n.language);
|
||||
|
||||
yield put(appInitialized());
|
||||
}
|
||||
70
client/src/sagas/app/services/board.js
Normal file
70
client/src/sagas/app/services/board.js
Normal file
@@ -0,0 +1,70 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import { goToBoardService, goToProjectService } from './router';
|
||||
import { createBoardRequest, deleteBoardRequest, updateBoardRequest } from '../requests';
|
||||
import {
|
||||
boardByIdSelector,
|
||||
maxIdSelector,
|
||||
nextBoardPositionSelector,
|
||||
pathSelector,
|
||||
} from '../../../selectors';
|
||||
import { createBoard, deleteBoard, updateBoard } from '../../../actions';
|
||||
import { nextLocalId } from '../../../utils/local-id';
|
||||
import { Board } from '../../../models';
|
||||
|
||||
export function* createBoardService(projectId, data) {
|
||||
const nextData = {
|
||||
...data,
|
||||
position: yield select(nextBoardPositionSelector, projectId),
|
||||
};
|
||||
|
||||
const localId = nextLocalId(yield select(maxIdSelector, Board.modelName));
|
||||
|
||||
yield put(
|
||||
createBoard({
|
||||
...nextData,
|
||||
projectId,
|
||||
id: localId,
|
||||
}),
|
||||
);
|
||||
|
||||
const {
|
||||
success,
|
||||
payload: { board },
|
||||
} = yield call(createBoardRequest, projectId, localId, nextData);
|
||||
|
||||
if (success) {
|
||||
yield call(goToBoardService, board.id);
|
||||
}
|
||||
}
|
||||
|
||||
export function* createBoardInCurrentProjectService(data) {
|
||||
const { projectId } = yield select(pathSelector);
|
||||
|
||||
yield call(createBoardService, projectId, data);
|
||||
}
|
||||
|
||||
export function* updateBoardService(id, data) {
|
||||
yield put(updateBoard(id, data));
|
||||
yield call(updateBoardRequest, id, data);
|
||||
}
|
||||
|
||||
export function* moveBoardService(id, index) {
|
||||
const { projectId } = yield select(boardByIdSelector, id);
|
||||
const position = yield select(nextBoardPositionSelector, projectId, index, id);
|
||||
|
||||
yield call(updateBoardService, id, {
|
||||
position,
|
||||
});
|
||||
}
|
||||
|
||||
export function* deleteBoardService(id) {
|
||||
const { boardId, projectId } = yield select(pathSelector);
|
||||
|
||||
if (id === boardId) {
|
||||
yield call(goToProjectService, projectId);
|
||||
}
|
||||
|
||||
yield put(deleteBoard(id));
|
||||
yield call(deleteBoardRequest, id);
|
||||
}
|
||||
64
client/src/sagas/app/services/card.js
Normal file
64
client/src/sagas/app/services/card.js
Normal file
@@ -0,0 +1,64 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import { goToBoardService } from './router';
|
||||
import { createCardRequest, deleteCardRequest, updateCardRequest } from '../requests';
|
||||
import { maxIdSelector, nextCardPositionSelector, pathSelector } from '../../../selectors';
|
||||
import { createCard, deleteCard, updateCard } from '../../../actions';
|
||||
import { nextLocalId } from '../../../utils/local-id';
|
||||
import { Card } from '../../../models';
|
||||
|
||||
export function* createCardService(listId, data) {
|
||||
const nextData = {
|
||||
...data,
|
||||
position: yield select(nextCardPositionSelector, listId),
|
||||
};
|
||||
|
||||
const localId = nextLocalId(yield select(maxIdSelector, Card.modelName));
|
||||
|
||||
yield put(
|
||||
createCard({
|
||||
...nextData,
|
||||
listId,
|
||||
id: localId,
|
||||
}),
|
||||
);
|
||||
|
||||
yield call(createCardRequest, listId, localId, nextData);
|
||||
}
|
||||
|
||||
export function* updateCardService(id, data) {
|
||||
yield put(updateCard(id, data));
|
||||
yield call(updateCardRequest, id, data);
|
||||
}
|
||||
|
||||
export function* updateCurrentCardService(data) {
|
||||
const { cardId } = yield select(pathSelector);
|
||||
|
||||
yield call(updateCardService, cardId, data);
|
||||
}
|
||||
|
||||
export function* moveCardService(id, listId, index) {
|
||||
const position = yield select(nextCardPositionSelector, listId, index, id);
|
||||
|
||||
yield call(updateCardService, id, {
|
||||
listId,
|
||||
position,
|
||||
});
|
||||
}
|
||||
|
||||
export function* deleteCardService(id) {
|
||||
const { cardId, boardId } = yield select(pathSelector);
|
||||
|
||||
if (id === cardId) {
|
||||
yield call(goToBoardService, boardId);
|
||||
}
|
||||
|
||||
yield put(deleteCard(id));
|
||||
yield call(deleteCardRequest, id);
|
||||
}
|
||||
|
||||
export function* deleteCurrentCardService() {
|
||||
const { cardId } = yield select(pathSelector);
|
||||
|
||||
yield call(deleteCardService, cardId);
|
||||
}
|
||||
45
client/src/sagas/app/services/comment-action.js
Normal file
45
client/src/sagas/app/services/comment-action.js
Normal file
@@ -0,0 +1,45 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import {
|
||||
createCommentActionRequest,
|
||||
deleteCommentActionRequest,
|
||||
updateCommentActionRequest,
|
||||
} from '../requests';
|
||||
import { currentUserIdSelector, maxIdSelector, pathSelector } from '../../../selectors';
|
||||
import { createCommentAction, deleteCommentAction, updateCommentAction } from '../../../actions';
|
||||
import { nextLocalId } from '../../../utils/local-id';
|
||||
import { Action } from '../../../models';
|
||||
import { ActionTypes } from '../../../constants/Enums';
|
||||
|
||||
export function* createCommentActionService(cardId, data) {
|
||||
const localId = nextLocalId(yield select(maxIdSelector, Action.modelName));
|
||||
const userId = yield select(currentUserIdSelector);
|
||||
|
||||
yield put(
|
||||
createCommentAction({
|
||||
cardId,
|
||||
userId,
|
||||
data,
|
||||
id: localId,
|
||||
type: ActionTypes.COMMENT_CARD,
|
||||
}),
|
||||
);
|
||||
|
||||
yield call(createCommentActionRequest, cardId, localId, data);
|
||||
}
|
||||
|
||||
export function* createCommentActionInCurrentCardService(data) {
|
||||
const { cardId } = yield select(pathSelector);
|
||||
|
||||
yield call(createCommentActionService, cardId, data);
|
||||
}
|
||||
|
||||
export function* updateCommentActionService(id, data) {
|
||||
yield put(updateCommentAction(id, data));
|
||||
yield call(updateCommentActionRequest, id, data);
|
||||
}
|
||||
|
||||
export function* deleteCommentActionService(id) {
|
||||
yield put(deleteCommentAction(id));
|
||||
yield call(deleteCommentActionRequest, id);
|
||||
}
|
||||
17
client/src/sagas/app/services/index.js
Normal file
17
client/src/sagas/app/services/index.js
Normal file
@@ -0,0 +1,17 @@
|
||||
export * from './router';
|
||||
export * from './socket';
|
||||
export * from './login';
|
||||
export * from './app';
|
||||
export * from './modal';
|
||||
export * from './user';
|
||||
export * from './project';
|
||||
export * from './project-membership';
|
||||
export * from './board';
|
||||
export * from './list';
|
||||
export * from './label';
|
||||
export * from './card';
|
||||
export * from './task';
|
||||
export * from './actions';
|
||||
export * from './comment-action';
|
||||
export * from './notifications';
|
||||
export * from './notification';
|
||||
93
client/src/sagas/app/services/label.js
Normal file
93
client/src/sagas/app/services/label.js
Normal file
@@ -0,0 +1,93 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import {
|
||||
createCardLabelRequest,
|
||||
createLabelRequest,
|
||||
deleteCardLabelRequest,
|
||||
deleteLabelRequest,
|
||||
updateLabelRequest,
|
||||
} from '../requests';
|
||||
import { maxIdSelector, pathSelector } from '../../../selectors';
|
||||
import {
|
||||
addLabelToBoardFilter,
|
||||
addLabelToCard,
|
||||
createLabel,
|
||||
deleteLabel,
|
||||
removeLabelFromBoardFilter,
|
||||
removeLabelFromCard,
|
||||
updateLabel,
|
||||
} from '../../../actions';
|
||||
import { nextLocalId } from '../../../utils/local-id';
|
||||
import { Label } from '../../../models';
|
||||
|
||||
export function* createLabelService(boardId, data) {
|
||||
const localId = nextLocalId(yield select(maxIdSelector, Label.modelName));
|
||||
|
||||
yield put(
|
||||
createLabel({
|
||||
...data,
|
||||
boardId,
|
||||
id: localId,
|
||||
}),
|
||||
);
|
||||
|
||||
yield call(createLabelRequest, boardId, localId, data);
|
||||
}
|
||||
|
||||
export function* createLabelInCurrentBoardService(data) {
|
||||
const { boardId } = yield select(pathSelector);
|
||||
|
||||
yield call(createLabelService, boardId, data);
|
||||
}
|
||||
|
||||
export function* updateLabelService(id, data) {
|
||||
yield put(updateLabel(id, data));
|
||||
yield call(updateLabelRequest, id, data);
|
||||
}
|
||||
|
||||
export function* deleteLabelService(id) {
|
||||
yield put(deleteLabel(id));
|
||||
yield call(deleteLabelRequest, id);
|
||||
}
|
||||
|
||||
export function* addLabelToCardService(id, cardId) {
|
||||
yield put(addLabelToCard(id, cardId));
|
||||
yield call(createCardLabelRequest, cardId, id);
|
||||
}
|
||||
|
||||
export function* addLabelToCurrentCardService(id) {
|
||||
const { cardId } = yield select(pathSelector);
|
||||
|
||||
yield call(addLabelToCardService, id, cardId);
|
||||
}
|
||||
|
||||
export function* removeLabelFromCardService(id, cardId) {
|
||||
yield put(removeLabelFromCard(id, cardId));
|
||||
yield call(deleteCardLabelRequest, cardId, id);
|
||||
}
|
||||
|
||||
export function* removeLabelFromCurrentCardService(id) {
|
||||
const { cardId } = yield select(pathSelector);
|
||||
|
||||
yield call(removeLabelFromCardService, id, cardId);
|
||||
}
|
||||
|
||||
export function* addLabelToBoardFilterService(id, boardId) {
|
||||
yield put(addLabelToBoardFilter(id, boardId));
|
||||
}
|
||||
|
||||
export function* addLabelToFilterInCurrentBoardService(id) {
|
||||
const { boardId } = yield select(pathSelector);
|
||||
|
||||
yield call(addLabelToBoardFilterService, id, boardId);
|
||||
}
|
||||
|
||||
export function* removeLabelFromBoardFilterService(id, boardId) {
|
||||
yield put(removeLabelFromBoardFilter(id, boardId));
|
||||
}
|
||||
|
||||
export function* removeLabelFromFilterInCurrentBoardService(id) {
|
||||
const { boardId } = yield select(pathSelector);
|
||||
|
||||
yield call(removeLabelFromBoardFilterService, id, boardId);
|
||||
}
|
||||
56
client/src/sagas/app/services/list.js
Normal file
56
client/src/sagas/app/services/list.js
Normal file
@@ -0,0 +1,56 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import { createListRequest, deleteListRequest, updateListRequest } from '../requests';
|
||||
import {
|
||||
listByIdSelector,
|
||||
maxIdSelector,
|
||||
nextListPositionSelector,
|
||||
pathSelector,
|
||||
} from '../../../selectors';
|
||||
import { createList, deleteList, updateList } from '../../../actions';
|
||||
import { nextLocalId } from '../../../utils/local-id';
|
||||
import { List } from '../../../models';
|
||||
|
||||
export function* createListService(boardId, data) {
|
||||
const nextData = {
|
||||
...data,
|
||||
position: yield select(nextListPositionSelector, boardId),
|
||||
};
|
||||
|
||||
const localId = nextLocalId(yield select(maxIdSelector, List.modelName));
|
||||
|
||||
yield put(
|
||||
createList({
|
||||
...nextData,
|
||||
boardId,
|
||||
id: localId,
|
||||
}),
|
||||
);
|
||||
|
||||
yield call(createListRequest, boardId, localId, nextData);
|
||||
}
|
||||
|
||||
export function* createListInCurrentBoardService(data) {
|
||||
const { boardId } = yield select(pathSelector);
|
||||
|
||||
yield call(createListService, boardId, data);
|
||||
}
|
||||
|
||||
export function* updateListService(id, data) {
|
||||
yield put(updateList(id, data));
|
||||
yield call(updateListRequest, id, data);
|
||||
}
|
||||
|
||||
export function* moveListService(id, index) {
|
||||
const { boardId } = yield select(listByIdSelector, id);
|
||||
const position = yield select(nextListPositionSelector, boardId, index, id);
|
||||
|
||||
yield call(updateListService, id, {
|
||||
position,
|
||||
});
|
||||
}
|
||||
|
||||
export function* deleteListService(id) {
|
||||
yield put(deleteList(id));
|
||||
yield call(deleteListRequest, id);
|
||||
}
|
||||
8
client/src/sagas/app/services/login.js
Normal file
8
client/src/sagas/app/services/login.js
Normal file
@@ -0,0 +1,8 @@
|
||||
import { put } from 'redux-saga/effects';
|
||||
|
||||
import { logout } from '../../../actions';
|
||||
|
||||
// eslint-disable-next-line import/prefer-default-export
|
||||
export function* logoutService() {
|
||||
yield put(logout());
|
||||
}
|
||||
11
client/src/sagas/app/services/modal.js
Normal file
11
client/src/sagas/app/services/modal.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import { put } from 'redux-saga/effects';
|
||||
|
||||
import { closeModal, openModal } from '../../../actions';
|
||||
|
||||
export function* openModalService(type) {
|
||||
yield put(openModal(type));
|
||||
}
|
||||
|
||||
export function* closeModalService() {
|
||||
yield put(closeModal());
|
||||
}
|
||||
8
client/src/sagas/app/services/notification.js
Normal file
8
client/src/sagas/app/services/notification.js
Normal file
@@ -0,0 +1,8 @@
|
||||
import { call } from 'redux-saga/effects';
|
||||
|
||||
import { deleteNotificationsService } from './notifications';
|
||||
|
||||
// eslint-disable-next-line import/prefer-default-export
|
||||
export function* deleteNotificationService(id) {
|
||||
yield call(deleteNotificationsService, [id]);
|
||||
}
|
||||
18
client/src/sagas/app/services/notifications.js
Normal file
18
client/src/sagas/app/services/notifications.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import { deleteNotificationsRequest } from '../requests';
|
||||
import { notificationIdsForCurrentCardSelector } from '../../../selectors';
|
||||
import { deleteNotifications } from '../../../actions';
|
||||
|
||||
export function* deleteNotificationsService(ids) {
|
||||
yield put(deleteNotifications(ids));
|
||||
yield call(deleteNotificationsRequest, ids);
|
||||
}
|
||||
|
||||
export function* deleteNotificationsInCurrentCardService() {
|
||||
const notificationIds = yield select(notificationIdsForCurrentCardSelector);
|
||||
|
||||
if (notificationIds && notificationIds.length > 0) {
|
||||
yield call(deleteNotificationsService, notificationIds);
|
||||
}
|
||||
}
|
||||
32
client/src/sagas/app/services/project-membership.js
Normal file
32
client/src/sagas/app/services/project-membership.js
Normal file
@@ -0,0 +1,32 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import { createProjectMembershipRequest, deleteProjectMembershipRequest } from '../requests';
|
||||
import { maxIdSelector, pathSelector } from '../../../selectors';
|
||||
import { createProjectMembership, deleteProjectMembership } from '../../../actions';
|
||||
import { nextLocalId } from '../../../utils/local-id';
|
||||
import { ProjectMembership } from '../../../models';
|
||||
|
||||
export function* createProjectMembershipService(projectId, data) {
|
||||
const localId = nextLocalId(yield select(maxIdSelector, ProjectMembership.modelName));
|
||||
|
||||
yield put(
|
||||
createProjectMembership({
|
||||
...data,
|
||||
projectId,
|
||||
id: localId,
|
||||
}),
|
||||
);
|
||||
|
||||
yield call(createProjectMembershipRequest, projectId, localId, data);
|
||||
}
|
||||
|
||||
export function* createMembershipInCurrentProjectService(data) {
|
||||
const { projectId } = yield select(pathSelector);
|
||||
|
||||
yield call(createProjectMembershipService, projectId, data);
|
||||
}
|
||||
|
||||
export function* deleteProjectMembershipService(id) {
|
||||
yield put(deleteProjectMembership(id));
|
||||
yield call(deleteProjectMembershipRequest, id);
|
||||
}
|
||||
47
client/src/sagas/app/services/project.js
Normal file
47
client/src/sagas/app/services/project.js
Normal file
@@ -0,0 +1,47 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import { goToProjectService, goToRootService } from './router';
|
||||
import { createProjectRequest, deleteProjectRequest, updateProjectRequest } from '../requests';
|
||||
import { pathSelector } from '../../../selectors';
|
||||
import { createProject, deleteProject, updateProject } from '../../../actions';
|
||||
|
||||
export function* createProjectService(data) {
|
||||
yield put(createProject(data));
|
||||
|
||||
const {
|
||||
success,
|
||||
payload: { project },
|
||||
} = yield call(createProjectRequest, data);
|
||||
|
||||
if (success) {
|
||||
yield call(goToProjectService, project.id);
|
||||
}
|
||||
}
|
||||
|
||||
export function* updateProjectService(id, data) {
|
||||
yield put(updateProject(id, data));
|
||||
yield call(updateProjectRequest, id, data);
|
||||
}
|
||||
|
||||
export function* updateCurrentProjectService(data) {
|
||||
const { projectId } = yield select(pathSelector);
|
||||
|
||||
yield call(updateProjectService, projectId, data);
|
||||
}
|
||||
|
||||
export function* deleteProjectService(id) {
|
||||
const { projectId } = yield select(pathSelector);
|
||||
|
||||
if (id === projectId) {
|
||||
yield call(goToRootService);
|
||||
}
|
||||
|
||||
yield put(deleteProject(id));
|
||||
yield call(deleteProjectRequest, id);
|
||||
}
|
||||
|
||||
export function* deleteCurrentProjectService() {
|
||||
const { projectId } = yield select(pathSelector);
|
||||
|
||||
yield call(deleteProjectService, projectId);
|
||||
}
|
||||
71
client/src/sagas/app/services/router.js
Normal file
71
client/src/sagas/app/services/router.js
Normal file
@@ -0,0 +1,71 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
import { push } from 'connected-react-router';
|
||||
|
||||
import { deleteNotificationsInCurrentCardService } from './notifications';
|
||||
import { fetchBoardRequest } from '../requests';
|
||||
import {
|
||||
currentBoardSelector,
|
||||
isAppInitializingSelector,
|
||||
pathsMatchSelector,
|
||||
} from '../../../selectors';
|
||||
import Paths from '../../../constants/Paths';
|
||||
|
||||
export function* goToRootService() {
|
||||
yield put(push(Paths.ROOT));
|
||||
}
|
||||
|
||||
export function* goToProjectService(projectId) {
|
||||
yield put(push(Paths.PROJECTS.replace(':id', projectId)));
|
||||
}
|
||||
|
||||
export function* goToBoardService(boardId) {
|
||||
yield put(push(Paths.BOARDS.replace(':id', boardId)));
|
||||
}
|
||||
|
||||
export function* goToCardService(cardId) {
|
||||
yield put(push(Paths.CARDS.replace(':id', cardId)));
|
||||
}
|
||||
|
||||
export function* runPathActionsService(pathsMatch) {
|
||||
if (!pathsMatch) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (pathsMatch.path) {
|
||||
case Paths.BOARDS:
|
||||
case Paths.CARDS: {
|
||||
const currentBoard = yield select(currentBoardSelector);
|
||||
|
||||
if (currentBoard && currentBoard.isFetching === null) {
|
||||
yield call(fetchBoardRequest, currentBoard.id);
|
||||
}
|
||||
|
||||
if (pathsMatch.path === Paths.CARDS) {
|
||||
yield call(deleteNotificationsInCurrentCardService);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
export function* locationChangedService() {
|
||||
const pathsMatch = yield select(pathsMatchSelector);
|
||||
|
||||
if (pathsMatch) {
|
||||
switch (pathsMatch.path) {
|
||||
case Paths.LOGIN:
|
||||
yield call(goToRootService);
|
||||
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
const isAppInitializing = yield select(isAppInitializingSelector);
|
||||
|
||||
if (!isAppInitializing) {
|
||||
yield call(runPathActionsService, pathsMatch);
|
||||
}
|
||||
}
|
||||
232
client/src/sagas/app/services/socket.js
Normal file
232
client/src/sagas/app/services/socket.js
Normal file
@@ -0,0 +1,232 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import { goToBoardService, goToProjectService, goToRootService } from './router';
|
||||
import { logoutService } from './login';
|
||||
import { closeModalService } from './modal';
|
||||
import { deleteNotificationsRequest, fetchUsersRequest } from '../requests';
|
||||
import {
|
||||
currentModalSelector,
|
||||
currentUserIdSelector,
|
||||
currentUserSelector,
|
||||
pathSelector,
|
||||
} from '../../../selectors';
|
||||
import {
|
||||
createActionReceived,
|
||||
createBoardReceived,
|
||||
createCardLabelReceived,
|
||||
createCardMembershipReceived,
|
||||
createCardReceived,
|
||||
createLabelReceived,
|
||||
createListReceived,
|
||||
createNotificationReceived,
|
||||
createProjectMembershipReceived,
|
||||
createProjectReceived,
|
||||
createTaskReceived,
|
||||
createUserReceived,
|
||||
deleteActionReceived,
|
||||
deleteCardLabelReceived,
|
||||
deleteCardMembershipReceived,
|
||||
deleteCardReceived,
|
||||
deleteBoardReceived,
|
||||
deleteLabelReceived,
|
||||
deleteListReceived,
|
||||
deleteNotificationReceived,
|
||||
deleteProjectMembershipReceived,
|
||||
deleteProjectReceived,
|
||||
deleteTaskReceived,
|
||||
deleteUserReceived,
|
||||
socketDisconnected,
|
||||
socketReconnected,
|
||||
updateActionReceived,
|
||||
updateBoardReceived,
|
||||
updateCardReceived,
|
||||
updateLabelReceived,
|
||||
updateListReceived,
|
||||
updateProjectReceived,
|
||||
updateTaskReceived,
|
||||
updateUserReceived,
|
||||
} from '../../../actions';
|
||||
import ModalTypes from '../../../constants/ModalTypes';
|
||||
|
||||
export function* socketDisconnectedService() {
|
||||
yield put(socketDisconnected());
|
||||
}
|
||||
|
||||
// TODO: refetch state on reconnect
|
||||
export function* socketReconnectedService() {
|
||||
yield put(socketReconnected());
|
||||
}
|
||||
|
||||
export function* createUserReceivedService(user) {
|
||||
yield put(createUserReceived(user));
|
||||
}
|
||||
|
||||
export function* updateUserReceivedService(user) {
|
||||
const currentUser = yield select(currentUserSelector);
|
||||
|
||||
if (user.id === currentUser.id) {
|
||||
if (currentUser.isAdmin) {
|
||||
if (!user.isAdmin) {
|
||||
const currentModal = yield select(currentModalSelector);
|
||||
|
||||
if (currentModal === ModalTypes.USERS) {
|
||||
yield call(closeModalService);
|
||||
}
|
||||
}
|
||||
} else if (user.isAdmin) {
|
||||
yield call(fetchUsersRequest);
|
||||
}
|
||||
}
|
||||
|
||||
yield put(updateUserReceived(user));
|
||||
}
|
||||
|
||||
export function* deleteUserReceivedService(user) {
|
||||
const currentUserId = yield select(currentUserIdSelector);
|
||||
|
||||
if (user.id === currentUserId) {
|
||||
yield call(logoutService);
|
||||
}
|
||||
|
||||
yield put(deleteUserReceived(user));
|
||||
}
|
||||
|
||||
export function* createProjectReceivedService(project, users, projectMemberships, boards) {
|
||||
yield put(createProjectReceived(project, users, projectMemberships, boards));
|
||||
}
|
||||
|
||||
export function* updateProjectReceivedService(project) {
|
||||
yield put(updateProjectReceived(project));
|
||||
}
|
||||
|
||||
export function* deleteProjectReceivedService(project) {
|
||||
const { projectId } = yield select(pathSelector);
|
||||
|
||||
if (project.id === projectId) {
|
||||
yield call(goToRootService);
|
||||
}
|
||||
|
||||
yield put(deleteProjectReceived(project));
|
||||
}
|
||||
|
||||
export function* createProjectMembershipReceivedService(projectMembership, user) {
|
||||
yield put(createProjectMembershipReceived(projectMembership, user));
|
||||
}
|
||||
|
||||
export function* deleteProjectMembershipReceivedService(projectMembership) {
|
||||
yield put(deleteProjectMembershipReceived(projectMembership));
|
||||
}
|
||||
|
||||
export function* createBoardReceivedService(board, lists, labels) {
|
||||
yield put(createBoardReceived(board, lists, labels));
|
||||
}
|
||||
|
||||
export function* updateBoardReceivedService(board) {
|
||||
yield put(updateBoardReceived(board));
|
||||
}
|
||||
|
||||
export function* deleteBoardReceivedService(board) {
|
||||
const { boardId, projectId } = yield select(pathSelector);
|
||||
|
||||
if (board.id === boardId) {
|
||||
yield call(goToProjectService, projectId);
|
||||
}
|
||||
|
||||
yield put(deleteBoardReceived(board));
|
||||
}
|
||||
|
||||
export function* createListReceivedService(list) {
|
||||
yield put(createListReceived(list));
|
||||
}
|
||||
|
||||
export function* updateListReceivedService(list) {
|
||||
yield put(updateListReceived(list));
|
||||
}
|
||||
|
||||
export function* deleteListReceivedService(list) {
|
||||
yield put(deleteListReceived(list));
|
||||
}
|
||||
|
||||
export function* createLabelReceivedService(label) {
|
||||
yield put(createLabelReceived(label));
|
||||
}
|
||||
|
||||
export function* updateLabelReceivedService(label) {
|
||||
yield put(updateLabelReceived(label));
|
||||
}
|
||||
|
||||
export function* deleteLabelReceivedService(label) {
|
||||
yield put(deleteLabelReceived(label));
|
||||
}
|
||||
|
||||
export function* createCardReceivedService(card) {
|
||||
yield put(createCardReceived(card));
|
||||
}
|
||||
|
||||
export function* updateCardReceivedService(card) {
|
||||
yield put(updateCardReceived(card));
|
||||
}
|
||||
|
||||
export function* deleteCardReceivedService(card) {
|
||||
const { cardId, boardId } = yield select(pathSelector);
|
||||
|
||||
if (card.id === cardId) {
|
||||
yield call(goToBoardService, boardId);
|
||||
}
|
||||
|
||||
yield put(deleteCardReceived(card));
|
||||
}
|
||||
|
||||
export function* createCardMembershipReceivedService(cardMembership) {
|
||||
yield put(createCardMembershipReceived(cardMembership));
|
||||
}
|
||||
|
||||
export function* deleteCardMembershipReceivedService(cardMembership) {
|
||||
yield put(deleteCardMembershipReceived(cardMembership));
|
||||
}
|
||||
|
||||
export function* createCardLabelReceivedService(cardLabel) {
|
||||
yield put(createCardLabelReceived(cardLabel));
|
||||
}
|
||||
|
||||
export function* deleteCardLabelReceivedService(cardLabel) {
|
||||
yield put(deleteCardLabelReceived(cardLabel));
|
||||
}
|
||||
|
||||
export function* createTaskReceivedService(task) {
|
||||
yield put(createTaskReceived(task));
|
||||
}
|
||||
|
||||
export function* updateTaskReceivedService(task) {
|
||||
yield put(updateTaskReceived(task));
|
||||
}
|
||||
|
||||
export function* deleteTaskReceivedService(task) {
|
||||
yield put(deleteTaskReceived(task));
|
||||
}
|
||||
|
||||
export function* createActionReceivedService(action) {
|
||||
yield put(createActionReceived(action));
|
||||
}
|
||||
|
||||
export function* updateActionReceivedService(action) {
|
||||
yield put(updateActionReceived(action));
|
||||
}
|
||||
|
||||
export function* deleteActionReceivedService(action) {
|
||||
yield put(deleteActionReceived(action));
|
||||
}
|
||||
|
||||
export function* createNotificationReceivedService(notification, user, card, action) {
|
||||
const { cardId } = yield select(pathSelector);
|
||||
|
||||
if (card.id === cardId) {
|
||||
yield call(deleteNotificationsRequest, [notification.id]);
|
||||
} else {
|
||||
yield put(createNotificationReceived(notification, user, card, action));
|
||||
}
|
||||
}
|
||||
|
||||
export function* deleteNotificationReceivedService(notification) {
|
||||
yield put(deleteNotificationReceived(notification));
|
||||
}
|
||||
37
client/src/sagas/app/services/task.js
Normal file
37
client/src/sagas/app/services/task.js
Normal file
@@ -0,0 +1,37 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import { createTaskRequest, deleteTaskRequest, updateTaskRequest } from '../requests';
|
||||
import { maxIdSelector, pathSelector } from '../../../selectors';
|
||||
import { createTask, deleteTask, updateTask } from '../../../actions';
|
||||
import { nextLocalId } from '../../../utils/local-id';
|
||||
import { Task } from '../../../models';
|
||||
|
||||
export function* createTaskService(cardId, data) {
|
||||
const localId = nextLocalId(yield select(maxIdSelector, Task.modelName));
|
||||
|
||||
yield put(
|
||||
createTask({
|
||||
...data,
|
||||
cardId,
|
||||
id: localId,
|
||||
}),
|
||||
);
|
||||
|
||||
yield call(createTaskRequest, cardId, localId, data);
|
||||
}
|
||||
|
||||
export function* createTaskInCurrentCardService(data) {
|
||||
const { cardId } = yield select(pathSelector);
|
||||
|
||||
yield call(createTaskService, cardId, data);
|
||||
}
|
||||
|
||||
export function* updateTaskService(id, data) {
|
||||
yield put(updateTask(id, data));
|
||||
yield call(updateTaskRequest, id, data);
|
||||
}
|
||||
|
||||
export function* deleteTaskService(id) {
|
||||
yield put(deleteTask(id));
|
||||
yield call(deleteTaskRequest, id);
|
||||
}
|
||||
96
client/src/sagas/app/services/user.js
Normal file
96
client/src/sagas/app/services/user.js
Normal file
@@ -0,0 +1,96 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
|
||||
import {
|
||||
createCardMembershipRequest,
|
||||
createUserRequest,
|
||||
deleteCardMembershipRequest,
|
||||
deleteUserRequest,
|
||||
updateUserRequest,
|
||||
uploadUserAvatarRequest,
|
||||
} from '../requests';
|
||||
import { currentUserIdSelector, pathSelector } from '../../../selectors';
|
||||
import {
|
||||
addUserToBoardFilter,
|
||||
addUserToCard,
|
||||
clearUserCreationError,
|
||||
createUser,
|
||||
deleteUser,
|
||||
updateUser,
|
||||
removeUserFromBoardFilter,
|
||||
removeUserFromCard,
|
||||
} from '../../../actions';
|
||||
|
||||
export function* createUserService(data) {
|
||||
yield put(createUser(data));
|
||||
yield call(createUserRequest, data);
|
||||
}
|
||||
|
||||
export function* clearUserCreationErrorService() {
|
||||
yield put(clearUserCreationError());
|
||||
}
|
||||
|
||||
export function* updateUserService(id, data) {
|
||||
yield put(updateUser(id, data));
|
||||
yield call(updateUserRequest, id, data);
|
||||
}
|
||||
|
||||
export function* updateCurrentUserService(data) {
|
||||
const id = yield select(currentUserIdSelector);
|
||||
|
||||
yield call(updateUserService, id, data);
|
||||
}
|
||||
|
||||
export function* uploadCurrentUserAvatarService(file) {
|
||||
const id = yield select(currentUserIdSelector);
|
||||
|
||||
yield call(uploadUserAvatarRequest, id, file);
|
||||
}
|
||||
|
||||
export function* deleteUserService(id) {
|
||||
yield put(deleteUser(id));
|
||||
yield call(deleteUserRequest, id);
|
||||
}
|
||||
|
||||
export function* addUserToCardService(id, cardId) {
|
||||
const currentUserId = yield select(currentUserIdSelector);
|
||||
|
||||
yield put(addUserToCard(id, cardId, id === currentUserId));
|
||||
yield call(createCardMembershipRequest, cardId, id);
|
||||
}
|
||||
|
||||
export function* addUserToCurrentCardService(id) {
|
||||
const { cardId } = yield select(pathSelector);
|
||||
|
||||
yield call(addUserToCardService, id, cardId);
|
||||
}
|
||||
|
||||
export function* removeUserFromCardService(id, cardId) {
|
||||
yield put(removeUserFromCard(id, cardId));
|
||||
yield call(deleteCardMembershipRequest, cardId, id);
|
||||
}
|
||||
|
||||
export function* removeUserFromCurrentCardService(id) {
|
||||
const { cardId } = yield select(pathSelector);
|
||||
|
||||
yield call(removeUserFromCardService, id, cardId);
|
||||
}
|
||||
|
||||
export function* addUserToBoardFilterService(id, boardId) {
|
||||
yield put(addUserToBoardFilter(id, boardId));
|
||||
}
|
||||
|
||||
export function* addUserToFilterInCurrentBoardService(id) {
|
||||
const { boardId } = yield select(pathSelector);
|
||||
|
||||
yield call(addUserToBoardFilterService, id, boardId);
|
||||
}
|
||||
|
||||
export function* removeUserFromBoardFilterService(id, boardId) {
|
||||
yield put(removeUserFromBoardFilter(id, boardId));
|
||||
}
|
||||
|
||||
export function* removeUserFromFilterInCurrentBoardService(id) {
|
||||
const { boardId } = yield select(pathSelector);
|
||||
|
||||
yield call(removeUserFromBoardFilterService, id, boardId);
|
||||
}
|
||||
Reference in New Issue
Block a user