diff --git a/client/src/actions/action.js b/client/src/actions/action.js deleted file mode 100644 index b0c6fd68..00000000 --- a/client/src/actions/action.js +++ /dev/null @@ -1,22 +0,0 @@ -import ActionTypes from '../constants/ActionTypes'; - -export const handleActionCreate = (action) => ({ - type: ActionTypes.ACTION_CREATE_HANDLE, - payload: { - action, - }, -}); - -export const handleActionUpdate = (action) => ({ - type: ActionTypes.ACTION_UPDATE_HANDLE, - payload: { - action, - }, -}); - -export const handleActionDelete = (action) => ({ - type: ActionTypes.ACTION_DELETE_HANDLE, - payload: { - action, - }, -}); diff --git a/client/src/actions/actions.js b/client/src/actions/actions.js deleted file mode 100644 index 527be153..00000000 --- a/client/src/actions/actions.js +++ /dev/null @@ -1,50 +0,0 @@ -import ActionTypes from '../constants/ActionTypes'; - -export const fetchActions = (cardId) => ({ - type: ActionTypes.ACTIONS_FETCH, - payload: { - cardId, - }, -}); - -fetchActions.success = (cardId, actions, users) => ({ - type: ActionTypes.ACTIONS_FETCH__SUCCESS, - payload: { - cardId, - actions, - users, - }, -}); - -fetchActions.failure = (cardId, error) => ({ - type: ActionTypes.ACTIONS_FETCH__FAILURE, - payload: { - cardId, - error, - }, -}); - -export const toggleActionsDetails = (cardId, isVisible) => ({ - type: ActionTypes.ACTIONS_DETAILS_TOGGLE, - payload: { - cardId, - isVisible, - }, -}); - -toggleActionsDetails.success = (cardId, actions, users) => ({ - type: ActionTypes.ACTIONS_DETAILS_TOGGLE__SUCCESS, - payload: { - cardId, - actions, - users, - }, -}); - -toggleActionsDetails.failure = (cardId, error) => ({ - type: ActionTypes.ACTIONS_DETAILS_TOGGLE__FAILURE, - payload: { - cardId, - error, - }, -}); diff --git a/client/src/actions/activities.js b/client/src/actions/activities.js new file mode 100644 index 00000000..d3a23a91 --- /dev/null +++ b/client/src/actions/activities.js @@ -0,0 +1,79 @@ +import ActionTypes from '../constants/ActionTypes'; + +const fetchActivities = (cardId) => ({ + type: ActionTypes.ACTIVITIES_FETCH, + payload: { + cardId, + }, +}); + +fetchActivities.success = (cardId, activities, users) => ({ + type: ActionTypes.ACTIVITIES_FETCH__SUCCESS, + payload: { + cardId, + activities, + users, + }, +}); + +fetchActivities.failure = (cardId, error) => ({ + type: ActionTypes.ACTIVITIES_FETCH__FAILURE, + payload: { + cardId, + error, + }, +}); + +const toggleActivitiesDetails = (cardId, isVisible) => ({ + type: ActionTypes.ACTIVITIES_DETAILS_TOGGLE, + payload: { + cardId, + isVisible, + }, +}); + +toggleActivitiesDetails.success = (cardId, activities, users) => ({ + type: ActionTypes.ACTIVITIES_DETAILS_TOGGLE__SUCCESS, + payload: { + cardId, + activities, + users, + }, +}); + +toggleActivitiesDetails.failure = (cardId, error) => ({ + type: ActionTypes.ACTIVITIES_DETAILS_TOGGLE__FAILURE, + payload: { + cardId, + error, + }, +}); + +const handleActivityCreate = (activity) => ({ + type: ActionTypes.ACTIVITY_CREATE_HANDLE, + payload: { + activity, + }, +}); + +const handleActivityUpdate = (activity) => ({ + type: ActionTypes.ACTIVITY_UPDATE_HANDLE, + payload: { + activity, + }, +}); + +const handleActivityDelete = (activity) => ({ + type: ActionTypes.ACTIVITY_DELETE_HANDLE, + payload: { + activity, + }, +}); + +export default { + fetchActivities, + toggleActivitiesDetails, + handleActivityCreate, + handleActivityUpdate, + handleActivityDelete, +}; diff --git a/client/src/actions/attachment.js b/client/src/actions/attachments.js similarity index 76% rename from client/src/actions/attachment.js rename to client/src/actions/attachments.js index b89e5af0..91c6c382 100644 --- a/client/src/actions/attachment.js +++ b/client/src/actions/attachments.js @@ -1,6 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -export const createAttachment = (attachment) => ({ +const createAttachment = (attachment) => ({ type: ActionTypes.ATTACHMENT_CREATE, payload: { attachment, @@ -23,14 +23,14 @@ createAttachment.failure = (localId, error) => ({ }, }); -export const handleAttachmentCreate = (attachment) => ({ +const handleAttachmentCreate = (attachment) => ({ type: ActionTypes.ATTACHMENT_CREATE_HANDLE, payload: { attachment, }, }); -export const updateAttachment = (id, data) => ({ +const updateAttachment = (id, data) => ({ type: ActionTypes.ATTACHMENT_UPDATE, payload: { id, @@ -53,14 +53,14 @@ updateAttachment.failure = (id, error) => ({ }, }); -export const handleAttachmentUpdate = (attachment) => ({ +const handleAttachmentUpdate = (attachment) => ({ type: ActionTypes.ATTACHMENT_UPDATE_HANDLE, payload: { attachment, }, }); -export const deleteAttachment = (id) => ({ +const deleteAttachment = (id) => ({ type: ActionTypes.ATTACHMENT_DELETE, payload: { id, @@ -82,9 +82,18 @@ deleteAttachment.failure = (id, error) => ({ }, }); -export const handleAttachmentDelete = (attachment) => ({ +const handleAttachmentDelete = (attachment) => ({ type: ActionTypes.ATTACHMENT_DELETE_HANDLE, payload: { attachment, }, }); + +export default { + createAttachment, + handleAttachmentCreate, + updateAttachment, + handleAttachmentUpdate, + deleteAttachment, + handleAttachmentDelete, +}; diff --git a/client/src/actions/board-membership.js b/client/src/actions/board-memberships.js similarity index 81% rename from client/src/actions/board-membership.js rename to client/src/actions/board-memberships.js index c6b2a568..4871a0a6 100644 --- a/client/src/actions/board-membership.js +++ b/client/src/actions/board-memberships.js @@ -1,6 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -export const createBoardMembership = (boardMembership) => ({ +const createBoardMembership = (boardMembership) => ({ type: ActionTypes.BOARD_MEMBERSHIP_CREATE, payload: { boardMembership, @@ -23,7 +23,7 @@ createBoardMembership.failure = (localId, error) => ({ }, }); -export const handleBoardMembershipCreate = ( +const handleBoardMembershipCreate = ( boardMembership, project, board, @@ -38,6 +38,7 @@ export const handleBoardMembershipCreate = ( cardLabels, tasks, attachments, + deletedNotifications, ) => ({ type: ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE, payload: { @@ -55,6 +56,7 @@ export const handleBoardMembershipCreate = ( cardLabels, tasks, attachments, + deletedNotifications, }, }); @@ -67,7 +69,7 @@ handleBoardMembershipCreate.fetchProject = (id, currentUserId, currentBoardId) = }, }); -export const deleteBoardMembership = (id) => ({ +const deleteBoardMembership = (id) => ({ type: ActionTypes.BOARD_MEMBERSHIP_DELETE, payload: { id, @@ -89,9 +91,16 @@ deleteBoardMembership.failure = (id, error) => ({ }, }); -export const handleBoardMembershipDelete = (boardMembership) => ({ +const handleBoardMembershipDelete = (boardMembership) => ({ type: ActionTypes.BOARD_MEMBERSHIP_DELETE_HANDLE, payload: { boardMembership, }, }); + +export default { + createBoardMembership, + handleBoardMembershipCreate, + deleteBoardMembership, + handleBoardMembershipDelete, +}; diff --git a/client/src/actions/board.js b/client/src/actions/boards.js similarity index 82% rename from client/src/actions/board.js rename to client/src/actions/boards.js index 23e336f9..484ae23a 100644 --- a/client/src/actions/board.js +++ b/client/src/actions/boards.js @@ -1,6 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -export const createBoard = (board) => ({ +const createBoard = (board) => ({ type: ActionTypes.BOARD_CREATE, payload: { board, @@ -24,14 +24,14 @@ createBoard.failure = (localId, error) => ({ }, }); -export const handleBoardCreate = (board) => ({ +const handleBoardCreate = (board) => ({ type: ActionTypes.BOARD_CREATE_HANDLE, payload: { board, }, }); -export const fetchBoard = (id) => ({ +const fetchBoard = (id) => ({ type: ActionTypes.BOARD_FETCH, payload: { id, @@ -75,7 +75,7 @@ fetchBoard.failure = (id, error) => ({ }, }); -export const updateBoard = (id, data) => ({ +const updateBoard = (id, data) => ({ type: ActionTypes.BOARD_UPDATE, payload: { id, @@ -98,14 +98,14 @@ updateBoard.failure = (id, error) => ({ }, }); -export const handleBoardUpdate = (board) => ({ +const handleBoardUpdate = (board) => ({ type: ActionTypes.BOARD_UPDATE_HANDLE, payload: { board, }, }); -export const deleteBoard = (id) => ({ +const deleteBoard = (id) => ({ type: ActionTypes.BOARD_DELETE, payload: { id, @@ -127,9 +127,19 @@ deleteBoard.failure = (id, error) => ({ }, }); -export const handleBoardDelete = (board) => ({ +const handleBoardDelete = (board) => ({ type: ActionTypes.BOARD_DELETE_HANDLE, payload: { board, }, }); + +export default { + createBoard, + handleBoardCreate, + fetchBoard, + updateBoard, + handleBoardUpdate, + deleteBoard, + handleBoardDelete, +}; diff --git a/client/src/actions/card.js b/client/src/actions/cards.js similarity index 78% rename from client/src/actions/card.js rename to client/src/actions/cards.js index 1efb3473..09699108 100644 --- a/client/src/actions/card.js +++ b/client/src/actions/cards.js @@ -1,6 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -export const createCard = (card) => ({ +const createCard = (card) => ({ type: ActionTypes.CARD_CREATE, payload: { card, @@ -23,14 +23,14 @@ createCard.failure = (localId, error) => ({ }, }); -export const handleCardCreate = (card) => ({ +const handleCardCreate = (card) => ({ type: ActionTypes.CARD_CREATE_HANDLE, payload: { card, }, }); -export const updateCard = (id, data) => ({ +const updateCard = (id, data) => ({ type: ActionTypes.CARD_UPDATE, payload: { id, @@ -53,14 +53,14 @@ updateCard.failure = (id, error) => ({ }, }); -export const handleCardUpdate = (card) => ({ +const handleCardUpdate = (card) => ({ type: ActionTypes.CARD_UPDATE_HANDLE, payload: { card, }, }); -export const deleteCard = (id) => ({ +const deleteCard = (id) => ({ type: ActionTypes.CARD_DELETE, payload: { id, @@ -82,9 +82,18 @@ deleteCard.failure = (id, error) => ({ }, }); -export const handleCardDelete = (card) => ({ +const handleCardDelete = (card) => ({ type: ActionTypes.CARD_DELETE_HANDLE, payload: { card, }, }); + +export default { + createCard, + handleCardCreate, + updateCard, + handleCardUpdate, + deleteCard, + handleCardDelete, +}; diff --git a/client/src/actions/comment-action.js b/client/src/actions/comment-action.js deleted file mode 100644 index b9443e30..00000000 --- a/client/src/actions/comment-action.js +++ /dev/null @@ -1,69 +0,0 @@ -import ActionTypes from '../constants/ActionTypes'; - -export const createCommentAction = (action) => ({ - type: ActionTypes.COMMENT_ACTION_CREATE, - payload: { - action, - }, -}); - -createCommentAction.success = (localId, action) => ({ - type: ActionTypes.COMMENT_ACTION_CREATE__SUCCESS, - payload: { - localId, - action, - }, -}); - -createCommentAction.failure = (localId, error) => ({ - type: ActionTypes.COMMENT_ACTION_CREATE__FAILURE, - payload: { - localId, - error, - }, -}); - -export const updateCommentAction = (id, data) => ({ - type: ActionTypes.COMMENT_ACTION_UPDATE, - payload: { - id, - data, - }, -}); - -updateCommentAction.success = (action) => ({ - type: ActionTypes.COMMENT_ACTION_UPDATE__SUCCESS, - payload: { - action, - }, -}); - -updateCommentAction.failure = (id, error) => ({ - type: ActionTypes.COMMENT_ACTION_UPDATE__FAILURE, - payload: { - id, - error, - }, -}); - -export const deleteCommentAction = (id) => ({ - type: ActionTypes.COMMENT_ACTION_DELETE, - payload: { - id, - }, -}); - -deleteCommentAction.success = (action) => ({ - type: ActionTypes.COMMENT_ACTION_DELETE__SUCCESS, - payload: { - action, - }, -}); - -deleteCommentAction.failure = (id, error) => ({ - type: ActionTypes.COMMENT_ACTION_DELETE__FAILURE, - payload: { - id, - error, - }, -}); diff --git a/client/src/actions/comment-activities.js b/client/src/actions/comment-activities.js new file mode 100644 index 00000000..03710e17 --- /dev/null +++ b/client/src/actions/comment-activities.js @@ -0,0 +1,75 @@ +import ActionTypes from '../constants/ActionTypes'; + +const createCommentActivity = (activity) => ({ + type: ActionTypes.COMMENT_ACTIVITY_CREATE, + payload: { + activity, + }, +}); + +createCommentActivity.success = (localId, activity) => ({ + type: ActionTypes.COMMENT_ACTIVITY_CREATE__SUCCESS, + payload: { + localId, + activity, + }, +}); + +createCommentActivity.failure = (localId, error) => ({ + type: ActionTypes.COMMENT_ACTIVITY_CREATE__FAILURE, + payload: { + localId, + error, + }, +}); + +const updateCommentActivity = (id, data) => ({ + type: ActionTypes.COMMENT_ACTIVITY_UPDATE, + payload: { + id, + data, + }, +}); + +updateCommentActivity.success = (activity) => ({ + type: ActionTypes.COMMENT_ACTIVITY_UPDATE__SUCCESS, + payload: { + activity, + }, +}); + +updateCommentActivity.failure = (id, error) => ({ + type: ActionTypes.COMMENT_ACTIVITY_UPDATE__FAILURE, + payload: { + id, + error, + }, +}); + +const deleteCommentActivity = (id) => ({ + type: ActionTypes.COMMENT_ACTIVITY_DELETE, + payload: { + id, + }, +}); + +deleteCommentActivity.success = (activity) => ({ + type: ActionTypes.COMMENT_ACTIVITY_DELETE__SUCCESS, + payload: { + activity, + }, +}); + +deleteCommentActivity.failure = (id, error) => ({ + type: ActionTypes.COMMENT_ACTIVITY_DELETE__FAILURE, + payload: { + id, + error, + }, +}); + +export default { + createCommentActivity, + updateCommentActivity, + deleteCommentActivity, +}; diff --git a/client/src/actions/core.js b/client/src/actions/core.js index b81f1768..e144bd94 100644 --- a/client/src/actions/core.js +++ b/client/src/actions/core.js @@ -1,7 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -// eslint-disable-next-line import/prefer-default-export -export const initializeCore = ( +const initializeCore = ( user, board, users, @@ -16,7 +15,7 @@ export const initializeCore = ( cardLabels, tasks, attachments, - actions, + activities, notifications, ) => ({ type: ActionTypes.CORE_INITIALIZE, @@ -35,7 +34,17 @@ export const initializeCore = ( cardLabels, tasks, attachments, - actions, + activities, notifications, }, }); + +const logout = () => ({ + type: ActionTypes.LOGOUT, + payload: {}, +}); + +export default { + initializeCore, + logout, +}; diff --git a/client/src/actions/entry/action.js b/client/src/actions/entry/action.js deleted file mode 100644 index 01cd322c..00000000 --- a/client/src/actions/entry/action.js +++ /dev/null @@ -1,22 +0,0 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; - -export const handleActionCreate = (action) => ({ - type: EntryActionTypes.ACTION_CREATE_HANDLE, - payload: { - action, - }, -}); - -export const handleActionUpdate = (action) => ({ - type: EntryActionTypes.ACTION_UPDATE_HANDLE, - payload: { - action, - }, -}); - -export const handleActionDelete = (action) => ({ - type: EntryActionTypes.ACTION_DELETE_HANDLE, - payload: { - action, - }, -}); diff --git a/client/src/actions/entry/actions.js b/client/src/actions/entry/actions.js deleted file mode 100755 index a83a544e..00000000 --- a/client/src/actions/entry/actions.js +++ /dev/null @@ -1,13 +0,0 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; - -export const fetchActionsInCurrentCard = () => ({ - type: EntryActionTypes.ACTIONS_IN_CURRENT_CARD_FETCH, - payload: {}, -}); - -export const toggleActionsDetailsInCurrentCard = (isVisible) => ({ - type: EntryActionTypes.ACTIONS_DETAILS_IN_CURRENT_CARD_TOGGLE, - payload: { - isVisible, - }, -}); diff --git a/client/src/actions/entry/board-membership.js b/client/src/actions/entry/board-membership.js deleted file mode 100644 index 109ec360..00000000 --- a/client/src/actions/entry/board-membership.js +++ /dev/null @@ -1,29 +0,0 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; - -export const createMembershipInCurrentBoard = (data) => ({ - type: EntryActionTypes.MEMBERSHIP_IN_CURRENT_BOARD_CREATE, - payload: { - data, - }, -}); - -export const handleBoardMembershipCreate = (boardMembership) => ({ - type: EntryActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE, - payload: { - boardMembership, - }, -}); - -export const deleteBoardMembership = (id) => ({ - type: EntryActionTypes.BOARD_MEMBERSHIP_DELETE, - payload: { - id, - }, -}); - -export const handleBoardMembershipDelete = (boardMembership) => ({ - type: EntryActionTypes.BOARD_MEMBERSHIP_DELETE_HANDLE, - payload: { - boardMembership, - }, -}); diff --git a/client/src/actions/entry/comment-action.js b/client/src/actions/entry/comment-action.js deleted file mode 100755 index 8e60b945..00000000 --- a/client/src/actions/entry/comment-action.js +++ /dev/null @@ -1,23 +0,0 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; - -export const createCommentActionInCurrentCard = (data) => ({ - type: EntryActionTypes.COMMENT_ACTION_IN_CURRENT_CARD_CREATE, - payload: { - data, - }, -}); - -export const updateCommentAction = (id, data) => ({ - type: EntryActionTypes.COMMENT_ACTION_UPDATE, - payload: { - id, - data, - }, -}); - -export const deleteCommentAction = (id) => ({ - type: EntryActionTypes.COMMENT_ACTION_DELETE, - payload: { - id, - }, -}); diff --git a/client/src/actions/entry/core.js b/client/src/actions/entry/core.js deleted file mode 100644 index b6aa410b..00000000 --- a/client/src/actions/entry/core.js +++ /dev/null @@ -1,7 +0,0 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; - -// eslint-disable-next-line import/prefer-default-export -export const initializeCore = () => ({ - type: EntryActionTypes.CORE_INITIALIZE, - payload: {}, -}); diff --git a/client/src/actions/entry/index.js b/client/src/actions/entry/index.js deleted file mode 100755 index 56339dcc..00000000 --- a/client/src/actions/entry/index.js +++ /dev/null @@ -1,18 +0,0 @@ -export * from './socket'; -export * from './login'; -export * from './core'; -export * from './modal'; -export * from './user'; -export * from './project'; -export * from './project-manager'; -export * from './board'; -export * from './board-membership'; -export * from './label'; -export * from './list'; -export * from './card'; -export * from './task'; -export * from './attachment'; -export * from './actions'; -export * from './action'; -export * from './comment-action'; -export * from './notification'; diff --git a/client/src/actions/entry/login.js b/client/src/actions/entry/login.js deleted file mode 100755 index 7faf5323..00000000 --- a/client/src/actions/entry/login.js +++ /dev/null @@ -1,18 +0,0 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; - -export const authenticate = (data) => ({ - type: EntryActionTypes.AUTHENTICATE, - payload: { - data, - }, -}); - -export const clearAuthenticateError = () => ({ - type: EntryActionTypes.AUTHENTICATE_ERROR_CLEAR, - payload: {}, -}); - -export const logout = () => ({ - type: EntryActionTypes.LOGOUT, - payload: {}, -}); diff --git a/client/src/actions/entry/notification.js b/client/src/actions/entry/notification.js deleted file mode 100755 index 0f2a7395..00000000 --- a/client/src/actions/entry/notification.js +++ /dev/null @@ -1,22 +0,0 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; - -export const handleNotificationCreate = (notification) => ({ - type: EntryActionTypes.NOTIFICATION_CREATE_HANDLE, - payload: { - notification, - }, -}); - -export const deleteNotification = (id) => ({ - type: EntryActionTypes.NOTIFICATION_DELETE, - payload: { - id, - }, -}); - -export const handleNotificationDelete = (notification) => ({ - type: EntryActionTypes.NOTIFICATION_DELETE_HANDLE, - payload: { - notification, - }, -}); diff --git a/client/src/actions/entry/project-manager.js b/client/src/actions/entry/project-manager.js deleted file mode 100755 index 3fc6b42d..00000000 --- a/client/src/actions/entry/project-manager.js +++ /dev/null @@ -1,29 +0,0 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; - -export const createManagerInCurrentProject = (data) => ({ - type: EntryActionTypes.MANAGER_IN_CURRENT_PROJECT_CREATE, - payload: { - data, - }, -}); - -export const handleProjectManagerCreate = (projectManager) => ({ - type: EntryActionTypes.PROJECT_MANAGER_CREATE_HANDLE, - payload: { - projectManager, - }, -}); - -export const deleteProjectManager = (id) => ({ - type: EntryActionTypes.PROJECT_MANAGER_DELETE, - payload: { - id, - }, -}); - -export const handleProjectManagerDelete = (projectManager) => ({ - type: EntryActionTypes.PROJECT_MANAGER_DELETE_HANDLE, - payload: { - projectManager, - }, -}); diff --git a/client/src/actions/entry/socket.js b/client/src/actions/entry/socket.js deleted file mode 100644 index c200ecb5..00000000 --- a/client/src/actions/entry/socket.js +++ /dev/null @@ -1,11 +0,0 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; - -export const handleSocketDisconnect = () => ({ - type: EntryActionTypes.SOCKET_DISCONNECT_HANDLE, - payload: {}, -}); - -export const handleSocketReconnect = () => ({ - type: EntryActionTypes.SOCKET_RECONNECT_HANDLE, - payload: {}, -}); diff --git a/client/src/actions/index.js b/client/src/actions/index.js index 161add47..fb60dd42 100644 --- a/client/src/actions/index.js +++ b/client/src/actions/index.js @@ -1,19 +1,39 @@ -export * from './router'; -export * from './socket'; -export * from './login'; -export * from './core'; -export * from './modal'; -export * from './user'; -export * from './project'; -export * from './project-manager'; -export * from './board'; -export * from './board-membership'; -export * from './label'; -export * from './list'; -export * from './card'; -export * from './task'; -export * from './attachment'; -export * from './actions'; -export * from './action'; -export * from './comment-action'; -export * from './notification'; +import router from './router'; +import socket from './socket'; +import login from './login'; +import core from './core'; +import modals from './modals'; +import users from './users'; +import projects from './projects'; +import projectManagers from './project-managers'; +import boards from './boards'; +import boardMemberships from './board-memberships'; +import labels from './labels'; +import lists from './lists'; +import cards from './cards'; +import tasks from './tasks'; +import attachments from './attachments'; +import activities from './activities'; +import commentActivities from './comment-activities'; +import notifications from './notifications'; + +export default { + ...router, + ...socket, + ...login, + ...core, + ...modals, + ...users, + ...projects, + ...projectManagers, + ...boards, + ...boardMemberships, + ...labels, + ...lists, + ...cards, + ...tasks, + ...attachments, + ...activities, + ...commentActivities, + ...notifications, +}; diff --git a/client/src/actions/label.js b/client/src/actions/labels.js similarity index 74% rename from client/src/actions/label.js rename to client/src/actions/labels.js index 5a9c3072..fdb93124 100644 --- a/client/src/actions/label.js +++ b/client/src/actions/labels.js @@ -1,6 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -export const createLabel = (label) => ({ +const createLabel = (label) => ({ type: ActionTypes.LABEL_CREATE, payload: { label, @@ -23,14 +23,14 @@ createLabel.failure = (localId, error) => ({ }, }); -export const handleLabelCreate = (label) => ({ +const handleLabelCreate = (label) => ({ type: ActionTypes.LABEL_CREATE_HANDLE, payload: { label, }, }); -export const updateLabel = (id, data) => ({ +const updateLabel = (id, data) => ({ type: ActionTypes.LABEL_UPDATE, payload: { id, @@ -53,14 +53,14 @@ updateLabel.failure = (id, error) => ({ }, }); -export const handleLabelUpdate = (label) => ({ +const handleLabelUpdate = (label) => ({ type: ActionTypes.LABEL_UPDATE_HANDLE, payload: { label, }, }); -export const deleteLabel = (id) => ({ +const deleteLabel = (id) => ({ type: ActionTypes.LABEL_DELETE, payload: { id, @@ -82,14 +82,14 @@ deleteLabel.failure = (id, error) => ({ }, }); -export const handleLabelDelete = (label) => ({ +const handleLabelDelete = (label) => ({ type: ActionTypes.LABEL_DELETE_HANDLE, payload: { label, }, }); -export const addLabelToCard = (id, cardId) => ({ +const addLabelToCard = (id, cardId) => ({ type: ActionTypes.LABEL_TO_CARD_ADD, payload: { id, @@ -113,14 +113,14 @@ addLabelToCard.failure = (id, cardId, error) => ({ }, }); -export const handleLabelToCardAdd = (cardLabel) => ({ +const handleLabelToCardAdd = (cardLabel) => ({ type: ActionTypes.LABEL_TO_CARD_ADD_HANDLE, payload: { cardLabel, }, }); -export const removeLabelFromCard = (id, cardId) => ({ +const removeLabelFromCard = (id, cardId) => ({ type: ActionTypes.LABEL_FROM_CARD_REMOVE, payload: { id, @@ -144,14 +144,14 @@ removeLabelFromCard.failure = (id, cardId, error) => ({ }, }); -export const handleLabelFromCardRemove = (cardLabel) => ({ +const handleLabelFromCardRemove = (cardLabel) => ({ type: ActionTypes.LABEL_FROM_CARD_REMOVE_HANDLE, payload: { cardLabel, }, }); -export const addLabelToBoardFilter = (id, boardId) => ({ +const addLabelToBoardFilter = (id, boardId) => ({ type: ActionTypes.LABEL_TO_BOARD_FILTER_ADD, payload: { id, @@ -159,10 +159,25 @@ export const addLabelToBoardFilter = (id, boardId) => ({ }, }); -export const removeLabelFromBoardFilter = (id, boardId) => ({ +const removeLabelFromBoardFilter = (id, boardId) => ({ type: ActionTypes.LABEL_FROM_BOARD_FILTER_REMOVE, payload: { id, boardId, }, }); + +export default { + createLabel, + handleLabelCreate, + updateLabel, + handleLabelUpdate, + deleteLabel, + handleLabelDelete, + addLabelToCard, + handleLabelToCardAdd, + removeLabelFromCard, + handleLabelFromCardRemove, + addLabelToBoardFilter, + removeLabelFromBoardFilter, +}; diff --git a/client/src/actions/list.js b/client/src/actions/lists.js similarity index 78% rename from client/src/actions/list.js rename to client/src/actions/lists.js index 71702be7..59f944f4 100644 --- a/client/src/actions/list.js +++ b/client/src/actions/lists.js @@ -1,6 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -export const createList = (list) => ({ +const createList = (list) => ({ type: ActionTypes.LIST_CREATE, payload: { list, @@ -23,14 +23,14 @@ createList.failure = (localId, error) => ({ }, }); -export const handleListCreate = (list) => ({ +const handleListCreate = (list) => ({ type: ActionTypes.LIST_CREATE_HANDLE, payload: { list, }, }); -export const updateList = (id, data) => ({ +const updateList = (id, data) => ({ type: ActionTypes.LIST_UPDATE, payload: { id, @@ -53,14 +53,14 @@ updateList.failure = (id, error) => ({ }, }); -export const handleListUpdate = (list) => ({ +const handleListUpdate = (list) => ({ type: ActionTypes.LIST_UPDATE_HANDLE, payload: { list, }, }); -export const deleteList = (id) => ({ +const deleteList = (id) => ({ type: ActionTypes.LIST_DELETE, payload: { id, @@ -82,9 +82,18 @@ deleteList.failure = (id, error) => ({ }, }); -export const handleListDelete = (list) => ({ +const handleListDelete = (list) => ({ type: ActionTypes.LIST_DELETE_HANDLE, payload: { list, }, }); + +export default { + createList, + handleListCreate, + updateList, + handleListUpdate, + deleteList, + handleListDelete, +}; diff --git a/client/src/actions/login.js b/client/src/actions/login.js index 608ee79b..8ffcded1 100644 --- a/client/src/actions/login.js +++ b/client/src/actions/login.js @@ -1,6 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -export const authenticate = (data) => ({ +const authenticate = (data) => ({ type: ActionTypes.AUTHENTICATE, payload: { data, @@ -21,12 +21,12 @@ authenticate.failure = (error) => ({ }, }); -export const clearAuthenticateError = () => ({ +const clearAuthenticateError = () => ({ type: ActionTypes.AUTHENTICATE_ERROR_CLEAR, payload: {}, }); -export const logout = () => ({ - type: ActionTypes.LOGOUT, - payload: {}, -}); +export default { + authenticate, + clearAuthenticateError, +}; diff --git a/client/src/actions/modal.js b/client/src/actions/modals.js similarity index 61% rename from client/src/actions/modal.js rename to client/src/actions/modals.js index 29ed6978..45476af1 100644 --- a/client/src/actions/modal.js +++ b/client/src/actions/modals.js @@ -1,13 +1,18 @@ import ActionTypes from '../constants/ActionTypes'; -export const openModal = (type) => ({ +const openModal = (type) => ({ type: ActionTypes.MODAL_OPEN, payload: { type, }, }); -export const closeModal = () => ({ +const closeModal = () => ({ type: ActionTypes.MODAL_CLOSE, payload: {}, }); + +export default { + openModal, + closeModal, +}; diff --git a/client/src/actions/notification.js b/client/src/actions/notifications.js similarity index 67% rename from client/src/actions/notification.js rename to client/src/actions/notifications.js index 0ac3d0fc..5e3084b9 100644 --- a/client/src/actions/notification.js +++ b/client/src/actions/notifications.js @@ -1,16 +1,16 @@ import ActionTypes from '../constants/ActionTypes'; -export const handleNotificationCreate = (notification, users, cards, actions) => ({ +const handleNotificationCreate = (notification, users, cards, activities) => ({ type: ActionTypes.NOTIFICATION_CREATE_HANDLE, payload: { notification, users, cards, - actions, + activities, }, }); -export const deleteNotification = (id) => ({ +const deleteNotification = (id) => ({ type: ActionTypes.NOTIFICATION_DELETE, payload: { id, @@ -32,9 +32,15 @@ deleteNotification.failure = (id, error) => ({ }, }); -export const handleNotificationDelete = (notification) => ({ +const handleNotificationDelete = (notification) => ({ type: ActionTypes.NOTIFICATION_DELETE_HANDLE, payload: { notification, }, }); + +export default { + handleNotificationCreate, + deleteNotification, + handleNotificationDelete, +}; diff --git a/client/src/actions/project-manager.js b/client/src/actions/project-managers.js similarity index 79% rename from client/src/actions/project-manager.js rename to client/src/actions/project-managers.js index 32e8125a..d7595b9b 100644 --- a/client/src/actions/project-manager.js +++ b/client/src/actions/project-managers.js @@ -1,6 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -export const createProjectManager = (projectManager) => ({ +const createProjectManager = (projectManager) => ({ type: ActionTypes.PROJECT_MANAGER_CREATE, payload: { projectManager, @@ -23,7 +23,7 @@ createProjectManager.failure = (localId, error) => ({ }, }); -export const handleProjectManagerCreate = ( +const handleProjectManagerCreate = ( projectManager, project, board, @@ -38,6 +38,7 @@ export const handleProjectManagerCreate = ( cardLabels, tasks, attachments, + deletedNotifications, ) => ({ type: ActionTypes.PROJECT_MANAGER_CREATE_HANDLE, payload: { @@ -55,6 +56,7 @@ export const handleProjectManagerCreate = ( cardLabels, tasks, attachments, + deletedNotifications, }, }); @@ -67,7 +69,7 @@ handleProjectManagerCreate.fetchProject = (id, currentUserId, currentBoardId) => }, }); -export const deleteProjectManager = (id, isCurrentUser, isCurrentProject) => ({ +const deleteProjectManager = (id, isCurrentUser, isCurrentProject) => ({ type: ActionTypes.PROJECT_MANAGER_DELETE, payload: { id, @@ -91,7 +93,7 @@ deleteProjectManager.failure = (id, error) => ({ }, }); -export const handleProjectManagerDelete = (projectManager, isCurrentUser, isCurrentProject) => ({ +const handleProjectManagerDelete = (projectManager, isCurrentUser, isCurrentProject) => ({ type: ActionTypes.PROJECT_MANAGER_DELETE_HANDLE, payload: { projectManager, @@ -99,3 +101,10 @@ export const handleProjectManagerDelete = (projectManager, isCurrentUser, isCurr isCurrentProject, }, }); + +export default { + createProjectManager, + handleProjectManagerCreate, + deleteProjectManager, + handleProjectManagerDelete, +}; diff --git a/client/src/actions/project.js b/client/src/actions/projects.js similarity index 77% rename from client/src/actions/project.js rename to client/src/actions/projects.js index 099cd7c7..d6374bdd 100644 --- a/client/src/actions/project.js +++ b/client/src/actions/projects.js @@ -1,6 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -export const createProject = (data) => ({ +const createProject = (data) => ({ type: ActionTypes.PROJECT_CREATE, payload: { data, @@ -22,7 +22,7 @@ createProject.failure = (error) => ({ }, }); -export const handleProjectCreate = (project, users, projectManagers, boards, boardMemberships) => ({ +const handleProjectCreate = (project, users, projectManagers, boards, boardMemberships) => ({ type: ActionTypes.PROJECT_CREATE_HANDLE, payload: { project, @@ -33,7 +33,7 @@ export const handleProjectCreate = (project, users, projectManagers, boards, boa }, }); -export const updateProject = (id, data) => ({ +const updateProject = (id, data) => ({ type: ActionTypes.PROJECT_UPDATE, payload: { id, @@ -56,14 +56,14 @@ updateProject.failure = (id, error) => ({ }, }); -export const handleProjectUpdate = (project) => ({ +const handleProjectUpdate = (project) => ({ type: ActionTypes.PROJECT_UPDATE_HANDLE, payload: { project, }, }); -export const updateProjectBackgroundImage = (id) => ({ +const updateProjectBackgroundImage = (id) => ({ type: ActionTypes.PROJECT_BACKGROUND_IMAGE_UPDATE, payload: { id, @@ -85,7 +85,7 @@ updateProjectBackgroundImage.failure = (id, error) => ({ }, }); -export const deleteProject = (id) => ({ +const deleteProject = (id) => ({ type: ActionTypes.PROJECT_DELETE, payload: { id, @@ -107,9 +107,19 @@ deleteProject.failure = (id, error) => ({ }, }); -export const handleProjectDelete = (project) => ({ +const handleProjectDelete = (project) => ({ type: ActionTypes.PROJECT_DELETE_HANDLE, payload: { project, }, }); + +export default { + createProject, + handleProjectCreate, + updateProject, + handleProjectUpdate, + updateProjectBackgroundImage, + deleteProject, + handleProjectDelete, +}; diff --git a/client/src/actions/router.js b/client/src/actions/router.js index 27fead85..ba743aa2 100644 --- a/client/src/actions/router.js +++ b/client/src/actions/router.js @@ -1,7 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -// eslint-disable-next-line import/prefer-default-export -export const handleLocationChange = ( +const handleLocationChange = ( board, users, projects, @@ -13,7 +12,7 @@ export const handleLocationChange = ( cardLabels, tasks, attachments, - notifications, + deletedNotifications, ) => ({ type: ActionTypes.LOCATION_CHANGE_HANDLE, payload: { @@ -28,7 +27,7 @@ export const handleLocationChange = ( cardLabels, tasks, attachments, - notifications, + deletedNotifications, }, }); @@ -38,3 +37,7 @@ handleLocationChange.fetchBoard = (id) => ({ id, }, }); + +export default { + handleLocationChange, +}; diff --git a/client/src/actions/socket.js b/client/src/actions/socket.js index de6d42b1..8f6fdf9a 100644 --- a/client/src/actions/socket.js +++ b/client/src/actions/socket.js @@ -1,11 +1,11 @@ import ActionTypes from '../constants/ActionTypes'; -export const handleSocketDisconnect = () => ({ +const handleSocketDisconnect = () => ({ type: ActionTypes.SOCKET_DISCONNECT_HANDLE, payload: {}, }); -export const handleSocketReconnect = ( +const handleSocketReconnect = ( user, board, users, @@ -20,7 +20,7 @@ export const handleSocketReconnect = ( cardLabels, tasks, attachments, - actions, + activities, notifications, ) => ({ type: ActionTypes.SOCKET_RECONNECT_HANDLE, @@ -39,7 +39,7 @@ export const handleSocketReconnect = ( cardLabels, tasks, attachments, - actions, + activities, notifications, }, }); @@ -51,3 +51,8 @@ handleSocketReconnect.fetchCore = (currentUserId, currentBoardId) => ({ currentBoardId, }, }); + +export default { + handleSocketDisconnect, + handleSocketReconnect, +}; diff --git a/client/src/actions/task.js b/client/src/actions/tasks.js similarity index 78% rename from client/src/actions/task.js rename to client/src/actions/tasks.js index e13752c7..679ade0f 100644 --- a/client/src/actions/task.js +++ b/client/src/actions/tasks.js @@ -1,6 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -export const createTask = (task) => ({ +const createTask = (task) => ({ type: ActionTypes.TASK_CREATE, payload: { task, @@ -23,14 +23,14 @@ createTask.failure = (localId, error) => ({ }, }); -export const handleTaskCreate = (task) => ({ +const handleTaskCreate = (task) => ({ type: ActionTypes.TASK_CREATE_HANDLE, payload: { task, }, }); -export const updateTask = (id, data) => ({ +const updateTask = (id, data) => ({ type: ActionTypes.TASK_UPDATE, payload: { id, @@ -53,14 +53,14 @@ updateTask.failure = (id, error) => ({ }, }); -export const handleTaskUpdate = (task) => ({ +const handleTaskUpdate = (task) => ({ type: ActionTypes.TASK_UPDATE_HANDLE, payload: { task, }, }); -export const deleteTask = (id) => ({ +const deleteTask = (id) => ({ type: ActionTypes.TASK_DELETE, payload: { id, @@ -82,9 +82,18 @@ deleteTask.failure = (id, error) => ({ }, }); -export const handleTaskDelete = (task) => ({ +const handleTaskDelete = (task) => ({ type: ActionTypes.TASK_DELETE_HANDLE, payload: { task, }, }); + +export default { + createTask, + handleTaskCreate, + updateTask, + handleTaskUpdate, + deleteTask, + handleTaskDelete, +}; diff --git a/client/src/actions/user.js b/client/src/actions/users.js similarity index 74% rename from client/src/actions/user.js rename to client/src/actions/users.js index 06018f53..a1e8648a 100644 --- a/client/src/actions/user.js +++ b/client/src/actions/users.js @@ -1,6 +1,6 @@ import ActionTypes from '../constants/ActionTypes'; -export const createUser = (data) => ({ +const createUser = (data) => ({ type: ActionTypes.USER_CREATE, payload: { data, @@ -21,19 +21,19 @@ createUser.failure = (error) => ({ }, }); -export const handleUserCreate = (user) => ({ +const handleUserCreate = (user) => ({ type: ActionTypes.USER_CREATE_HANDLE, payload: { user, }, }); -export const clearUserCreateError = () => ({ +const clearUserCreateError = () => ({ type: ActionTypes.USER_CREATE_ERROR_CLEAR, payload: {}, }); -export const updateUser = (id, data) => ({ +const updateUser = (id, data) => ({ type: ActionTypes.USER_UPDATE, payload: { id, @@ -56,7 +56,7 @@ updateUser.failure = (id, error) => ({ }, }); -export const handleUserUpdate = (user, users, isCurrent) => ({ +const handleUserUpdate = (user, users, isCurrent) => ({ type: ActionTypes.USER_UPDATE_HANDLE, payload: { user, @@ -65,7 +65,7 @@ export const handleUserUpdate = (user, users, isCurrent) => ({ }, }); -export const updateUserEmail = (id, data) => ({ +const updateUserEmail = (id, data) => ({ type: ActionTypes.USER_EMAIL_UPDATE, payload: { id, @@ -88,14 +88,14 @@ updateUserEmail.failure = (id, error) => ({ }, }); -export const clearUserEmailUpdateError = (id) => ({ +const clearUserEmailUpdateError = (id) => ({ type: ActionTypes.USER_EMAIL_UPDATE_ERROR_CLEAR, payload: { id, }, }); -export const updateUserPassword = (id, data) => ({ +const updateUserPassword = (id, data) => ({ type: ActionTypes.USER_PASSWORD_UPDATE, payload: { id, @@ -118,14 +118,14 @@ updateUserPassword.failure = (id, error) => ({ }, }); -export const clearUserPasswordUpdateError = (id) => ({ +const clearUserPasswordUpdateError = (id) => ({ type: ActionTypes.USER_PASSWORD_UPDATE_ERROR_CLEAR, payload: { id, }, }); -export const updateUserUsername = (id, data) => ({ +const updateUserUsername = (id, data) => ({ type: ActionTypes.USER_USERNAME_UPDATE, payload: { id, @@ -148,14 +148,14 @@ updateUserUsername.failure = (id, error) => ({ }, }); -export const clearUserUsernameUpdateError = (id) => ({ +const clearUserUsernameUpdateError = (id) => ({ type: ActionTypes.USER_USERNAME_UPDATE_ERROR_CLEAR, payload: { id, }, }); -export const updateUserAvatar = (id) => ({ +const updateUserAvatar = (id) => ({ type: ActionTypes.USER_AVATAR_UPDATE, payload: { id, @@ -177,7 +177,7 @@ updateUserAvatar.failure = (id, error) => ({ }, }); -export const deleteUser = (id) => ({ +const deleteUser = (id) => ({ type: ActionTypes.USER_DELETE, payload: { id, @@ -199,14 +199,14 @@ deleteUser.failure = (id, error) => ({ }, }); -export const handleUserDelete = (user) => ({ +const handleUserDelete = (user) => ({ type: ActionTypes.USER_DELETE_HANDLE, payload: { user, }, }); -export const addUserToCard = (id, cardId, isCurrent) => ({ +const addUserToCard = (id, cardId, isCurrent) => ({ type: ActionTypes.USER_TO_CARD_ADD, payload: { id, @@ -231,14 +231,14 @@ addUserToCard.failure = (id, cardId, error) => ({ }, }); -export const handleUserToCardAdd = (cardMembership) => ({ +const handleUserToCardAdd = (cardMembership) => ({ type: ActionTypes.USER_TO_CARD_ADD_HANDLE, payload: { cardMembership, }, }); -export const removeUserFromCard = (id, cardId) => ({ +const removeUserFromCard = (id, cardId) => ({ type: ActionTypes.USER_FROM_CARD_REMOVE, payload: { id, @@ -262,14 +262,14 @@ removeUserFromCard.failure = (id, cardId, error) => ({ }, }); -export const handleUserFromCardRemove = (cardMembership) => ({ +const handleUserFromCardRemove = (cardMembership) => ({ type: ActionTypes.USER_FROM_CARD_REMOVE_HANDLE, payload: { cardMembership, }, }); -export const addUserToBoardFilter = (id, boardId) => ({ +const addUserToBoardFilter = (id, boardId) => ({ type: ActionTypes.USER_TO_BOARD_FILTER_ADD, payload: { id, @@ -277,10 +277,33 @@ export const addUserToBoardFilter = (id, boardId) => ({ }, }); -export const removeUserFromBoardFilter = (id, boardId) => ({ +const removeUserFromBoardFilter = (id, boardId) => ({ type: ActionTypes.USER_FROM_BOARD_FILTER_REMOVE, payload: { id, boardId, }, }); + +export default { + createUser, + handleUserCreate, + clearUserCreateError, + updateUser, + handleUserUpdate, + updateUserEmail, + clearUserEmailUpdateError, + updateUserPassword, + clearUserPasswordUpdateError, + updateUserUsername, + clearUserUsernameUpdateError, + updateUserAvatar, + deleteUser, + handleUserDelete, + addUserToCard, + handleUserToCardAdd, + removeUserFromCard, + handleUserFromCardRemove, + addUserToBoardFilter, + removeUserFromBoardFilter, +}; diff --git a/client/src/api/actions.js b/client/src/api/actions.js deleted file mode 100755 index cc1d6c09..00000000 --- a/client/src/api/actions.js +++ /dev/null @@ -1,36 +0,0 @@ -import socket from './socket'; - -/* Transformers */ - -export const transformAction = (action) => ({ - ...action, - createdAt: new Date(action.createdAt), -}); - -/* Actions */ - -const getActions = (cardId, data) => - socket.get(`/cards/${cardId}/actions`, data).then((body) => ({ - ...body, - items: body.items.map(transformAction), - })); - -/* Event handlers */ - -const makeHandleActionCreate = (next) => (body) => { - next({ - ...body, - item: transformAction(body.item), - }); -}; - -const makeHandleActionUpdate = makeHandleActionCreate; - -const makeHandleActionDelete = makeHandleActionCreate; - -export default { - getActions, - makeHandleActionCreate, - makeHandleActionUpdate, - makeHandleActionDelete, -}; diff --git a/client/src/api/activities.js b/client/src/api/activities.js new file mode 100755 index 00000000..b99999bf --- /dev/null +++ b/client/src/api/activities.js @@ -0,0 +1,36 @@ +import socket from './socket'; + +/* Transformers */ + +export const transformActivity = (activity) => ({ + ...activity, + createdAt: new Date(activity.createdAt), +}); + +/* Actions */ + +const getActivities = (cardId, data) => + socket.get(`/cards/${cardId}/actions`, data).then((body) => ({ + ...body, + items: body.items.map(transformActivity), + })); + +/* Event handlers */ + +const makeHandleActivityCreate = (next) => (body) => { + next({ + ...body, + item: transformActivity(body.item), + }); +}; + +const makeHandleActivityUpdate = makeHandleActivityCreate; + +const makeHandleActivityDelete = makeHandleActivityCreate; + +export default { + getActivities, + makeHandleActivityCreate, + makeHandleActivityUpdate, + makeHandleActivityDelete, +}; diff --git a/client/src/api/cards.js b/client/src/api/cards.js index 353f8f7b..b8e26244 100755 --- a/client/src/api/cards.js +++ b/client/src/api/cards.js @@ -78,14 +78,9 @@ const makeHandleCardCreate = (next) => (body) => { }); }; -const makeHandleCardUpdate = (next) => (body) => { - next({ - ...body, - item: transformCard(body.item), - }); -}; +const makeHandleCardUpdate = makeHandleCardCreate; -const makeHandleCardDelete = makeHandleCardUpdate; +const makeHandleCardDelete = makeHandleCardCreate; export default { getCards, diff --git a/client/src/api/comment-actions.js b/client/src/api/comment-actions.js deleted file mode 100755 index 40f67db6..00000000 --- a/client/src/api/comment-actions.js +++ /dev/null @@ -1,28 +0,0 @@ -import socket from './socket'; -import { transformAction } from './actions'; - -/* Actions */ - -const createCommentAction = (cardId, data) => - socket.post(`/cards/${cardId}/comment-actions`, data).then((body) => ({ - ...body, - item: transformAction(body.item), - })); - -const updateCommentAction = (id, data) => - socket.patch(`/comment-actions/${id}`, data).then((body) => ({ - ...body, - item: transformAction(body.item), - })); - -const deleteCommentAction = (id) => - socket.delete(`/comment-actions/${id}`).then((body) => ({ - ...body, - item: transformAction(body.item), - })); - -export default { - createCommentAction, - updateCommentAction, - deleteCommentAction, -}; diff --git a/client/src/api/comment-activities.js b/client/src/api/comment-activities.js new file mode 100755 index 00000000..3d378639 --- /dev/null +++ b/client/src/api/comment-activities.js @@ -0,0 +1,28 @@ +import socket from './socket'; +import { transformActivity } from './activities'; + +/* Actions */ + +const createCommentActivity = (cardId, data) => + socket.post(`/cards/${cardId}/comment-actions`, data).then((body) => ({ + ...body, + item: transformActivity(body.item), + })); + +const updateCommentActivity = (id, data) => + socket.patch(`/comment-actions/${id}`, data).then((body) => ({ + ...body, + item: transformActivity(body.item), + })); + +const deleteCommentActivity = (id) => + socket.delete(`/comment-actions/${id}`).then((body) => ({ + ...body, + item: transformActivity(body.item), + })); + +export default { + createCommentActivity, + updateCommentActivity, + deleteCommentActivity, +}; diff --git a/client/src/api/index.js b/client/src/api/index.js index b7a49076..fd9db7c0 100755 --- a/client/src/api/index.js +++ b/client/src/api/index.js @@ -13,8 +13,8 @@ import cardMemberships from './card-memberships'; import cardLabels from './card-labels'; import tasks from './tasks'; import attachments from './attachments'; -import actions from './actions'; -import commentActions from './comment-actions'; +import activities from './activities'; +import commentActivities from './comment-activities'; import notifications from './notifications'; export { http, socket }; @@ -33,7 +33,7 @@ export default { ...cardLabels, ...tasks, ...attachments, - ...actions, - ...commentActions, + ...activities, + ...commentActivities, ...notifications, }; diff --git a/client/src/api/notifications.js b/client/src/api/notifications.js index 246165fc..3fd664fd 100755 --- a/client/src/api/notifications.js +++ b/client/src/api/notifications.js @@ -1,33 +1,61 @@ +import omit from 'lodash/omit'; + import socket from './socket'; import { transformCard } from './cards'; -import { transformAction } from './actions'; +import { transformActivity } from './activities'; + +/* Transformers */ + +export const transformNotification = (notification) => ({ + ...omit(notification, 'actionId'), + activityId: notification.actionId, +}); /* Actions */ const getNotifications = () => socket.get('/notifications').then((body) => ({ ...body, + items: body.items.map(transformNotification), included: { - ...body.included, + ...omit(body.included, 'actions'), cards: body.included.cards.map(transformCard), - actions: body.included.actions.map(transformAction), + activities: body.included.actions.map(transformActivity), }, })); const getNotification = (id) => socket.get(`/notifications/${id}`).then((body) => ({ ...body, + item: transformNotification(body.item), included: { - ...body.included, + ...omit(body.included, 'actions'), cards: body.included.cards.map(transformCard), - actions: body.included.actions.map(transformAction), + activities: body.included.actions.map(transformActivity), }, })); -const updateNotifications = (ids, data) => socket.patch(`/notifications/${ids.join(',')}`, data); +const updateNotifications = (ids, data) => + socket.patch(`/notifications/${ids.join(',')}`, data).then((body) => ({ + ...body, + items: body.items.map(transformNotification), + })); + +/* Event handlers */ + +const makeHandleNotificationCreate = (next) => (body) => { + next({ + ...body, + item: transformNotification(body.item), + }); +}; + +const makeHandleNotificationUpdate = makeHandleNotificationCreate; export default { getNotifications, getNotification, updateNotifications, + makeHandleNotificationCreate, + makeHandleNotificationUpdate, }; diff --git a/client/src/components/CardModal/Actions/index.js b/client/src/components/CardModal/Actions/index.js deleted file mode 100755 index c8b328f7..00000000 --- a/client/src/components/CardModal/Actions/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import Actions from './Actions'; - -export default Actions; diff --git a/client/src/components/CardModal/Actions/Actions.jsx b/client/src/components/CardModal/Activities/Activities.jsx similarity index 93% rename from client/src/components/CardModal/Actions/Actions.jsx rename to client/src/components/CardModal/Activities/Activities.jsx index 62813213..d5790114 100755 --- a/client/src/components/CardModal/Actions/Actions.jsx +++ b/client/src/components/CardModal/Activities/Activities.jsx @@ -3,13 +3,13 @@ import PropTypes from 'prop-types'; import { useTranslation } from 'react-i18next'; import { Button, Comment, Icon, Loader, Visibility } from 'semantic-ui-react'; -import { ActionTypes } from '../../../constants/Enums'; +import { ActivityTypes } from '../../../constants/Enums'; import CommentAdd from './CommentAdd'; import Item from './Item'; -import styles from './Actions.module.scss'; +import styles from './Activities.module.scss'; -const Actions = React.memo( +const Activities = React.memo( ({ items, isFetching, @@ -60,7 +60,7 @@ const Actions = React.memo(
{items.map((item) => - item.type === ActionTypes.COMMENT_CARD ? ( + item.type === ActivityTypes.COMMENT_CARD ? ( { let contentNode; switch (type) { - case ActionTypes.CREATE_CARD: + case ActivityTypes.CREATE_CARD: contentNode = ( { ); break; - case ActionTypes.MOVE_CARD: + case ActivityTypes.MOVE_CARD: contentNode = ( { const [t] = useTranslation(); @@ -357,19 +357,19 @@ const CardModal = React.memo(
)} - {canEdit && ( @@ -490,10 +490,10 @@ CardModal.propTypes = { dueDate: PropTypes.instanceOf(Date), timer: PropTypes.object, // eslint-disable-line react/forbid-prop-types isSubscribed: PropTypes.bool.isRequired, - isActionsFetching: PropTypes.bool.isRequired, - isAllActionsFetched: PropTypes.bool.isRequired, - isActionsDetailsVisible: PropTypes.bool.isRequired, - isActionsDetailsFetching: PropTypes.bool.isRequired, + isActivitiesFetching: PropTypes.bool.isRequired, + isAllActivitiesFetched: PropTypes.bool.isRequired, + isActivitiesDetailsVisible: PropTypes.bool.isRequired, + isActivitiesDetailsFetching: PropTypes.bool.isRequired, listId: PropTypes.string.isRequired, boardId: PropTypes.string.isRequired, projectId: PropTypes.string.isRequired, @@ -502,13 +502,13 @@ CardModal.propTypes = { labels: PropTypes.array.isRequired, tasks: PropTypes.array.isRequired, attachments: PropTypes.array.isRequired, - actions: PropTypes.array.isRequired, + activities: PropTypes.array.isRequired, allProjectsToLists: PropTypes.array.isRequired, allBoardMemberships: PropTypes.array.isRequired, allLabels: PropTypes.array.isRequired, /* eslint-enable react/forbid-prop-types */ canEdit: PropTypes.bool.isRequired, - canEditAllCommentActions: PropTypes.bool.isRequired, + canEditAllCommentActivities: PropTypes.bool.isRequired, onUpdate: PropTypes.func.isRequired, onMove: PropTypes.func.isRequired, onTransfer: PropTypes.func.isRequired, @@ -528,11 +528,11 @@ CardModal.propTypes = { onAttachmentCreate: PropTypes.func.isRequired, onAttachmentUpdate: PropTypes.func.isRequired, onAttachmentDelete: PropTypes.func.isRequired, - onActionsFetch: PropTypes.func.isRequired, - onActionsDetailsToggle: PropTypes.func.isRequired, - onCommentActionCreate: PropTypes.func.isRequired, - onCommentActionUpdate: PropTypes.func.isRequired, - onCommentActionDelete: PropTypes.func.isRequired, + onActivitiesFetch: PropTypes.func.isRequired, + onActivitiesDetailsToggle: PropTypes.func.isRequired, + onCommentActivityCreate: PropTypes.func.isRequired, + onCommentActivityUpdate: PropTypes.func.isRequired, + onCommentActivityDelete: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired, }; diff --git a/client/src/components/Header/NotificationsPopup.jsx b/client/src/components/Header/NotificationsPopup.jsx index e96d05e2..e2645d34 100755 --- a/client/src/components/Header/NotificationsPopup.jsx +++ b/client/src/components/Header/NotificationsPopup.jsx @@ -7,7 +7,7 @@ import { withPopup } from '../../lib/popup'; import { Popup } from '../../lib/custom-ui'; import Paths from '../../constants/Paths'; -import { ActionTypes } from '../../constants/Enums'; +import { ActivityTypes } from '../../constants/Enums'; import User from '../User'; import styles from './NotificationsPopup.module.scss'; @@ -23,42 +23,42 @@ const NotificationsStep = React.memo(({ items, onDelete, onClose }) => { ); const renderItemContent = useCallback( - ({ action, card }) => { - switch (action.type) { - case ActionTypes.MOVE_CARD: + ({ activity, card }) => { + switch (activity.type) { + case ActivityTypes.MOVE_CARD: return ( - {action.user.name} + {activity.user.name} {' moved '} {card.name} {' from '} - {action.data.fromList.name} + {activity.data.fromList.name} {' to '} - {action.data.toList.name} + {activity.data.toList.name} ); - case ActionTypes.COMMENT_CARD: + case ActivityTypes.COMMENT_CARD: return ( - {action.user.name} - {` left a new comment «${action.data.text}» to `} + {activity.user.name} + {` left a new comment «${activity.data.text}» to `} {card.name} @@ -79,11 +79,11 @@ const NotificationsStep = React.memo(({ items, onDelete, onClose }) => { {items.length > 0 ? items.map((item) => (
- {item.card && item.action ? ( + {item.card && item.activity ? ( <> {renderItemContent(item)} diff --git a/client/src/components/UsersModal/Item/ActionsPopup.jsx b/client/src/components/UsersModal/Item/ActionsPopup.jsx index 862ab524..399a9bcb 100644 --- a/client/src/components/UsersModal/Item/ActionsPopup.jsx +++ b/client/src/components/UsersModal/Item/ActionsPopup.jsx @@ -101,7 +101,7 @@ const ActionsStep = React.memo( { - const allUsers = usersSelector(state); - const isCurrentUserManager = isCurrentUserManagerForCurrentProjectSelector(state); - const memberships = membershipsForCurrentBoardSelector(state); - const labels = labelsForCurrentBoardSelector(state); - const filterUsers = filterUsersForCurrentBoardSelector(state); - const filterLabels = filterLabelsForCurrentBoardSelector(state); + const allUsers = selectors.selectUsers(state); + const isCurrentUserManager = selectors.selectIsCurrentUserManagerForCurrentProject(state); + const memberships = selectors.selectMembershipsForCurrentBoard(state); + const labels = selectors.selectLabelsForCurrentBoard(state); + const filterUsers = selectors.selectFilterUsersForCurrentBoard(state); + const filterLabels = selectors.selectFilterLabelsForCurrentBoard(state); return { memberships, @@ -43,15 +26,15 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => bindActionCreators( { - onMembershipCreate: createMembershipInCurrentBoard, - onMembershipDelete: deleteBoardMembership, - onUserToFilterAdd: addUserToFilterInCurrentBoard, - onUserFromFilterRemove: removeUserFromFilterInCurrentBoard, - onLabelToFilterAdd: addLabelToFilterInCurrentBoard, - onLabelFromFilterRemove: removeLabelFromFilterInCurrentBoard, - onLabelCreate: createLabelInCurrentBoard, - onLabelUpdate: updateLabel, - onLabelDelete: deleteLabel, + onMembershipCreate: entryActions.createMembershipInCurrentBoard, + onMembershipDelete: entryActions.deleteBoardMembership, + onUserToFilterAdd: entryActions.addUserToFilterInCurrentBoard, + onUserFromFilterRemove: entryActions.removeUserFromFilterInCurrentBoard, + onLabelToFilterAdd: entryActions.addLabelToFilterInCurrentBoard, + onLabelFromFilterRemove: entryActions.removeLabelFromFilterInCurrentBoard, + onLabelCreate: entryActions.createLabelInCurrentBoard, + onLabelUpdate: entryActions.updateLabel, + onLabelDelete: entryActions.deleteLabel, }, dispatch, ); diff --git a/client/src/containers/BoardKanbanContainer.js b/client/src/containers/BoardKanbanContainer.js index ed1ad614..5460f21f 100755 --- a/client/src/containers/BoardKanbanContainer.js +++ b/client/src/containers/BoardKanbanContainer.js @@ -1,18 +1,14 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { - isCurrentUserMemberForCurrentBoardSelector, - listIdsForCurrentBoardSelector, - pathSelector, -} from '../selectors'; -import { createListInCurrentBoard, moveCard, moveList } from '../actions/entry'; +import selectors from '../selectors'; +import entryActions from '../entry-actions'; import BoardKanban from '../components/BoardKanban'; const mapStateToProps = (state) => { - const { cardId } = pathSelector(state); - const isCurrentUserMember = isCurrentUserMemberForCurrentBoardSelector(state); - const listIds = listIdsForCurrentBoardSelector(state); + const { cardId } = selectors.selectPath(state); + const isCurrentUserMember = selectors.selectIsCurrentUserMemberForCurrentBoard(state); + const listIds = selectors.selectListIdsForCurrentBoard(state); return { listIds, @@ -24,9 +20,9 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => bindActionCreators( { - onListCreate: createListInCurrentBoard, - onListMove: moveList, - onCardMove: moveCard, + onListCreate: entryActions.createListInCurrentBoard, + onListMove: entryActions.moveList, + onCardMove: entryActions.moveCard, }, dispatch, ); diff --git a/client/src/containers/BoardWrapperContainer.js b/client/src/containers/BoardWrapperContainer.js index d58886cb..a7fb0609 100755 --- a/client/src/containers/BoardWrapperContainer.js +++ b/client/src/containers/BoardWrapperContainer.js @@ -1,10 +1,10 @@ import { connect } from 'react-redux'; -import { currentBoardSelector } from '../selectors'; +import selectors from '../selectors'; import BoardWrapper from '../components/BoardWrapper'; const mapStateToProps = (state) => { - const { type, isFetching } = currentBoardSelector(state); + const { type, isFetching } = selectors.selectCurrentBoard(state); return { type, diff --git a/client/src/containers/BoardsContainer.js b/client/src/containers/BoardsContainer.js index b0d193d4..a8bbf2e3 100755 --- a/client/src/containers/BoardsContainer.js +++ b/client/src/containers/BoardsContainer.js @@ -1,18 +1,14 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { - boardsForCurrentProjectSelector, - isCurrentUserManagerForCurrentProjectSelector, - pathSelector, -} from '../selectors'; -import { createBoardInCurrentProject, deleteBoard, moveBoard, updateBoard } from '../actions/entry'; +import selectors from '../selectors'; +import entryActions from '../entry-actions'; import Boards from '../components/Boards'; const mapStateToProps = (state) => { - const { boardId } = pathSelector(state); - const boards = boardsForCurrentProjectSelector(state); - const isCurrentUserManager = isCurrentUserManagerForCurrentProjectSelector(state); + const { boardId } = selectors.selectPath(state); + const boards = selectors.selectBoardsForCurrentProject(state); + const isCurrentUserManager = selectors.selectIsCurrentUserManagerForCurrentProject(state); return { items: boards, @@ -24,10 +20,10 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => bindActionCreators( { - onCreate: createBoardInCurrentProject, - onUpdate: updateBoard, - onMove: moveBoard, - onDelete: deleteBoard, + onCreate: entryActions.createBoardInCurrentProject, + onUpdate: entryActions.updateBoard, + onMove: entryActions.moveBoard, + onDelete: entryActions.deleteBoard, }, dispatch, ); diff --git a/client/src/containers/CardContainer.js b/client/src/containers/CardContainer.js index 09a93cc5..7da41559 100755 --- a/client/src/containers/CardContainer.js +++ b/client/src/containers/CardContainer.js @@ -1,57 +1,33 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { - isCurrentUserMemberForCurrentBoardSelector, - labelsForCurrentBoardSelector, - makeCardByIdSelector, - makeLabelsByCardIdSelector, - makeNotificationsTotalByCardIdSelector, - makeTasksByCardIdSelector, - makeUsersByCardIdSelector, - membershipsForCurrentBoardSelector, - pathSelector, - projectsToListsForCurrentUserSelector, -} from '../selectors'; -import { - addLabelToCard, - addUserToCard, - createLabelInCurrentBoard, - deleteCard, - deleteLabel, - fetchBoard, - moveCard, - removeLabelFromCard, - removeUserFromCard, - transferCard, - updateLabel, - updateCard, -} from '../actions/entry'; +import selectors from '../selectors'; +import entryActions from '../entry-actions'; import Card from '../components/Card'; const makeMapStateToProps = () => { - const cardByIdSelector = makeCardByIdSelector(); - const usersByCardIdSelector = makeUsersByCardIdSelector(); - const labelsByCardIdSelector = makeLabelsByCardIdSelector(); - const tasksByCardIdSelector = makeTasksByCardIdSelector(); - const notificationsTotalByCardIdSelector = makeNotificationsTotalByCardIdSelector(); + const selectCardById = selectors.makeSelectCardById(); + const selectUsersByCardId = selectors.makeSelectUsersByCardId(); + const selectLabelsByCardId = selectors.makeSelectLabelsByCardId(); + const selectTasksByCardId = selectors.makeSelectTasksByCardId(); + const selectNotificationsTotalByCardId = selectors.makeSelectNotificationsTotalByCardId(); return (state, { id, index }) => { - const { projectId } = pathSelector(state); - const allProjectsToLists = projectsToListsForCurrentUserSelector(state); - const allBoardMemberships = membershipsForCurrentBoardSelector(state); - const allLabels = labelsForCurrentBoardSelector(state); - const isCurrentUserMember = isCurrentUserMemberForCurrentBoardSelector(state); + const { projectId } = selectors.selectPath(state); + const allProjectsToLists = selectors.selectProjectsToListsForCurrentUser(state); + const allBoardMemberships = selectors.selectMembershipsForCurrentBoard(state); + const allLabels = selectors.selectLabelsForCurrentBoard(state); + const isCurrentUserMember = selectors.selectIsCurrentUserMemberForCurrentBoard(state); - const { name, dueDate, timer, coverUrl, boardId, listId, isPersisted } = cardByIdSelector( + const { name, dueDate, timer, coverUrl, boardId, listId, isPersisted } = selectCardById( state, id, ); - const users = usersByCardIdSelector(state, id); - const labels = labelsByCardIdSelector(state, id); - const tasks = tasksByCardIdSelector(state, id); - const notificationsTotal = notificationsTotalByCardIdSelector(state, id); + const users = selectUsersByCardId(state, id); + const labels = selectLabelsByCardId(state, id); + const tasks = selectTasksByCardId(state, id); + const notificationsTotal = selectNotificationsTotalByCardId(state, id); return { id, @@ -79,18 +55,18 @@ const makeMapStateToProps = () => { const mapDispatchToProps = (dispatch, { id }) => bindActionCreators( { - onUpdate: (data) => updateCard(id, data), - onMove: (listId, index) => moveCard(id, listId, index), - onTransfer: (boardId, listId) => transferCard(id, boardId, listId), - onDelete: () => deleteCard(id), - onUserAdd: (userId) => addUserToCard(userId, id), - onUserRemove: (userId) => removeUserFromCard(userId, id), - onBoardFetch: fetchBoard, - onLabelAdd: (labelId) => addLabelToCard(labelId, id), - onLabelRemove: (labelId) => removeLabelFromCard(labelId, id), - onLabelCreate: (data) => createLabelInCurrentBoard(data), - onLabelUpdate: (labelId, data) => updateLabel(labelId, data), - onLabelDelete: (labelId) => deleteLabel(labelId), + onUpdate: (data) => entryActions.updateCard(id, data), + onMove: (listId, index) => entryActions.moveCard(id, listId, index), + onTransfer: (boardId, listId) => entryActions.transferCard(id, boardId, listId), + onDelete: () => entryActions.deleteCard(id), + onUserAdd: (userId) => entryActions.addUserToCard(userId, id), + onUserRemove: (userId) => entryActions.removeUserFromCard(userId, id), + onBoardFetch: entryActions.fetchBoard, + onLabelAdd: (labelId) => entryActions.addLabelToCard(labelId, id), + onLabelRemove: (labelId) => entryActions.removeLabelFromCard(labelId, id), + onLabelCreate: (data) => entryActions.createLabelInCurrentBoard(data), + onLabelUpdate: (labelId, data) => entryActions.updateLabel(labelId, data), + onLabelDelete: (labelId) => entryActions.deleteLabel(labelId), }, dispatch, ); diff --git a/client/src/containers/CardModalContainer.js b/client/src/containers/CardModalContainer.js index e5ae6aa7..b83d93c7 100755 --- a/client/src/containers/CardModalContainer.js +++ b/client/src/containers/CardModalContainer.js @@ -3,56 +3,18 @@ import { connect } from 'react-redux'; import { push } from 'connected-react-router'; import omit from 'lodash/omit'; -import { - actionsForCurrentCardSelector, - attachmentsForCurrentCardSelector, - currentCardSelector, - isCurrentUserManagerForCurrentProjectSelector, - isCurrentUserMemberForCurrentBoardSelector, - labelsForCurrentBoardSelector, - labelsForCurrentCardSelector, - membershipsForCurrentBoardSelector, - pathSelector, - projectsToListsForCurrentUserSelector, - tasksForCurrentCardSelector, - usersForCurrentCardSelector, -} from '../selectors'; -import { - addLabelToCurrentCard, - addUserToCurrentCard, - createAttachmentInCurrentCard, - createCommentActionInCurrentCard, - createLabelInCurrentBoard, - createTaskInCurrentCard, - deleteAttachment, - deleteCommentAction, - deleteCurrentCard, - deleteLabel, - deleteTask, - fetchActionsInCurrentCard, - fetchBoard, - moveCurrentCard, - moveTask, - removeLabelFromCurrentCard, - removeUserFromCurrentCard, - toggleActionsDetailsInCurrentCard, - transferCurrentCard, - updateAttachment, - updateCommentAction, - updateCurrentCard, - updateLabel, - updateTask, -} from '../actions/entry'; +import selectors from '../selectors'; +import entryActions from '../entry-actions'; import Paths from '../constants/Paths'; import CardModal from '../components/CardModal'; const mapStateToProps = (state) => { - const { projectId } = pathSelector(state); - const allProjectsToLists = projectsToListsForCurrentUserSelector(state); - const isCurrentUserManager = isCurrentUserManagerForCurrentProjectSelector(state); - const allBoardMemberships = membershipsForCurrentBoardSelector(state); - const allLabels = labelsForCurrentBoardSelector(state); - const isCurrentUserMember = isCurrentUserMemberForCurrentBoardSelector(state); + const { projectId } = selectors.selectPath(state); + const allProjectsToLists = selectors.selectProjectsToListsForCurrentUser(state); + const isCurrentUserManager = selectors.selectIsCurrentUserManagerForCurrentProject(state); + const allBoardMemberships = selectors.selectMembershipsForCurrentBoard(state); + const allLabels = selectors.selectLabelsForCurrentBoard(state); + const isCurrentUserMember = selectors.selectIsCurrentUserMemberForCurrentBoard(state); const { name, @@ -60,19 +22,19 @@ const mapStateToProps = (state) => { dueDate, timer, isSubscribed, - isActionsFetching, - isActionsDetailsVisible, - isActionsDetailsFetching, - isAllActionsFetched, + isActivitiesFetching, + isAllActivitiesFetched, + isActivitiesDetailsVisible, + isActivitiesDetailsFetching, boardId, listId, - } = currentCardSelector(state); + } = selectors.selectCurrentCard(state); - const users = usersForCurrentCardSelector(state); - const labels = labelsForCurrentCardSelector(state); - const tasks = tasksForCurrentCardSelector(state); - const attachments = attachmentsForCurrentCardSelector(state); - const actions = actionsForCurrentCardSelector(state); + const users = selectors.selectUsersForCurrentCard(state); + const labels = selectors.selectLabelsForCurrentCard(state); + const tasks = selectors.selectTasksForCurrentCard(state); + const attachments = selectors.selectAttachmentsForCurrentCard(state); + const activities = selectors.selectActivitiesForCurrentCard(state); return { name, @@ -80,10 +42,10 @@ const mapStateToProps = (state) => { dueDate, timer, isSubscribed, - isActionsFetching, - isAllActionsFetched, - isActionsDetailsVisible, - isActionsDetailsFetching, + isActivitiesFetching, + isAllActivitiesFetched, + isActivitiesDetailsVisible, + isActivitiesDetailsFetching, listId, boardId, projectId, @@ -91,42 +53,42 @@ const mapStateToProps = (state) => { labels, tasks, attachments, - actions, + activities, allProjectsToLists, allBoardMemberships, allLabels, canEdit: isCurrentUserMember, - canEditAllCommentActions: isCurrentUserManager, + canEditAllCommentActivities: isCurrentUserManager, }; }; const mapDispatchToProps = (dispatch) => bindActionCreators( { - onUpdate: updateCurrentCard, - onMove: moveCurrentCard, - onTransfer: transferCurrentCard, - onDelete: deleteCurrentCard, - onUserAdd: addUserToCurrentCard, - onUserRemove: removeUserFromCurrentCard, - onBoardFetch: fetchBoard, - onLabelAdd: addLabelToCurrentCard, - onLabelRemove: removeLabelFromCurrentCard, - onLabelCreate: createLabelInCurrentBoard, - onLabelUpdate: updateLabel, - onLabelDelete: deleteLabel, - onTaskCreate: createTaskInCurrentCard, - onTaskUpdate: updateTask, - onTaskMove: moveTask, - onTaskDelete: deleteTask, - onAttachmentCreate: createAttachmentInCurrentCard, - onAttachmentUpdate: updateAttachment, - onAttachmentDelete: deleteAttachment, - onActionsFetch: fetchActionsInCurrentCard, - onActionsDetailsToggle: toggleActionsDetailsInCurrentCard, - onCommentActionCreate: createCommentActionInCurrentCard, - onCommentActionUpdate: updateCommentAction, - onCommentActionDelete: deleteCommentAction, + onUpdate: entryActions.updateCurrentCard, + onMove: entryActions.moveCurrentCard, + onTransfer: entryActions.transferCurrentCard, + onDelete: entryActions.deleteCurrentCard, + onUserAdd: entryActions.addUserToCurrentCard, + onUserRemove: entryActions.removeUserFromCurrentCard, + onBoardFetch: entryActions.fetchBoard, + onLabelAdd: entryActions.addLabelToCurrentCard, + onLabelRemove: entryActions.removeLabelFromCurrentCard, + onLabelCreate: entryActions.createLabelInCurrentBoard, + onLabelUpdate: entryActions.updateLabel, + onLabelDelete: entryActions.deleteLabel, + onTaskCreate: entryActions.createTaskInCurrentCard, + onTaskUpdate: entryActions.updateTask, + onTaskMove: entryActions.moveTask, + onTaskDelete: entryActions.deleteTask, + onAttachmentCreate: entryActions.createAttachmentInCurrentCard, + onAttachmentUpdate: entryActions.updateAttachment, + onAttachmentDelete: entryActions.deleteAttachment, + onActivitiesFetch: entryActions.fetchActivitiesInCurrentCard, + onActivitiesDetailsToggle: entryActions.toggleActivitiesDetailsInCurrentCard, + onCommentActivityCreate: entryActions.createCommentActivityInCurrentCard, + onCommentActivityUpdate: entryActions.updateCommentActivity, + onCommentActivityDelete: entryActions.deleteCommentActivity, push, }, dispatch, diff --git a/client/src/containers/CoreContainer.js b/client/src/containers/CoreContainer.js index 2a85b28a..d251927e 100755 --- a/client/src/containers/CoreContainer.js +++ b/client/src/containers/CoreContainer.js @@ -1,11 +1,11 @@ import { connect } from 'react-redux'; -import { currentModalSelector, currentProjectSelector } from '../selectors'; +import selectors from '../selectors'; import Core from '../components/Core'; const mapStateToProps = (state) => { - const currentModal = currentModalSelector(state); - const currentProject = currentProjectSelector(state); + const currentModal = selectors.selectCurrentModal(state); + const currentProject = selectors.selectCurrentProject(state); return { currentModal, diff --git a/client/src/containers/CoreWrapperContainer.js b/client/src/containers/CoreWrapperContainer.js index e8679b75..f50ca642 100755 --- a/client/src/containers/CoreWrapperContainer.js +++ b/client/src/containers/CoreWrapperContainer.js @@ -1,10 +1,10 @@ import { connect } from 'react-redux'; -import { isCoreInitializingSelector } from '../selectors'; +import selectors from '../selectors'; import CoreWrapper from '../components/CoreWrapper'; const mapStateToProps = (state) => { - const isCoreInitializing = isCoreInitializingSelector(state); + const isCoreInitializing = selectors.selectIsCoreInitializing(state); return { isInitializing: isCoreInitializing, diff --git a/client/src/containers/FixedContainer.js b/client/src/containers/FixedContainer.js index 70d6813a..2b4e3639 100644 --- a/client/src/containers/FixedContainer.js +++ b/client/src/containers/FixedContainer.js @@ -1,11 +1,11 @@ import { connect } from 'react-redux'; -import { currentBoardSelector, pathSelector } from '../selectors'; +import selectors from '../selectors'; import Fixed from '../components/Fixed'; const mapStateToProps = (state) => { - const { projectId } = pathSelector(state); - const currentBoard = currentBoardSelector(state); + const { projectId } = selectors.selectPath(state); + const currentBoard = selectors.selectCurrentBoard(state); return { projectId, diff --git a/client/src/containers/HeaderContainer.js b/client/src/containers/HeaderContainer.js index 08434014..0ceb24a8 100755 --- a/client/src/containers/HeaderContainer.js +++ b/client/src/containers/HeaderContainer.js @@ -1,26 +1,15 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { - currentProjectSelector, - currentUserSelector, - isCurrentUserManagerForCurrentProjectSelector, - notificationsForCurrentUserSelector, -} from '../selectors'; -import { - deleteNotification, - logout, - openProjectSettingsModal, - openUserSettingsModal, - openUsersModal, -} from '../actions/entry'; +import selectors from '../selectors'; +import entryActions from '../entry-actions'; import Header from '../components/Header'; const mapStateToProps = (state) => { - const currentUser = currentUserSelector(state); - const currentProject = currentProjectSelector(state); - const notifications = notificationsForCurrentUserSelector(state); - const isCurrentUserManager = isCurrentUserManagerForCurrentProjectSelector(state); + const currentUser = selectors.selectCurrentUser(state); + const currentProject = selectors.selectCurrentProject(state); + const notifications = selectors.selectNotificationsForCurrentUser(state); + const isCurrentUserManager = selectors.selectIsCurrentUserManagerForCurrentProject(state); return { notifications, @@ -34,11 +23,11 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => bindActionCreators( { - onProjectSettingsClick: openProjectSettingsModal, - onUsersClick: openUsersModal, - onNotificationDelete: deleteNotification, - onUserSettingsClick: openUserSettingsModal, - onLogout: logout, + onProjectSettingsClick: entryActions.openProjectSettingsModal, + onUsersClick: entryActions.openUsersModal, + onNotificationDelete: entryActions.deleteNotification, + onUserSettingsClick: entryActions.openUserSettingsModal, + onLogout: entryActions.logout, }, dispatch, ); diff --git a/client/src/containers/ListContainer.js b/client/src/containers/ListContainer.js index 84dac1f9..40da4e2e 100755 --- a/client/src/containers/ListContainer.js +++ b/client/src/containers/ListContainer.js @@ -1,22 +1,18 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { - isCurrentUserMemberForCurrentBoardSelector, - makeCardIdsByListIdSelector, - makeListByIdSelector, -} from '../selectors'; -import { createCard, deleteList, updateList } from '../actions/entry'; +import selectors from '../selectors'; +import entryActions from '../entry-actions'; import List from '../components/List'; const makeMapStateToProps = () => { - const listByIdSelector = makeListByIdSelector(); - const cardIdsByListIdSelector = makeCardIdsByListIdSelector(); + const selectListById = selectors.makeSelectListById(); + const selectCardIdsByListId = selectors.makeSelectCardIdsByListId(); return (state, { id, index }) => { - const { name, isPersisted } = listByIdSelector(state, id); - const cardIds = cardIdsByListIdSelector(state, id); - const isCurrentUserMember = isCurrentUserMemberForCurrentBoardSelector(state); + const { name, isPersisted } = selectListById(state, id); + const cardIds = selectCardIdsByListId(state, id); + const isCurrentUserMember = selectors.selectIsCurrentUserMemberForCurrentBoard(state); return { id, @@ -32,9 +28,9 @@ const makeMapStateToProps = () => { const mapDispatchToProps = (dispatch, { id }) => bindActionCreators( { - onUpdate: (data) => updateList(id, data), - onDelete: () => deleteList(id), - onCardCreate: (data) => createCard(id, data), + onUpdate: (data) => entryActions.updateList(id, data), + onDelete: () => entryActions.deleteList(id), + onCardCreate: (data) => entryActions.createCard(id, data), }, dispatch, ); diff --git a/client/src/containers/LoginContainer.js b/client/src/containers/LoginContainer.js index d895adb9..af25d0d5 100755 --- a/client/src/containers/LoginContainer.js +++ b/client/src/containers/LoginContainer.js @@ -1,7 +1,7 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { authenticate, clearAuthenticateError } from '../actions/entry'; +import entryActions from '../entry-actions'; import Login from '../components/Login'; const mapStateToProps = ({ @@ -17,8 +17,8 @@ const mapStateToProps = ({ const mapDispatchToProps = (dispatch) => bindActionCreators( { - onAuthenticate: authenticate, - onMessageDismiss: clearAuthenticateError, + onAuthenticate: entryActions.authenticate, + onMessageDismiss: entryActions.clearAuthenticateError, }, dispatch, ); diff --git a/client/src/containers/ProjectAddModalContainer.js b/client/src/containers/ProjectAddModalContainer.js index 5c20abe3..8ec9eacb 100755 --- a/client/src/containers/ProjectAddModalContainer.js +++ b/client/src/containers/ProjectAddModalContainer.js @@ -1,7 +1,7 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { closeModal, createProject } from '../actions/entry'; +import entryActions from '../entry-actions'; import ProjectAddModal from '../components/ProjectAddModal'; const mapStateToProps = ({ @@ -16,8 +16,8 @@ const mapStateToProps = ({ const mapDispatchToProps = (dispatch) => bindActionCreators( { - onCreate: createProject, - onClose: closeModal, + onCreate: entryActions.createProject, + onClose: entryActions.closeModal, }, dispatch, ); diff --git a/client/src/containers/ProjectContainer.js b/client/src/containers/ProjectContainer.js index 266d0f7e..9e24aa90 100755 --- a/client/src/containers/ProjectContainer.js +++ b/client/src/containers/ProjectContainer.js @@ -1,11 +1,11 @@ import { connect } from 'react-redux'; -import { currentModalSelector } from '../selectors'; +import selectors from '../selectors'; import ModalTypes from '../constants/ModalTypes'; import Project from '../components/Project'; const mapStateToProps = (state) => { - const currentModal = currentModalSelector(state); + const currentModal = selectors.selectCurrentModal(state); return { isSettingsModalOpened: currentModal === ModalTypes.PROJECT_SETTINGS, diff --git a/client/src/containers/ProjectSettingsModalContainer.js b/client/src/containers/ProjectSettingsModalContainer.js index f4fa2970..e9c4ffcd 100644 --- a/client/src/containers/ProjectSettingsModalContainer.js +++ b/client/src/containers/ProjectSettingsModalContainer.js @@ -1,28 +1,17 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { - currentProjectSelector, - managersForCurrentProjectSelector, - usersSelector, -} from '../selectors'; -import { - closeModal, - createManagerInCurrentProject, - deleteCurrentProject, - deleteProjectManager, - updateCurrentProject, - updateCurrentProjectBackgroundImage, -} from '../actions/entry'; +import selectors from '../selectors'; +import entryActions from '../entry-actions'; import ProjectSettingsModal from '../components/ProjectSettingsModal'; const mapStateToProps = (state) => { - const users = usersSelector(state); + const users = selectors.selectUsers(state); const { name, background, backgroundImage, isBackgroundImageUpdating } = - currentProjectSelector(state); + selectors.selectCurrentProject(state); - const managers = managersForCurrentProjectSelector(state); + const managers = selectors.selectManagersForCurrentProject(state); return { name, @@ -37,12 +26,12 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => bindActionCreators( { - onUpdate: updateCurrentProject, - onBackgroundImageUpdate: updateCurrentProjectBackgroundImage, - onDelete: deleteCurrentProject, - onManagerCreate: createManagerInCurrentProject, - onManagerDelete: deleteProjectManager, - onClose: closeModal, + onUpdate: entryActions.updateCurrentProject, + onBackgroundImageUpdate: entryActions.updateCurrentProjectBackgroundImage, + onDelete: entryActions.deleteCurrentProject, + onManagerCreate: entryActions.createManagerInCurrentProject, + onManagerDelete: entryActions.deleteProjectManager, + onClose: entryActions.closeModal, }, dispatch, ); diff --git a/client/src/containers/ProjectsContainer.js b/client/src/containers/ProjectsContainer.js index 1db7b074..b3622c7d 100755 --- a/client/src/containers/ProjectsContainer.js +++ b/client/src/containers/ProjectsContainer.js @@ -1,16 +1,16 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { currentUserSelector, projectsForCurrentUserSelector } from '../selectors'; -import { openProjectAddModal } from '../actions/entry'; +import selectors from '../selectors'; +import entryActions from '../entry-actions'; import Projects from '../components/Projects'; const mapStateToProps = (state) => { - const { isAdmin } = currentUserSelector(state); - const project = projectsForCurrentUserSelector(state); + const { isAdmin } = selectors.selectCurrentUser(state); + const projects = selectors.selectProjectsForCurrentUser(state); return { - items: project, + items: projects, canAdd: isAdmin, }; }; @@ -18,7 +18,7 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => bindActionCreators( { - onAdd: openProjectAddModal, + onAdd: entryActions.openProjectAddModal, }, dispatch, ); diff --git a/client/src/containers/StaticContainer.js b/client/src/containers/StaticContainer.js index 563b9506..01e10793 100644 --- a/client/src/containers/StaticContainer.js +++ b/client/src/containers/StaticContainer.js @@ -1,10 +1,10 @@ import { connect } from 'react-redux'; -import { pathSelector } from '../selectors'; +import selectors from '../selectors'; import Static from '../components/Static'; const mapStateToProps = (state) => { - const { cardId, boardId, projectId } = pathSelector(state); + const { cardId, boardId, projectId } = selectors.selectPath(state); return { cardId, diff --git a/client/src/containers/UserAddPopupContainer.js b/client/src/containers/UserAddPopupContainer.js index 9915c0b7..10a042b8 100755 --- a/client/src/containers/UserAddPopupContainer.js +++ b/client/src/containers/UserAddPopupContainer.js @@ -1,7 +1,7 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { clearUserCreateError, createUser } from '../actions/entry'; +import entryActions from '../entry-actions'; import UserAddPopup from '../components/UserAddPopup'; const mapStateToProps = ({ @@ -17,8 +17,8 @@ const mapStateToProps = ({ const mapDispatchToProps = (dispatch) => bindActionCreators( { - onCreate: createUser, - onMessageDismiss: clearUserCreateError, + onCreate: entryActions.createUser, + onMessageDismiss: entryActions.clearUserCreateError, }, dispatch, ); diff --git a/client/src/containers/UserSettingsModalContainer.js b/client/src/containers/UserSettingsModalContainer.js index 388d3623..2b8dee87 100644 --- a/client/src/containers/UserSettingsModalContainer.js +++ b/client/src/containers/UserSettingsModalContainer.js @@ -1,19 +1,8 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { currentUserSelector } from '../selectors'; -import { - clearCurrentUserEmailUpdateError, - clearCurrentUserPasswordUpdateError, - clearCurrentUserUsernameUpdateError, - closeModal, - updateCurrentUser, - updateCurrentUserAvatar, - updateCurrentUserEmail, - updateCurrentUserLanguage, - updateCurrentUserPassword, - updateCurrentUserUsername, -} from '../actions/entry'; +import selectors from '../selectors'; +import entryActions from '../entry-actions'; import UserSettingsModal from '../components/UserSettingsModal'; const mapStateToProps = (state) => { @@ -30,7 +19,7 @@ const mapStateToProps = (state) => { emailUpdateForm, passwordUpdateForm, usernameUpdateForm, - } = currentUserSelector(state); + } = selectors.selectCurrentUser(state); return { email, @@ -51,16 +40,16 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => bindActionCreators( { - onUpdate: updateCurrentUser, - onAvatarUpdate: updateCurrentUserAvatar, - onLanguageUpdate: updateCurrentUserLanguage, - onUsernameUpdate: updateCurrentUserUsername, - onUsernameUpdateMessageDismiss: clearCurrentUserUsernameUpdateError, - onEmailUpdate: updateCurrentUserEmail, - onEmailUpdateMessageDismiss: clearCurrentUserEmailUpdateError, - onPasswordUpdate: updateCurrentUserPassword, - onPasswordUpdateMessageDismiss: clearCurrentUserPasswordUpdateError, - onClose: closeModal, + onUpdate: entryActions.updateCurrentUser, + onAvatarUpdate: entryActions.updateCurrentUserAvatar, + onLanguageUpdate: entryActions.updateCurrentUserLanguage, + onUsernameUpdate: entryActions.updateCurrentUserUsername, + onUsernameUpdateMessageDismiss: entryActions.clearCurrentUserUsernameUpdateError, + onEmailUpdate: entryActions.updateCurrentUserEmail, + onEmailUpdateMessageDismiss: entryActions.clearCurrentUserEmailUpdateError, + onPasswordUpdate: entryActions.updateCurrentUserPassword, + onPasswordUpdateMessageDismiss: entryActions.clearCurrentUserPasswordUpdateError, + onClose: entryActions.closeModal, }, dispatch, ); diff --git a/client/src/containers/UsersModalContainer.js b/client/src/containers/UsersModalContainer.js index eacd08c7..53503f5b 100755 --- a/client/src/containers/UsersModalContainer.js +++ b/client/src/containers/UsersModalContainer.js @@ -1,22 +1,12 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { usersExceptCurrentSelector } from '../selectors'; -import { - clearUserEmailUpdateError, - clearUserPasswordUpdateError, - clearUserUsernameUpdateError, - closeModal, - deleteUser, - updateUser, - updateUserEmail, - updateUserPassword, - updateUserUsername, -} from '../actions/entry'; +import selectors from '../selectors'; +import entryActions from '../entry-actions'; import UsersModal from '../components/UsersModal'; const mapStateToProps = (state) => { - const users = usersExceptCurrentSelector(state); + const users = selectors.selectUsersExceptCurrent(state); return { items: users, @@ -26,15 +16,15 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => bindActionCreators( { - onUpdate: updateUser, - onUsernameUpdate: updateUserUsername, - onUsernameUpdateMessageDismiss: clearUserUsernameUpdateError, - onEmailUpdate: updateUserEmail, - onEmailUpdateMessageDismiss: clearUserEmailUpdateError, - onPasswordUpdate: updateUserPassword, - onPasswordUpdateMessageDismiss: clearUserPasswordUpdateError, - onDelete: deleteUser, - onClose: closeModal, + onUpdate: entryActions.updateUser, + onUsernameUpdate: entryActions.updateUserUsername, + onUsernameUpdateMessageDismiss: entryActions.clearUserUsernameUpdateError, + onEmailUpdate: entryActions.updateUserEmail, + onEmailUpdateMessageDismiss: entryActions.clearUserEmailUpdateError, + onPasswordUpdate: entryActions.updateUserPassword, + onPasswordUpdateMessageDismiss: entryActions.clearUserPasswordUpdateError, + onDelete: entryActions.deleteUser, + onClose: entryActions.closeModal, }, dispatch, ); diff --git a/client/src/entry-actions/activities.js b/client/src/entry-actions/activities.js new file mode 100755 index 00000000..9663a7d7 --- /dev/null +++ b/client/src/entry-actions/activities.js @@ -0,0 +1,42 @@ +import EntryActionTypes from '../constants/EntryActionTypes'; + +const fetchActivitiesInCurrentCard = () => ({ + type: EntryActionTypes.ACTIVITIES_IN_CURRENT_CARD_FETCH, + payload: {}, +}); + +const toggleActivitiesDetailsInCurrentCard = (isVisible) => ({ + type: EntryActionTypes.ACTIVITIES_DETAILS_IN_CURRENT_CARD_TOGGLE, + payload: { + isVisible, + }, +}); + +const handleActivityCreate = (activity) => ({ + type: EntryActionTypes.ACTIVITY_CREATE_HANDLE, + payload: { + activity, + }, +}); + +const handleActivityUpdate = (activity) => ({ + type: EntryActionTypes.ACTIVITY_UPDATE_HANDLE, + payload: { + activity, + }, +}); + +const handleActivityDelete = (activity) => ({ + type: EntryActionTypes.ACTIVITY_DELETE_HANDLE, + payload: { + activity, + }, +}); + +export default { + fetchActivitiesInCurrentCard, + toggleActivitiesDetailsInCurrentCard, + handleActivityCreate, + handleActivityUpdate, + handleActivityDelete, +}; diff --git a/client/src/actions/entry/attachment.js b/client/src/entry-actions/attachments.js similarity index 50% rename from client/src/actions/entry/attachment.js rename to client/src/entry-actions/attachments.js index 128a120c..732fe5e5 100644 --- a/client/src/actions/entry/attachment.js +++ b/client/src/entry-actions/attachments.js @@ -1,13 +1,13 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; +import EntryActionTypes from '../constants/EntryActionTypes'; -export const createAttachmentInCurrentCard = (data) => ({ +const createAttachmentInCurrentCard = (data) => ({ type: EntryActionTypes.ATTACHMENT_IN_CURRENT_CARD_CREATE, payload: { data, }, }); -export const handleAttachmentCreate = (attachment, requestId) => ({ +const handleAttachmentCreate = (attachment, requestId) => ({ type: EntryActionTypes.ATTACHMENT_CREATE_HANDLE, payload: { attachment, @@ -15,7 +15,7 @@ export const handleAttachmentCreate = (attachment, requestId) => ({ }, }); -export const updateAttachment = (id, data) => ({ +const updateAttachment = (id, data) => ({ type: EntryActionTypes.ATTACHMENT_UPDATE, payload: { id, @@ -23,23 +23,32 @@ export const updateAttachment = (id, data) => ({ }, }); -export const handleAttachmentUpdate = (attachment) => ({ +const handleAttachmentUpdate = (attachment) => ({ type: EntryActionTypes.ATTACHMENT_UPDATE_HANDLE, payload: { attachment, }, }); -export const deleteAttachment = (id) => ({ +const deleteAttachment = (id) => ({ type: EntryActionTypes.ATTACHMENT_DELETE, payload: { id, }, }); -export const handleAttachmentDelete = (attachment) => ({ +const handleAttachmentDelete = (attachment) => ({ type: EntryActionTypes.ATTACHMENT_DELETE_HANDLE, payload: { attachment, }, }); + +export default { + createAttachmentInCurrentCard, + handleAttachmentCreate, + updateAttachment, + handleAttachmentUpdate, + deleteAttachment, + handleAttachmentDelete, +}; diff --git a/client/src/entry-actions/board-memberships.js b/client/src/entry-actions/board-memberships.js new file mode 100644 index 00000000..ba245438 --- /dev/null +++ b/client/src/entry-actions/board-memberships.js @@ -0,0 +1,36 @@ +import EntryActionTypes from '../constants/EntryActionTypes'; + +const createMembershipInCurrentBoard = (data) => ({ + type: EntryActionTypes.MEMBERSHIP_IN_CURRENT_BOARD_CREATE, + payload: { + data, + }, +}); + +const handleBoardMembershipCreate = (boardMembership) => ({ + type: EntryActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE, + payload: { + boardMembership, + }, +}); + +const deleteBoardMembership = (id) => ({ + type: EntryActionTypes.BOARD_MEMBERSHIP_DELETE, + payload: { + id, + }, +}); + +const handleBoardMembershipDelete = (boardMembership) => ({ + type: EntryActionTypes.BOARD_MEMBERSHIP_DELETE_HANDLE, + payload: { + boardMembership, + }, +}); + +export default { + createMembershipInCurrentBoard, + handleBoardMembershipCreate, + deleteBoardMembership, + handleBoardMembershipDelete, +}; diff --git a/client/src/actions/entry/board.js b/client/src/entry-actions/boards.js similarity index 54% rename from client/src/actions/entry/board.js rename to client/src/entry-actions/boards.js index e9e4fd4c..638f49ba 100755 --- a/client/src/actions/entry/board.js +++ b/client/src/entry-actions/boards.js @@ -1,27 +1,27 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; +import EntryActionTypes from '../constants/EntryActionTypes'; -export const createBoardInCurrentProject = (data) => ({ +const createBoardInCurrentProject = (data) => ({ type: EntryActionTypes.BOARD_IN_CURRENT_PROJECT_CREATE, payload: { data, }, }); -export const handleBoardCreate = (board) => ({ +const handleBoardCreate = (board) => ({ type: EntryActionTypes.BOARD_CREATE_HANDLE, payload: { board, }, }); -export const fetchBoard = (id) => ({ +const fetchBoard = (id) => ({ type: EntryActionTypes.BOARD_FETCH, payload: { id, }, }); -export const updateBoard = (id, data) => ({ +const updateBoard = (id, data) => ({ type: EntryActionTypes.BOARD_UPDATE, payload: { id, @@ -29,14 +29,14 @@ export const updateBoard = (id, data) => ({ }, }); -export const handleBoardUpdate = (board) => ({ +const handleBoardUpdate = (board) => ({ type: EntryActionTypes.BOARD_UPDATE_HANDLE, payload: { board, }, }); -export const moveBoard = (id, index) => ({ +const moveBoard = (id, index) => ({ type: EntryActionTypes.BOARD_MOVE, payload: { id, @@ -44,16 +44,27 @@ export const moveBoard = (id, index) => ({ }, }); -export const deleteBoard = (id) => ({ +const deleteBoard = (id) => ({ type: EntryActionTypes.BOARD_DELETE, payload: { id, }, }); -export const handleBoardDelete = (board) => ({ +const handleBoardDelete = (board) => ({ type: EntryActionTypes.BOARD_DELETE_HANDLE, payload: { board, }, }); + +export default { + createBoardInCurrentProject, + handleBoardCreate, + fetchBoard, + updateBoard, + handleBoardUpdate, + moveBoard, + deleteBoard, + handleBoardDelete, +}; diff --git a/client/src/actions/entry/card.js b/client/src/entry-actions/cards.js similarity index 55% rename from client/src/actions/entry/card.js rename to client/src/entry-actions/cards.js index 1382448d..c3e9eb25 100755 --- a/client/src/actions/entry/card.js +++ b/client/src/entry-actions/cards.js @@ -1,6 +1,6 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; +import EntryActionTypes from '../constants/EntryActionTypes'; -export const createCard = (listId, data) => ({ +const createCard = (listId, data) => ({ type: EntryActionTypes.CARD_CREATE, payload: { listId, @@ -8,14 +8,14 @@ export const createCard = (listId, data) => ({ }, }); -export const handleCardCreate = (card) => ({ +const handleCardCreate = (card) => ({ type: EntryActionTypes.CARD_CREATE_HANDLE, payload: { card, }, }); -export const updateCard = (id, data) => ({ +const updateCard = (id, data) => ({ type: EntryActionTypes.CARD_UPDATE, payload: { id, @@ -23,21 +23,21 @@ export const updateCard = (id, data) => ({ }, }); -export const updateCurrentCard = (data) => ({ +const updateCurrentCard = (data) => ({ type: EntryActionTypes.CURRENT_CARD_UPDATE, payload: { data, }, }); -export const handleCardUpdate = (card) => ({ +const handleCardUpdate = (card) => ({ type: EntryActionTypes.CARD_UPDATE_HANDLE, payload: { card, }, }); -export const moveCard = (id, listId, index = 0) => ({ +const moveCard = (id, listId, index = 0) => ({ type: EntryActionTypes.CARD_MOVE, payload: { id, @@ -46,7 +46,7 @@ export const moveCard = (id, listId, index = 0) => ({ }, }); -export const moveCurrentCard = (listId, index = 0) => ({ +const moveCurrentCard = (listId, index = 0) => ({ type: EntryActionTypes.CURRENT_CARD_MOVE, payload: { listId, @@ -54,7 +54,7 @@ export const moveCurrentCard = (listId, index = 0) => ({ }, }); -export const transferCard = (id, boardId, listId, index = 0) => ({ +const transferCard = (id, boardId, listId, index = 0) => ({ type: EntryActionTypes.CARD_TRANSFER, payload: { id, @@ -64,7 +64,7 @@ export const transferCard = (id, boardId, listId, index = 0) => ({ }, }); -export const transferCurrentCard = (boardId, listId, index = 0) => ({ +const transferCurrentCard = (boardId, listId, index = 0) => ({ type: EntryActionTypes.CURRENT_CARD_TRANSFER, payload: { boardId, @@ -73,21 +73,36 @@ export const transferCurrentCard = (boardId, listId, index = 0) => ({ }, }); -export const deleteCard = (id) => ({ +const deleteCard = (id) => ({ type: EntryActionTypes.CARD_DELETE, payload: { id, }, }); -export const deleteCurrentCard = () => ({ +const deleteCurrentCard = () => ({ type: EntryActionTypes.CURRENT_CARD_DELETE, payload: {}, }); -export const handleCardDelete = (card) => ({ +const handleCardDelete = (card) => ({ type: EntryActionTypes.CARD_DELETE_HANDLE, payload: { card, }, }); + +export default { + createCard, + handleCardCreate, + updateCard, + updateCurrentCard, + handleCardUpdate, + moveCard, + moveCurrentCard, + transferCard, + transferCurrentCard, + deleteCard, + deleteCurrentCard, + handleCardDelete, +}; diff --git a/client/src/entry-actions/comment-activities.js b/client/src/entry-actions/comment-activities.js new file mode 100755 index 00000000..3e36efcf --- /dev/null +++ b/client/src/entry-actions/comment-activities.js @@ -0,0 +1,29 @@ +import EntryActionTypes from '../constants/EntryActionTypes'; + +const createCommentActivityInCurrentCard = (data) => ({ + type: EntryActionTypes.COMMENT_ACTIVITY_IN_CURRENT_CARD_CREATE, + payload: { + data, + }, +}); + +const updateCommentActivity = (id, data) => ({ + type: EntryActionTypes.COMMENT_ACTIVITY_UPDATE, + payload: { + id, + data, + }, +}); + +const deleteCommentActivity = (id) => ({ + type: EntryActionTypes.COMMENT_ACTIVITY_DELETE, + payload: { + id, + }, +}); + +export default { + createCommentActivityInCurrentCard, + updateCommentActivity, + deleteCommentActivity, +}; diff --git a/client/src/entry-actions/core.js b/client/src/entry-actions/core.js new file mode 100644 index 00000000..f76395c2 --- /dev/null +++ b/client/src/entry-actions/core.js @@ -0,0 +1,16 @@ +import EntryActionTypes from '../constants/EntryActionTypes'; + +const initializeCore = () => ({ + type: EntryActionTypes.CORE_INITIALIZE, + payload: {}, +}); + +const logout = () => ({ + type: EntryActionTypes.LOGOUT, + payload: {}, +}); + +export default { + initializeCore, + logout, +}; diff --git a/client/src/entry-actions/index.js b/client/src/entry-actions/index.js new file mode 100755 index 00000000..12bbb306 --- /dev/null +++ b/client/src/entry-actions/index.js @@ -0,0 +1,37 @@ +import socket from './socket'; +import login from './login'; +import core from './core'; +import modals from './modals'; +import users from './users'; +import projects from './projects'; +import projectManagers from './project-managers'; +import boards from './boards'; +import boardMemberships from './board-memberships'; +import labels from './labels'; +import lists from './lists'; +import cards from './cards'; +import tasks from './tasks'; +import attachments from './attachments'; +import activities from './activities'; +import commentActivities from './comment-activities'; +import notifications from './notifications'; + +export default { + ...socket, + ...login, + ...core, + ...modals, + ...users, + ...projects, + ...projectManagers, + ...boards, + ...boardMemberships, + ...labels, + ...lists, + ...cards, + ...tasks, + ...attachments, + ...activities, + ...commentActivities, + ...notifications, +}; diff --git a/client/src/actions/entry/label.js b/client/src/entry-actions/labels.js similarity index 53% rename from client/src/actions/entry/label.js rename to client/src/entry-actions/labels.js index cec6baec..bd88b777 100755 --- a/client/src/actions/entry/label.js +++ b/client/src/entry-actions/labels.js @@ -1,20 +1,20 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; +import EntryActionTypes from '../constants/EntryActionTypes'; -export const createLabelInCurrentBoard = (data) => ({ +const createLabelInCurrentBoard = (data) => ({ type: EntryActionTypes.LABEL_IN_CURRENT_BOARD_CREATE, payload: { data, }, }); -export const handleLabelCreate = (label) => ({ +const handleLabelCreate = (label) => ({ type: EntryActionTypes.LABEL_CREATE_HANDLE, payload: { label, }, }); -export const updateLabel = (id, data) => ({ +const updateLabel = (id, data) => ({ type: EntryActionTypes.LABEL_UPDATE, payload: { id, @@ -22,28 +22,28 @@ export const updateLabel = (id, data) => ({ }, }); -export const handleLabelUpdate = (label) => ({ +const handleLabelUpdate = (label) => ({ type: EntryActionTypes.LABEL_UPDATE_HANDLE, payload: { label, }, }); -export const deleteLabel = (id) => ({ +const deleteLabel = (id) => ({ type: EntryActionTypes.LABEL_DELETE, payload: { id, }, }); -export const handleLabelDelete = (label) => ({ +const handleLabelDelete = (label) => ({ type: EntryActionTypes.LABEL_DELETE_HANDLE, payload: { label, }, }); -export const addLabelToCard = (id, cardId) => ({ +const addLabelToCard = (id, cardId) => ({ type: EntryActionTypes.LABEL_TO_CARD_ADD, payload: { id, @@ -51,21 +51,21 @@ export const addLabelToCard = (id, cardId) => ({ }, }); -export const addLabelToCurrentCard = (id) => ({ +const addLabelToCurrentCard = (id) => ({ type: EntryActionTypes.LABEL_TO_CURRENT_CARD_ADD, payload: { id, }, }); -export const handleLabelToCardAdd = (cardLabel) => ({ +const handleLabelToCardAdd = (cardLabel) => ({ type: EntryActionTypes.LABEL_TO_CARD_ADD_HANDLE, payload: { cardLabel, }, }); -export const removeLabelFromCard = (id, cardId) => ({ +const removeLabelFromCard = (id, cardId) => ({ type: EntryActionTypes.LABEL_FROM_CARD_REMOVE, payload: { id, @@ -73,30 +73,47 @@ export const removeLabelFromCard = (id, cardId) => ({ }, }); -export const removeLabelFromCurrentCard = (id) => ({ +const removeLabelFromCurrentCard = (id) => ({ type: EntryActionTypes.LABEL_FROM_CURRENT_CARD_REMOVE, payload: { id, }, }); -export const handleLabelFromCardRemove = (cardLabel) => ({ +const handleLabelFromCardRemove = (cardLabel) => ({ type: EntryActionTypes.LABEL_FROM_CARD_REMOVE_HANDLE, payload: { cardLabel, }, }); -export const addLabelToFilterInCurrentBoard = (id) => ({ +const addLabelToFilterInCurrentBoard = (id) => ({ type: EntryActionTypes.LABEL_TO_FILTER_IN_CURRENT_BOARD_ADD, payload: { id, }, }); -export const removeLabelFromFilterInCurrentBoard = (id) => ({ +const removeLabelFromFilterInCurrentBoard = (id) => ({ type: EntryActionTypes.LABEL_FROM_FILTER_IN_CURRENT_BOARD_REMOVE, payload: { id, }, }); + +export default { + createLabelInCurrentBoard, + handleLabelCreate, + updateLabel, + handleLabelUpdate, + deleteLabel, + handleLabelDelete, + addLabelToCard, + addLabelToCurrentCard, + handleLabelToCardAdd, + removeLabelFromCard, + removeLabelFromCurrentCard, + handleLabelFromCardRemove, + addLabelToFilterInCurrentBoard, + removeLabelFromFilterInCurrentBoard, +}; diff --git a/client/src/actions/entry/list.js b/client/src/entry-actions/lists.js similarity index 53% rename from client/src/actions/entry/list.js rename to client/src/entry-actions/lists.js index 9a7446a2..97350c15 100755 --- a/client/src/actions/entry/list.js +++ b/client/src/entry-actions/lists.js @@ -1,20 +1,20 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; +import EntryActionTypes from '../constants/EntryActionTypes'; -export const createListInCurrentBoard = (data) => ({ +const createListInCurrentBoard = (data) => ({ type: EntryActionTypes.LIST_IN_CURRENT_BOARD_CREATE, payload: { data, }, }); -export const handleListCreate = (list) => ({ +const handleListCreate = (list) => ({ type: EntryActionTypes.LIST_CREATE_HANDLE, payload: { list, }, }); -export const updateList = (id, data) => ({ +const updateList = (id, data) => ({ type: EntryActionTypes.LIST_UPDATE, payload: { id, @@ -22,14 +22,14 @@ export const updateList = (id, data) => ({ }, }); -export const handleListUpdate = (list) => ({ +const handleListUpdate = (list) => ({ type: EntryActionTypes.LIST_UPDATE_HANDLE, payload: { list, }, }); -export const moveList = (id, index) => ({ +const moveList = (id, index) => ({ type: EntryActionTypes.LIST_MOVE, payload: { id, @@ -37,16 +37,26 @@ export const moveList = (id, index) => ({ }, }); -export const deleteList = (id) => ({ +const deleteList = (id) => ({ type: EntryActionTypes.LIST_DELETE, payload: { id, }, }); -export const handleListDelete = (list) => ({ +const handleListDelete = (list) => ({ type: EntryActionTypes.LIST_DELETE_HANDLE, payload: { list, }, }); + +export default { + createListInCurrentBoard, + handleListCreate, + updateList, + handleListUpdate, + moveList, + deleteList, + handleListDelete, +}; diff --git a/client/src/entry-actions/login.js b/client/src/entry-actions/login.js new file mode 100755 index 00000000..db0d37dd --- /dev/null +++ b/client/src/entry-actions/login.js @@ -0,0 +1,18 @@ +import EntryActionTypes from '../constants/EntryActionTypes'; + +const authenticate = (data) => ({ + type: EntryActionTypes.AUTHENTICATE, + payload: { + data, + }, +}); + +const clearAuthenticateError = () => ({ + type: EntryActionTypes.AUTHENTICATE_ERROR_CLEAR, + payload: {}, +}); + +export default { + authenticate, + clearAuthenticateError, +}; diff --git a/client/src/actions/entry/modal.js b/client/src/entry-actions/modals.js similarity index 51% rename from client/src/actions/entry/modal.js rename to client/src/entry-actions/modals.js index f0b882de..bbd4337a 100755 --- a/client/src/actions/entry/modal.js +++ b/client/src/entry-actions/modals.js @@ -1,35 +1,43 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; -import ModalTypes from '../../constants/ModalTypes'; +import EntryActionTypes from '../constants/EntryActionTypes'; +import ModalTypes from '../constants/ModalTypes'; -export const openUsersModal = () => ({ +const openUsersModal = () => ({ type: EntryActionTypes.MODAL_OPEN, payload: { type: ModalTypes.USERS, }, }); -export const openUserSettingsModal = () => ({ +const openUserSettingsModal = () => ({ type: EntryActionTypes.MODAL_OPEN, payload: { type: ModalTypes.USER_SETTINGS, }, }); -export const openProjectAddModal = () => ({ +const openProjectAddModal = () => ({ type: EntryActionTypes.MODAL_OPEN, payload: { type: ModalTypes.PROJECT_ADD, }, }); -export const openProjectSettingsModal = () => ({ +const openProjectSettingsModal = () => ({ type: EntryActionTypes.MODAL_OPEN, payload: { type: ModalTypes.PROJECT_SETTINGS, }, }); -export const closeModal = () => ({ +const closeModal = () => ({ type: EntryActionTypes.MODAL_CLOSE, payload: {}, }); + +export default { + openUsersModal, + openUserSettingsModal, + openProjectAddModal, + openProjectSettingsModal, + closeModal, +}; diff --git a/client/src/entry-actions/notifications.js b/client/src/entry-actions/notifications.js new file mode 100755 index 00000000..e05066d7 --- /dev/null +++ b/client/src/entry-actions/notifications.js @@ -0,0 +1,28 @@ +import EntryActionTypes from '../constants/EntryActionTypes'; + +const handleNotificationCreate = (notification) => ({ + type: EntryActionTypes.NOTIFICATION_CREATE_HANDLE, + payload: { + notification, + }, +}); + +const deleteNotification = (id) => ({ + type: EntryActionTypes.NOTIFICATION_DELETE, + payload: { + id, + }, +}); + +const handleNotificationDelete = (notification) => ({ + type: EntryActionTypes.NOTIFICATION_DELETE_HANDLE, + payload: { + notification, + }, +}); + +export default { + handleNotificationCreate, + deleteNotification, + handleNotificationDelete, +}; diff --git a/client/src/entry-actions/project-managers.js b/client/src/entry-actions/project-managers.js new file mode 100755 index 00000000..6520b846 --- /dev/null +++ b/client/src/entry-actions/project-managers.js @@ -0,0 +1,36 @@ +import EntryActionTypes from '../constants/EntryActionTypes'; + +const createManagerInCurrentProject = (data) => ({ + type: EntryActionTypes.MANAGER_IN_CURRENT_PROJECT_CREATE, + payload: { + data, + }, +}); + +const handleProjectManagerCreate = (projectManager) => ({ + type: EntryActionTypes.PROJECT_MANAGER_CREATE_HANDLE, + payload: { + projectManager, + }, +}); + +const deleteProjectManager = (id) => ({ + type: EntryActionTypes.PROJECT_MANAGER_DELETE, + payload: { + id, + }, +}); + +const handleProjectManagerDelete = (projectManager) => ({ + type: EntryActionTypes.PROJECT_MANAGER_DELETE_HANDLE, + payload: { + projectManager, + }, +}); + +export default { + createManagerInCurrentProject, + handleProjectManagerCreate, + deleteProjectManager, + handleProjectManagerDelete, +}; diff --git a/client/src/actions/entry/project.js b/client/src/entry-actions/projects.js similarity index 50% rename from client/src/actions/entry/project.js rename to client/src/entry-actions/projects.js index 5fa97cc8..33b76ab4 100755 --- a/client/src/actions/entry/project.js +++ b/client/src/entry-actions/projects.js @@ -1,48 +1,58 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; +import EntryActionTypes from '../constants/EntryActionTypes'; -export const createProject = (data) => ({ +const createProject = (data) => ({ type: EntryActionTypes.PROJECT_CREATE, payload: { data, }, }); -export const handleProjectCreate = (project) => ({ +const handleProjectCreate = (project) => ({ type: EntryActionTypes.PROJECT_CREATE_HANDLE, payload: { project, }, }); -export const updateCurrentProject = (data) => ({ +const updateCurrentProject = (data) => ({ type: EntryActionTypes.CURRENT_PROJECT_UPDATE, payload: { data, }, }); -export const handleProjectUpdate = (project) => ({ +const handleProjectUpdate = (project) => ({ type: EntryActionTypes.PROJECT_UPDATE_HANDLE, payload: { project, }, }); -export const updateCurrentProjectBackgroundImage = (data) => ({ +const updateCurrentProjectBackgroundImage = (data) => ({ type: EntryActionTypes.CURRENT_PROJECT_BACKGROUND_IMAGE_UPDATE, payload: { data, }, }); -export const deleteCurrentProject = () => ({ +const deleteCurrentProject = () => ({ type: EntryActionTypes.CURRENT_PROJECT_DELETE, payload: {}, }); -export const handleProjectDelete = (project) => ({ +const handleProjectDelete = (project) => ({ type: EntryActionTypes.PROJECT_DELETE_HANDLE, payload: { project, }, }); + +export default { + createProject, + handleProjectCreate, + updateCurrentProject, + handleProjectUpdate, + updateCurrentProjectBackgroundImage, + deleteCurrentProject, + handleProjectDelete, +}; diff --git a/client/src/entry-actions/socket.js b/client/src/entry-actions/socket.js new file mode 100644 index 00000000..11781ed2 --- /dev/null +++ b/client/src/entry-actions/socket.js @@ -0,0 +1,16 @@ +import EntryActionTypes from '../constants/EntryActionTypes'; + +const handleSocketDisconnect = () => ({ + type: EntryActionTypes.SOCKET_DISCONNECT_HANDLE, + payload: {}, +}); + +const handleSocketReconnect = () => ({ + type: EntryActionTypes.SOCKET_RECONNECT_HANDLE, + payload: {}, +}); + +export default { + handleSocketDisconnect, + handleSocketReconnect, +}; diff --git a/client/src/actions/entry/task.js b/client/src/entry-actions/tasks.js similarity index 53% rename from client/src/actions/entry/task.js rename to client/src/entry-actions/tasks.js index c406a800..6d870d6d 100755 --- a/client/src/actions/entry/task.js +++ b/client/src/entry-actions/tasks.js @@ -1,20 +1,20 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; +import EntryActionTypes from '../constants/EntryActionTypes'; -export const createTaskInCurrentCard = (data) => ({ +const createTaskInCurrentCard = (data) => ({ type: EntryActionTypes.TASK_IN_CURRENT_CARD_CREATE, payload: { data, }, }); -export const handleTaskCreate = (task) => ({ +const handleTaskCreate = (task) => ({ type: EntryActionTypes.TASK_CREATE_HANDLE, payload: { task, }, }); -export const updateTask = (id, data) => ({ +const updateTask = (id, data) => ({ type: EntryActionTypes.TASK_UPDATE, payload: { id, @@ -22,14 +22,14 @@ export const updateTask = (id, data) => ({ }, }); -export const handleTaskUpdate = (task) => ({ +const handleTaskUpdate = (task) => ({ type: EntryActionTypes.TASK_UPDATE_HANDLE, payload: { task, }, }); -export const moveTask = (id, index) => ({ +const moveTask = (id, index) => ({ type: EntryActionTypes.TASK_MOVE, payload: { id, @@ -37,16 +37,26 @@ export const moveTask = (id, index) => ({ }, }); -export const deleteTask = (id) => ({ +const deleteTask = (id) => ({ type: EntryActionTypes.TASK_DELETE, payload: { id, }, }); -export const handleTaskDelete = (task) => ({ +const handleTaskDelete = (task) => ({ type: EntryActionTypes.TASK_DELETE_HANDLE, payload: { task, }, }); + +export default { + createTaskInCurrentCard, + handleTaskCreate, + updateTask, + handleTaskUpdate, + moveTask, + deleteTask, + handleTaskDelete, +}; diff --git a/client/src/actions/entry/user.js b/client/src/entry-actions/users.js similarity index 53% rename from client/src/actions/entry/user.js rename to client/src/entry-actions/users.js index 0f1b5fcf..3f6c7e2a 100755 --- a/client/src/actions/entry/user.js +++ b/client/src/entry-actions/users.js @@ -1,25 +1,25 @@ -import EntryActionTypes from '../../constants/EntryActionTypes'; +import EntryActionTypes from '../constants/EntryActionTypes'; -export const createUser = (data) => ({ +const createUser = (data) => ({ type: EntryActionTypes.USER_CREATE, payload: { data, }, }); -export const handleUserCreate = (user) => ({ +const handleUserCreate = (user) => ({ type: EntryActionTypes.USER_CREATE_HANDLE, payload: { user, }, }); -export const clearUserCreateError = () => ({ +const clearUserCreateError = () => ({ type: EntryActionTypes.USER_CREATE_ERROR_CLEAR, payload: {}, }); -export const updateUser = (id, data) => ({ +const updateUser = (id, data) => ({ type: EntryActionTypes.USER_UPDATE, payload: { id, @@ -27,28 +27,28 @@ export const updateUser = (id, data) => ({ }, }); -export const updateCurrentUser = (data) => ({ +const updateCurrentUser = (data) => ({ type: EntryActionTypes.CURRENT_USER_UPDATE, payload: { data, }, }); -export const handleUserUpdate = (user) => ({ +const handleUserUpdate = (user) => ({ type: EntryActionTypes.USER_UPDATE_HANDLE, payload: { user, }, }); -export const updateCurrentUserLanguage = (language) => ({ +const updateCurrentUserLanguage = (language) => ({ type: EntryActionTypes.CURRENT_USER_LANGUAGE_UPDATE, payload: { language, }, }); -export const updateUserEmail = (id, data) => ({ +const updateUserEmail = (id, data) => ({ type: EntryActionTypes.USER_EMAIL_UPDATE, payload: { id, @@ -56,26 +56,26 @@ export const updateUserEmail = (id, data) => ({ }, }); -export const updateCurrentUserEmail = (data) => ({ +const updateCurrentUserEmail = (data) => ({ type: EntryActionTypes.CURRENT_USER_EMAIL_UPDATE, payload: { data, }, }); -export const clearUserEmailUpdateError = (id) => ({ +const clearUserEmailUpdateError = (id) => ({ type: EntryActionTypes.USER_EMAIL_UPDATE_ERROR_CLEAR, payload: { id, }, }); -export const clearCurrentUserEmailUpdateError = () => ({ +const clearCurrentUserEmailUpdateError = () => ({ type: EntryActionTypes.CURRENT_USER_EMAIL_UPDATE_ERROR_CLEAR, payload: {}, }); -export const updateUserPassword = (id, data) => ({ +const updateUserPassword = (id, data) => ({ type: EntryActionTypes.USER_PASSWORD_UPDATE, payload: { id, @@ -83,26 +83,26 @@ export const updateUserPassword = (id, data) => ({ }, }); -export const updateCurrentUserPassword = (data) => ({ +const updateCurrentUserPassword = (data) => ({ type: EntryActionTypes.CURRENT_USER_PASSWORD_UPDATE, payload: { data, }, }); -export const clearUserPasswordUpdateError = (id) => ({ +const clearUserPasswordUpdateError = (id) => ({ type: EntryActionTypes.USER_PASSWORD_UPDATE_ERROR_CLEAR, payload: { id, }, }); -export const clearCurrentUserPasswordUpdateError = () => ({ +const clearCurrentUserPasswordUpdateError = () => ({ type: EntryActionTypes.CURRENT_USER_PASSWORD_UPDATE_ERROR_CLEAR, payload: {}, }); -export const updateUserUsername = (id, data) => ({ +const updateUserUsername = (id, data) => ({ type: EntryActionTypes.USER_USERNAME_UPDATE, payload: { id, @@ -110,47 +110,47 @@ export const updateUserUsername = (id, data) => ({ }, }); -export const updateCurrentUserUsername = (data) => ({ +const updateCurrentUserUsername = (data) => ({ type: EntryActionTypes.CURRENT_USER_USERNAME_UPDATE, payload: { data, }, }); -export const clearUserUsernameUpdateError = (id) => ({ +const clearUserUsernameUpdateError = (id) => ({ type: EntryActionTypes.USER_USERNAME_UPDATE_ERROR_CLEAR, payload: { id, }, }); -export const clearCurrentUserUsernameUpdateError = () => ({ +const clearCurrentUserUsernameUpdateError = () => ({ type: EntryActionTypes.CURRENT_USER_USERNAME_UPDATE_ERROR_CLEAR, payload: {}, }); -export const updateCurrentUserAvatar = (data) => ({ +const updateCurrentUserAvatar = (data) => ({ type: EntryActionTypes.CURRENT_USER_AVATAR_UPDATE, payload: { data, }, }); -export const deleteUser = (id) => ({ +const deleteUser = (id) => ({ type: EntryActionTypes.USER_DELETE, payload: { id, }, }); -export const handleUserDelete = (user) => ({ +const handleUserDelete = (user) => ({ type: EntryActionTypes.USER_DELETE_HANDLE, payload: { user, }, }); -export const addUserToCard = (id, cardId) => ({ +const addUserToCard = (id, cardId) => ({ type: EntryActionTypes.USER_TO_CARD_ADD, payload: { id, @@ -158,21 +158,21 @@ export const addUserToCard = (id, cardId) => ({ }, }); -export const addUserToCurrentCard = (id) => ({ +const addUserToCurrentCard = (id) => ({ type: EntryActionTypes.USER_TO_CURRENT_CARD_ADD, payload: { id, }, }); -export const handleUserToCardAdd = (cardMembership) => ({ +const handleUserToCardAdd = (cardMembership) => ({ type: EntryActionTypes.USER_TO_CARD_ADD_HANDLE, payload: { cardMembership, }, }); -export const removeUserFromCard = (id, cardId) => ({ +const removeUserFromCard = (id, cardId) => ({ type: EntryActionTypes.USER_FROM_CARD_REMOVE, payload: { id, @@ -180,30 +180,63 @@ export const removeUserFromCard = (id, cardId) => ({ }, }); -export const removeUserFromCurrentCard = (id) => ({ +const removeUserFromCurrentCard = (id) => ({ type: EntryActionTypes.USER_FROM_CURRENT_CARD_REMOVE, payload: { id, }, }); -export const handleUserFromCardRemove = (cardMembership) => ({ +const handleUserFromCardRemove = (cardMembership) => ({ type: EntryActionTypes.USER_FROM_CARD_REMOVE_HANDLE, payload: { cardMembership, }, }); -export const addUserToFilterInCurrentBoard = (id) => ({ +const addUserToFilterInCurrentBoard = (id) => ({ type: EntryActionTypes.USER_TO_FILTER_IN_CURRENT_BOARD_ADD, payload: { id, }, }); -export const removeUserFromFilterInCurrentBoard = (id) => ({ +const removeUserFromFilterInCurrentBoard = (id) => ({ type: EntryActionTypes.USER_FROM_FILTER_IN_CURRENT_BOARD_REMOVE, payload: { id, }, }); + +export default { + createUser, + handleUserCreate, + clearUserCreateError, + updateUser, + updateCurrentUser, + handleUserUpdate, + updateCurrentUserLanguage, + updateUserEmail, + updateCurrentUserEmail, + clearUserEmailUpdateError, + clearCurrentUserEmailUpdateError, + updateUserPassword, + updateCurrentUserPassword, + clearUserPasswordUpdateError, + clearCurrentUserPasswordUpdateError, + updateUserUsername, + updateCurrentUserUsername, + clearUserUsernameUpdateError, + clearCurrentUserUsernameUpdateError, + updateCurrentUserAvatar, + deleteUser, + handleUserDelete, + addUserToCard, + addUserToCurrentCard, + handleUserToCardAdd, + removeUserFromCard, + removeUserFromCurrentCard, + handleUserFromCardRemove, + addUserToFilterInCurrentBoard, + removeUserFromFilterInCurrentBoard, +}; diff --git a/client/src/models/Action.js b/client/src/models/Action.js deleted file mode 100755 index eea1a307..00000000 --- a/client/src/models/Action.js +++ /dev/null @@ -1,95 +0,0 @@ -import { Model, attr, fk } from 'redux-orm'; - -import ActionTypes from '../constants/ActionTypes'; - -export default class extends Model { - static modelName = 'Action'; - - static fields = { - id: attr(), - type: attr(), - data: attr(), - createdAt: attr({ - getDefault: () => new Date(), - }), - isInCard: attr({ - getDefault: () => true, - }), - cardId: fk({ - to: 'Card', - as: 'card', - relatedName: 'actions', - }), - userId: fk({ - to: 'User', - as: 'user', - relatedName: 'actions', - }), - }; - - static reducer({ type, payload }, Action) { - switch (type) { - case ActionTypes.SOCKET_RECONNECT_HANDLE: - Action.all().delete(); - - payload.actions.forEach((action) => { - Action.upsert({ - ...action, - isInCard: false, - }); - }); - - break; - case ActionTypes.CORE_INITIALIZE: - payload.actions.forEach((action) => { - Action.upsert({ - ...action, - isInCard: false, - }); - }); - - break; - case ActionTypes.ACTIONS_FETCH__SUCCESS: - case ActionTypes.ACTIONS_DETAILS_TOGGLE__SUCCESS: - case ActionTypes.NOTIFICATION_CREATE_HANDLE: - payload.actions.forEach((action) => { - Action.upsert(action); - }); - - break; - case ActionTypes.ACTION_CREATE_HANDLE: - case ActionTypes.ACTION_UPDATE_HANDLE: - case ActionTypes.COMMENT_ACTION_CREATE: - case ActionTypes.COMMENT_ACTION_UPDATE__SUCCESS: - Action.upsert(payload.action); - - break; - case ActionTypes.ACTION_DELETE_HANDLE: - case ActionTypes.COMMENT_ACTION_DELETE__SUCCESS: { - const actionModel = Action.withId(payload.action.id); - - if (actionModel) { - actionModel.delete(); - } - - break; - } - case ActionTypes.COMMENT_ACTION_CREATE__SUCCESS: - Action.withId(payload.localId).delete(); - Action.upsert(payload.action); - - break; - case ActionTypes.COMMENT_ACTION_UPDATE: - Action.withId(payload.id).update({ - data: payload.data, - }); - - break; - case ActionTypes.COMMENT_ACTION_DELETE: - Action.withId(payload.id).delete(); - - break; - default: - } - } -} diff --git a/client/src/models/Activity.js b/client/src/models/Activity.js new file mode 100755 index 00000000..f387d04f --- /dev/null +++ b/client/src/models/Activity.js @@ -0,0 +1,95 @@ +import { Model, attr, fk } from 'redux-orm'; + +import ActionTypes from '../constants/ActionTypes'; + +export default class extends Model { + static modelName = 'Activity'; + + static fields = { + id: attr(), + type: attr(), + data: attr(), + createdAt: attr({ + getDefault: () => new Date(), + }), + isInCard: attr({ + getDefault: () => true, + }), + cardId: fk({ + to: 'Card', + as: 'card', + relatedName: 'activities', + }), + userId: fk({ + to: 'User', + as: 'user', + relatedName: 'activities', + }), + }; + + static reducer({ type, payload }, Activity) { + switch (type) { + case ActionTypes.SOCKET_RECONNECT_HANDLE: + Activity.all().delete(); + + payload.activities.forEach((activity) => { + Activity.upsert({ + ...activity, + isInCard: false, + }); + }); + + break; + case ActionTypes.CORE_INITIALIZE: + payload.activities.forEach((activity) => { + Activity.upsert({ + ...activity, + isInCard: false, + }); + }); + + break; + case ActionTypes.ACTIVITIES_FETCH__SUCCESS: + case ActionTypes.ACTIVITIES_DETAILS_TOGGLE__SUCCESS: + case ActionTypes.NOTIFICATION_CREATE_HANDLE: + payload.activities.forEach((activity) => { + Activity.upsert(activity); + }); + + break; + case ActionTypes.ACTIVITY_CREATE_HANDLE: + case ActionTypes.ACTIVITY_UPDATE_HANDLE: + case ActionTypes.COMMENT_ACTIVITY_CREATE: + case ActionTypes.COMMENT_ACTIVITY_UPDATE__SUCCESS: + Activity.upsert(payload.activity); + + break; + case ActionTypes.ACTIVITY_DELETE_HANDLE: + case ActionTypes.COMMENT_ACTIVITY_DELETE__SUCCESS: { + const activityModel = Activity.withId(payload.activity.id); + + if (activityModel) { + activityModel.delete(); + } + + break; + } + case ActionTypes.COMMENT_ACTIVITY_CREATE__SUCCESS: + Activity.withId(payload.localId).delete(); + Activity.upsert(payload.activity); + + break; + case ActionTypes.COMMENT_ACTIVITY_UPDATE: + Activity.withId(payload.id).update({ + data: payload.data, + }); + + break; + case ActionTypes.COMMENT_ACTIVITY_DELETE: + Activity.withId(payload.id).delete(); + + break; + default: + } + } +} diff --git a/client/src/models/Card.js b/client/src/models/Card.js index 2346bb37..c8712db1 100755 --- a/client/src/models/Card.js +++ b/client/src/models/Card.js @@ -2,7 +2,7 @@ import { Model, attr, fk, many, oneToOne } from 'redux-orm'; import ActionTypes from '../constants/ActionTypes'; import Config from '../constants/Config'; -import { ActionTypes as ActionTypesEnum } from '../constants/Enums'; +import { ActivityTypes } from '../constants/Enums'; export default class extends Model { static modelName = 'Card'; @@ -17,16 +17,16 @@ export default class extends Model { isSubscribed: attr({ getDefault: () => false, }), - isActionsFetching: attr({ + isActivitiesFetching: attr({ getDefault: () => false, }), - isAllActionsFetched: attr({ + isAllActivitiesFetched: attr({ getDefault: () => false, }), - isActionsDetailsVisible: attr({ + isActivitiesDetailsVisible: attr({ getDefault: () => false, }), - isActionsDetailsFetching: attr({ + isActivitiesDetailsFetching: attr({ getDefault: () => false, }), boardId: fk({ @@ -189,44 +189,44 @@ export default class extends Model { break; } - case ActionTypes.ACTIONS_FETCH: + case ActionTypes.ACTIVITIES_FETCH: Card.withId(payload.cardId).update({ - isActionsFetching: true, + isActivitiesFetching: true, }); break; - case ActionTypes.ACTIONS_FETCH__SUCCESS: + case ActionTypes.ACTIVITIES_FETCH__SUCCESS: Card.withId(payload.cardId).update({ - isActionsFetching: false, - isAllActionsFetched: payload.actions.length < Config.ACTIONS_LIMIT, + isActivitiesFetching: false, + isAllActivitiesFetched: payload.activities.length < Config.ACTIVITIES_LIMIT, }); break; - case ActionTypes.ACTIONS_DETAILS_TOGGLE: { + case ActionTypes.ACTIVITIES_DETAILS_TOGGLE: { const cardModel = Card.withId(payload.cardId); - cardModel.isActionsDetailsVisible = payload.isVisible; + cardModel.isActivitiesDetailsVisible = payload.isVisible; if (payload.isVisible) { - cardModel.isActionsDetailsFetching = true; + cardModel.isActivitiesDetailsFetching = true; } break; } - case ActionTypes.ACTIONS_DETAILS_TOGGLE__SUCCESS: { + case ActionTypes.ACTIVITIES_DETAILS_TOGGLE__SUCCESS: { const cardModel = Card.withId(payload.cardId); cardModel.update({ - isAllActionsFetched: payload.actions.length < Config.ACTIONS_LIMIT, - isActionsDetailsFetching: false, + isAllActivitiesFetched: payload.activities.length < Config.ACTIVITIES_LIMIT, + isActivitiesDetailsFetching: false, }); - cardModel.actions.toModelArray().forEach((actionModel) => { - if (actionModel.notification) { - actionModel.update({ + cardModel.activities.toModelArray().forEach((activityModel) => { + if (activityModel.notification) { + activityModel.update({ isInCard: false, }); } else { - actionModel.delete(); + activityModel.delete(); } }); @@ -250,16 +250,16 @@ export default class extends Model { return this.attachments.orderBy('id', false); } - getFilteredOrderedInCardActionsQuerySet() { + getFilteredOrderedInCardActivitiesQuerySet() { const filter = { isInCard: true, }; - if (!this.isActionsDetailsVisible) { - filter.type = ActionTypesEnum.COMMENT_CARD; + if (!this.isActivitiesDetailsVisible) { + filter.type = ActivityTypes.COMMENT_CARD; } - return this.actions.filter(filter).orderBy('id', false); + return this.activities.filter(filter).orderBy('id', false); } getUnreadNotificationsQuerySet() { @@ -271,7 +271,7 @@ export default class extends Model { deleteRelated() { this.tasks.delete(); this.attachments.delete(); - this.actions.delete(); + this.activities.delete(); } deleteWithRelated() { diff --git a/client/src/models/Notification.js b/client/src/models/Notification.js index 0d6191cf..4ace2873 100755 --- a/client/src/models/Notification.js +++ b/client/src/models/Notification.js @@ -20,9 +20,9 @@ export default class extends Model { as: 'card', relatedName: 'notifications', }), - actionId: oneToOne({ - to: 'Action', - as: 'action', + activityId: oneToOne({ + to: 'Activity', + as: 'activity', }), }; @@ -31,8 +31,8 @@ export default class extends Model { case ActionTypes.LOCATION_CHANGE_HANDLE: case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE: case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE: - if (payload.notifications) { - payload.notifications.forEach((notification) => { + if (payload.deletedNotifications) { + payload.deletedNotifications.forEach((notification) => { Notification.withId(notification.id).deleteWithRelated(); }); } diff --git a/client/src/models/User.js b/client/src/models/User.js index 168a3112..6bdf2753 100755 --- a/client/src/models/User.js +++ b/client/src/models/User.js @@ -278,7 +278,7 @@ export default class extends Model { case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE: case ActionTypes.BOARD_FETCH__SUCCESS: case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE: - case ActionTypes.ACTIONS_FETCH__SUCCESS: + case ActionTypes.ACTIVITIES_FETCH__SUCCESS: case ActionTypes.NOTIFICATION_CREATE_HANDLE: payload.users.forEach((user) => { User.upsert(user); diff --git a/client/src/models/index.js b/client/src/models/index.js index e4265246..70bfa40a 100755 --- a/client/src/models/index.js +++ b/client/src/models/index.js @@ -8,7 +8,7 @@ import List from './List'; import Card from './Card'; import Task from './Task'; import Attachment from './Attachment'; -import Action from './Action'; +import Activity from './Activity'; import Notification from './Notification'; export { @@ -22,6 +22,6 @@ export { Card, Task, Attachment, - Action, + Activity, Notification, }; diff --git a/client/src/orm.js b/client/src/orm.js index 9857a60a..d11256e2 100755 --- a/client/src/orm.js +++ b/client/src/orm.js @@ -1,7 +1,7 @@ import { ORM } from 'redux-orm'; import { - Action, + Activity, Attachment, Board, BoardMembership, @@ -30,7 +30,7 @@ orm.register( Card, Task, Attachment, - Action, + Activity, Notification, ); diff --git a/client/src/sagas/core/index.js b/client/src/sagas/core/index.js index 41682624..9b4aeb58 100755 --- a/client/src/sagas/core/index.js +++ b/client/src/sagas/core/index.js @@ -1,7 +1,7 @@ import { all, apply, call, fork, take } from 'redux-saga/effects'; import watchers from './watchers'; -import { initializeCoreService } from './services'; +import services from './services'; import { socket } from '../../api'; import { removeAccessToken } from '../../utils/access-token-storage'; import ActionTypes from '../../constants/ActionTypes'; @@ -11,7 +11,7 @@ export default function* coreSaga() { yield all(watchers.map((watcher) => fork(watcher))); yield apply(socket, socket.connect); - yield fork(initializeCoreService); + yield fork(services.initializeCore); yield take(ActionTypes.LOGOUT); diff --git a/client/src/sagas/core/request.js b/client/src/sagas/core/request.js index 7cc2e405..83184529 100755 --- a/client/src/sagas/core/request.js +++ b/client/src/sagas/core/request.js @@ -1,6 +1,6 @@ import { call, fork, join, put, take } from 'redux-saga/effects'; -import { logout } from '../../actions'; +import actions from '../../actions'; import ErrorCodes from '../../constants/ErrorCodes'; let lastRequestTask; @@ -16,7 +16,7 @@ function* queueRequest(method, ...args) { return yield call(method, ...args); } catch (error) { if (error.code === ErrorCodes.UNAUTHORIZED) { - yield put(logout()); // TODO: next url + yield put(actions.logout()); // TODO: next url yield take(); } diff --git a/client/src/sagas/core/requests/board.js b/client/src/sagas/core/requests/boards.js similarity index 84% rename from client/src/sagas/core/requests/board.js rename to client/src/sagas/core/requests/boards.js index d037390c..7b97377a 100644 --- a/client/src/sagas/core/requests/board.js +++ b/client/src/sagas/core/requests/boards.js @@ -1,13 +1,12 @@ import { call, select } from 'redux-saga/effects'; import request from '../request'; -import { pathsMatchSelector } from '../../../selectors'; +import selectors from '../../../selectors'; import api from '../../../api'; import Paths from '../../../constants/Paths'; -// eslint-disable-next-line import/prefer-default-export -export function* fetchBoardByCurrentPathRequest() { - const pathsMatch = yield select(pathsMatchSelector); +export function* fetchBoardByCurrentPath() { + const pathsMatch = yield select(selectors.selectPathsMatch); let board; let card; @@ -67,3 +66,7 @@ export function* fetchBoardByCurrentPathRequest() { project: projects[0], }; } + +export default { + fetchBoardByCurrentPath, +}; diff --git a/client/src/sagas/core/requests/core.js b/client/src/sagas/core/requests/core.js index 9f9bd8bc..10055b08 100644 --- a/client/src/sagas/core/requests/core.js +++ b/client/src/sagas/core/requests/core.js @@ -1,12 +1,11 @@ import { call } from 'redux-saga/effects'; -import { fetchBoardByCurrentPathRequest } from './board'; +import { fetchBoardByCurrentPath } from './boards'; import request from '../request'; import api from '../../../api'; import mergeRecords from '../../../utils/merge-records'; -// eslint-disable-next-line import/prefer-default-export -export function* fetchCoreRequest() { +export function* fetchCore() { const { item: user } = yield call(request, api.getCurrentUser); const { items: users1 } = yield call(request, api.getUsers); @@ -42,7 +41,7 @@ export function* fetchCoreRequest() { cardLabels, tasks, attachments, - } = yield call(fetchBoardByCurrentPathRequest)); + } = yield call(fetchBoardByCurrentPath)); } catch {} // eslint-disable-line no-empty const body = yield call(request, api.getNotifications); @@ -50,7 +49,7 @@ export function* fetchCoreRequest() { let { items: notifications } = body; const { - included: { users: users3, cards: cards2, actions }, + included: { users: users3, cards: cards2, activities }, } = body; if (card) { @@ -80,7 +79,7 @@ export function* fetchCoreRequest() { cardLabels, tasks, attachments, - actions, + activities, notifications, users: mergeRecords(users1, users2, users3), projects: mergeRecords(projects1, projects2), @@ -88,3 +87,7 @@ export function* fetchCoreRequest() { cards: mergeRecords(cards1, cards2), }; } + +export default { + fetchCore, +}; diff --git a/client/src/sagas/core/requests/index.js b/client/src/sagas/core/requests/index.js index 0d602d65..8b08aacd 100644 --- a/client/src/sagas/core/requests/index.js +++ b/client/src/sagas/core/requests/index.js @@ -1,2 +1,7 @@ -export * from './core'; -export * from './board'; +import core from './core'; +import boards from './boards'; + +export default { + ...core, + ...boards, +}; diff --git a/client/src/sagas/core/services/action.js b/client/src/sagas/core/services/action.js deleted file mode 100644 index c1cf343d..00000000 --- a/client/src/sagas/core/services/action.js +++ /dev/null @@ -1,15 +0,0 @@ -import { put } from 'redux-saga/effects'; - -import { handleActionCreate, handleActionDelete, handleActionUpdate } from '../../../actions'; - -export function* handleActionCreateService(action) { - yield put(handleActionCreate(action)); -} - -export function* handleActionUpdateService(action) { - yield put(handleActionUpdate(action)); -} - -export function* handleActionDeleteService(action) { - yield put(handleActionDelete(action)); -} diff --git a/client/src/sagas/core/services/actions.js b/client/src/sagas/core/services/actions.js deleted file mode 100644 index b81aae7b..00000000 --- a/client/src/sagas/core/services/actions.js +++ /dev/null @@ -1,66 +0,0 @@ -import { call, put, select } from 'redux-saga/effects'; - -import request from '../request'; -import { cardByIdSelector, lastActionIdByCardIdSelector, pathSelector } from '../../../selectors'; -import { fetchActions, toggleActionsDetails } from '../../../actions'; -import api from '../../../api'; - -export function* fetchActionsService(cardId) { - const { isActionsDetailsVisible } = yield select(cardByIdSelector, cardId); - const lastId = yield select(lastActionIdByCardIdSelector, cardId); - - yield put(fetchActions(cardId)); - - let actions; - let users; - - try { - ({ - items: actions, - included: { users }, - } = yield call(request, api.getActions, cardId, { - beforeId: lastId, - withDetails: isActionsDetailsVisible, - })); - } catch (error) { - yield put(fetchActions.failure(cardId, error)); - return; - } - - yield put(fetchActions.success(cardId, actions, users)); -} - -export function* fetchActionsInCurrentCardService() { - const { cardId } = yield select(pathSelector); - - yield call(fetchActionsService, cardId); -} - -export function* toggleActionsDetailsService(cardId, isVisible) { - yield put(toggleActionsDetails(cardId, isVisible)); - - if (isVisible) { - let actions; - let users; - - try { - ({ - items: actions, - included: { users }, - } = yield call(request, api.getActions, cardId, { - withDetails: isVisible, - })); - } catch (error) { - yield put(toggleActionsDetails.failure(cardId, error)); - return; - } - - yield put(toggleActionsDetails.success(cardId, actions, users)); - } -} - -export function* toggleActionsDetailsInCurrentCardService(isVisible) { - const { cardId } = yield select(pathSelector); - - yield call(toggleActionsDetailsService, cardId, isVisible); -} diff --git a/client/src/sagas/core/services/activities.js b/client/src/sagas/core/services/activities.js new file mode 100644 index 00000000..a4150279 --- /dev/null +++ b/client/src/sagas/core/services/activities.js @@ -0,0 +1,88 @@ +import { call, put, select } from 'redux-saga/effects'; + +import request from '../request'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; +import api from '../../../api'; + +export function* fetchActivities(cardId) { + const { isActivitiesDetailsVisible } = yield select(selectors.selectCardById, cardId); + const lastId = yield select(selectors.selectLastActivityIdByCardId, cardId); + + yield put(actions.fetchActivities(cardId)); + + let activities; + let users; + + try { + ({ + items: activities, + included: { users }, + } = yield call(request, api.getActivities, cardId, { + beforeId: lastId, + withDetails: isActivitiesDetailsVisible, + })); + } catch (error) { + yield put(actions.fetchActivities.failure(cardId, error)); + return; + } + + yield put(actions.fetchActivities.success(cardId, activities, users)); +} + +export function* fetchActivitiesInCurrentCard() { + const { cardId } = yield select(selectors.selectPath); + + yield call(fetchActivities, cardId); +} + +export function* toggleActivitiesDetails(cardId, isVisible) { + yield put(actions.toggleActivitiesDetails(cardId, isVisible)); + + if (isVisible) { + let activities; + let users; + + try { + ({ + items: activities, + included: { users }, + } = yield call(request, api.getActivities, cardId, { + withDetails: isVisible, + })); + } catch (error) { + yield put(actions.toggleActivitiesDetails.failure(cardId, error)); + return; + } + + yield put(actions.toggleActivitiesDetails.success(cardId, activities, users)); + } +} + +export function* toggleActivitiesDetailsInCurrentCard(isVisible) { + const { cardId } = yield select(selectors.selectPath); + + yield call(toggleActivitiesDetails, cardId, isVisible); +} + +export function* handleActivityCreate(activity) { + yield put(actions.handleActivityCreate(activity)); +} + +export function* handleActivityUpdate(activity) { + yield put(actions.handleActivityUpdate(activity)); +} + +export function* handleActivityDelete(activity) { + yield put(actions.handleActivityDelete(activity)); +} + +export default { + fetchActivities, + fetchActivitiesInCurrentCard, + toggleActivitiesDetails, + toggleActivitiesDetailsInCurrentCard, + handleActivityCreate, + handleActivityUpdate, + handleActivityDelete, +}; diff --git a/client/src/sagas/core/services/attachment.js b/client/src/sagas/core/services/attachment.js deleted file mode 100644 index 89b0801c..00000000 --- a/client/src/sagas/core/services/attachment.js +++ /dev/null @@ -1,86 +0,0 @@ -import { call, put, select } from 'redux-saga/effects'; - -import request from '../request'; -import { isAttachmentWithIdExistsSelector, pathSelector } from '../../../selectors'; -import { - createAttachment, - deleteAttachment, - handleAttachmentCreate, - handleAttachmentDelete, - handleAttachmentUpdate, - updateAttachment, -} from '../../../actions'; -import api from '../../../api'; -import { createLocalId } from '../../../utils/local-id'; - -export function* createAttachmentService(cardId, data) { - const localId = yield call(createLocalId); - - yield put( - createAttachment({ - cardId, - id: localId, - name: data.file.name, - }), - ); - - let attachment; - try { - ({ item: attachment } = yield call(request, api.createAttachment, cardId, data, localId)); - } catch (error) { - yield put(createAttachment.failure(localId, error)); - return; - } - - yield put(createAttachment.success(localId, attachment)); -} - -export function* createAttachmentInCurrentCardService(data) { - const { cardId } = yield select(pathSelector); - - yield call(createAttachmentService, cardId, data); -} - -export function* handleAttachmentCreateService(attachment, requestId) { - const isExists = yield select(isAttachmentWithIdExistsSelector, requestId); - - if (!isExists) { - yield put(handleAttachmentCreate(attachment)); - } -} - -export function* updateAttachmentService(id, data) { - yield put(updateAttachment(id, data)); - - let attachment; - try { - ({ item: attachment } = yield call(request, api.updateAttachment, id, data)); - } catch (error) { - yield put(updateAttachment.failure(id, error)); - return; - } - - yield put(updateAttachment.success(attachment)); -} - -export function* handleAttachmentUpdateService(attachment) { - yield put(handleAttachmentUpdate(attachment)); -} - -export function* deleteAttachmentService(id) { - yield put(deleteAttachment(id)); - - let attachment; - try { - ({ item: attachment } = yield call(request, api.deleteAttachment, id)); - } catch (error) { - yield put(deleteAttachment.failure(id, error)); - return; - } - - yield put(deleteAttachment.success(attachment)); -} - -export function* handleAttachmentDeleteService(attachment) { - yield put(handleAttachmentDelete(attachment)); -} diff --git a/client/src/sagas/core/services/attachments.js b/client/src/sagas/core/services/attachments.js new file mode 100644 index 00000000..6328b90d --- /dev/null +++ b/client/src/sagas/core/services/attachments.js @@ -0,0 +1,89 @@ +import { call, put, select } from 'redux-saga/effects'; + +import request from '../request'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; +import api from '../../../api'; +import { createLocalId } from '../../../utils/local-id'; + +export function* createAttachment(cardId, data) { + const localId = yield call(createLocalId); + + yield put( + actions.createAttachment({ + cardId, + id: localId, + name: data.file.name, + }), + ); + + let attachment; + try { + ({ item: attachment } = yield call(request, api.createAttachment, cardId, data, localId)); + } catch (error) { + yield put(actions.createAttachment.failure(localId, error)); + return; + } + + yield put(actions.createAttachment.success(localId, attachment)); +} + +export function* createAttachmentInCurrentCard(data) { + const { cardId } = yield select(selectors.selectPath); + + yield call(createAttachment, cardId, data); +} + +export function* handleAttachmentCreate(attachment, requestId) { + const isExists = yield select(selectors.selectIsAttachmentWithIdExists, requestId); + + if (!isExists) { + yield put(actions.handleAttachmentCreate(attachment)); + } +} + +export function* updateAttachment(id, data) { + yield put(actions.updateAttachment(id, data)); + + let attachment; + try { + ({ item: attachment } = yield call(request, api.updateAttachment, id, data)); + } catch (error) { + yield put(actions.updateAttachment.failure(id, error)); + return; + } + + yield put(actions.updateAttachment.success(attachment)); +} + +export function* handleAttachmentUpdate(attachment) { + yield put(actions.handleAttachmentUpdate(attachment)); +} + +export function* deleteAttachment(id) { + yield put(actions.deleteAttachment(id)); + + let attachment; + try { + ({ item: attachment } = yield call(request, api.deleteAttachment, id)); + } catch (error) { + yield put(actions.deleteAttachment.failure(id, error)); + return; + } + + yield put(actions.deleteAttachment.success(attachment)); +} + +export function* handleAttachmentDelete(attachment) { + yield put(actions.handleAttachmentDelete(attachment)); +} + +export default { + createAttachment, + createAttachmentInCurrentCard, + handleAttachmentCreate, + updateAttachment, + handleAttachmentUpdate, + deleteAttachment, + handleAttachmentDelete, +}; diff --git a/client/src/sagas/core/services/board-membership.js b/client/src/sagas/core/services/board-memberships.js similarity index 55% rename from client/src/sagas/core/services/board-membership.js rename to client/src/sagas/core/services/board-memberships.js index 617b7962..b54dd28c 100644 --- a/client/src/sagas/core/services/board-membership.js +++ b/client/src/sagas/core/services/board-memberships.js @@ -1,30 +1,19 @@ import { call, put, select } from 'redux-saga/effects'; -import { goToProjectService } from './router'; +import { goToProject } from './router'; import request from '../request'; -import { fetchBoardByCurrentPathRequest } from '../requests'; -import { - boardMembershipByIdSelector, - currentUserIdSelector, - isCurrentUserManagerForCurrentProjectSelector, - notificationsByCardIdSelector, - pathSelector, -} from '../../../selectors'; -import { - createBoardMembership, - deleteBoardMembership, - handleBoardMembershipCreate, - handleBoardMembershipDelete, -} from '../../../actions'; +import requests from '../requests'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; import api from '../../../api'; import { createLocalId } from '../../../utils/local-id'; import mergeRecords from '../../../utils/merge-records'; -export function* createBoardMembershipService(boardId, data) { +export function* createBoardMembership(boardId, data) { const localId = yield call(createLocalId); yield put( - createBoardMembership({ + actions.createBoardMembership({ ...data, boardId, id: localId, @@ -35,21 +24,21 @@ export function* createBoardMembershipService(boardId, data) { try { ({ item: boardMembership } = yield call(request, api.createBoardMembership, boardId, data)); } catch (error) { - yield put(createBoardMembership.failure(localId, error)); + yield put(actions.createBoardMembership.failure(localId, error)); return; } - yield put(createBoardMembership.success(localId, boardMembership)); + yield put(actions.createBoardMembership.success(localId, boardMembership)); } -export function* createMembershipInCurrentBoardService(data) { - const { boardId } = yield select(pathSelector); +export function* createMembershipInCurrentBoard(data) { + const { boardId } = yield select(selectors.selectPath); - yield call(createBoardMembershipService, boardId, data); + yield call(createBoardMembership, boardId, data); } -export function* handleBoardMembershipCreateService(boardMembership) { - const currentUserId = yield select(currentUserIdSelector); +export function* handleBoardMembershipCreate(boardMembership) { + const currentUserId = yield select(selectors.selectCurrentUserId); const isCurrentUser = boardMembership.userId === currentUserId; let user; @@ -68,7 +57,7 @@ export function* handleBoardMembershipCreateService(boardMembership) { let cardLabels; let tasks; let attachments; - let notifications; + let deletedNotifications; if (isCurrentUser) { let board2; @@ -78,9 +67,11 @@ export function* handleBoardMembershipCreateService(boardMembership) { return; } - const { boardId } = yield select(pathSelector); + const { boardId } = yield select(selectors.selectPath); - yield put(handleBoardMembershipCreate.fetchProject(board2.projectId, currentUserId, boardId)); + yield put( + actions.handleBoardMembershipCreate.fetchProject(board2.projectId, currentUserId, boardId), + ); try { ({ @@ -93,7 +84,7 @@ export function* handleBoardMembershipCreateService(boardMembership) { let body; try { - body = yield call(fetchBoardByCurrentPathRequest); + body = yield call(requests.fetchBoardByCurrentPathRequest); } catch {} // eslint-disable-line no-empty if (body && body.project && body.project.id === board2.projectId) { @@ -112,7 +103,7 @@ export function* handleBoardMembershipCreateService(boardMembership) { } = body); if (body.card) { - notifications = yield select(notificationsByCardIdSelector, body.card.id); + deletedNotifications = yield select(selectors.selectNotificationsByCardId, body.card.id); } } } else { @@ -124,7 +115,7 @@ export function* handleBoardMembershipCreateService(boardMembership) { } yield put( - handleBoardMembershipCreate( + actions.handleBoardMembershipCreate( boardMembership, project, board1, @@ -139,48 +130,60 @@ export function* handleBoardMembershipCreateService(boardMembership) { cardLabels, tasks, attachments, - notifications, + deletedNotifications, ), ); } -export function* deleteBoardMembershipService(id) { - let boardMembership = yield select(boardMembershipByIdSelector, id); +export function* deleteBoardMembership(id) { + let boardMembership = yield select(selectors.selectBoardMembershipById, id); - const currentUserId = yield select(currentUserIdSelector); - const { boardId, projectId } = yield select(pathSelector); + const currentUserId = yield select(selectors.selectCurrentUserId); + const { boardId, projectId } = yield select(selectors.selectPath); if (boardMembership.userId === currentUserId && boardMembership.boardId === boardId) { - const isCurrentUserManager = yield select(isCurrentUserManagerForCurrentProjectSelector); + const isCurrentUserManager = yield select( + selectors.selectIsCurrentUserManagerForCurrentProject, + ); if (!isCurrentUserManager) { - yield call(goToProjectService, projectId); + yield call(goToProject, projectId); } } - yield put(deleteBoardMembership(id)); + yield put(actions.deleteBoardMembership(id)); try { ({ item: boardMembership } = yield call(request, api.deleteBoardMembership, id)); } catch (error) { - yield put(deleteBoardMembership.failure(id, error)); + yield put(actions.deleteBoardMembership.failure(id, error)); return; } - yield put(deleteBoardMembership.success(boardMembership)); + yield put(actions.deleteBoardMembership.success(boardMembership)); } -export function* handleBoardMembershipDeleteService(boardMembership) { - const currentUserId = yield select(currentUserIdSelector); - const { boardId, projectId } = yield select(pathSelector); +export function* handleBoardMembershipDelete(boardMembership) { + const currentUserId = yield select(selectors.selectCurrentUserId); + const { boardId, projectId } = yield select(selectors.selectPath); if (boardMembership.userId === currentUserId && boardMembership.boardId === boardId) { - const isCurrentUserManager = yield select(isCurrentUserManagerForCurrentProjectSelector); + const isCurrentUserManager = yield select( + selectors.selectIsCurrentUserManagerForCurrentProject, + ); if (!isCurrentUserManager) { - yield call(goToProjectService, projectId); + yield call(goToProject, projectId); } } - yield put(handleBoardMembershipDelete(boardMembership)); + yield put(actions.handleBoardMembershipDelete(boardMembership)); } + +export default { + createBoardMembership, + createMembershipInCurrentBoard, + handleBoardMembershipCreate, + deleteBoardMembership, + handleBoardMembershipDelete, +}; diff --git a/client/src/sagas/core/services/board.js b/client/src/sagas/core/services/board.js deleted file mode 100644 index 732d10cc..00000000 --- a/client/src/sagas/core/services/board.js +++ /dev/null @@ -1,169 +0,0 @@ -import { call, put, select } from 'redux-saga/effects'; - -import { goToBoardService, goToProjectService } from './router'; -import request from '../request'; -import { boardByIdSelector, nextBoardPositionSelector, pathSelector } from '../../../selectors'; -import { - createBoard, - deleteBoard, - fetchBoard, - handleBoardCreate, - handleBoardDelete, - handleBoardUpdate, - updateBoard, -} from '../../../actions'; -import api from '../../../api'; -import { createLocalId } from '../../../utils/local-id'; - -export function* createBoardService(projectId, data) { - const nextData = { - ...data, - position: yield select(nextBoardPositionSelector, projectId), - }; - - const localId = yield call(createLocalId); - - yield put( - createBoard({ - ...nextData, - projectId, - id: localId, - }), - ); - - let board; - let boardMemberships; - - try { - ({ - item: board, - included: { boardMemberships }, - } = yield call(request, api.createBoard, projectId, nextData)); - } catch (error) { - yield put(createBoard.failure(localId, error)); - return; - } - - yield put(createBoard.success(localId, board, boardMemberships)); - yield call(goToBoardService, board.id); -} - -export function* createBoardInCurrentProjectService(data) { - const { projectId } = yield select(pathSelector); - - yield call(createBoardService, projectId, data); -} - -export function* handleBoardCreateService(board) { - yield put(handleBoardCreate(board)); -} - -export function* fetchBoardService(id) { - yield put(fetchBoard(id)); - - let board; - let users; - let projects; - let boardMemberships; - let labels; - let lists; - let cards; - let cardMemberships; - let cardLabels; - let tasks; - let attachments; - - try { - ({ - item: board, - included: { - users, - projects, - boardMemberships, - labels, - lists, - cards, - cardMemberships, - cardLabels, - tasks, - attachments, - }, - } = yield call(request, api.getBoard, id)); - } catch (error) { - yield put(fetchBoard.failure(id, error)); - return; - } - - yield put( - fetchBoard.success( - board, - users, - projects, - boardMemberships, - labels, - lists, - cards, - cardMemberships, - cardLabels, - tasks, - attachments, - ), - ); -} - -export function* updateBoardService(id, data) { - yield put(updateBoard(id, data)); - - let board; - try { - ({ item: board } = yield call(request, api.updateBoard, id, data)); - } catch (error) { - yield put(updateBoard.failure(id, error)); - return; - } - - yield put(updateBoard.success(board)); -} - -export function* handleBoardUpdateService(board) { - yield put(handleBoardUpdate(board)); -} - -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)); - - let board; - try { - ({ item: board } = yield call(request, api.deleteBoard, id)); - } catch (error) { - yield put(deleteBoard.failure(id, error)); - return; - } - - yield put(deleteBoard.success(board)); -} - -export function* handleBoardDeleteService(board) { - const { boardId, projectId } = yield select(pathSelector); - - if (board.id === boardId) { - yield call(goToProjectService, projectId); - } - - yield put(handleBoardDelete(board)); -} diff --git a/client/src/sagas/core/services/boards.js b/client/src/sagas/core/services/boards.js new file mode 100644 index 00000000..cc138810 --- /dev/null +++ b/client/src/sagas/core/services/boards.js @@ -0,0 +1,173 @@ +import { call, put, select } from 'redux-saga/effects'; + +import { goToBoard, goToProject } 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* createBoard(projectId, data) { + const nextData = { + ...data, + position: yield select(selectors.selectNextBoardPosition, projectId), + }; + + const localId = yield call(createLocalId); + + yield put( + actions.createBoard({ + ...nextData, + projectId, + id: localId, + }), + ); + + let board; + let boardMemberships; + + try { + ({ + item: board, + included: { boardMemberships }, + } = yield call(request, api.createBoard, projectId, nextData)); + } catch (error) { + yield put(actions.createBoard.failure(localId, error)); + return; + } + + yield put(actions.createBoard.success(localId, board, boardMemberships)); + yield call(goToBoard, board.id); +} + +export function* createBoardInCurrentProject(data) { + const { projectId } = yield select(selectors.selectPath); + + yield call(createBoard, projectId, data); +} + +export function* handleBoardCreate(board) { + yield put(actions.handleBoardCreate(board)); +} + +export function* fetchBoard(id) { + yield put(actions.fetchBoard(id)); + + let board; + let users; + let projects; + let boardMemberships; + let labels; + let lists; + let cards; + let cardMemberships; + let cardLabels; + let tasks; + let attachments; + + try { + ({ + item: board, + included: { + users, + projects, + boardMemberships, + labels, + lists, + cards, + cardMemberships, + cardLabels, + tasks, + attachments, + }, + } = yield call(request, api.getBoard, id)); + } catch (error) { + yield put(actions.fetchBoard.failure(id, error)); + return; + } + + yield put( + actions.fetchBoard.success( + board, + users, + projects, + boardMemberships, + labels, + lists, + cards, + cardMemberships, + cardLabels, + tasks, + attachments, + ), + ); +} + +export function* updateBoard(id, data) { + yield put(actions.updateBoard(id, data)); + + let board; + try { + ({ item: board } = yield call(request, api.updateBoard, id, data)); + } catch (error) { + yield put(actions.updateBoard.failure(id, error)); + return; + } + + yield put(actions.updateBoard.success(board)); +} + +export function* handleBoardUpdate(board) { + yield put(actions.handleBoardUpdate(board)); +} + +export function* moveBoard(id, index) { + const { projectId } = yield select(selectors.selectBoardById, id); + const position = yield select(selectors.selectNextBoardPosition, projectId, index, id); + + yield call(updateBoard, id, { + position, + }); +} + +export function* deleteBoard(id) { + const { boardId, projectId } = yield select(selectors.selectPath); + + if (id === boardId) { + yield call(goToProject, projectId); + } + + yield put(actions.deleteBoard(id)); + + let board; + try { + ({ item: board } = yield call(request, api.deleteBoard, id)); + } catch (error) { + yield put(actions.deleteBoard.failure(id, error)); + return; + } + + yield put(actions.deleteBoard.success(board)); +} + +export function* handleBoardDelete(board) { + const { boardId, projectId } = yield select(selectors.selectPath); + + if (board.id === boardId) { + yield call(goToProject, projectId); + } + + yield put(actions.handleBoardDelete(board)); +} + +export default { + createBoard, + createBoardInCurrentProject, + handleBoardCreate, + fetchBoard, + updateBoard, + handleBoardUpdate, + moveBoard, + deleteBoard, + handleBoardDelete, +}; diff --git a/client/src/sagas/core/services/card.js b/client/src/sagas/core/services/card.js deleted file mode 100644 index 818e495a..00000000 --- a/client/src/sagas/core/services/card.js +++ /dev/null @@ -1,145 +0,0 @@ -import { call, put, select } from 'redux-saga/effects'; - -import { goToBoardService } from './router'; -import request from '../request'; -import { listByIdSelector, nextCardPositionSelector, pathSelector } from '../../../selectors'; -import { - createCard, - deleteCard, - handleCardCreate, - handleCardDelete, - handleCardUpdate, - updateCard, -} from '../../../actions'; -import api from '../../../api'; -import { createLocalId } from '../../../utils/local-id'; - -export function* createCardService(listId, data) { - const { boardId } = yield select(listByIdSelector, listId); - - const nextData = { - ...data, - listId, - position: yield select(nextCardPositionSelector, listId), - }; - - const localId = yield call(createLocalId); - - yield put( - createCard({ - ...nextData, - boardId, - id: localId, - }), - ); - - let card; - try { - ({ item: card } = yield call(request, api.createCard, boardId, nextData)); - } catch (error) { - yield put(createCard.failure(localId, error)); - return; - } - - yield put(createCard.success(localId, card)); -} - -export function* handleCardCreateService(card) { - yield put(handleCardCreate(card)); -} - -export function* updateCardService(id, data) { - yield put(updateCard(id, data)); - - let card; - try { - ({ item: card } = yield call(request, api.updateCard, id, data)); - } catch (error) { - yield put(updateCard.failure(id, error)); - return; - } - - yield put(updateCard.success(card)); -} - -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* moveCurrentCardService(listId, index) { - const { cardId } = yield select(pathSelector); - - yield call(moveCardService, cardId, listId, index); -} - -export function* transferCardService(id, boardId, listId, index) { - const { cardId: currentCardId, boardId: currentBoardId } = yield select(pathSelector); - const position = yield select(nextCardPositionSelector, listId, index, id); - - if (id === currentCardId) { - yield call(goToBoardService, currentBoardId); - } - - yield call(updateCardService, id, { - boardId, - listId, - position, - }); -} - -export function* transferCurrentCardService(boardId, listId, index) { - const { cardId } = yield select(pathSelector); - - yield call(transferCardService, cardId, boardId, listId, index); -} - -export function* handleCardUpdateService(card) { - yield put(handleCardUpdate(card)); // TODO: handle card transfer -} - -export function* deleteCardService(id) { - const { cardId, boardId } = yield select(pathSelector); - - if (id === cardId) { - yield call(goToBoardService, boardId); - } - - yield put(deleteCard(id)); - - let card; - try { - ({ item: card } = yield call(request, api.deleteCard, id)); - } catch (error) { - yield put(deleteCard.failure(id, error)); - return; - } - - yield put(deleteCard.success(card)); -} - -export function* deleteCurrentCardService() { - const { cardId } = yield select(pathSelector); - - yield call(deleteCardService, cardId); -} - -export function* handleCardDeleteService(card) { - const { cardId, boardId } = yield select(pathSelector); - - if (card.id === cardId) { - yield call(goToBoardService, boardId); - } - - yield put(handleCardDelete(card)); -} diff --git a/client/src/sagas/core/services/cards.js b/client/src/sagas/core/services/cards.js new file mode 100644 index 00000000..9af22a6f --- /dev/null +++ b/client/src/sagas/core/services/cards.js @@ -0,0 +1,153 @@ +import { call, put, select } from 'redux-saga/effects'; + +import { goToBoard } 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) { + const { boardId } = yield select(selectors.selectListById, listId); + + const nextData = { + ...data, + listId, + position: yield select(selectors.selectNextCardPosition, listId), + }; + + const localId = yield call(createLocalId); + + yield put( + actions.createCard({ + ...nextData, + boardId, + id: localId, + }), + ); + + let card; + try { + ({ item: card } = yield call(request, api.createCard, boardId, nextData)); + } catch (error) { + yield put(actions.createCard.failure(localId, error)); + return; + } + + yield put(actions.createCard.success(localId, card)); +} + +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); +} + +export function* handleCardUpdate(card) { + yield put(actions.handleCardUpdate(card)); // TODO: handle card transfer +} + +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, +}; diff --git a/client/src/sagas/core/services/comment-action.js b/client/src/sagas/core/services/comment-action.js deleted file mode 100644 index 88163dae..00000000 --- a/client/src/sagas/core/services/comment-action.js +++ /dev/null @@ -1,67 +0,0 @@ -import { call, put, select } from 'redux-saga/effects'; - -import request from '../request'; -import { currentUserIdSelector, pathSelector } from '../../../selectors'; -import { createCommentAction, deleteCommentAction, updateCommentAction } from '../../../actions'; -import api from '../../../api'; -import { createLocalId } from '../../../utils/local-id'; -import { ActionTypes } from '../../../constants/Enums'; - -export function* createCommentActionService(cardId, data) { - const localId = yield call(createLocalId); - const userId = yield select(currentUserIdSelector); - - yield put( - createCommentAction({ - cardId, - userId, - data, - id: localId, - type: ActionTypes.COMMENT_CARD, - }), - ); - - let action; - try { - ({ item: action } = yield call(request, api.createCommentAction, cardId, data)); - } catch (error) { - yield put(createCommentAction.failure(localId, error)); - return; - } - - yield put(createCommentAction.success(localId, action)); -} - -export function* createCommentActionInCurrentCardService(data) { - const { cardId } = yield select(pathSelector); - - yield call(createCommentActionService, cardId, data); -} - -export function* updateCommentActionService(id, data) { - yield put(updateCommentAction(id, data)); - - let action; - try { - ({ item: action } = yield call(request, api.updateCommentAction, id, data)); - } catch (error) { - yield put(updateCommentAction.failure(id, error)); - return; - } - - yield put(updateCommentAction.success(action)); -} - -export function* deleteCommentActionService(id) { - yield put(deleteCommentAction(id)); - - let action; - try { - ({ item: action } = yield call(request, api.deleteCommentAction, id)); - } catch (error) { - yield put(deleteCommentAction.failure(id, error)); - return; - } - - yield put(deleteCommentAction.success(action)); -} diff --git a/client/src/sagas/core/services/comment-activities.js b/client/src/sagas/core/services/comment-activities.js new file mode 100644 index 00000000..51fe480e --- /dev/null +++ b/client/src/sagas/core/services/comment-activities.js @@ -0,0 +1,74 @@ +import { call, put, select } from 'redux-saga/effects'; + +import request from '../request'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; +import api from '../../../api'; +import { createLocalId } from '../../../utils/local-id'; +import { ActivityTypes } from '../../../constants/Enums'; + +export function* createCommentActivity(cardId, data) { + const localId = yield call(createLocalId); + const userId = yield select(selectors.selectCurrentUserId); + + yield put( + actions.createCommentActivity({ + cardId, + userId, + data, + id: localId, + type: ActivityTypes.COMMENT_CARD, + }), + ); + + let activity; + try { + ({ item: activity } = yield call(request, api.createCommentActivity, cardId, data)); + } catch (error) { + yield put(actions.createCommentActivity.failure(localId, error)); + return; + } + + yield put(actions.createCommentActivity.success(localId, activity)); +} + +export function* createCommentActivityInCurrentCard(data) { + const { cardId } = yield select(selectors.selectPath); + + yield call(createCommentActivity, cardId, data); +} + +export function* updateCommentActivity(id, data) { + yield put(actions.updateCommentActivity(id, data)); + + let activity; + try { + ({ item: activity } = yield call(request, api.updateCommentActivity, id, data)); + } catch (error) { + yield put(actions.updateCommentActivity.failure(id, error)); + return; + } + + yield put(actions.updateCommentActivity.success(activity)); +} + +export function* deleteCommentActivity(id) { + yield put(actions.deleteCommentActivity(id)); + + let activity; + try { + ({ item: activity } = yield call(request, api.deleteCommentActivity, id)); + } catch (error) { + yield put(actions.deleteCommentActivity.failure(id, error)); + return; + } + + yield put(actions.deleteCommentActivity.success(activity)); +} + +export default { + createCommentActivity, + createCommentActivityInCurrentCard, + updateCommentActivity, + deleteCommentActivity, +}; diff --git a/client/src/sagas/core/services/core.js b/client/src/sagas/core/services/core.js index ec3a496b..5420e415 100644 --- a/client/src/sagas/core/services/core.js +++ b/client/src/sagas/core/services/core.js @@ -1,10 +1,10 @@ -import { call, put } from 'redux-saga/effects'; +import { call, put, take } from 'redux-saga/effects'; -import { fetchCoreRequest } from '../requests'; -import { initializeCore } from '../../../actions'; +import requests from '../requests'; +import actions from '../../../actions'; import i18n from '../../../i18n'; -export function* initializeCoreService() { +export function* initializeCore() { const { user, board, @@ -20,15 +20,15 @@ export function* initializeCoreService() { cardLabels, tasks, attachments, - actions, + activities, notifications, - } = yield call(fetchCoreRequest); // TODO: handle error + } = yield call(requests.fetchCore); // TODO: handle error yield call(i18n.changeLanguage, user.language); yield call(i18n.loadCoreLocale); yield put( - initializeCore( + actions.initializeCore( user, board, users, @@ -43,13 +43,13 @@ export function* initializeCoreService() { cardLabels, tasks, attachments, - actions, + activities, notifications, ), ); } -export function* changeCoreLanguageService(language) { +export function* changeCoreLanguage(language) { if (language === null) { yield call(i18n.detectLanguage); yield call(i18n.loadCoreLocale); @@ -59,3 +59,14 @@ export function* changeCoreLanguageService(language) { yield call(i18n.changeLanguage, language); } } + +export function* logout() { + yield put(actions.logout()); + yield take(); +} + +export default { + initializeCore, + changeCoreLanguage, + logout, +}; diff --git a/client/src/sagas/core/services/index.js b/client/src/sagas/core/services/index.js index 161add47..55d1175b 100644 --- a/client/src/sagas/core/services/index.js +++ b/client/src/sagas/core/services/index.js @@ -1,19 +1,37 @@ -export * from './router'; -export * from './socket'; -export * from './login'; -export * from './core'; -export * from './modal'; -export * from './user'; -export * from './project'; -export * from './project-manager'; -export * from './board'; -export * from './board-membership'; -export * from './label'; -export * from './list'; -export * from './card'; -export * from './task'; -export * from './attachment'; -export * from './actions'; -export * from './action'; -export * from './comment-action'; -export * from './notification'; +import router from './router'; +import socket from './socket'; +import core from './core'; +import modals from './modals'; +import users from './users'; +import projects from './projects'; +import projectManagers from './project-managers'; +import boards from './boards'; +import boardMemberships from './board-memberships'; +import labels from './labels'; +import lists from './lists'; +import cards from './cards'; +import tasks from './tasks'; +import attachments from './attachments'; +import activities from './activities'; +import commentActivities from './comment-activities'; +import notifications from './notifications'; + +export default { + ...router, + ...socket, + ...core, + ...modals, + ...users, + ...projects, + ...projectManagers, + ...boards, + ...boardMemberships, + ...labels, + ...lists, + ...cards, + ...tasks, + ...attachments, + ...activities, + ...commentActivities, + ...notifications, +}; diff --git a/client/src/sagas/core/services/label.js b/client/src/sagas/core/services/label.js deleted file mode 100644 index aa169453..00000000 --- a/client/src/sagas/core/services/label.js +++ /dev/null @@ -1,158 +0,0 @@ -import { call, put, select } from 'redux-saga/effects'; - -import request from '../request'; -import { pathSelector } from '../../../selectors'; -import { - addLabelToBoardFilter, - addLabelToCard, - createLabel, - deleteLabel, - handleLabelCreate, - handleLabelDelete, - handleLabelFromCardRemove, - handleLabelToCardAdd, - handleLabelUpdate, - removeLabelFromBoardFilter, - removeLabelFromCard, - updateLabel, -} from '../../../actions'; -import api from '../../../api'; -import { createLocalId } from '../../../utils/local-id'; - -export function* createLabelService(boardId, data) { - const localId = yield call(createLocalId); - - yield put( - createLabel({ - ...data, - boardId, - id: localId, - }), - ); - - let label; - try { - ({ item: label } = yield call(request, api.createLabel, boardId, data)); - } catch (error) { - yield put(createLabel.failure(localId, error)); - return; - } - - yield put(createLabel.success(localId, label)); -} - -export function* createLabelInCurrentBoardService(data) { - const { boardId } = yield select(pathSelector); - - yield call(createLabelService, boardId, data); -} - -export function* handleLabelCreateService(label) { - yield put(handleLabelCreate(label)); -} - -export function* updateLabelService(id, data) { - yield put(updateLabel(id, data)); - - let label; - try { - ({ item: label } = yield call(request, api.updateLabel, id, data)); - } catch (error) { - yield put(updateLabel.failure(id, error)); - return; - } - - yield put(updateLabel.success(label)); -} - -export function* handleLabelUpdateService(label) { - yield put(handleLabelUpdate(label)); -} - -export function* deleteLabelService(id) { - yield put(deleteLabel(id)); - - let label; - try { - ({ item: label } = yield call(request, api.deleteLabel, id)); - } catch (error) { - yield put(deleteLabel.failure(id, error)); - return; - } - - yield put(deleteLabel.success(label)); -} - -export function* handleLabelDeleteService(label) { - yield put(handleLabelDelete(label)); -} - -export function* addLabelToCardService(id, cardId) { - yield put(addLabelToCard(id, cardId)); - - let cardLabel; - try { - ({ item: cardLabel } = yield call(request, api.createCardLabel, cardId, { - labelId: id, - })); - } catch (error) { - yield put(addLabelToCard.failure(id, cardId, error)); - return; - } - - yield put(addLabelToCard.success(cardLabel)); -} - -export function* addLabelToCurrentCardService(id) { - const { cardId } = yield select(pathSelector); - - yield call(addLabelToCardService, id, cardId); -} - -export function* handleLabelToCardAddService(cardLabel) { - yield put(handleLabelToCardAdd(cardLabel)); -} - -export function* removeLabelFromCardService(id, cardId) { - yield put(removeLabelFromCard(id, cardId)); - - let cardLabel; - try { - ({ item: cardLabel } = yield call(request, api.deleteCardLabel, cardId, id)); - } catch (error) { - yield put(removeLabelFromCard.failure(id, cardId, error)); - return; - } - - yield put(removeLabelFromCard.success(cardLabel)); -} - -export function* removeLabelFromCurrentCardService(id) { - const { cardId } = yield select(pathSelector); - - yield call(removeLabelFromCardService, id, cardId); -} - -export function* handleLabelFromCardRemoveService(cardLabel) { - yield put(handleLabelFromCardRemove(cardLabel)); -} - -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); -} diff --git a/client/src/sagas/core/services/labels.js b/client/src/sagas/core/services/labels.js new file mode 100644 index 00000000..94323934 --- /dev/null +++ b/client/src/sagas/core/services/labels.js @@ -0,0 +1,165 @@ +import { call, put, select } from 'redux-saga/effects'; + +import request from '../request'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; +import api from '../../../api'; +import { createLocalId } from '../../../utils/local-id'; + +export function* createLabel(boardId, data) { + const localId = yield call(createLocalId); + + yield put( + actions.createLabel({ + ...data, + boardId, + id: localId, + }), + ); + + let label; + try { + ({ item: label } = yield call(request, api.createLabel, boardId, data)); + } catch (error) { + yield put(actions.createLabel.failure(localId, error)); + return; + } + + yield put(actions.createLabel.success(localId, label)); +} + +export function* createLabelInCurrentBoard(data) { + const { boardId } = yield select(selectors.selectPath); + + yield call(createLabel, boardId, data); +} + +export function* handleLabelCreate(label) { + yield put(actions.handleLabelCreate(label)); +} + +export function* updateLabel(id, data) { + yield put(actions.updateLabel(id, data)); + + let label; + try { + ({ item: label } = yield call(request, api.updateLabel, id, data)); + } catch (error) { + yield put(actions.updateLabel.failure(id, error)); + return; + } + + yield put(actions.updateLabel.success(label)); +} + +export function* handleLabelUpdate(label) { + yield put(actions.handleLabelUpdate(label)); +} + +export function* deleteLabel(id) { + yield put(actions.deleteLabel(id)); + + let label; + try { + ({ item: label } = yield call(request, api.deleteLabel, id)); + } catch (error) { + yield put(actions.deleteLabel.failure(id, error)); + return; + } + + yield put(actions.deleteLabel.success(label)); +} + +export function* handleLabelDelete(label) { + yield put(actions.handleLabelDelete(label)); +} + +export function* addLabelToCard(id, cardId) { + yield put(actions.addLabelToCard(id, cardId)); + + let cardLabel; + try { + ({ item: cardLabel } = yield call(request, api.createCardLabel, cardId, { + labelId: id, + })); + } catch (error) { + yield put(actions.addLabelToCard.failure(id, cardId, error)); + return; + } + + yield put(actions.addLabelToCard.success(cardLabel)); +} + +export function* addLabelToCurrentCard(id) { + const { cardId } = yield select(selectors.selectPath); + + yield call(addLabelToCard, id, cardId); +} + +export function* handleLabelToCardAdd(cardLabel) { + yield put(actions.handleLabelToCardAdd(cardLabel)); +} + +export function* removeLabelFromCard(id, cardId) { + yield put(actions.removeLabelFromCard(id, cardId)); + + let cardLabel; + try { + ({ item: cardLabel } = yield call(request, api.deleteCardLabel, cardId, id)); + } catch (error) { + yield put(actions.removeLabelFromCard.failure(id, cardId, error)); + return; + } + + yield put(actions.removeLabelFromCard.success(cardLabel)); +} + +export function* removeLabelFromCurrentCard(id) { + const { cardId } = yield select(selectors.selectPath); + + yield call(removeLabelFromCard, id, cardId); +} + +export function* handleLabelFromCardRemove(cardLabel) { + yield put(actions.handleLabelFromCardRemove(cardLabel)); +} + +export function* addLabelToBoardFilter(id, boardId) { + yield put(actions.addLabelToBoardFilter(id, boardId)); +} + +export function* addLabelToFilterInCurrentBoard(id) { + const { boardId } = yield select(selectors.selectPath); + + yield call(addLabelToBoardFilter, id, boardId); +} + +export function* removeLabelFromBoardFilter(id, boardId) { + yield put(actions.removeLabelFromBoardFilter(id, boardId)); +} + +export function* removeLabelFromFilterInCurrentBoard(id) { + const { boardId } = yield select(selectors.selectPath); + + yield call(removeLabelFromBoardFilter, id, boardId); +} + +export default { + createLabel, + createLabelInCurrentBoard, + handleLabelCreate, + updateLabel, + handleLabelUpdate, + deleteLabel, + handleLabelDelete, + addLabelToCard, + addLabelToCurrentCard, + handleLabelToCardAdd, + removeLabelFromCard, + removeLabelFromCurrentCard, + handleLabelFromCardRemove, + addLabelToBoardFilter, + addLabelToFilterInCurrentBoard, + removeLabelFromBoardFilter, + removeLabelFromFilterInCurrentBoard, +}; diff --git a/client/src/sagas/core/services/list.js b/client/src/sagas/core/services/list.js deleted file mode 100644 index 6238927f..00000000 --- a/client/src/sagas/core/services/list.js +++ /dev/null @@ -1,96 +0,0 @@ -import { call, put, select } from 'redux-saga/effects'; - -import request from '../request'; -import { listByIdSelector, nextListPositionSelector, pathSelector } from '../../../selectors'; -import { - createList, - deleteList, - handleListCreate, - handleListDelete, - handleListUpdate, - updateList, -} from '../../../actions'; -import api from '../../../api'; -import { createLocalId } from '../../../utils/local-id'; - -export function* createListService(boardId, data) { - const nextData = { - ...data, - position: yield select(nextListPositionSelector, boardId), - }; - - const localId = yield call(createLocalId); - - yield put( - createList({ - ...nextData, - boardId, - id: localId, - }), - ); - - let list; - try { - ({ item: list } = yield call(request, api.createList, boardId, nextData)); - } catch (error) { - yield put(createList.failure(localId, error)); - return; - } - - yield put(createList.success(localId, list)); -} - -export function* createListInCurrentBoardService(data) { - const { boardId } = yield select(pathSelector); - - yield call(createListService, boardId, data); -} - -export function* handleListCreateService(label) { - yield put(handleListCreate(label)); -} - -export function* updateListService(id, data) { - yield put(updateList(id, data)); - - let list; - try { - ({ item: list } = yield call(request, api.updateList, id, data)); - } catch (error) { - yield put(updateList.failure(id, error)); - return; - } - - yield put(updateList.success(list)); -} - -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* handleListUpdateService(label) { - yield put(handleListUpdate(label)); -} - -export function* deleteListService(id) { - yield put(deleteList(id)); - - let list; - try { - ({ item: list } = yield call(request, api.deleteList, id)); - } catch (error) { - yield put(deleteList.failure(id, error)); - return; - } - - yield put(deleteList.success(list)); -} - -export function* handleListDeleteService(label) { - yield put(handleListDelete(label)); -} diff --git a/client/src/sagas/core/services/lists.js b/client/src/sagas/core/services/lists.js new file mode 100644 index 00000000..670bc9a5 --- /dev/null +++ b/client/src/sagas/core/services/lists.js @@ -0,0 +1,100 @@ +import { call, put, select } from 'redux-saga/effects'; + +import request from '../request'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; +import api from '../../../api'; +import { createLocalId } from '../../../utils/local-id'; + +export function* createList(boardId, data) { + const nextData = { + ...data, + position: yield select(selectors.selectNextListPosition, boardId), + }; + + const localId = yield call(createLocalId); + + yield put( + actions.createList({ + ...nextData, + boardId, + id: localId, + }), + ); + + let list; + try { + ({ item: list } = yield call(request, api.createList, boardId, nextData)); + } catch (error) { + yield put(actions.createList.failure(localId, error)); + return; + } + + yield put(actions.createList.success(localId, list)); +} + +export function* createListInCurrentBoard(data) { + const { boardId } = yield select(selectors.selectPath); + + yield call(createList, boardId, data); +} + +export function* handleListCreate(label) { + yield put(actions.handleListCreate(label)); +} + +export function* updateList(id, data) { + yield put(actions.updateList(id, data)); + + let list; + try { + ({ item: list } = yield call(request, api.updateList, id, data)); + } catch (error) { + yield put(actions.updateList.failure(id, error)); + return; + } + + yield put(actions.updateList.success(list)); +} + +export function* handleListUpdate(label) { + yield put(actions.handleListUpdate(label)); +} + +export function* moveList(id, index) { + const { boardId } = yield select(selectors.selectListById, id); + const position = yield select(selectors.selectNextListPosition, boardId, index, id); + + yield call(updateList, id, { + position, + }); +} + +export function* deleteList(id) { + yield put(actions.deleteList(id)); + + let list; + try { + ({ item: list } = yield call(request, api.deleteList, id)); + } catch (error) { + yield put(actions.deleteList.failure(id, error)); + return; + } + + yield put(actions.deleteList.success(list)); +} + +export function* handleListDelete(label) { + yield put(actions.handleListDelete(label)); +} + +export default { + createList, + createListInCurrentBoard, + handleListCreate, + updateList, + handleListUpdate, + moveList, + deleteList, + handleListDelete, +}; diff --git a/client/src/sagas/core/services/login.js b/client/src/sagas/core/services/login.js deleted file mode 100644 index a39298f2..00000000 --- a/client/src/sagas/core/services/login.js +++ /dev/null @@ -1,9 +0,0 @@ -import { put, take } from 'redux-saga/effects'; - -import { logout } from '../../../actions'; - -// eslint-disable-next-line import/prefer-default-export -export function* logoutService() { - yield put(logout()); - yield take(); -} diff --git a/client/src/sagas/core/services/modal.js b/client/src/sagas/core/services/modal.js deleted file mode 100644 index 7934bebe..00000000 --- a/client/src/sagas/core/services/modal.js +++ /dev/null @@ -1,11 +0,0 @@ -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()); -} diff --git a/client/src/sagas/core/services/modals.js b/client/src/sagas/core/services/modals.js new file mode 100644 index 00000000..265bfc9a --- /dev/null +++ b/client/src/sagas/core/services/modals.js @@ -0,0 +1,16 @@ +import { put } from 'redux-saga/effects'; + +import actions from '../../../actions'; + +export function* openModal(type) { + yield put(actions.openModal(type)); +} + +export function* closeModal() { + yield put(actions.closeModal()); +} + +export default { + openModal, + closeModal, +}; diff --git a/client/src/sagas/core/services/notification.js b/client/src/sagas/core/services/notifications.js similarity index 51% rename from client/src/sagas/core/services/notification.js rename to client/src/sagas/core/services/notifications.js index 6724adb3..2f8cb590 100644 --- a/client/src/sagas/core/services/notification.js +++ b/client/src/sagas/core/services/notifications.js @@ -1,16 +1,12 @@ import { call, put, select } from 'redux-saga/effects'; import request from '../request'; -import { pathSelector } from '../../../selectors'; -import { - deleteNotification, - handleNotificationCreate, - handleNotificationDelete, -} from '../../../actions'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; import api from '../../../api'; -export function* handleNotificationCreateService(notification) { - const { cardId } = yield select(pathSelector); +export function* handleNotificationCreate(notification) { + const { cardId } = yield select(selectors.selectPath); if (notification.cardId === cardId) { try { @@ -21,22 +17,22 @@ export function* handleNotificationCreateService(notification) { } else { let users; let cards; - let actions; + let activities; try { ({ - included: { users, cards, actions }, + included: { users, cards, activities }, } = yield call(request, api.getNotification, notification.id)); } catch { return; } - yield put(handleNotificationCreate(notification, users, cards, actions)); + yield put(actions.handleNotificationCreate(notification, users, cards, activities)); } } -export function* deleteNotificationService(id) { - yield put(deleteNotification(id)); +export function* deleteNotification(id) { + yield put(actions.deleteNotification(id)); let notifications; try { @@ -44,13 +40,19 @@ export function* deleteNotificationService(id) { isRead: true, })); } catch (error) { - yield put(deleteNotification.failure(id, error)); + yield put(actions.deleteNotification.failure(id, error)); return; } - yield put(deleteNotification.success(notifications[0])); + yield put(actions.deleteNotification.success(notifications[0])); } -export function* handleNotificationDeleteService(notification) { - yield put(handleNotificationDelete(notification)); +export function* handleNotificationDelete(notification) { + yield put(actions.handleNotificationDelete(notification)); } + +export default { + handleNotificationCreate, + deleteNotification, + handleNotificationDelete, +}; diff --git a/client/src/sagas/core/services/project-manager.js b/client/src/sagas/core/services/project-managers.js similarity index 58% rename from client/src/sagas/core/services/project-manager.js rename to client/src/sagas/core/services/project-managers.js index 991fefe3..dcef6abb 100644 --- a/client/src/sagas/core/services/project-manager.js +++ b/client/src/sagas/core/services/project-managers.js @@ -1,28 +1,18 @@ import { call, put, select } from 'redux-saga/effects'; import request from '../request'; -import { fetchBoardByCurrentPathRequest } from '../requests'; -import { - currentUserIdSelector, - notificationsByCardIdSelector, - pathSelector, - projectManagerByIdSelector, -} from '../../../selectors'; -import { - createProjectManager, - deleteProjectManager, - handleProjectManagerCreate, - handleProjectManagerDelete, -} from '../../../actions'; +import requests from '../requests'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; import api from '../../../api'; import { createLocalId } from '../../../utils/local-id'; import mergeRecords from '../../../utils/merge-records'; -export function* createProjectManagerService(projectId, data) { +export function* createProjectManager(projectId, data) { const localId = yield call(createLocalId); yield put( - createProjectManager({ + actions.createProjectManager({ ...data, projectId, id: localId, @@ -33,20 +23,20 @@ export function* createProjectManagerService(projectId, data) { try { ({ item: projectManager } = yield call(request, api.createProjectManager, projectId, data)); } catch (error) { - yield put(createProjectManager.failure(localId, error)); + yield put(actions.createProjectManager.failure(localId, error)); } - yield put(createProjectManager.success(localId, projectManager)); + yield put(actions.createProjectManager.success(localId, projectManager)); } -export function* createManagerInCurrentProjectService(data) { - const { projectId } = yield select(pathSelector); +export function* createManagerInCurrentProject(data) { + const { projectId } = yield select(selectors.selectPath); - yield call(createProjectManagerService, projectId, data); + yield call(createProjectManager, projectId, data); } -export function* handleProjectManagerCreateService(projectManager) { - const currentUserId = yield select(currentUserIdSelector); +export function* handleProjectManagerCreate(projectManager) { + const currentUserId = yield select(selectors.selectCurrentUserId); const isCurrentUser = projectManager.userId === currentUserId; let user; @@ -65,13 +55,17 @@ export function* handleProjectManagerCreateService(projectManager) { let cardLabels; let tasks; let attachments; - let notifications; + let deletedNotifications; if (isCurrentUser) { - const { boardId } = yield select(pathSelector); + const { boardId } = yield select(selectors.selectPath); yield put( - handleProjectManagerCreate.fetchProject(projectManager.projectId, currentUserId, boardId), + actions.handleProjectManagerCreate.fetchProject( + projectManager.projectId, + currentUserId, + boardId, + ), ); try { @@ -85,7 +79,7 @@ export function* handleProjectManagerCreateService(projectManager) { let body; try { - body = yield call(fetchBoardByCurrentPathRequest); + body = yield call(requests.fetchBoardByCurrentPath); } catch {} // eslint-disable-line no-empty if (body && body.project && body.project.id === projectManager.projectId) { @@ -104,7 +98,7 @@ export function* handleProjectManagerCreateService(projectManager) { } = body); if (body.card) { - notifications = yield select(notificationsByCardIdSelector, body.card.id); + deletedNotifications = yield select(selectors.selectNotificationsByCardId, body.card.id); } } } else { @@ -116,7 +110,7 @@ export function* handleProjectManagerCreateService(projectManager) { } yield put( - handleProjectManagerCreate( + actions.handleProjectManagerCreate( projectManager, project, board, @@ -131,19 +125,19 @@ export function* handleProjectManagerCreateService(projectManager) { cardLabels, tasks, attachments, - notifications, + deletedNotifications, ), ); } -export function* deleteProjectManagerService(id) { - let projectManager = yield select(projectManagerByIdSelector, id); +export function* deleteProjectManager(id) { + let projectManager = yield select(selectors.selectProjectManagerById, id); - const currentUserId = yield select(currentUserIdSelector); - const { projectId } = yield select(pathSelector); + const currentUserId = yield select(selectors.selectCurrentUserId); + const { projectId } = yield select(selectors.selectPath); yield put( - deleteProjectManager( + actions.deleteProjectManager( id, projectManager.userId === currentUserId, projectManager.projectId === projectId, @@ -153,22 +147,30 @@ export function* deleteProjectManagerService(id) { try { ({ item: projectManager } = yield call(request, api.deleteProjectManager, id)); } catch (error) { - yield put(deleteProjectManager.failure(id, error)); + yield put(actions.deleteProjectManager.failure(id, error)); return; } - yield put(deleteProjectManager.success(projectManager)); + yield put(actions.deleteProjectManager.success(projectManager)); } -export function* handleProjectManagerDeleteService(projectManager) { - const currentUserId = yield select(currentUserIdSelector); - const { projectId } = yield select(pathSelector); +export function* handleProjectManagerDelete(projectManager) { + const currentUserId = yield select(selectors.selectCurrentUserId); + const { projectId } = yield select(selectors.selectPath); yield put( - handleProjectManagerDelete( + actions.handleProjectManagerDelete( projectManager, projectManager.userId === currentUserId, projectManager.projectId === projectId, ), ); } + +export default { + createProjectManager, + createManagerInCurrentProject, + handleProjectManagerCreate, + deleteProjectManager, + handleProjectManagerDelete, +}; diff --git a/client/src/sagas/core/services/project.js b/client/src/sagas/core/services/project.js deleted file mode 100644 index 884714b7..00000000 --- a/client/src/sagas/core/services/project.js +++ /dev/null @@ -1,131 +0,0 @@ -import { call, put, select } from 'redux-saga/effects'; - -import { goToProjectService, goToRootService } from './router'; -import request from '../request'; -import { pathSelector } from '../../../selectors'; -import { - createProject, - deleteProject, - handleProjectCreate, - handleProjectDelete, - handleProjectUpdate, - updateProject, - updateProjectBackgroundImage, -} from '../../../actions'; -import api from '../../../api'; - -export function* createProjectService(data) { - yield put(createProject(data)); - - let project; - let projectManagers; - - try { - ({ - item: project, - included: { projectManagers }, - } = yield call(request, api.createProject, data)); - } catch (error) { - yield put(createProject.failure(error)); - return; - } - - yield put(createProject.success(project, projectManagers)); - yield call(goToProjectService, project.id); -} - -export function* handleProjectCreateService({ id }) { - let project; - let users; - let projectManagers; - let boards; - let boardMemberships; - - try { - ({ - item: project, - included: { users, projectManagers, boards, boardMemberships }, - } = yield call(request, api.getProject, id)); - } catch (error) { - return; - } - - yield put(handleProjectCreate(project, users, projectManagers, boards, boardMemberships)); -} - -export function* updateProjectService(id, data) { - yield put(updateProject(id, data)); - - let project; - try { - ({ item: project } = yield call(request, api.updateProject, id, data)); - } catch (error) { - yield put(updateProject.failure(id, error)); - } - - yield put(updateProject.success(project)); -} - -export function* updateCurrentProjectService(data) { - const { projectId } = yield select(pathSelector); - - yield call(updateProjectService, projectId, data); -} - -export function* handleProjectUpdateService(project) { - yield put(handleProjectUpdate(project)); -} - -export function* updateProjectBackgroundImageService(id, data) { - yield put(updateProjectBackgroundImage(id)); - - let project; - try { - ({ item: project } = yield call(request, api.updateProjectBackgroundImage, id, data)); - } catch (error) { - yield put(updateProjectBackgroundImage.failure(id, error)); - } - - yield put(updateProjectBackgroundImage.success(project)); -} - -export function* updateCurrentProjectBackgroundImageService(data) { - const { projectId } = yield select(pathSelector); - - yield call(updateProjectBackgroundImageService, projectId, data); -} - -export function* deleteProjectService(id) { - const { projectId } = yield select(pathSelector); - - if (id === projectId) { - yield call(goToRootService); - } - - yield put(deleteProject(id)); - - let project; - try { - ({ item: project } = yield call(request, api.deleteProject, id)); - } catch (error) { - yield put(deleteProject.failure(id, error)); - } - - yield put(deleteProject.success(project)); -} - -export function* deleteCurrentProjectService() { - const { projectId } = yield select(pathSelector); - - yield call(deleteProjectService, projectId); -} - -export function* handleProjectDeleteService(project) { - const { projectId } = yield select(pathSelector); - - if (project.id === projectId) { - yield call(goToRootService); - } - - yield put(handleProjectDelete(project)); -} diff --git a/client/src/sagas/core/services/projects.js b/client/src/sagas/core/services/projects.js new file mode 100644 index 00000000..80a9b396 --- /dev/null +++ b/client/src/sagas/core/services/projects.js @@ -0,0 +1,136 @@ +import { call, put, select } from 'redux-saga/effects'; + +import { goToProject, goToRoot } from './router'; +import request from '../request'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; +import api from '../../../api'; + +export function* createProject(data) { + yield put(actions.createProject(data)); + + let project; + let projectManagers; + + try { + ({ + item: project, + included: { projectManagers }, + } = yield call(request, api.createProject, data)); + } catch (error) { + yield put(actions.createProject.failure(error)); + return; + } + + yield put(actions.createProject.success(project, projectManagers)); + yield call(goToProject, project.id); +} + +export function* handleProjectCreate({ id }) { + let project; + let users; + let projectManagers; + let boards; + let boardMemberships; + + try { + ({ + item: project, + included: { users, projectManagers, boards, boardMemberships }, + } = yield call(request, api.getProject, id)); + } catch (error) { + return; + } + + yield put(actions.handleProjectCreate(project, users, projectManagers, boards, boardMemberships)); +} + +export function* updateProject(id, data) { + yield put(actions.updateProject(id, data)); + + let project; + try { + ({ item: project } = yield call(request, api.updateProject, id, data)); + } catch (error) { + yield put(actions.updateProject.failure(id, error)); + } + + yield put(actions.updateProject.success(project)); +} + +export function* updateCurrentProject(data) { + const { projectId } = yield select(selectors.selectPath); + + yield call(updateProject, projectId, data); +} + +export function* handleProjectUpdate(project) { + yield put(actions.handleProjectUpdate(project)); +} + +export function* updateProjectBackgroundImage(id, data) { + yield put(actions.updateProjectBackgroundImage(id)); + + let project; + try { + ({ item: project } = yield call(request, api.updateProjectBackgroundImage, id, data)); + } catch (error) { + yield put(actions.updateProjectBackgroundImage.failure(id, error)); + } + + yield put(actions.updateProjectBackgroundImage.success(project)); +} + +export function* updateCurrentProjectBackgroundImage(data) { + const { projectId } = yield select(selectors.selectPath); + + yield call(updateProjectBackgroundImage, projectId, data); +} + +export function* deleteProject(id) { + const { projectId } = yield select(selectors.selectPath); + + if (id === projectId) { + yield call(goToRoot); + } + + yield put(actions.deleteProject(id)); + + let project; + try { + ({ item: project } = yield call(request, api.deleteProject, id)); + } catch (error) { + yield put(actions.deleteProject.failure(id, error)); + } + + yield put(actions.deleteProject.success(project)); +} + +export function* deleteCurrentProject() { + const { projectId } = yield select(selectors.selectPath); + + yield call(deleteProject, projectId); +} + +export function* handleProjectDelete(project) { + const { projectId } = yield select(selectors.selectPath); + + if (project.id === projectId) { + yield call(goToRoot); + } + + yield put(actions.handleProjectDelete(project)); +} + +export default { + createProject, + handleProjectCreate, + updateProject, + updateCurrentProject, + handleProjectUpdate, + updateProjectBackgroundImage, + updateCurrentProjectBackgroundImage, + deleteProject, + deleteCurrentProject, + handleProjectDelete, +}; diff --git a/client/src/sagas/core/services/router.js b/client/src/sagas/core/services/router.js index 7ed31e6a..a371d1b2 100644 --- a/client/src/sagas/core/services/router.js +++ b/client/src/sagas/core/services/router.js @@ -2,35 +2,30 @@ import { call, put, select, take } from 'redux-saga/effects'; import { push } from 'connected-react-router'; import request from '../request'; -import { - currentBoardSelector, - isCoreInitializingSelector, - notificationIdsForCurrentCardSelector, - pathsMatchSelector, -} from '../../../selectors'; -import { handleLocationChange } from '../../../actions'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; import api from '../../../api'; import ActionTypes from '../../../constants/ActionTypes'; import Paths from '../../../constants/Paths'; -export function* goToRootService() { +export function* goToRoot() { yield put(push(Paths.ROOT)); } -export function* goToProjectService(projectId) { +export function* goToProject(projectId) { yield put(push(Paths.PROJECTS.replace(':id', projectId))); } -export function* goToBoardService(boardId) { +export function* goToBoard(boardId) { yield put(push(Paths.BOARDS.replace(':id', boardId))); } -export function* goToCardService(cardId) { +export function* goToCard(cardId) { yield put(push(Paths.CARDS.replace(':id', cardId))); } -export function* handleLocationChangeService() { - const pathsMatch = yield select(pathsMatchSelector); +export function* handleLocationChange() { + const pathsMatch = yield select(selectors.selectPathsMatch); if (!pathsMatch) { return; @@ -38,13 +33,13 @@ export function* handleLocationChangeService() { switch (pathsMatch.path) { case Paths.LOGIN: - yield call(goToRootService); + yield call(goToRoot); break; default: } - const isCoreInitializing = yield select(isCoreInitializingSelector); + const isCoreInitializing = yield select(selectors.selectIsCoreInitializing); if (isCoreInitializing) { yield take(ActionTypes.CORE_INITIALIZE); @@ -61,15 +56,15 @@ export function* handleLocationChangeService() { let cardLabels; let tasks; let attachments; - let notifications; + let deletedNotifications; switch (pathsMatch.path) { case Paths.BOARDS: case Paths.CARDS: { - const currentBoard = yield select(currentBoardSelector); + const currentBoard = yield select(selectors.selectCurrentBoard); if (currentBoard && currentBoard.isFetching === null) { - yield put(handleLocationChange.fetchBoard(currentBoard.id)); + yield put(actions.handleLocationChange.fetchBoard(currentBoard.id)); try { ({ @@ -91,11 +86,11 @@ export function* handleLocationChangeService() { } if (pathsMatch.path === Paths.CARDS) { - const notificationIds = yield select(notificationIdsForCurrentCardSelector); + const notificationIds = yield select(selectors.selectNotificationIdsForCurrentCard); if (notificationIds && notificationIds.length > 0) { try { - ({ items: notifications } = yield call( + ({ items: deletedNotifications } = yield call( request, api.updateNotifications, notificationIds, @@ -113,7 +108,7 @@ export function* handleLocationChangeService() { } yield put( - handleLocationChange( + actions.handleLocationChange( board, users, projects, @@ -125,7 +120,15 @@ export function* handleLocationChangeService() { cardLabels, tasks, attachments, - notifications, + deletedNotifications, ), ); } + +export default { + goToRoot, + goToProject, + goToBoard, + goToCard, + handleLocationChange, +}; diff --git a/client/src/sagas/core/services/socket.js b/client/src/sagas/core/services/socket.js index 2b4eac7f..a52c7d25 100644 --- a/client/src/sagas/core/services/socket.js +++ b/client/src/sagas/core/services/socket.js @@ -1,18 +1,18 @@ import { call, put, select } from 'redux-saga/effects'; -import { fetchCoreRequest } from '../requests'; -import { currentUserIdSelector, pathSelector } from '../../../selectors'; -import { handleSocketDisconnect, handleSocketReconnect } from '../../../actions'; +import requests from '../requests'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; -export function* handleSocketDisconnectService() { - yield put(handleSocketDisconnect()); +export function* handleSocketDisconnect() { + yield put(actions.handleSocketDisconnect()); } -export function* handleSocketReconnectService() { - const currentUserId = yield select(currentUserIdSelector); - const { boardId } = yield select(pathSelector); +export function* handleSocketReconnect() { + const currentUserId = yield select(selectors.selectCurrentUserId); + const { boardId } = yield select(selectors.selectPath); - yield put(handleSocketReconnect.fetchCore(currentUserId, boardId)); + yield put(actions.handleSocketReconnect.fetchCore(currentUserId, boardId)); const { user, @@ -29,12 +29,12 @@ export function* handleSocketReconnectService() { cardLabels, tasks, attachments, - actions, + activities, notifications, - } = yield call(fetchCoreRequest); // TODO: handle error + } = yield call(requests.fetchCore); // TODO: handle error yield put( - handleSocketReconnect( + actions.handleSocketReconnect( user, board, users, @@ -49,8 +49,13 @@ export function* handleSocketReconnectService() { cardLabels, tasks, attachments, - actions, + activities, notifications, ), ); } + +export default { + handleSocketDisconnect, + handleSocketReconnect, +}; diff --git a/client/src/sagas/core/services/task.js b/client/src/sagas/core/services/task.js deleted file mode 100644 index 4ec49340..00000000 --- a/client/src/sagas/core/services/task.js +++ /dev/null @@ -1,96 +0,0 @@ -import { call, put, select } from 'redux-saga/effects'; - -import request from '../request'; -import { nextTaskPositionSelector, pathSelector, taskByIdSelector } from '../../../selectors'; -import { - createTask, - deleteTask, - handleTaskCreate, - handleTaskDelete, - handleTaskUpdate, - updateTask, -} from '../../../actions'; -import api from '../../../api'; -import { createLocalId } from '../../../utils/local-id'; - -export function* createTaskService(cardId, data) { - const nextData = { - ...data, - position: yield select(nextTaskPositionSelector, cardId), - }; - - const localId = yield call(createLocalId); - - yield put( - createTask({ - ...nextData, - cardId, - id: localId, - }), - ); - - let task; - try { - ({ item: task } = yield call(request, api.createTask, cardId, nextData)); - } catch (error) { - yield put(createTask.failure(localId, error)); - return; - } - - yield put(createTask.success(localId, task)); -} - -export function* createTaskInCurrentCardService(data) { - const { cardId } = yield select(pathSelector); - - yield call(createTaskService, cardId, data); -} - -export function* handleTaskCreateService(task) { - yield put(handleTaskCreate(task)); -} - -export function* updateTaskService(id, data) { - yield put(updateTask(id, data)); - - let task; - try { - ({ item: task } = yield call(request, api.updateTask, id, data)); - } catch (error) { - yield put(updateTask.failure(id, error)); - return; - } - - yield put(updateTask.success(task)); -} - -export function* handleTaskUpdateService(task) { - yield put(handleTaskUpdate(task)); -} - -export function* moveTaskService(id, index) { - const { cardId } = yield select(taskByIdSelector, id); - const position = yield select(nextTaskPositionSelector, cardId, index, id); - - yield call(updateTaskService, id, { - position, - }); -} - -export function* deleteTaskService(id) { - yield put(deleteTask(id)); - - let task; - try { - ({ item: task } = yield call(request, api.deleteTask, id)); - } catch (error) { - yield put(deleteTask.failure(id, error)); - return; - } - - yield put(deleteTask.success(task)); -} - -export function* handleTaskDeleteService(task) { - yield put(handleTaskDelete(task)); -} diff --git a/client/src/sagas/core/services/tasks.js b/client/src/sagas/core/services/tasks.js new file mode 100644 index 00000000..cae0cd4f --- /dev/null +++ b/client/src/sagas/core/services/tasks.js @@ -0,0 +1,100 @@ +import { call, put, select } from 'redux-saga/effects'; + +import request from '../request'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; +import api from '../../../api'; +import { createLocalId } from '../../../utils/local-id'; + +export function* createTask(cardId, data) { + const nextData = { + ...data, + position: yield select(selectors.selectNextTaskPosition, cardId), + }; + + const localId = yield call(createLocalId); + + yield put( + actions.createTask({ + ...nextData, + cardId, + id: localId, + }), + ); + + let task; + try { + ({ item: task } = yield call(request, api.createTask, cardId, nextData)); + } catch (error) { + yield put(actions.createTask.failure(localId, error)); + return; + } + + yield put(actions.createTask.success(localId, task)); +} + +export function* createTaskInCurrentCard(data) { + const { cardId } = yield select(selectors.selectPath); + + yield call(createTask, cardId, data); +} + +export function* handleTaskCreate(task) { + yield put(actions.handleTaskCreate(task)); +} + +export function* updateTask(id, data) { + yield put(actions.updateTask(id, data)); + + let task; + try { + ({ item: task } = yield call(request, api.updateTask, id, data)); + } catch (error) { + yield put(actions.updateTask.failure(id, error)); + return; + } + + yield put(actions.updateTask.success(task)); +} + +export function* handleTaskUpdate(task) { + yield put(actions.handleTaskUpdate(task)); +} + +export function* moveTask(id, index) { + const { cardId } = yield select(selectors.selectTaskById, id); + const position = yield select(selectors.selectNextTaskPosition, cardId, index, id); + + yield call(updateTask, id, { + position, + }); +} + +export function* deleteTask(id) { + yield put(actions.deleteTask(id)); + + let task; + try { + ({ item: task } = yield call(request, api.deleteTask, id)); + } catch (error) { + yield put(actions.deleteTask.failure(id, error)); + return; + } + + yield put(actions.deleteTask.success(task)); +} + +export function* handleTaskDelete(task) { + yield put(actions.handleTaskDelete(task)); +} + +export default { + createTask, + createTaskInCurrentCard, + handleTaskCreate, + updateTask, + handleTaskUpdate, + moveTask, + deleteTask, + handleTaskDelete, +}; diff --git a/client/src/sagas/core/services/user.js b/client/src/sagas/core/services/user.js deleted file mode 100644 index 6f9fc88e..00000000 --- a/client/src/sagas/core/services/user.js +++ /dev/null @@ -1,304 +0,0 @@ -import { call, put, select } from 'redux-saga/effects'; - -import { logoutService } from './login'; -import { changeCoreLanguageService } from './core'; -import request from '../request'; -import { currentUserIdSelector, currentUserSelector, pathSelector } from '../../../selectors'; -import { - addUserToBoardFilter, - addUserToCard, - clearUserCreateError, - clearUserEmailUpdateError, - clearUserPasswordUpdateError, - clearUserUsernameUpdateError, - createUser, - deleteUser, - handleUserCreate, - handleUserDelete, - handleUserFromCardRemove, - handleUserToCardAdd, - handleUserUpdate, - removeUserFromBoardFilter, - removeUserFromCard, - updateUser, - updateUserAvatar, - updateUserEmail, - updateUserPassword, - updateUserUsername, -} from '../../../actions'; -import api from '../../../api'; - -export function* createUserService(data) { - yield put(createUser(data)); - - let user; - try { - ({ item: user } = yield call(request, api.createUser, data)); - } catch (error) { - yield put(createUser.failure(error)); - return; - } - - yield put(createUser.success(user)); -} - -export function* handleUserCreateService(user) { - yield put(handleUserCreate(user)); -} - -export function* clearUserCreateErrorService() { - yield put(clearUserCreateError()); -} - -export function* updateUserService(id, data) { - yield put(updateUser(id, data)); - - let user; - try { - ({ item: user } = yield call(request, api.updateUser, id, data)); - } catch (error) { - yield put(updateUser.failure(id, error)); - return; - } - - yield put(updateUser.success(user)); -} - -export function* updateCurrentUserService(data) { - const id = yield select(currentUserIdSelector); - - yield call(updateUserService, id, data); -} - -export function* handleUserUpdateService(user) { - const currentUser = yield select(currentUserSelector); - const isCurrent = user.id === currentUser.id; - - let users; - if (isCurrent && !currentUser.isAdmin && user.isAdmin) { - ({ items: users } = yield call(request, api.getUsers)); - } - - yield put(handleUserUpdate(user, users, isCurrent)); -} - -// TODO: add loading state -export function* updateUserLanguageService(id, language) { - yield call(changeCoreLanguageService, language); - - yield call(updateUserService, id, { - language, - }); -} - -export function* updateCurrentUserLanguageService(language) { - const id = yield select(currentUserIdSelector); - - yield call(updateUserLanguageService, id, language); -} - -export function* updateUserEmailService(id, data) { - yield put(updateUserEmail(id, data)); - - let user; - try { - ({ item: user } = yield call(request, api.updateUserEmail, id, data)); - } catch (error) { - yield put(updateUserEmail.failure(id, error)); - return; - } - - yield put(updateUserEmail.success(user)); -} - -export function* updateCurrentUserEmailService(data) { - const id = yield select(currentUserIdSelector); - - yield call(updateUserEmailService, id, data); -} - -export function* clearUserEmailUpdateErrorService(id) { - yield put(clearUserEmailUpdateError(id)); -} - -export function* clearCurrentUserEmailUpdateErrorService() { - const id = yield select(currentUserIdSelector); - - yield call(clearUserEmailUpdateErrorService, id); -} - -export function* updateUserPasswordService(id, data) { - yield put(updateUserPassword(id, data)); - - let user; - try { - ({ item: user } = yield call(request, api.updateUserPassword, id, data)); - } catch (error) { - yield put(updateUserPassword.failure(id, error)); - return; - } - - yield put(updateUserPassword.success(user)); -} - -export function* updateCurrentUserPasswordService(data) { - const id = yield select(currentUserIdSelector); - - yield call(updateUserPasswordService, id, data); -} - -export function* clearUserPasswordUpdateErrorService(id) { - yield put(clearUserPasswordUpdateError(id)); -} - -export function* clearCurrentUserPasswordUpdateErrorService() { - const id = yield select(currentUserIdSelector); - - yield call(clearUserPasswordUpdateErrorService, id); -} - -export function* updateUserUsernameService(id, data) { - yield put(updateUserUsername(id, data)); - - let user; - try { - ({ item: user } = yield call(request, api.updateUserUsername, id, data)); - } catch (error) { - yield put(updateUserUsername.failure(id, error)); - return; - } - - yield put(updateUserUsername.success(user)); -} - -export function* updateCurrentUserUsernameService(data) { - const id = yield select(currentUserIdSelector); - - yield call(updateUserUsernameService, id, data); -} - -export function* clearUserUsernameUpdateErrorService(id) { - yield put(clearUserUsernameUpdateError(id)); -} - -export function* clearCurrentUserUsernameUpdateErrorService() { - const id = yield select(currentUserIdSelector); - - yield call(clearUserUsernameUpdateErrorService, id); -} - -export function* updateUserAvatarService(id, data) { - yield put(updateUserAvatar(id)); - - let user; - try { - ({ item: user } = yield call(request, api.updateUserAvatar, id, data)); - } catch (error) { - yield put(updateUserAvatar.failure(id, error)); - return; - } - - yield put(updateUserAvatar.success(user)); -} - -export function* updateCurrentUserAvatarService(data) { - const id = yield select(currentUserIdSelector); - - yield call(updateUserAvatarService, id, data); -} - -export function* deleteUserService(id) { - yield put(deleteUser(id)); - - let user; - try { - ({ item: user } = yield call(request, api.deleteUser, id)); - } catch (error) { - yield put(deleteUser.failure(id, error)); - return; - } - - yield put(deleteUser.success(user)); -} - -export function* handleUserDeleteService(user) { - const currentUserId = yield select(currentUserIdSelector); - - if (user.id === currentUserId) { - yield call(logoutService); - } - - yield put(handleUserDelete(user)); -} - -export function* addUserToCardService(id, cardId) { - const currentUserId = yield select(currentUserIdSelector); - - yield put(addUserToCard(id, cardId, id === currentUserId)); - - let cardMembership; - try { - ({ item: cardMembership } = yield call(request, api.createCardMembership, cardId, { - userId: id, - })); - } catch (error) { - yield put(addUserToCard.failure(id, cardId, error)); - return; - } - - yield put(addUserToCard.success(cardMembership)); -} - -export function* addUserToCurrentCardService(id) { - const { cardId } = yield select(pathSelector); - - yield call(addUserToCardService, id, cardId); -} - -export function* handleUserToCardAddService(cardMembership) { - yield put(handleUserToCardAdd(cardMembership)); -} - -export function* removeUserFromCardService(id, cardId) { - yield put(removeUserFromCard(id, cardId)); - - let cardMembership; - try { - ({ item: cardMembership } = yield call(request, api.deleteCardMembership, cardId, id)); - } catch (error) { - yield put(removeUserFromCard.failure(id, cardId, error)); - return; - } - - yield put(removeUserFromCard.success(cardMembership)); -} - -export function* removeUserFromCurrentCardService(id) { - const { cardId } = yield select(pathSelector); - - yield call(removeUserFromCardService, id, cardId); -} - -export function* handleUserFromCardRemoveService(cardMembership) { - yield put(handleUserFromCardRemove(cardMembership)); -} - -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); -} diff --git a/client/src/sagas/core/services/users.js b/client/src/sagas/core/services/users.js new file mode 100644 index 00000000..12f1f965 --- /dev/null +++ b/client/src/sagas/core/services/users.js @@ -0,0 +1,319 @@ +import { call, put, select } from 'redux-saga/effects'; + +import { changeCoreLanguage, logout } from './core'; +import request from '../request'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; +import api from '../../../api'; + +export function* createUser(data) { + yield put(actions.createUser(data)); + + let user; + try { + ({ item: user } = yield call(request, api.createUser, data)); + } catch (error) { + yield put(actions.createUser.failure(error)); + return; + } + + yield put(actions.createUser.success(user)); +} + +export function* handleUserCreate(user) { + yield put(actions.handleUserCreate(user)); +} + +export function* clearUserCreateError() { + yield put(actions.clearUserCreateError()); +} + +export function* updateUser(id, data) { + yield put(actions.updateUser(id, data)); + + let user; + try { + ({ item: user } = yield call(request, api.updateUser, id, data)); + } catch (error) { + yield put(actions.updateUser.failure(id, error)); + return; + } + + yield put(actions.updateUser.success(user)); +} + +export function* updateCurrentUser(data) { + const id = yield select(selectors.selectCurrentUserId); + + yield call(updateUser, id, data); +} + +export function* handleUserUpdate(user) { + const currentUser = yield select(selectors.selectCurrentUser); + const isCurrent = user.id === currentUser.id; + + let users; + if (isCurrent && !currentUser.isAdmin && user.isAdmin) { + ({ items: users } = yield call(request, api.getUsers)); + } + + yield put(actions.handleUserUpdate(user, users, isCurrent)); +} + +// TODO: add loading state +export function* updateUserLanguage(id, language) { + yield call(changeCoreLanguage, language); + + yield call(updateUser, id, { + language, + }); +} + +export function* updateCurrentUserLanguage(language) { + const id = yield select(selectors.selectCurrentUserId); + + yield call(updateUserLanguage, id, language); +} + +export function* updateUserEmail(id, data) { + yield put(actions.updateUserEmail(id, data)); + + let user; + try { + ({ item: user } = yield call(request, api.updateUserEmail, id, data)); + } catch (error) { + yield put(actions.updateUserEmail.failure(id, error)); + return; + } + + yield put(actions.updateUserEmail.success(user)); +} + +export function* updateCurrentUserEmail(data) { + const id = yield select(selectors.selectCurrentUserId); + + yield call(updateUserEmail, id, data); +} + +export function* clearUserEmailUpdateError(id) { + yield put(actions.clearUserEmailUpdateError(id)); +} + +export function* clearCurrentUserEmailUpdateError() { + const id = yield select(selectors.selectCurrentUserId); + + yield call(clearUserEmailUpdateError, id); +} + +export function* updateUserPassword(id, data) { + yield put(actions.updateUserPassword(id, data)); + + let user; + try { + ({ item: user } = yield call(request, api.updateUserPassword, id, data)); + } catch (error) { + yield put(actions.updateUserPassword.failure(id, error)); + return; + } + + yield put(actions.updateUserPassword.success(user)); +} + +export function* updateCurrentUserPassword(data) { + const id = yield select(selectors.selectCurrentUserId); + + yield call(updateUserPassword, id, data); +} + +export function* clearUserPasswordUpdateError(id) { + yield put(actions.clearUserPasswordUpdateError(id)); +} + +export function* clearCurrentUserPasswordUpdateError() { + const id = yield select(selectors.selectCurrentUserId); + + yield call(clearUserPasswordUpdateError, id); +} + +export function* updateUserUsername(id, data) { + yield put(actions.updateUserUsername(id, data)); + + let user; + try { + ({ item: user } = yield call(request, api.updateUserUsername, id, data)); + } catch (error) { + yield put(actions.updateUserUsername.failure(id, error)); + return; + } + + yield put(actions.updateUserUsername.success(user)); +} + +export function* updateCurrentUserUsername(data) { + const id = yield select(selectors.selectCurrentUserId); + + yield call(updateUserUsername, id, data); +} + +export function* clearUserUsernameUpdateError(id) { + yield put(actions.clearUserUsernameUpdateError(id)); +} + +export function* clearCurrentUserUsernameUpdateError() { + const id = yield select(selectors.selectCurrentUserId); + + yield call(clearUserUsernameUpdateError, id); +} + +export function* updateUserAvatar(id, data) { + yield put(actions.updateUserAvatar(id)); + + let user; + try { + ({ item: user } = yield call(request, api.updateUserAvatar, id, data)); + } catch (error) { + yield put(actions.updateUserAvatar.failure(id, error)); + return; + } + + yield put(actions.updateUserAvatar.success(user)); +} + +export function* updateCurrentUserAvatar(data) { + const id = yield select(selectors.selectCurrentUserId); + + yield call(updateUserAvatar, id, data); +} + +export function* deleteUser(id) { + yield put(actions.deleteUser(id)); + + let user; + try { + ({ item: user } = yield call(request, api.deleteUser, id)); + } catch (error) { + yield put(actions.deleteUser.failure(id, error)); + return; + } + + yield put(actions.deleteUser.success(user)); +} + +export function* handleUserDelete(user) { + const currentUserId = yield select(selectors.selectCurrentUserId); + + if (user.id === currentUserId) { + yield call(logout); + } + + yield put(actions.handleUserDelete(user)); +} + +export function* addUserToCard(id, cardId) { + const currentUserId = yield select(selectors.selectCurrentUserId); + + yield put(actions.addUserToCard(id, cardId, id === currentUserId)); + + let cardMembership; + try { + ({ item: cardMembership } = yield call(request, api.createCardMembership, cardId, { + userId: id, + })); + } catch (error) { + yield put(actions.addUserToCard.failure(id, cardId, error)); + return; + } + + yield put(actions.addUserToCard.success(cardMembership)); +} + +export function* addUserToCurrentCard(id) { + const { cardId } = yield select(selectors.selectPath); + + yield call(addUserToCard, id, cardId); +} + +export function* handleUserToCardAdd(cardMembership) { + yield put(actions.handleUserToCardAdd(cardMembership)); +} + +export function* removeUserFromCard(id, cardId) { + yield put(actions.removeUserFromCard(id, cardId)); + + let cardMembership; + try { + ({ item: cardMembership } = yield call(request, api.deleteCardMembership, cardId, id)); + } catch (error) { + yield put(actions.removeUserFromCard.failure(id, cardId, error)); + return; + } + + yield put(actions.removeUserFromCard.success(cardMembership)); +} + +export function* removeUserFromCurrentCard(id) { + const { cardId } = yield select(selectors.selectPath); + + yield call(removeUserFromCard, id, cardId); +} + +export function* handleUserFromCardRemove(cardMembership) { + yield put(actions.handleUserFromCardRemove(cardMembership)); +} + +export function* addUserToBoardFilter(id, boardId) { + yield put(actions.addUserToBoardFilter(id, boardId)); +} + +export function* addUserToFilterInCurrentBoard(id) { + const { boardId } = yield select(selectors.selectPath); + + yield call(addUserToBoardFilter, id, boardId); +} + +export function* removeUserFromBoardFilter(id, boardId) { + yield put(actions.removeUserFromBoardFilter(id, boardId)); +} + +export function* removeUserFromFilterInCurrentBoard(id) { + const { boardId } = yield select(selectors.selectPath); + + yield call(removeUserFromBoardFilter, id, boardId); +} + +export default { + createUser, + handleUserCreate, + clearUserCreateError, + updateUser, + updateCurrentUser, + handleUserUpdate, + updateUserLanguage, + updateCurrentUserLanguage, + updateUserEmail, + updateCurrentUserEmail, + clearUserEmailUpdateError, + clearCurrentUserEmailUpdateError, + updateUserPassword, + updateCurrentUserPassword, + clearUserPasswordUpdateError, + clearCurrentUserPasswordUpdateError, + updateUserUsername, + updateCurrentUserUsername, + clearUserUsernameUpdateError, + clearCurrentUserUsernameUpdateError, + updateUserAvatar, + updateCurrentUserAvatar, + deleteUser, + handleUserDelete, + addUserToCard, + addUserToCurrentCard, + handleUserToCardAdd, + removeUserFromCard, + removeUserFromCurrentCard, + handleUserFromCardRemove, + addUserToBoardFilter, + addUserToFilterInCurrentBoard, + removeUserFromBoardFilter, + removeUserFromFilterInCurrentBoard, +}; diff --git a/client/src/sagas/core/watchers/action.js b/client/src/sagas/core/watchers/action.js deleted file mode 100644 index c76cff9f..00000000 --- a/client/src/sagas/core/watchers/action.js +++ /dev/null @@ -1,22 +0,0 @@ -import { all, takeEvery } from 'redux-saga/effects'; - -import { - handleActionCreateService, - handleActionDeleteService, - handleActionUpdateService, -} from '../services'; -import EntryActionTypes from '../../../constants/EntryActionTypes'; - -export default function* actionWatchers() { - yield all([ - takeEvery(EntryActionTypes.ACTION_CREATE_HANDLE, ({ payload: { action } }) => - handleActionCreateService(action), - ), - takeEvery(EntryActionTypes.ACTION_UPDATE_HANDLE, ({ payload: { action } }) => - handleActionUpdateService(action), - ), - takeEvery(EntryActionTypes.ACTION_DELETE_HANDLE, ({ payload: { action } }) => - handleActionDeleteService(action), - ), - ]); -} diff --git a/client/src/sagas/core/watchers/actions.js b/client/src/sagas/core/watchers/actions.js deleted file mode 100644 index da7b71a9..00000000 --- a/client/src/sagas/core/watchers/actions.js +++ /dev/null @@ -1,19 +0,0 @@ -import { all, takeEvery } from 'redux-saga/effects'; - -import { - fetchActionsInCurrentCardService, - toggleActionsDetailsInCurrentCardService, -} from '../services'; -import EntryActionTypes from '../../../constants/EntryActionTypes'; - -export default function* actionsWatchers() { - yield all([ - takeEvery(EntryActionTypes.ACTIONS_IN_CURRENT_CARD_FETCH, () => - fetchActionsInCurrentCardService(), - ), - takeEvery( - EntryActionTypes.ACTIONS_DETAILS_IN_CURRENT_CARD_TOGGLE, - ({ payload: { isVisible } }) => toggleActionsDetailsInCurrentCardService(isVisible), - ), - ]); -} diff --git a/client/src/sagas/core/watchers/activities.js b/client/src/sagas/core/watchers/activities.js new file mode 100644 index 00000000..abd6b76e --- /dev/null +++ b/client/src/sagas/core/watchers/activities.js @@ -0,0 +1,25 @@ +import { all, takeEvery } from 'redux-saga/effects'; + +import services from '../services'; +import EntryActionTypes from '../../../constants/EntryActionTypes'; + +export default function* activitiesWatchers() { + yield all([ + takeEvery(EntryActionTypes.ACTIVITIES_IN_CURRENT_CARD_FETCH, () => + services.fetchActivitiesInCurrentCard(), + ), + takeEvery( + EntryActionTypes.ACTIVITIES_DETAILS_IN_CURRENT_CARD_TOGGLE, + ({ payload: { isVisible } }) => services.toggleActivitiesDetailsInCurrentCard(isVisible), + ), + takeEvery(EntryActionTypes.ACTIVITY_CREATE_HANDLE, ({ payload: { activity } }) => + services.handleActivityCreate(activity), + ), + takeEvery(EntryActionTypes.ACTIVITY_UPDATE_HANDLE, ({ payload: { activity } }) => + services.handleActivityUpdate(activity), + ), + takeEvery(EntryActionTypes.ACTIVITY_DELETE_HANDLE, ({ payload: { activity } }) => + services.handleActivityDelete(activity), + ), + ]); +} diff --git a/client/src/sagas/core/watchers/attachment.js b/client/src/sagas/core/watchers/attachments.js similarity index 56% rename from client/src/sagas/core/watchers/attachment.js rename to client/src/sagas/core/watchers/attachments.js index 125988e6..c85a46e1 100644 --- a/client/src/sagas/core/watchers/attachment.js +++ b/client/src/sagas/core/watchers/attachments.js @@ -1,34 +1,27 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { - createAttachmentInCurrentCardService, - deleteAttachmentService, - handleAttachmentCreateService, - handleAttachmentDeleteService, - handleAttachmentUpdateService, - updateAttachmentService, -} from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; -export default function* attachmentWatchers() { +export default function* attachmentsWatchers() { yield all([ takeEvery(EntryActionTypes.ATTACHMENT_IN_CURRENT_CARD_CREATE, ({ payload: { data } }) => - createAttachmentInCurrentCardService(data), + services.createAttachmentInCurrentCard(data), ), takeEvery(EntryActionTypes.ATTACHMENT_CREATE_HANDLE, ({ payload: { attachment, requestId } }) => - handleAttachmentCreateService(attachment, requestId), + services.handleAttachmentCreate(attachment, requestId), ), takeEvery(EntryActionTypes.ATTACHMENT_UPDATE, ({ payload: { id, data } }) => - updateAttachmentService(id, data), + services.updateAttachment(id, data), ), takeEvery(EntryActionTypes.ATTACHMENT_UPDATE_HANDLE, ({ payload: { attachment } }) => - handleAttachmentUpdateService(attachment), + services.handleAttachmentUpdate(attachment), ), takeEvery(EntryActionTypes.ATTACHMENT_DELETE, ({ payload: { id } }) => - deleteAttachmentService(id), + services.deleteAttachment(id), ), takeEvery(EntryActionTypes.ATTACHMENT_DELETE_HANDLE, ({ payload: { attachment } }) => - handleAttachmentDeleteService(attachment), + services.handleAttachmentDelete(attachment), ), ]); } diff --git a/client/src/sagas/core/watchers/board-membership.js b/client/src/sagas/core/watchers/board-memberships.js similarity index 55% rename from client/src/sagas/core/watchers/board-membership.js rename to client/src/sagas/core/watchers/board-memberships.js index ed909648..2bba3bb6 100644 --- a/client/src/sagas/core/watchers/board-membership.js +++ b/client/src/sagas/core/watchers/board-memberships.js @@ -1,26 +1,21 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { - createMembershipInCurrentBoardService, - deleteBoardMembershipService, - handleBoardMembershipCreateService, - handleBoardMembershipDeleteService, -} from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; -export default function* boardMembershipWatchers() { +export default function* boardMembershipsWatchers() { yield all([ takeEvery(EntryActionTypes.MEMBERSHIP_IN_CURRENT_BOARD_CREATE, ({ payload: { data } }) => - createMembershipInCurrentBoardService(data), + services.createMembershipInCurrentBoard(data), ), takeEvery(EntryActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE, ({ payload: { boardMembership } }) => - handleBoardMembershipCreateService(boardMembership), + services.handleBoardMembershipCreate(boardMembership), ), takeEvery(EntryActionTypes.BOARD_MEMBERSHIP_DELETE, ({ payload: { id } }) => - deleteBoardMembershipService(id), + services.deleteBoardMembership(id), ), takeEvery(EntryActionTypes.BOARD_MEMBERSHIP_DELETE_HANDLE, ({ payload: { boardMembership } }) => - handleBoardMembershipDeleteService(boardMembership), + services.handleBoardMembershipDelete(boardMembership), ), ]); } diff --git a/client/src/sagas/core/watchers/board.js b/client/src/sagas/core/watchers/boards.js similarity index 58% rename from client/src/sagas/core/watchers/board.js rename to client/src/sagas/core/watchers/boards.js index aca352ee..ad9f2615 100644 --- a/client/src/sagas/core/watchers/board.js +++ b/client/src/sagas/core/watchers/boards.js @@ -1,38 +1,29 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { - createBoardInCurrentProjectService, - deleteBoardService, - fetchBoardService, - handleBoardCreateService, - handleBoardDeleteService, - handleBoardUpdateService, - moveBoardService, - updateBoardService, -} from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; -export default function* boardWatchers() { +export default function* boardsWatchers() { yield all([ takeEvery(EntryActionTypes.BOARD_IN_CURRENT_PROJECT_CREATE, ({ payload: { data } }) => - createBoardInCurrentProjectService(data), + services.createBoardInCurrentProject(data), ), takeEvery(EntryActionTypes.BOARD_CREATE_HANDLE, ({ payload: { board } }) => - handleBoardCreateService(board), + services.handleBoardCreate(board), ), - takeEvery(EntryActionTypes.BOARD_FETCH, ({ payload: { id } }) => fetchBoardService(id)), + takeEvery(EntryActionTypes.BOARD_FETCH, ({ payload: { id } }) => services.fetchBoard(id)), takeEvery(EntryActionTypes.BOARD_UPDATE, ({ payload: { id, data } }) => - updateBoardService(id, data), + services.updateBoard(id, data), ), takeEvery(EntryActionTypes.BOARD_UPDATE_HANDLE, ({ payload: { board } }) => - handleBoardUpdateService(board), + services.handleBoardUpdate(board), ), takeEvery(EntryActionTypes.BOARD_MOVE, ({ payload: { id, index } }) => - moveBoardService(id, index), + services.moveBoard(id, index), ), - takeEvery(EntryActionTypes.BOARD_DELETE, ({ payload: { id } }) => deleteBoardService(id)), + takeEvery(EntryActionTypes.BOARD_DELETE, ({ payload: { id } }) => services.deleteBoard(id)), takeEvery(EntryActionTypes.BOARD_DELETE_HANDLE, ({ payload: { board } }) => - handleBoardDeleteService(board), + services.handleBoardDelete(board), ), ]); } diff --git a/client/src/sagas/core/watchers/card.js b/client/src/sagas/core/watchers/cards.js similarity index 54% rename from client/src/sagas/core/watchers/card.js rename to client/src/sagas/core/watchers/cards.js index 16fac5cc..6a5d0889 100644 --- a/client/src/sagas/core/watchers/card.js +++ b/client/src/sagas/core/watchers/cards.js @@ -1,54 +1,41 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { - createCardService, - deleteCardService, - deleteCurrentCardService, - handleCardCreateService, - handleCardDeleteService, - handleCardUpdateService, - moveCardService, - moveCurrentCardService, - transferCardService, - transferCurrentCardService, - updateCardService, - updateCurrentCardService, -} from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; -export default function* cardWatchers() { +export default function* cardsWatchers() { yield all([ takeEvery(EntryActionTypes.CARD_CREATE, ({ payload: { listId, data } }) => - createCardService(listId, data), + services.createCard(listId, data), ), takeEvery(EntryActionTypes.CARD_CREATE_HANDLE, ({ payload: { card } }) => - handleCardCreateService(card), + services.handleCardCreate(card), ), takeEvery(EntryActionTypes.CARD_UPDATE, ({ payload: { id, data } }) => - updateCardService(id, data), + services.updateCard(id, data), ), takeEvery(EntryActionTypes.CURRENT_CARD_UPDATE, ({ payload: { data } }) => - updateCurrentCardService(data), + services.updateCurrentCard(data), ), takeEvery(EntryActionTypes.CARD_UPDATE_HANDLE, ({ payload: { card } }) => - handleCardUpdateService(card), + services.handleCardUpdate(card), ), takeEvery(EntryActionTypes.CARD_MOVE, ({ payload: { id, listId, index } }) => - moveCardService(id, listId, index), + services.moveCard(id, listId, index), ), takeEvery(EntryActionTypes.CURRENT_CARD_MOVE, ({ payload: { listId, index } }) => - moveCurrentCardService(listId, index), + services.moveCurrentCard(listId, index), ), takeEvery(EntryActionTypes.CARD_TRANSFER, ({ payload: { id, boardId, listId, index } }) => - transferCardService(id, boardId, listId, index), + services.transferCard(id, boardId, listId, index), ), takeEvery(EntryActionTypes.CURRENT_CARD_TRANSFER, ({ payload: { boardId, listId, index } }) => - transferCurrentCardService(boardId, listId, index), + services.transferCurrentCard(boardId, listId, index), ), - takeEvery(EntryActionTypes.CARD_DELETE, ({ payload: { id } }) => deleteCardService(id)), - takeEvery(EntryActionTypes.CURRENT_CARD_DELETE, () => deleteCurrentCardService()), + takeEvery(EntryActionTypes.CARD_DELETE, ({ payload: { id } }) => services.deleteCard(id)), + takeEvery(EntryActionTypes.CURRENT_CARD_DELETE, () => services.deleteCurrentCard()), takeEvery(EntryActionTypes.CARD_DELETE_HANDLE, ({ payload: { card } }) => - handleCardDeleteService(card), + services.handleCardDelete(card), ), ]); } diff --git a/client/src/sagas/core/watchers/comment-action.js b/client/src/sagas/core/watchers/comment-action.js deleted file mode 100644 index 29e64f36..00000000 --- a/client/src/sagas/core/watchers/comment-action.js +++ /dev/null @@ -1,22 +0,0 @@ -import { all, takeEvery } from 'redux-saga/effects'; - -import { - createCommentActionInCurrentCardService, - deleteCommentActionService, - updateCommentActionService, -} from '../services'; -import EntryActionTypes from '../../../constants/EntryActionTypes'; - -export default function* commentActionWatchers() { - yield all([ - takeEvery(EntryActionTypes.COMMENT_ACTION_IN_CURRENT_CARD_CREATE, ({ payload: { data } }) => - createCommentActionInCurrentCardService(data), - ), - takeEvery(EntryActionTypes.COMMENT_ACTION_UPDATE, ({ payload: { id, data } }) => - updateCommentActionService(id, data), - ), - takeEvery(EntryActionTypes.COMMENT_ACTION_DELETE, ({ payload: { id } }) => - deleteCommentActionService(id), - ), - ]); -} diff --git a/client/src/sagas/core/watchers/comment-activities.js b/client/src/sagas/core/watchers/comment-activities.js new file mode 100644 index 00000000..e95e91ee --- /dev/null +++ b/client/src/sagas/core/watchers/comment-activities.js @@ -0,0 +1,18 @@ +import { all, takeEvery } from 'redux-saga/effects'; + +import services from '../services'; +import EntryActionTypes from '../../../constants/EntryActionTypes'; + +export default function* commentActivitiesWatchers() { + yield all([ + takeEvery(EntryActionTypes.COMMENT_ACTIVITY_IN_CURRENT_CARD_CREATE, ({ payload: { data } }) => + services.createCommentActivityInCurrentCard(data), + ), + takeEvery(EntryActionTypes.COMMENT_ACTIVITY_UPDATE, ({ payload: { id, data } }) => + services.updateCommentActivity(id, data), + ), + takeEvery(EntryActionTypes.COMMENT_ACTIVITY_DELETE, ({ payload: { id } }) => + services.deleteCommentActivity(id), + ), + ]); +} diff --git a/client/src/sagas/core/watchers/core.js b/client/src/sagas/core/watchers/core.js index 62cfd6c9..40485b86 100644 --- a/client/src/sagas/core/watchers/core.js +++ b/client/src/sagas/core/watchers/core.js @@ -1,8 +1,11 @@ -import { takeEvery } from 'redux-saga/effects'; +import { all, takeEvery } from 'redux-saga/effects'; -import { initializeCoreService } from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; export default function* coreWatchers() { - yield takeEvery(EntryActionTypes.CORE_INITIALIZE, () => initializeCoreService()); + yield all([ + takeEvery(EntryActionTypes.CORE_INITIALIZE, () => services.initializeCore()), + takeEvery(EntryActionTypes.LOGOUT, () => services.logout()), + ]); } diff --git a/client/src/sagas/core/watchers/index.js b/client/src/sagas/core/watchers/index.js index 27c81c1c..30df370b 100755 --- a/client/src/sagas/core/watchers/index.js +++ b/client/src/sagas/core/watchers/index.js @@ -1,41 +1,37 @@ import router from './router'; import socket from './socket'; -import login from './login'; import core from './core'; -import modal from './modal'; -import user from './user'; -import project from './project'; -import projectManager from './project-manager'; -import board from './board'; -import boardMembership from './board-membership'; -import label from './label'; -import list from './list'; -import card from './card'; -import task from './task'; -import attachment from './attachment'; -import actions from './actions'; -import action from './action'; -import commentAction from './comment-action'; -import notification from './notification'; +import modals from './modals'; +import users from './users'; +import projects from './projects'; +import projectManagers from './project-managers'; +import boards from './boards'; +import boardMemberships from './board-memberships'; +import labels from './labels'; +import lists from './lists'; +import cards from './cards'; +import tasks from './tasks'; +import attachments from './attachments'; +import activities from './activities'; +import commentActivities from './comment-activities'; +import notifications from './notifications'; export default [ router, socket, - login, core, - modal, - user, - project, - projectManager, - board, - boardMembership, - label, - list, - card, - task, - attachment, - actions, - action, - commentAction, - notification, + modals, + users, + projects, + projectManagers, + boards, + boardMemberships, + labels, + lists, + cards, + tasks, + attachments, + activities, + commentActivities, + notifications, ]; diff --git a/client/src/sagas/core/watchers/label.js b/client/src/sagas/core/watchers/labels.js similarity index 56% rename from client/src/sagas/core/watchers/label.js rename to client/src/sagas/core/watchers/labels.js index 75ba0c8e..f8e52e01 100644 --- a/client/src/sagas/core/watchers/label.js +++ b/client/src/sagas/core/watchers/labels.js @@ -1,64 +1,49 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { - addLabelToCardService, - addLabelToCurrentCardService, - addLabelToFilterInCurrentBoardService, - createLabelInCurrentBoardService, - deleteLabelService, - handleLabelCreateService, - handleLabelDeleteService, - handleLabelFromCardRemoveService, - handleLabelToCardAddService, - handleLabelUpdateService, - removeLabelFromCardService, - removeLabelFromCurrentCardService, - removeLabelFromFilterInCurrentBoardService, - updateLabelService, -} from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; -export default function* labelWatchers() { +export default function* labelsWatchers() { yield all([ takeEvery(EntryActionTypes.LABEL_IN_CURRENT_BOARD_CREATE, ({ payload: { data } }) => - createLabelInCurrentBoardService(data), + services.createLabelInCurrentBoard(data), ), takeEvery(EntryActionTypes.LABEL_CREATE_HANDLE, ({ payload: { label } }) => - handleLabelCreateService(label), + services.handleLabelCreate(label), ), takeEvery(EntryActionTypes.LABEL_UPDATE, ({ payload: { id, data } }) => - updateLabelService(id, data), + services.updateLabel(id, data), ), takeEvery(EntryActionTypes.LABEL_UPDATE_HANDLE, ({ payload: { label } }) => - handleLabelUpdateService(label), + services.handleLabelUpdate(label), ), - takeEvery(EntryActionTypes.LABEL_DELETE, ({ payload: { id } }) => deleteLabelService(id)), + takeEvery(EntryActionTypes.LABEL_DELETE, ({ payload: { id } }) => services.deleteLabel(id)), takeEvery(EntryActionTypes.LABEL_DELETE_HANDLE, ({ payload: { label } }) => - handleLabelDeleteService(label), + services.handleLabelDelete(label), ), takeEvery(EntryActionTypes.LABEL_TO_CARD_ADD, ({ payload: { id, cardId } }) => - addLabelToCardService(id, cardId), + services.addLabelToCard(id, cardId), ), takeEvery(EntryActionTypes.LABEL_TO_CURRENT_CARD_ADD, ({ payload: { id } }) => - addLabelToCurrentCardService(id), + services.addLabelToCurrentCard(id), ), takeEvery(EntryActionTypes.LABEL_TO_CARD_ADD_HANDLE, ({ payload: { cardLabel } }) => - handleLabelToCardAddService(cardLabel), + services.handleLabelToCardAdd(cardLabel), ), takeEvery(EntryActionTypes.LABEL_FROM_CARD_REMOVE, ({ payload: { id, cardId } }) => - removeLabelFromCardService(id, cardId), + services.removeLabelFromCard(id, cardId), ), takeEvery(EntryActionTypes.LABEL_FROM_CURRENT_CARD_REMOVE, ({ payload: { id } }) => - removeLabelFromCurrentCardService(id), + services.removeLabelFromCurrentCard(id), ), takeEvery(EntryActionTypes.LABEL_FROM_CARD_REMOVE_HANDLE, ({ payload: { cardLabel } }) => - handleLabelFromCardRemoveService(cardLabel), + services.handleLabelFromCardRemove(cardLabel), ), takeEvery(EntryActionTypes.LABEL_TO_FILTER_IN_CURRENT_BOARD_ADD, ({ payload: { id } }) => - addLabelToFilterInCurrentBoardService(id), + services.addLabelToFilterInCurrentBoard(id), ), takeEvery(EntryActionTypes.LABEL_FROM_FILTER_IN_CURRENT_BOARD_REMOVE, ({ payload: { id } }) => - removeLabelFromFilterInCurrentBoardService(id), + services.removeLabelFromFilterInCurrentBoard(id), ), ]); } diff --git a/client/src/sagas/core/watchers/list.js b/client/src/sagas/core/watchers/lists.js similarity index 58% rename from client/src/sagas/core/watchers/list.js rename to client/src/sagas/core/watchers/lists.js index 67462f8a..028881ed 100644 --- a/client/src/sagas/core/watchers/list.js +++ b/client/src/sagas/core/watchers/lists.js @@ -1,36 +1,28 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { - createListInCurrentBoardService, - deleteListService, - handleListCreateService, - handleListDeleteService, - handleListUpdateService, - moveListService, - updateListService, -} from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; -export default function* listWatchers() { +export default function* listsWatchers() { yield all([ takeEvery(EntryActionTypes.LIST_IN_CURRENT_BOARD_CREATE, ({ payload: { data } }) => - createListInCurrentBoardService(data), + services.createListInCurrentBoard(data), ), takeEvery(EntryActionTypes.LIST_CREATE_HANDLE, ({ payload: { list } }) => - handleListCreateService(list), + services.handleListCreate(list), ), takeEvery(EntryActionTypes.LIST_UPDATE, ({ payload: { id, data } }) => - updateListService(id, data), + services.updateList(id, data), ), takeEvery(EntryActionTypes.LIST_UPDATE_HANDLE, ({ payload: { list } }) => - handleListUpdateService(list), + services.handleListUpdate(list), ), takeEvery(EntryActionTypes.LIST_MOVE, ({ payload: { id, index } }) => - moveListService(id, index), + services.moveList(id, index), ), - takeEvery(EntryActionTypes.LIST_DELETE, ({ payload: { id } }) => deleteListService(id)), + takeEvery(EntryActionTypes.LIST_DELETE, ({ payload: { id } }) => services.deleteList(id)), takeEvery(EntryActionTypes.LIST_DELETE_HANDLE, ({ payload: { list } }) => - handleListDeleteService(list), + services.handleListDelete(list), ), ]); } diff --git a/client/src/sagas/core/watchers/login.js b/client/src/sagas/core/watchers/login.js deleted file mode 100644 index 84fd40c5..00000000 --- a/client/src/sagas/core/watchers/login.js +++ /dev/null @@ -1,8 +0,0 @@ -import { takeEvery } from 'redux-saga/effects'; - -import { logoutService } from '../services'; -import EntryActionTypes from '../../../constants/EntryActionTypes'; - -export default function* loginWatchers() { - yield takeEvery(EntryActionTypes.LOGOUT, () => logoutService()); -} diff --git a/client/src/sagas/core/watchers/modal.js b/client/src/sagas/core/watchers/modal.js deleted file mode 100644 index 50b6956a..00000000 --- a/client/src/sagas/core/watchers/modal.js +++ /dev/null @@ -1,11 +0,0 @@ -import { all, takeEvery } from 'redux-saga/effects'; - -import { closeModalService, openModalService } from '../services'; -import EntryActionTypes from '../../../constants/EntryActionTypes'; - -export default function* modalWatchers() { - yield all([ - takeEvery(EntryActionTypes.MODAL_OPEN, ({ payload: { type } }) => openModalService(type)), - takeEvery(EntryActionTypes.MODAL_CLOSE, () => closeModalService()), - ]); -} diff --git a/client/src/sagas/core/watchers/modals.js b/client/src/sagas/core/watchers/modals.js new file mode 100644 index 00000000..3d9cd5b0 --- /dev/null +++ b/client/src/sagas/core/watchers/modals.js @@ -0,0 +1,11 @@ +import { all, takeEvery } from 'redux-saga/effects'; + +import services from '../services'; +import EntryActionTypes from '../../../constants/EntryActionTypes'; + +export default function* modalsWatchers() { + yield all([ + takeEvery(EntryActionTypes.MODAL_OPEN, ({ payload: { type } }) => services.openModal(type)), + takeEvery(EntryActionTypes.MODAL_CLOSE, () => services.closeModal()), + ]); +} diff --git a/client/src/sagas/core/watchers/notification.js b/client/src/sagas/core/watchers/notifications.js similarity index 57% rename from client/src/sagas/core/watchers/notification.js rename to client/src/sagas/core/watchers/notifications.js index 93fb5ef3..c5c57283 100644 --- a/client/src/sagas/core/watchers/notification.js +++ b/client/src/sagas/core/watchers/notifications.js @@ -1,22 +1,18 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { - deleteNotificationService, - handleNotificationCreateService, - handleNotificationDeleteService, -} from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; -export default function* notificationWatchers() { +export default function* notificationsWatchers() { yield all([ takeEvery(EntryActionTypes.NOTIFICATION_CREATE_HANDLE, ({ payload: { notification } }) => - handleNotificationCreateService(notification), + services.handleNotificationCreate(notification), ), takeEvery(EntryActionTypes.NOTIFICATION_DELETE, ({ payload: { id } }) => - deleteNotificationService(id), + services.deleteNotification(id), ), takeEvery(EntryActionTypes.NOTIFICATION_DELETE_HANDLE, ({ payload: { notification } }) => - handleNotificationDeleteService(notification), + services.handleNotificationDelete(notification), ), ]); } diff --git a/client/src/sagas/core/watchers/project-manager.js b/client/src/sagas/core/watchers/project-managers.js similarity index 55% rename from client/src/sagas/core/watchers/project-manager.js rename to client/src/sagas/core/watchers/project-managers.js index 18c65a7b..bc140787 100644 --- a/client/src/sagas/core/watchers/project-manager.js +++ b/client/src/sagas/core/watchers/project-managers.js @@ -1,26 +1,21 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { - createManagerInCurrentProjectService, - deleteProjectManagerService, - handleProjectManagerCreateService, - handleProjectManagerDeleteService, -} from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; -export default function* projectManagerWatchers() { +export default function* projectManagersWatchers() { yield all([ takeEvery(EntryActionTypes.MANAGER_IN_CURRENT_PROJECT_CREATE, ({ payload: { data } }) => - createManagerInCurrentProjectService(data), + services.createManagerInCurrentProject(data), ), takeEvery(EntryActionTypes.PROJECT_MANAGER_CREATE_HANDLE, ({ payload: { projectManager } }) => - handleProjectManagerCreateService(projectManager), + services.handleProjectManagerCreate(projectManager), ), takeEvery(EntryActionTypes.PROJECT_MANAGER_DELETE, ({ payload: { id } }) => - deleteProjectManagerService(id), + services.deleteProjectManager(id), ), takeEvery(EntryActionTypes.PROJECT_MANAGER_DELETE_HANDLE, ({ payload: { projectManager } }) => - handleProjectManagerDeleteService(projectManager), + services.handleProjectManagerDelete(projectManager), ), ]); } diff --git a/client/src/sagas/core/watchers/project.js b/client/src/sagas/core/watchers/projects.js similarity index 51% rename from client/src/sagas/core/watchers/project.js rename to client/src/sagas/core/watchers/projects.js index 8283de1a..cd1acc04 100644 --- a/client/src/sagas/core/watchers/project.js +++ b/client/src/sagas/core/watchers/projects.js @@ -1,36 +1,28 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { - createProjectService, - deleteCurrentProjectService, - handleProjectCreateService, - handleProjectDeleteService, - handleProjectUpdateService, - updateCurrentProjectBackgroundImageService, - updateCurrentProjectService, -} from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; -export default function* projectWatchers() { +export default function* projectsWatchers() { yield all([ takeEvery(EntryActionTypes.PROJECT_CREATE, ({ payload: { data } }) => - createProjectService(data), + services.createProject(data), ), takeEvery(EntryActionTypes.PROJECT_CREATE_HANDLE, ({ payload: { project } }) => - handleProjectCreateService(project), + services.handleProjectCreate(project), ), takeEvery(EntryActionTypes.CURRENT_PROJECT_UPDATE, ({ payload: { data } }) => - updateCurrentProjectService(data), + services.updateCurrentProject(data), ), takeEvery(EntryActionTypes.PROJECT_UPDATE_HANDLE, ({ payload: { project } }) => - handleProjectUpdateService(project), + services.handleProjectUpdate(project), ), takeEvery(EntryActionTypes.CURRENT_PROJECT_BACKGROUND_IMAGE_UPDATE, ({ payload: { data } }) => - updateCurrentProjectBackgroundImageService(data), + services.updateCurrentProjectBackgroundImage(data), ), - takeEvery(EntryActionTypes.CURRENT_PROJECT_DELETE, () => deleteCurrentProjectService()), + takeEvery(EntryActionTypes.CURRENT_PROJECT_DELETE, () => services.deleteCurrentProject()), takeEvery(EntryActionTypes.PROJECT_DELETE_HANDLE, ({ payload: { project } }) => - handleProjectDeleteService(project), + services.handleProjectDelete(project), ), ]); } diff --git a/client/src/sagas/core/watchers/router.js b/client/src/sagas/core/watchers/router.js index c25472ab..da82c471 100755 --- a/client/src/sagas/core/watchers/router.js +++ b/client/src/sagas/core/watchers/router.js @@ -1,8 +1,8 @@ import { takeEvery } from 'redux-saga/effects'; import { LOCATION_CHANGE } from 'connected-react-router'; -import { handleLocationChangeService } from '../services'; +import services from '../services'; export default function* routerWatchers() { - yield takeEvery(LOCATION_CHANGE, () => handleLocationChangeService()); + yield takeEvery(LOCATION_CHANGE, () => services.handleLocationChange()); } diff --git a/client/src/sagas/core/watchers/socket.js b/client/src/sagas/core/watchers/socket.js index 0bbc18ac..e84a3ccc 100644 --- a/client/src/sagas/core/watchers/socket.js +++ b/client/src/sagas/core/watchers/socket.js @@ -1,208 +1,168 @@ import { eventChannel } from 'redux-saga'; import { all, call, cancelled, put, take, takeEvery } from 'redux-saga/effects'; -import { handleSocketDisconnectService, handleSocketReconnectService } from '../services'; -import { - handleProjectManagerCreate as handleProjectManagerCreateAction, - handleProjectManagerDelete as handleProjectManagerDeleteAction, - handleBoardCreate as handleBoardCreateAction, - handleBoardUpdate as handleBoardUpdateAction, - handleBoardDelete as handleBoardDeleteAction, - handleBoardMembershipCreate as handleBoardMembershipCreateAction, - handleBoardMembershipDelete as handleBoardMembershipDeleteAction, - handleListCreate as handleListCreateAction, - handleListUpdate as handleListUpdateAction, - handleListDelete as handleListDeleteAction, - handleLabelCreate as handleLabelCreateAction, - handleLabelUpdate as handleLabelUpdateAction, - handleLabelDelete as handleLabelDeleteAction, - handleCardCreate as handleCardCreateAction, - handleCardUpdate as handleCardUpdateAction, - handleCardDelete as handleCardDeleteAction, - handleUserToCardAdd as handleUserToCardAddAction, - handleUserFromCardRemove as handleUserFromCardRemoveAction, - handleLabelToCardAdd as handleLabelToCardAddAction, - handleLabelFromCardRemove as handleLabelFromCardRemoveAction, - handleTaskCreate as handleTaskCreateAction, - handleTaskUpdate as handleTaskUpdateAction, - handleTaskDelete as handleTaskDeleteAction, - handleAttachmentCreate as handleAttachmentCreateAction, - handleAttachmentUpdate as handleAttachmentUpdateAction, - handleAttachmentDelete as handleAttachmentDeleteAction, - handleActionCreate as handleActionCreateAction, - handleActionUpdate as handleActionUpdateAction, - handleActionDelete as handleActionDeleteAction, - handleNotificationCreate as handleNotificationCreateAction, - handleNotificationDelete as handleNotificationDeleteAction, - handleSocketDisconnect as handleSocketDisconnectAction, - handleUserCreate as handleUserCreateAction, - handleUserUpdate as handleUserUpdateAction, - handleUserDelete as handleUserDeleteAction, - handleProjectCreate as handleProjectCreateAction, - handleProjectUpdate as handleProjectUpdateAction, - handleProjectDelete as handleProjectDeleteAction, - handleSocketReconnect as handleSocketReconnectAction, -} from '../../../actions/entry'; +import services from '../services'; +import entryActions from '../../../entry-actions'; import api, { socket } from '../../../api'; import EntryActionTypes from '../../../constants/EntryActionTypes'; const createSocketEventsChannel = () => eventChannel((emit) => { const handleDisconnect = () => { - emit(handleSocketDisconnectAction()); + emit(entryActions.handleSocketDisconnect()); }; const handleReconnect = () => { - emit(handleSocketReconnectAction()); + emit(entryActions.handleSocketReconnect()); }; const handleUserCreate = ({ item }) => { - emit(handleUserCreateAction(item)); + emit(entryActions.handleUserCreate(item)); }; const handleUserUpdate = ({ item }) => { - emit(handleUserUpdateAction(item)); + emit(entryActions.handleUserUpdate(item)); }; const handleUserDelete = ({ item }) => { - emit(handleUserDeleteAction(item)); + emit(entryActions.handleUserDelete(item)); }; const handleProjectCreate = ({ item }) => { - emit(handleProjectCreateAction(item)); + emit(entryActions.handleProjectCreate(item)); }; const handleProjectUpdate = ({ item }) => { - emit(handleProjectUpdateAction(item)); + emit(entryActions.handleProjectUpdate(item)); }; const handleProjectDelete = ({ item }) => { - emit(handleProjectDeleteAction(item)); + emit(entryActions.handleProjectDelete(item)); }; const handleProjectManagerCreate = ({ item }) => { - emit(handleProjectManagerCreateAction(item)); + emit(entryActions.handleProjectManagerCreate(item)); }; const handleProjectManagerDelete = ({ item }) => { - emit(handleProjectManagerDeleteAction(item)); + emit(entryActions.handleProjectManagerDelete(item)); }; const handleBoardCreate = ({ item }) => { - emit(handleBoardCreateAction(item)); + emit(entryActions.handleBoardCreate(item)); }; const handleBoardUpdate = ({ item }) => { - emit(handleBoardUpdateAction(item)); + emit(entryActions.handleBoardUpdate(item)); }; const handleBoardDelete = ({ item }) => { - emit(handleBoardDeleteAction(item)); + emit(entryActions.handleBoardDelete(item)); }; const handleBoardMembershipCreate = ({ item }) => { - emit(handleBoardMembershipCreateAction(item)); + emit(entryActions.handleBoardMembershipCreate(item)); }; const handleBoardMembershipDelete = ({ item }) => { - emit(handleBoardMembershipDeleteAction(item)); + emit(entryActions.handleBoardMembershipDelete(item)); }; const handleListCreate = ({ item }) => { - emit(handleListCreateAction(item)); + emit(entryActions.handleListCreate(item)); }; const handleListUpdate = ({ item }) => { - emit(handleListUpdateAction(item)); + emit(entryActions.handleListUpdate(item)); }; const handleListDelete = ({ item }) => { - emit(handleListDeleteAction(item)); + emit(entryActions.handleListDelete(item)); }; const handleLabelCreate = ({ item }) => { - emit(handleLabelCreateAction(item)); + emit(entryActions.handleLabelCreate(item)); }; const handleLabelUpdate = ({ item }) => { - emit(handleLabelUpdateAction(item)); + emit(entryActions.handleLabelUpdate(item)); }; const handleLabelDelete = ({ item }) => { - emit(handleLabelDeleteAction(item)); + emit(entryActions.handleLabelDelete(item)); }; const handleCardCreate = api.makeHandleCardCreate(({ item }) => { - emit(handleCardCreateAction(item)); + emit(entryActions.handleCardCreate(item)); }); const handleCardUpdate = api.makeHandleCardUpdate(({ item }) => { - emit(handleCardUpdateAction(item)); + emit(entryActions.handleCardUpdate(item)); }); const handleCardDelete = api.makeHandleCardDelete(({ item }) => { - emit(handleCardDeleteAction(item)); + emit(entryActions.handleCardDelete(item)); }); const handleUserToCardAdd = ({ item }) => { - emit(handleUserToCardAddAction(item)); + emit(entryActions.handleUserToCardAdd(item)); }; const handleUserFromCardRemove = ({ item }) => { - emit(handleUserFromCardRemoveAction(item)); + emit(entryActions.handleUserFromCardRemove(item)); }; const handleLabelToCardAdd = ({ item }) => { - emit(handleLabelToCardAddAction(item)); + emit(entryActions.handleLabelToCardAdd(item)); }; const handleLabelFromCardRemove = ({ item }) => { - emit(handleLabelFromCardRemoveAction(item)); + emit(entryActions.handleLabelFromCardRemove(item)); }; const handleTaskCreate = ({ item }) => { - emit(handleTaskCreateAction(item)); + emit(entryActions.handleTaskCreate(item)); }; const handleTaskUpdate = ({ item }) => { - emit(handleTaskUpdateAction(item)); + emit(entryActions.handleTaskUpdate(item)); }; const handleTaskDelete = ({ item }) => { - emit(handleTaskDeleteAction(item)); + emit(entryActions.handleTaskDelete(item)); }; const handleAttachmentCreate = api.makeHandleAttachmentCreate(({ item, requestId }) => { - emit(handleAttachmentCreateAction(item, requestId)); + emit(entryActions.handleAttachmentCreate(item, requestId)); }); const handleAttachmentUpdate = api.makeHandleAttachmentUpdate(({ item }) => { - emit(handleAttachmentUpdateAction(item)); + emit(entryActions.handleAttachmentUpdate(item)); }); const handleAttachmentDelete = api.makeHandleAttachmentDelete(({ item }) => { - emit(handleAttachmentDeleteAction(item)); + emit(entryActions.handleAttachmentDelete(item)); }); - const handleActionCreate = api.makeHandleActionCreate(({ item }) => { - emit(handleActionCreateAction(item)); + const handleActivityCreate = api.makeHandleActivityCreate(({ item }) => { + emit(entryActions.handleActivityCreate(item)); }); - const handleActionUpdate = api.makeHandleActionUpdate(({ item }) => { - emit(handleActionUpdateAction(item)); + const handleActivityUpdate = api.makeHandleActivityUpdate(({ item }) => { + emit(entryActions.handleActivityUpdate(item)); }); - const handleActionDelete = api.makeHandleActionDelete(({ item }) => { - emit(handleActionDeleteAction(item)); + const handleActivityDelete = api.makeHandleActivityDelete(({ item }) => { + emit(entryActions.handleActivityDelete(item)); }); - const handleNotificationCreate = ({ item }) => { - emit(handleNotificationCreateAction(item)); - }; + const handleNotificationCreate = api.makeHandleNotificationCreate(({ item }) => { + emit(entryActions.handleNotificationCreate(item)); + }); - const handleNotificationDelete = ({ item }) => { - emit(handleNotificationDeleteAction(item)); - }; + const handleNotificationUpdate = api.makeHandleNotificationUpdate(({ item }) => { + emit(entryActions.handleNotificationDelete(item)); + }); socket.on('disconnect', handleDisconnect); socket.on('reconnect', handleReconnect); @@ -251,12 +211,12 @@ const createSocketEventsChannel = () => socket.on('attachmentUpdate', handleAttachmentUpdate); socket.on('attachmentDelete', handleAttachmentDelete); - socket.on('actionCreate', handleActionCreate); - socket.on('actionUpdate', handleActionUpdate); - socket.on('actionDelete', handleActionDelete); + socket.on('actionCreate', handleActivityCreate); + socket.on('actionUpdate', handleActivityUpdate); + socket.on('actionDelete', handleActivityDelete); socket.on('notificationCreate', handleNotificationCreate); - socket.on('notificationUpdate', handleNotificationDelete); + socket.on('notificationUpdate', handleNotificationUpdate); return () => { socket.off('disconnect', handleDisconnect); @@ -306,21 +266,23 @@ const createSocketEventsChannel = () => socket.off('attachmentUpdate', handleAttachmentUpdate); socket.off('attachmentDelete', handleAttachmentDelete); - socket.off('actionCreate', handleActionCreate); - socket.off('actionUpdate', handleActionUpdate); - socket.off('actionDelete', handleActionDelete); + socket.off('actionCreate', handleActivityCreate); + socket.off('actionUpdate', handleActivityUpdate); + socket.off('actionDelete', handleActivityDelete); socket.off('notificationCreate', handleNotificationCreate); - socket.off('notificationUpdate', handleNotificationDelete); + socket.off('notificationUpdate', handleNotificationUpdate); }; }); export default function* socketWatchers() { yield all([ yield takeEvery(EntryActionTypes.SOCKET_DISCONNECT_HANDLE, () => - handleSocketDisconnectService(), + services.handleSocketDisconnect(), + ), + yield takeEvery(EntryActionTypes.SOCKET_RECONNECT_HANDLE, () => + services.handleSocketReconnect(), ), - yield takeEvery(EntryActionTypes.SOCKET_RECONNECT_HANDLE, () => handleSocketReconnectService()), ]); const socketEventsChannel = yield call(createSocketEventsChannel); diff --git a/client/src/sagas/core/watchers/task.js b/client/src/sagas/core/watchers/tasks.js similarity index 58% rename from client/src/sagas/core/watchers/task.js rename to client/src/sagas/core/watchers/tasks.js index dacd0575..ef733f07 100644 --- a/client/src/sagas/core/watchers/task.js +++ b/client/src/sagas/core/watchers/tasks.js @@ -1,36 +1,28 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { - createTaskInCurrentCardService, - deleteTaskService, - handleTaskCreateService, - handleTaskDeleteService, - handleTaskUpdateService, - moveTaskService, - updateTaskService, -} from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; -export default function* taskWatchers() { +export default function* tasksWatchers() { yield all([ takeEvery(EntryActionTypes.TASK_IN_CURRENT_CARD_CREATE, ({ payload: { data } }) => - createTaskInCurrentCardService(data), + services.createTaskInCurrentCard(data), ), takeEvery(EntryActionTypes.TASK_CREATE_HANDLE, ({ payload: { task } }) => - handleTaskCreateService(task), + services.handleTaskCreate(task), ), takeEvery(EntryActionTypes.TASK_UPDATE, ({ payload: { id, data } }) => - updateTaskService(id, data), + services.updateTask(id, data), ), takeEvery(EntryActionTypes.TASK_UPDATE_HANDLE, ({ payload: { task } }) => - handleTaskUpdateService(task), + services.handleTaskUpdate(task), ), takeEvery(EntryActionTypes.TASK_MOVE, ({ payload: { id, index } }) => - moveTaskService(id, index), + services.moveTask(id, index), ), - takeEvery(EntryActionTypes.TASK_DELETE, ({ payload: { id } }) => deleteTaskService(id)), + takeEvery(EntryActionTypes.TASK_DELETE, ({ payload: { id } }) => services.deleteTask(id)), takeEvery(EntryActionTypes.TASK_DELETE_HANDLE, ({ payload: { task } }) => - handleTaskDeleteService(task), + services.handleTaskDelete(task), ), ]); } diff --git a/client/src/sagas/core/watchers/user.js b/client/src/sagas/core/watchers/users.js similarity index 53% rename from client/src/sagas/core/watchers/user.js rename to client/src/sagas/core/watchers/users.js index 48589b91..e12024e5 100644 --- a/client/src/sagas/core/watchers/user.js +++ b/client/src/sagas/core/watchers/users.js @@ -1,124 +1,93 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { - addUserToCardService, - addUserToCurrentCardService, - addUserToFilterInCurrentBoardService, - clearCurrentUserEmailUpdateErrorService, - clearCurrentUserPasswordUpdateErrorService, - clearCurrentUserUsernameUpdateErrorService, - clearUserCreateErrorService, - clearUserEmailUpdateErrorService, - clearUserPasswordUpdateErrorService, - clearUserUsernameUpdateErrorService, - createUserService, - deleteUserService, - handleUserCreateService, - handleUserDeleteService, - handleUserFromCardRemoveService, - handleUserToCardAddService, - handleUserUpdateService, - removeUserFromCardService, - removeUserFromCurrentCardService, - removeUserFromFilterInCurrentBoardService, - updateUserService, - updateCurrentUserAvatarService, - updateCurrentUserEmailService, - updateCurrentUserLanguageService, - updateCurrentUserPasswordService, - updateCurrentUserService, - updateCurrentUserUsernameService, - updateUserEmailService, - updateUserPasswordService, - updateUserUsernameService, -} from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; -export default function* userWatchers() { +export default function* usersWatchers() { yield all([ - takeEvery(EntryActionTypes.USER_CREATE, ({ payload: { data } }) => createUserService(data)), + takeEvery(EntryActionTypes.USER_CREATE, ({ payload: { data } }) => services.createUser(data)), takeEvery(EntryActionTypes.USER_CREATE_HANDLE, ({ payload: { user } }) => - handleUserCreateService(user), + services.handleUserCreate(user), ), - takeEvery(EntryActionTypes.USER_CREATE_ERROR_CLEAR, () => clearUserCreateErrorService()), + takeEvery(EntryActionTypes.USER_CREATE_ERROR_CLEAR, () => services.clearUserCreateError()), takeEvery(EntryActionTypes.USER_UPDATE, ({ payload: { id, data } }) => - updateUserService(id, data), + services.updateUser(id, data), ), takeEvery(EntryActionTypes.CURRENT_USER_UPDATE, ({ payload: { data } }) => - updateCurrentUserService(data), + services.updateCurrentUser(data), ), takeEvery(EntryActionTypes.USER_UPDATE_HANDLE, ({ payload: { user } }) => - handleUserUpdateService(user), + services.handleUserUpdate(user), ), takeEvery(EntryActionTypes.CURRENT_USER_LANGUAGE_UPDATE, ({ payload: { language } }) => - updateCurrentUserLanguageService(language), + services.updateCurrentUserLanguage(language), ), takeEvery(EntryActionTypes.USER_EMAIL_UPDATE, ({ payload: { id, data } }) => - updateUserEmailService(id, data), + services.updateUserEmail(id, data), ), takeEvery(EntryActionTypes.CURRENT_USER_EMAIL_UPDATE, ({ payload: { data } }) => - updateCurrentUserEmailService(data), + services.updateCurrentUserEmail(data), ), takeEvery(EntryActionTypes.USER_EMAIL_UPDATE_ERROR_CLEAR, ({ payload: { id } }) => - clearUserEmailUpdateErrorService(id), + services.clearUserEmailUpdateError(id), ), takeEvery(EntryActionTypes.CURRENT_USER_EMAIL_UPDATE_ERROR_CLEAR, () => - clearCurrentUserEmailUpdateErrorService(), + services.clearCurrentUserEmailUpdateError(), ), takeEvery(EntryActionTypes.USER_PASSWORD_UPDATE, ({ payload: { id, data } }) => - updateUserPasswordService(id, data), + services.updateUserPassword(id, data), ), takeEvery(EntryActionTypes.CURRENT_USER_PASSWORD_UPDATE, ({ payload: { data } }) => - updateCurrentUserPasswordService(data), + services.updateCurrentUserPassword(data), ), takeEvery(EntryActionTypes.USER_PASSWORD_UPDATE_ERROR_CLEAR, ({ payload: { id } }) => - clearUserPasswordUpdateErrorService(id), + services.clearUserPasswordUpdateError(id), ), takeEvery(EntryActionTypes.CURRENT_USER_PASSWORD_UPDATE_ERROR_CLEAR, () => - clearCurrentUserPasswordUpdateErrorService(), + services.clearCurrentUserPasswordUpdateError(), ), takeEvery(EntryActionTypes.USER_USERNAME_UPDATE, ({ payload: { id, data } }) => - updateUserUsernameService(id, data), + services.updateUserUsername(id, data), ), takeEvery(EntryActionTypes.CURRENT_USER_USERNAME_UPDATE, ({ payload: { data } }) => - updateCurrentUserUsernameService(data), + services.updateCurrentUserUsername(data), ), takeEvery(EntryActionTypes.USER_USERNAME_UPDATE_ERROR_CLEAR, ({ payload: { id } }) => - clearUserUsernameUpdateErrorService(id), + services.clearUserUsernameUpdateError(id), ), takeEvery(EntryActionTypes.CURRENT_USER_USERNAME_UPDATE_ERROR_CLEAR, () => - clearCurrentUserUsernameUpdateErrorService(), + services.clearCurrentUserUsernameUpdateError(), ), takeEvery(EntryActionTypes.CURRENT_USER_AVATAR_UPDATE, ({ payload: { data } }) => - updateCurrentUserAvatarService(data), + services.updateCurrentUserAvatar(data), ), - takeEvery(EntryActionTypes.USER_DELETE, ({ payload: { id } }) => deleteUserService(id)), + takeEvery(EntryActionTypes.USER_DELETE, ({ payload: { id } }) => services.deleteUser(id)), takeEvery(EntryActionTypes.USER_DELETE_HANDLE, ({ payload: { user } }) => - handleUserDeleteService(user), + services.handleUserDelete(user), ), takeEvery(EntryActionTypes.USER_TO_CARD_ADD, ({ payload: { id, cardId } }) => - addUserToCardService(id, cardId), + services.addUserToCard(id, cardId), ), takeEvery(EntryActionTypes.USER_TO_CURRENT_CARD_ADD, ({ payload: { id } }) => - addUserToCurrentCardService(id), + services.addUserToCurrentCard(id), ), takeEvery(EntryActionTypes.USER_TO_CARD_ADD_HANDLE, ({ payload: { cardMembership } }) => - handleUserToCardAddService(cardMembership), + services.handleUserToCardAdd(cardMembership), ), takeEvery(EntryActionTypes.USER_FROM_CARD_REMOVE, ({ payload: { id, cardId } }) => - removeUserFromCardService(id, cardId), + services.removeUserFromCard(id, cardId), ), takeEvery(EntryActionTypes.USER_FROM_CURRENT_CARD_REMOVE, ({ payload: { id } }) => - removeUserFromCurrentCardService(id), + services.removeUserFromCurrentCard(id), ), takeEvery(EntryActionTypes.USER_FROM_CARD_REMOVE_HANDLE, ({ payload: { cardMembership } }) => - handleUserFromCardRemoveService(cardMembership), + services.handleUserFromCardRemove(cardMembership), ), takeEvery(EntryActionTypes.USER_TO_FILTER_IN_CURRENT_BOARD_ADD, ({ payload: { id } }) => - addUserToFilterInCurrentBoardService(id), + services.addUserToFilterInCurrentBoard(id), ), takeEvery(EntryActionTypes.USER_FROM_FILTER_IN_CURRENT_BOARD_REMOVE, ({ payload: { id } }) => - removeUserFromFilterInCurrentBoardService(id), + services.removeUserFromFilterInCurrentBoard(id), ), ]); } diff --git a/client/src/sagas/login/index.js b/client/src/sagas/login/index.js index 5ebd39c1..785de29d 100755 --- a/client/src/sagas/login/index.js +++ b/client/src/sagas/login/index.js @@ -1,7 +1,7 @@ import { all, call, cancel, fork, take } from 'redux-saga/effects'; import watchers from './watchers'; -import { goToRootService } from './services'; +import services from './services'; import { setAccessToken } from '../../utils/access-token-storage'; import ActionTypes from '../../constants/ActionTypes'; @@ -15,5 +15,5 @@ export default function* loginSaga() { yield cancel(watcherTasks); yield call(setAccessToken, accessToken); - yield call(goToRootService); + yield call(services.goToRoot); } diff --git a/client/src/sagas/login/services/index.js b/client/src/sagas/login/services/index.js index f1356edc..6af91e49 100644 --- a/client/src/sagas/login/services/index.js +++ b/client/src/sagas/login/services/index.js @@ -1,2 +1,7 @@ -export * from './router'; -export * from './login'; +import router from './router'; +import login from './login'; + +export default { + ...router, + ...login, +}; diff --git a/client/src/sagas/login/services/login.js b/client/src/sagas/login/services/login.js index 38c41623..f4a6d39a 100644 --- a/client/src/sagas/login/services/login.js +++ b/client/src/sagas/login/services/login.js @@ -1,22 +1,27 @@ import { call, put } from 'redux-saga/effects'; -import { authenticate, clearAuthenticateError } from '../../../actions'; +import actions from '../../../actions'; import api from '../../../api'; -export function* authenticateService(data) { - yield put(authenticate(data)); +export function* authenticate(data) { + yield put(actions.authenticate(data)); let accessToken; try { ({ item: accessToken } = yield call(api.createAccessToken, data)); } catch (error) { - yield put(authenticate.failure(error)); + yield put(actions.authenticate.failure(error)); return; } - yield put(authenticate.success(accessToken)); + yield put(actions.authenticate.success(accessToken)); } -export function* clearAuthenticateErrorService() { - yield put(clearAuthenticateError()); +export function* clearAuthenticateError() { + yield put(actions.clearAuthenticateError()); } + +export default { + authenticate, + clearAuthenticateError, +}; diff --git a/client/src/sagas/login/services/router.js b/client/src/sagas/login/services/router.js index 3ca6ed2e..1aa806e8 100644 --- a/client/src/sagas/login/services/router.js +++ b/client/src/sagas/login/services/router.js @@ -1,19 +1,19 @@ import { call, put, select } from 'redux-saga/effects'; import { push } from 'connected-react-router'; -import { pathsMatchSelector } from '../../../selectors'; +import selectors from '../../../selectors'; import Paths from '../../../constants/Paths'; -export function* goToLoginService() { +export function* goToLogin() { yield put(push(Paths.LOGIN)); } -export function* goToRootService() { +export function* goToRoot() { yield put(push(Paths.ROOT)); } -export function* handleLocationChangeService() { - const pathsMatch = yield select(pathsMatchSelector); +export function* handleLocationChange() { + const pathsMatch = yield select(selectors.selectPathsMatch); if (!pathsMatch) { return; @@ -24,9 +24,15 @@ export function* handleLocationChangeService() { case Paths.PROJECTS: case Paths.BOARDS: case Paths.CARDS: - yield call(goToLoginService); + yield call(goToLogin); break; default: } } + +export default { + goToLogin, + goToRoot, + handleLocationChange, +}; diff --git a/client/src/sagas/login/watchers/login.js b/client/src/sagas/login/watchers/login.js index aed70190..9741b981 100644 --- a/client/src/sagas/login/watchers/login.js +++ b/client/src/sagas/login/watchers/login.js @@ -1,11 +1,13 @@ import { all, takeEvery } from 'redux-saga/effects'; -import { authenticateService, clearAuthenticateErrorService } from '../services'; +import services from '../services'; import EntryActionTypes from '../../../constants/EntryActionTypes'; export default function* loginWatchers() { yield all([ - takeEvery(EntryActionTypes.AUTHENTICATE, ({ payload: { data } }) => authenticateService(data)), - takeEvery(EntryActionTypes.AUTHENTICATE_ERROR_CLEAR, () => clearAuthenticateErrorService()), + takeEvery(EntryActionTypes.AUTHENTICATE, ({ payload: { data } }) => + services.authenticate(data), + ), + takeEvery(EntryActionTypes.AUTHENTICATE_ERROR_CLEAR, () => services.clearAuthenticateError()), ]); } diff --git a/client/src/sagas/login/watchers/router.js b/client/src/sagas/login/watchers/router.js index c25472ab..da82c471 100755 --- a/client/src/sagas/login/watchers/router.js +++ b/client/src/sagas/login/watchers/router.js @@ -1,8 +1,8 @@ import { takeEvery } from 'redux-saga/effects'; import { LOCATION_CHANGE } from 'connected-react-router'; -import { handleLocationChangeService } from '../services'; +import services from '../services'; export default function* routerWatchers() { - yield takeEvery(LOCATION_CHANGE, () => handleLocationChangeService()); + yield takeEvery(LOCATION_CHANGE, () => services.handleLocationChange()); } diff --git a/client/src/selectors/attachment.js b/client/src/selectors/attachments.js similarity index 55% rename from client/src/selectors/attachment.js rename to client/src/selectors/attachments.js index 8ec5ec62..80fb55b3 100644 --- a/client/src/selectors/attachment.js +++ b/client/src/selectors/attachments.js @@ -2,9 +2,12 @@ import { createSelector } from 'redux-orm'; import orm from '../orm'; -// eslint-disable-next-line import/prefer-default-export -export const isAttachmentWithIdExistsSelector = createSelector( +export const selectIsAttachmentWithIdExists = createSelector( orm, (_, id) => id, ({ Attachment }, id) => Attachment.idExists(id), ); + +export default { + selectIsAttachmentWithIdExists, +}; diff --git a/client/src/selectors/auth.js b/client/src/selectors/auth.js index 21deed96..5f86ff36 100644 --- a/client/src/selectors/auth.js +++ b/client/src/selectors/auth.js @@ -1,2 +1,5 @@ -// eslint-disable-next-line import/prefer-default-export -export const accessTokenSelector = ({ auth: { accessToken } }) => accessToken; +export const selectAccessToken = ({ auth: { accessToken } }) => accessToken; + +export default { + selectAccessToken, +}; diff --git a/client/src/selectors/board-membership.js b/client/src/selectors/board-memberships.js similarity index 62% rename from client/src/selectors/board-membership.js rename to client/src/selectors/board-memberships.js index 879fa19c..4051d8ef 100644 --- a/client/src/selectors/board-membership.js +++ b/client/src/selectors/board-memberships.js @@ -2,7 +2,7 @@ import { createSelector } from 'redux-orm'; import orm from '../orm'; -export const makeBoardMembershipByIdSelector = () => +export const makeSelectBoardMembershipById = () => createSelector( orm, (_, id) => id, @@ -17,4 +17,9 @@ export const makeBoardMembershipByIdSelector = () => }, ); -export const boardMembershipByIdSelector = makeBoardMembershipByIdSelector(); +export const selectBoardMembershipById = makeSelectBoardMembershipById(); + +export default { + makeSelectBoardMembershipById, + selectBoardMembershipById, +}; diff --git a/client/src/selectors/board.js b/client/src/selectors/boards.js similarity index 64% rename from client/src/selectors/board.js rename to client/src/selectors/boards.js index 740a19d0..cb0cec52 100644 --- a/client/src/selectors/board.js +++ b/client/src/selectors/boards.js @@ -1,11 +1,11 @@ import { createSelector } from 'redux-orm'; import orm from '../orm'; -import { pathSelector } from './router'; -import { currentUserIdSelector } from './user'; +import { selectPath } from './router'; +import { selectCurrentUserId } from './users'; import { isLocalId } from '../utils/local-id'; -export const makeBoardByIdSelector = () => +export const makeSelectBoardById = () => createSelector( orm, (_, id) => id, @@ -20,11 +20,11 @@ export const makeBoardByIdSelector = () => }, ); -export const boardByIdSelector = makeBoardByIdSelector(); +export const selectBoardById = makeSelectBoardById(); -export const currentBoardSelector = createSelector( +export const selectCurrentBoard = createSelector( orm, - (state) => pathSelector(state).boardId, + (state) => selectPath(state).boardId, ({ Board }, id) => { if (!id) { return id; @@ -40,10 +40,10 @@ export const currentBoardSelector = createSelector( }, ); -export const membershipsForCurrentBoardSelector = createSelector( +export const selectMembershipsForCurrentBoard = createSelector( orm, - (state) => pathSelector(state).boardId, - (state) => currentUserIdSelector(state), + (state) => selectPath(state).boardId, + (state) => selectCurrentUserId(state), ({ Board }, id, currentUserId) => { if (!id) { return id; @@ -69,9 +69,9 @@ export const membershipsForCurrentBoardSelector = createSelector( }, ); -export const labelsForCurrentBoardSelector = createSelector( +export const selectLabelsForCurrentBoard = createSelector( orm, - (state) => pathSelector(state).boardId, + (state) => selectPath(state).boardId, ({ Board }, id) => { if (!id) { return id; @@ -90,9 +90,9 @@ export const labelsForCurrentBoardSelector = createSelector( }, ); -export const listIdsForCurrentBoardSelector = createSelector( +export const selectListIdsForCurrentBoard = createSelector( orm, - (state) => pathSelector(state).boardId, + (state) => selectPath(state).boardId, ({ Board }, id) => { if (!id) { return id; @@ -111,9 +111,9 @@ export const listIdsForCurrentBoardSelector = createSelector( }, ); -export const filterUsersForCurrentBoardSelector = createSelector( +export const selectFilterUsersForCurrentBoard = createSelector( orm, - (state) => pathSelector(state).boardId, + (state) => selectPath(state).boardId, ({ Board }, id) => { if (!id) { return id; @@ -129,9 +129,9 @@ export const filterUsersForCurrentBoardSelector = createSelector( }, ); -export const filterLabelsForCurrentBoardSelector = createSelector( +export const selectFilterLabelsForCurrentBoard = createSelector( orm, - (state) => pathSelector(state).boardId, + (state) => selectPath(state).boardId, ({ Board }, id) => { if (!id) { return id; @@ -147,10 +147,10 @@ export const filterLabelsForCurrentBoardSelector = createSelector( }, ); -export const isCurrentUserMemberForCurrentBoardSelector = createSelector( +export const selectIsCurrentUserMemberForCurrentBoard = createSelector( orm, - (state) => pathSelector(state).boardId, - (state) => currentUserIdSelector(state), + (state) => selectPath(state).boardId, + (state) => selectCurrentUserId(state), ({ Board }, id, currentUserId) => { if (!id) { return false; @@ -165,3 +165,15 @@ export const isCurrentUserMemberForCurrentBoardSelector = createSelector( return boardModel.hasMemberUser(currentUserId); }, ); + +export default { + makeSelectBoardById, + selectBoardById, + selectCurrentBoard, + selectMembershipsForCurrentBoard, + selectLabelsForCurrentBoard, + selectListIdsForCurrentBoard, + selectFilterUsersForCurrentBoard, + selectFilterLabelsForCurrentBoard, + selectIsCurrentUserMemberForCurrentBoard, +}; diff --git a/client/src/selectors/card.js b/client/src/selectors/cards.js similarity index 58% rename from client/src/selectors/card.js rename to client/src/selectors/cards.js index 6252cddb..8f100d57 100644 --- a/client/src/selectors/card.js +++ b/client/src/selectors/cards.js @@ -1,11 +1,11 @@ import { createSelector } from 'redux-orm'; import orm from '../orm'; -import { pathSelector } from './router'; -import { currentUserIdSelector } from './user'; +import { selectPath } from './router'; +import { selectCurrentUserId } from './users'; import { isLocalId } from '../utils/local-id'; -export const makeCardByIdSelector = () => +export const makeSelectCardById = () => createSelector( orm, (_, id) => id, @@ -24,9 +24,9 @@ export const makeCardByIdSelector = () => }, ); -export const cardByIdSelector = makeCardByIdSelector(); +export const selectCardById = makeSelectCardById(); -export const makeUsersByCardIdSelector = () => +export const makeSelectUsersByCardId = () => createSelector( orm, (_, id) => id, @@ -41,9 +41,9 @@ export const makeUsersByCardIdSelector = () => }, ); -export const usersByCardIdSelector = makeUsersByCardIdSelector(); +export const selectUsersByCardId = makeSelectUsersByCardId(); -export const makeLabelsByCardIdSelector = () => +export const makeSelectLabelsByCardId = () => createSelector( orm, (_, id) => id, @@ -58,9 +58,9 @@ export const makeLabelsByCardIdSelector = () => }, ); -export const labelsByCardIdSelector = makeLabelsByCardIdSelector(); +export const selectLabelsByCardId = makeSelectLabelsByCardId(); -export const makeTasksByCardIdSelector = () => +export const makeSelectTasksByCardId = () => createSelector( orm, (_, id) => id, @@ -75,9 +75,9 @@ export const makeTasksByCardIdSelector = () => }, ); -export const tasksByCardIdSelector = makeTasksByCardIdSelector(); +export const selectTasksByCardId = makeSelectTasksByCardId(); -export const makeLastActionIdByCardIdSelector = () => +export const makeSelectLastActivityIdByCardId = () => createSelector( orm, (_, id) => id, @@ -88,15 +88,15 @@ export const makeLastActionIdByCardIdSelector = () => return cardModel; } - const lastActionModel = cardModel.getFilteredOrderedInCardActionsQuerySet().last(); + const lastActivityModel = cardModel.getFilteredOrderedInCardActivitiesQuerySet().last(); - return lastActionModel && lastActionModel.id; + return lastActivityModel && lastActivityModel.id; }, ); -export const lastActionIdByCardIdSelector = makeLastActionIdByCardIdSelector(); +export const selectLastActivityIdByCardId = makeSelectLastActivityIdByCardId(); -export const makeNotificationsByCardIdSelector = () => +export const makeSelectNotificationsByCardId = () => createSelector( orm, (_, id) => id, @@ -111,9 +111,9 @@ export const makeNotificationsByCardIdSelector = () => }, ); -export const notificationsByCardIdSelector = makeNotificationsByCardIdSelector(); +export const selectNotificationsByCardId = makeSelectNotificationsByCardId(); -export const makeNotificationsTotalByCardIdSelector = () => +export const makeSelectNotificationsTotalByCardId = () => createSelector( orm, (_, id) => id, @@ -128,11 +128,11 @@ export const makeNotificationsTotalByCardIdSelector = () => }, ); -export const notificationsTotalByCardIdSelector = makeNotificationsTotalByCardIdSelector(); +export const selectNotificationsTotalByCardId = makeSelectNotificationsTotalByCardId(); -export const currentCardSelector = createSelector( +export const selectCurrentCard = createSelector( orm, - (state) => pathSelector(state).cardId, + (state) => selectPath(state).cardId, ({ Card }, id) => { if (!id) { return id; @@ -148,9 +148,9 @@ export const currentCardSelector = createSelector( }, ); -export const usersForCurrentCardSelector = createSelector( +export const selectUsersForCurrentCard = createSelector( orm, - (state) => pathSelector(state).cardId, + (state) => selectPath(state).cardId, ({ Card }, id) => { if (!id) { return id; @@ -166,9 +166,9 @@ export const usersForCurrentCardSelector = createSelector( }, ); -export const labelsForCurrentCardSelector = createSelector( +export const selectLabelsForCurrentCard = createSelector( orm, - (state) => pathSelector(state).cardId, + (state) => selectPath(state).cardId, ({ Card }, id) => { if (!id) { return id; @@ -184,9 +184,9 @@ export const labelsForCurrentCardSelector = createSelector( }, ); -export const tasksForCurrentCardSelector = createSelector( +export const selectTasksForCurrentCard = createSelector( orm, - (state) => pathSelector(state).cardId, + (state) => selectPath(state).cardId, ({ Card }, id) => { if (!id) { return id; @@ -208,9 +208,9 @@ export const tasksForCurrentCardSelector = createSelector( }, ); -export const attachmentsForCurrentCardSelector = createSelector( +export const selectAttachmentsForCurrentCard = createSelector( orm, - (state) => pathSelector(state).cardId, + (state) => selectPath(state).cardId, ({ Card }, id) => { if (!id) { return id; @@ -233,10 +233,10 @@ export const attachmentsForCurrentCardSelector = createSelector( }, ); -export const actionsForCurrentCardSelector = createSelector( +export const selectActivitiesForCurrentCard = createSelector( orm, - (state) => pathSelector(state).cardId, - (state) => currentUserIdSelector(state), + (state) => selectPath(state).cardId, + (state) => selectCurrentUserId(state), ({ Card }, id, currentUserId) => { if (!id) { return id; @@ -249,22 +249,22 @@ export const actionsForCurrentCardSelector = createSelector( } return cardModel - .getFilteredOrderedInCardActionsQuerySet() + .getFilteredOrderedInCardActivitiesQuerySet() .toModelArray() - .map((actionModel) => ({ - ...actionModel.ref, - isPersisted: !isLocalId(actionModel.id), + .map((activityModel) => ({ + ...activityModel.ref, + isPersisted: !isLocalId(activityModel.id), user: { - ...actionModel.user.ref, - isCurrent: actionModel.user.id === currentUserId, + ...activityModel.user.ref, + isCurrent: activityModel.user.id === currentUserId, }, })); }, ); -export const notificationIdsForCurrentCardSelector = createSelector( +export const selectNotificationIdsForCurrentCard = createSelector( orm, - (state) => pathSelector(state).cardId, + (state) => selectPath(state).cardId, ({ Card }, id) => { if (!id) { return id; @@ -282,3 +282,27 @@ export const notificationIdsForCurrentCardSelector = createSelector( .map((notification) => notification.id); }, ); + +export default { + makeSelectCardById, + selectCardById, + makeSelectUsersByCardId, + selectUsersByCardId, + makeSelectLabelsByCardId, + selectLabelsByCardId, + makeSelectTasksByCardId, + selectTasksByCardId, + makeSelectLastActivityIdByCardId, + selectLastActivityIdByCardId, + makeSelectNotificationsByCardId, + selectNotificationsByCardId, + makeSelectNotificationsTotalByCardId, + selectNotificationsTotalByCardId, + selectCurrentCard, + selectUsersForCurrentCard, + selectLabelsForCurrentCard, + selectTasksForCurrentCard, + selectAttachmentsForCurrentCard, + selectActivitiesForCurrentCard, + selectNotificationIdsForCurrentCard, +}; diff --git a/client/src/selectors/core.js b/client/src/selectors/core.js index a703f00f..0bd9edfe 100755 --- a/client/src/selectors/core.js +++ b/client/src/selectors/core.js @@ -4,7 +4,7 @@ import isUndefined from 'lodash/isUndefined'; import orm from '../orm'; import Config from '../constants/Config'; -export const isCoreInitializingSelector = ({ core: { isInitializing } }) => isInitializing; +export const selectIsCoreInitializing = ({ core: { isInitializing } }) => isInitializing; const nextPosition = (items, index, excludedId) => { const filteredItems = isUndefined(excludedId) @@ -29,7 +29,7 @@ const nextPosition = (items, index, excludedId) => { return prevPosition + (nextItem.position - prevPosition) / 2; }; -export const nextBoardPositionSelector = createSelector( +export const selectNextBoardPosition = createSelector( orm, (_, projectId) => projectId, (_, __, index) => index, @@ -45,7 +45,7 @@ export const nextBoardPositionSelector = createSelector( }, ); -export const nextListPositionSelector = createSelector( +export const selectNextListPosition = createSelector( orm, (_, boardId) => boardId, (_, __, index) => index, @@ -61,7 +61,7 @@ export const nextListPositionSelector = createSelector( }, ); -export const nextCardPositionSelector = createSelector( +export const selectNextCardPosition = createSelector( orm, (_, listId) => listId, (_, __, index) => index, @@ -77,7 +77,7 @@ export const nextCardPositionSelector = createSelector( }, ); -export const nextTaskPositionSelector = createSelector( +export const selectNextTaskPosition = createSelector( orm, (_, cardId) => cardId, (_, __, index) => index, @@ -92,3 +92,11 @@ export const nextTaskPositionSelector = createSelector( return nextPosition(cardModel.getOrderedTasksQuerySet().toRefArray(), index, excludedId); }, ); + +export default { + selectIsCoreInitializing, + selectNextBoardPosition, + selectNextListPosition, + selectNextCardPosition, + selectNextTaskPosition, +}; diff --git a/client/src/selectors/index.js b/client/src/selectors/index.js index 7a77a3bb..c3da383f 100755 --- a/client/src/selectors/index.js +++ b/client/src/selectors/index.js @@ -1,14 +1,29 @@ -export * from './router'; -export * from './auth'; -export * from './core'; -export * from './modal'; -export * from './user'; -export * from './users'; -export * from './project'; -export * from './project-manager'; -export * from './board'; -export * from './board-membership'; -export * from './list'; -export * from './card'; -export * from './task'; -export * from './attachment'; +import router from './router'; +import auth from './auth'; +import core from './core'; +import modals from './modals'; +import users from './users'; +import projects from './projects'; +import projectManagers from './project-managers'; +import boards from './boards'; +import boardMemberships from './board-memberships'; +import lists from './lists'; +import cards from './cards'; +import tasks from './tasks'; +import attachments from './attachments'; + +export default { + ...router, + ...auth, + ...core, + ...modals, + ...users, + ...projects, + ...projectManagers, + ...boards, + ...boardMemberships, + ...lists, + ...cards, + ...tasks, + ...attachments, +}; diff --git a/client/src/selectors/list.js b/client/src/selectors/lists.js similarity index 67% rename from client/src/selectors/list.js rename to client/src/selectors/lists.js index dad75eba..1eddbd9f 100644 --- a/client/src/selectors/list.js +++ b/client/src/selectors/lists.js @@ -3,7 +3,7 @@ import { createSelector } from 'redux-orm'; import orm from '../orm'; import { isLocalId } from '../utils/local-id'; -export const makeListByIdSelector = () => +export const makeSelectListById = () => createSelector( orm, (_, id) => id, @@ -21,9 +21,9 @@ export const makeListByIdSelector = () => }, ); -export const listByIdSelector = makeListByIdSelector(); +export const selectListById = makeSelectListById(); -export const makeCardIdsByListIdSelector = () => +export const makeSelectCardIdsByListId = () => createSelector( orm, (_, id) => id, @@ -38,4 +38,11 @@ export const makeCardIdsByListIdSelector = () => }, ); -export const cardIdsByListIdSelector = makeCardIdsByListIdSelector(); +export const selectCardIdsByListId = makeSelectCardIdsByListId(); + +export default { + makeSelectListById, + selectListById, + makeSelectCardIdsByListId, + selectCardIdsByListId, +}; diff --git a/client/src/selectors/modal.js b/client/src/selectors/modal.js deleted file mode 100644 index d8c2d8e2..00000000 --- a/client/src/selectors/modal.js +++ /dev/null @@ -1,2 +0,0 @@ -// eslint-disable-next-line import/prefer-default-export -export const currentModalSelector = ({ core: { currentModal } }) => currentModal; diff --git a/client/src/selectors/modals.js b/client/src/selectors/modals.js new file mode 100644 index 00000000..8085687d --- /dev/null +++ b/client/src/selectors/modals.js @@ -0,0 +1,5 @@ +export const selectCurrentModal = ({ core: { currentModal } }) => currentModal; + +export default { + selectCurrentModal, +}; diff --git a/client/src/selectors/project-manager.js b/client/src/selectors/project-managers.js similarity index 62% rename from client/src/selectors/project-manager.js rename to client/src/selectors/project-managers.js index eb0f7207..99cb05bb 100644 --- a/client/src/selectors/project-manager.js +++ b/client/src/selectors/project-managers.js @@ -2,7 +2,7 @@ import { createSelector } from 'redux-orm'; import orm from '../orm'; -export const makeProjectManagerByIdSelector = () => +export const makeSelectProjectManagerById = () => createSelector( orm, (_, id) => id, @@ -17,4 +17,9 @@ export const makeProjectManagerByIdSelector = () => }, ); -export const projectManagerByIdSelector = makeProjectManagerByIdSelector(); +export const selectProjectManagerById = makeSelectProjectManagerById(); + +export default { + makeSelectProjectManagerById, + selectProjectManagerById, +}; diff --git a/client/src/selectors/project.js b/client/src/selectors/projects.js similarity index 65% rename from client/src/selectors/project.js rename to client/src/selectors/projects.js index 9727c068..ddfe60e1 100644 --- a/client/src/selectors/project.js +++ b/client/src/selectors/projects.js @@ -1,13 +1,13 @@ import { createSelector } from 'redux-orm'; import orm from '../orm'; -import { pathSelector } from './router'; -import { currentUserIdSelector } from './user'; +import { selectPath } from './router'; +import { selectCurrentUserId } from './users'; import { isLocalId } from '../utils/local-id'; -export const currentProjectSelector = createSelector( +export const selectCurrentProject = createSelector( orm, - (state) => pathSelector(state).projectId, + (state) => selectPath(state).projectId, ({ Project }, id) => { if (!id) { return id; @@ -23,10 +23,10 @@ export const currentProjectSelector = createSelector( }, ); -export const managersForCurrentProjectSelector = createSelector( +export const selectManagersForCurrentProject = createSelector( orm, - (state) => pathSelector(state).projectId, - (state) => currentUserIdSelector(state), + (state) => selectPath(state).projectId, + (state) => selectCurrentUserId(state), ({ Project }, id, currentUserId) => { if (!id) { return id; @@ -52,10 +52,10 @@ export const managersForCurrentProjectSelector = createSelector( }, ); -export const boardsForCurrentProjectSelector = createSelector( +export const selectBoardsForCurrentProject = createSelector( orm, - (state) => pathSelector(state).projectId, - (state) => currentUserIdSelector(state), + (state) => selectPath(state).projectId, + (state) => selectCurrentUserId(state), ({ Project }, id, currentUserId) => { if (!id) { return id; @@ -74,10 +74,10 @@ export const boardsForCurrentProjectSelector = createSelector( }, ); -export const isCurrentUserManagerForCurrentProjectSelector = createSelector( +export const selectIsCurrentUserManagerForCurrentProject = createSelector( orm, - (state) => pathSelector(state).projectId, - (state) => currentUserIdSelector(state), + (state) => selectPath(state).projectId, + (state) => selectCurrentUserId(state), ({ Project }, id, currentUserId) => { if (!id) { return false; @@ -92,3 +92,10 @@ export const isCurrentUserManagerForCurrentProjectSelector = createSelector( return projectModel.hasManagerUser(currentUserId); }, ); + +export default { + selectCurrentProject, + selectManagersForCurrentProject, + selectBoardsForCurrentProject, + selectIsCurrentUserManagerForCurrentProject, +}; diff --git a/client/src/selectors/router.js b/client/src/selectors/router.js index 5e79682b..fba03503 100755 --- a/client/src/selectors/router.js +++ b/client/src/selectors/router.js @@ -2,24 +2,24 @@ import { createSelector as createReselectSelector } from 'reselect'; import { createSelector as createReduxOrmSelector } from 'redux-orm'; import orm from '../orm'; -import { currentUserIdSelector } from './user'; +import { selectCurrentUserId } from './users'; import matchPaths from '../utils/match-paths'; import Paths from '../constants/Paths'; -export const pathnameSelector = ({ +export const selectPathname = ({ router: { location: { pathname }, }, }) => pathname; -export const pathsMatchSelector = createReselectSelector(pathnameSelector, (pathname) => +export const selectPathsMatch = createReselectSelector(selectPathname, (pathname) => matchPaths(pathname, Object.values(Paths)), ); -export const pathSelector = createReduxOrmSelector( +export const selectPath = createReduxOrmSelector( orm, - pathsMatchSelector, - (state) => currentUserIdSelector(state), + selectPathsMatch, + (state) => selectCurrentUserId(state), ({ Project, Board, Card }, pathsMatch, currentUserId) => { if (pathsMatch) { switch (pathsMatch.path) { @@ -105,3 +105,9 @@ export const pathSelector = createReduxOrmSelector( return {}; }, ); + +export default { + selectPathname, + selectPathsMatch, + selectPath, +}; diff --git a/client/src/selectors/task.js b/client/src/selectors/tasks.js similarity index 64% rename from client/src/selectors/task.js rename to client/src/selectors/tasks.js index 5ffdd49e..dba6a225 100644 --- a/client/src/selectors/task.js +++ b/client/src/selectors/tasks.js @@ -2,7 +2,7 @@ import { createSelector } from 'redux-orm'; import orm from '../orm'; -export const makeTaskByIdSelector = () => +export const makeSelectTaskById = () => createSelector( orm, (_, id) => id, @@ -17,4 +17,9 @@ export const makeTaskByIdSelector = () => }, ); -export const taskByIdSelector = makeTaskByIdSelector(); +export const selectTaskById = makeSelectTaskById(); + +export default { + makeSelectTaskById, + selectTaskById, +}; diff --git a/client/src/selectors/user.js b/client/src/selectors/user.js deleted file mode 100644 index b0706767..00000000 --- a/client/src/selectors/user.js +++ /dev/null @@ -1,108 +0,0 @@ -import { createSelector } from 'redux-orm'; - -import orm from '../orm'; - -export const currentUserIdSelector = ({ auth: { userId } }) => userId; - -export const currentUserSelector = createSelector( - orm, - (state) => currentUserIdSelector(state), - ({ User }, id) => { - if (!id) { - return id; - } - - const userModel = User.withId(id); - - if (!userModel) { - return userModel; - } - - return userModel.ref; - }, -); - -export const projectsForCurrentUserSelector = createSelector( - orm, - (state) => currentUserIdSelector(state), - ({ User }, id) => { - if (!id) { - return id; - } - - const userModel = User.withId(id); - - if (!userModel) { - return userModel; - } - - return userModel.getOrderedAvailableProjectsModelArray().map((projectModel) => { - const boardsModels = projectModel.getOrderedAvailableBoardsModelArray(userModel.id); - - let notificationsTotal = 0; - boardsModels.forEach((boardModel) => { - boardModel.cards.toModelArray().forEach((cardModel) => { - notificationsTotal += cardModel.getUnreadNotificationsQuerySet().count(); - }); - }); - - return { - ...projectModel.ref, - notificationsTotal, - firstBoardId: boardsModels[0] && boardsModels[0].id, - }; - }); - }, -); - -export const projectsToListsForCurrentUserSelector = createSelector( - orm, - (state) => currentUserIdSelector(state), - ({ User }, id) => { - if (!id) { - return id; - } - - const userModel = User.withId(id); - - if (!userModel) { - return userModel; - } - - return userModel.getOrderedAvailableProjectsModelArray().map((projectModel) => ({ - ...projectModel.ref, - boards: projectModel.getOrderedMemberBoardsModelArray(id).map((boardModel) => ({ - ...boardModel.ref, - lists: boardModel.getOrderedListsQuerySet().toRefArray(), - })), - })); - }, -); - -export const notificationsForCurrentUserSelector = createSelector( - orm, - (state) => currentUserIdSelector(state), - ({ User }, id) => { - if (!id) { - return id; - } - - const userModel = User.withId(id); - - if (!userModel) { - return userModel; - } - - return userModel - .getOrderedUnreadNotificationsQuerySet() - .toModelArray() - .map((notificationModel) => ({ - ...notificationModel.ref, - action: notificationModel.action && { - ...notificationModel.action.ref, - user: notificationModel.action.user.ref, - }, - card: notificationModel.card && notificationModel.card.ref, - })); - }, -); diff --git a/client/src/selectors/users.js b/client/src/selectors/users.js index 66f0ef9b..c3b3bd4b 100644 --- a/client/src/selectors/users.js +++ b/client/src/selectors/users.js @@ -1,15 +1,16 @@ import { createSelector } from 'redux-orm'; import orm from '../orm'; -import { currentUserIdSelector } from './user'; -export const usersSelector = createSelector(orm, ({ User }) => +export const selectCurrentUserId = ({ auth: { userId } }) => userId; + +export const selectUsers = createSelector(orm, ({ User }) => User.getOrderedUndeletedQuerySet().toRefArray(), ); -export const usersExceptCurrentSelector = createSelector( +export const selectUsersExceptCurrent = createSelector( orm, - (state) => currentUserIdSelector(state), + (state) => selectCurrentUserId(state), ({ User }, id) => User.getOrderedUndeletedQuerySet() .exclude({ @@ -17,3 +18,116 @@ export const usersExceptCurrentSelector = createSelector( }) .toRefArray(), ); + +export const selectCurrentUser = createSelector( + orm, + (state) => selectCurrentUserId(state), + ({ User }, id) => { + if (!id) { + return id; + } + + const userModel = User.withId(id); + + if (!userModel) { + return userModel; + } + + return userModel.ref; + }, +); + +export const selectProjectsForCurrentUser = createSelector( + orm, + (state) => selectCurrentUserId(state), + ({ User }, id) => { + if (!id) { + return id; + } + + const userModel = User.withId(id); + + if (!userModel) { + return userModel; + } + + return userModel.getOrderedAvailableProjectsModelArray().map((projectModel) => { + const boardsModels = projectModel.getOrderedAvailableBoardsModelArray(userModel.id); + + let notificationsTotal = 0; + boardsModels.forEach((boardModel) => { + boardModel.cards.toModelArray().forEach((cardModel) => { + notificationsTotal += cardModel.getUnreadNotificationsQuerySet().count(); + }); + }); + + return { + ...projectModel.ref, + notificationsTotal, + firstBoardId: boardsModels[0] && boardsModels[0].id, + }; + }); + }, +); + +export const selectProjectsToListsForCurrentUser = createSelector( + orm, + (state) => selectCurrentUserId(state), + ({ User }, id) => { + if (!id) { + return id; + } + + const userModel = User.withId(id); + + if (!userModel) { + return userModel; + } + + return userModel.getOrderedAvailableProjectsModelArray().map((projectModel) => ({ + ...projectModel.ref, + boards: projectModel.getOrderedMemberBoardsModelArray(id).map((boardModel) => ({ + ...boardModel.ref, + lists: boardModel.getOrderedListsQuerySet().toRefArray(), + })), + })); + }, +); + +export const selectNotificationsForCurrentUser = createSelector( + orm, + (state) => selectCurrentUserId(state), + ({ User }, id) => { + if (!id) { + return id; + } + + const userModel = User.withId(id); + + if (!userModel) { + return userModel; + } + + return userModel + .getOrderedUnreadNotificationsQuerySet() + .toModelArray() + .map((notificationModel) => ({ + ...notificationModel.ref, + activity: notificationModel.activity && { + ...notificationModel.activity.ref, + user: notificationModel.activity.user.ref, + }, + card: notificationModel.card && notificationModel.card.ref, + })); + }, +); + +export default { + selectCurrentUserId, + selectUsers, + selectUsersExceptCurrent, + selectCurrentUser, + selectProjectsForCurrentUser, + selectProjectsToListsForCurrentUser, + selectNotificationsForCurrentUser, +}; diff --git a/client/src/store.js b/client/src/store.js index 8c56df6a..4839a3cf 100755 --- a/client/src/store.js +++ b/client/src/store.js @@ -1,4 +1,4 @@ -import { applyMiddleware, createStore, compose as reduxCompose } from 'redux'; +import { applyMiddleware, legacy_createStore as createStore, compose as reduxCompose } from 'redux'; import createSagaMiddleware from 'redux-saga'; import { routerMiddleware } from 'connected-react-router'; diff --git a/client/src/utils/access-token-storage.js b/client/src/utils/access-token-storage.js index e3a8adfd..cde5b2e2 100755 --- a/client/src/utils/access-token-storage.js +++ b/client/src/utils/access-token-storage.js @@ -8,18 +8,7 @@ export const setAccessToken = (accessToken) => { }); }; -export const getAccessToken = () => { - // TODO: remove migration - const accessToken = localStorage.getItem(Config.ACCESS_TOKEN_KEY); - if (accessToken) { - localStorage.removeItem(Config.ACCESS_TOKEN_KEY); - - setAccessToken(accessToken); - return accessToken; - } - - return Cookies.get(Config.ACCESS_TOKEN_KEY); -}; +export const getAccessToken = () => Cookies.get(Config.ACCESS_TOKEN_KEY); export const removeAccessToken = () => { Cookies.remove(Config.ACCESS_TOKEN_KEY); diff --git a/server/api/helpers/utils/create-attachment-receiver.js b/server/api/helpers/utils/create-attachment-receiver.js index 93827348..31384384 100644 --- a/server/api/helpers/utils/create-attachment-receiver.js +++ b/server/api/helpers/utils/create-attachment-receiver.js @@ -28,7 +28,7 @@ module.exports = { firstFileHandled = true; const buffer = await streamToArray(file).then((parts) => - Buffer.concat(parts.map((part) => (util.isBuffer(part) ? part : Buffer.from(part)))), + Buffer.concat(parts.map((part) => (Buffer.isBuffer(part) ? part : Buffer.from(part)))), ); try { diff --git a/server/api/helpers/utils/create-project-background-image-receiver.js b/server/api/helpers/utils/create-project-background-image-receiver.js index 9535c443..e39fe92f 100644 --- a/server/api/helpers/utils/create-project-background-image-receiver.js +++ b/server/api/helpers/utils/create-project-background-image-receiver.js @@ -27,7 +27,7 @@ module.exports = { firstFileHandled = true; const buffer = await streamToArray(file).then((parts) => - Buffer.concat(parts.map((part) => (util.isBuffer(part) ? part : Buffer.from(part)))), + Buffer.concat(parts.map((part) => (Buffer.isBuffer(part) ? part : Buffer.from(part)))), ); try { diff --git a/server/api/helpers/utils/create-user-avatar-receiver.js b/server/api/helpers/utils/create-user-avatar-receiver.js index 82a4968c..0c17f67c 100644 --- a/server/api/helpers/utils/create-user-avatar-receiver.js +++ b/server/api/helpers/utils/create-user-avatar-receiver.js @@ -27,7 +27,7 @@ module.exports = { firstFileHandled = true; const buffer = await streamToArray(file).then((parts) => - Buffer.concat(parts.map((part) => (util.isBuffer(part) ? part : Buffer.from(part)))), + Buffer.concat(parts.map((part) => (Buffer.isBuffer(part) ? part : Buffer.from(part)))), ); try {