From 3e9e7b2732f0d4a8855ec9c8ceb77dd83c62fb66 Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 23 May 2024 08:56:49 -0300 Subject: [PATCH 01/11] Use updateApiObjectsNoChild recursively to create board if local change --- src/components/Board/Board.actions.js | 29 ++++++++++++++++++++++++- src/components/Board/Board.constants.js | 3 +++ src/components/Board/Board.reducer.js | 19 +++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 2602b092b..910a05682 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -38,7 +38,9 @@ import { DOWNLOAD_IMAGES_FAILURE, DOWNLOAD_IMAGES_STARTED, DOWNLOAD_IMAGE_SUCCESS, - DOWNLOAD_IMAGE_FAILURE + DOWNLOAD_IMAGE_FAILURE, + UNMARK_SHOULD_CREATE_API_BOARD, + REMOTE_BOARD_ID_LENGTH } from './Board.constants'; import API from '../../api'; @@ -741,11 +743,36 @@ export function updateApiMarkedBoards() { throw new Error(e.message); }); } + if ( + allBoards[i].id.length < REMOTE_BOARD_ID_LENGTH && + allBoards[i].shouldCreateBoard + ) { + const state = getState(); + + let boardData = { + ...allBoards[i], + author: state.app.userData.name, + email: state.app.userData.email, + hidden: false, + locale: state.lang + }; + delete boardData.shouldCreateBoard; + + dispatch(updateApiObjectsNoChild(boardData, false, true)); + dispatch(unmarkShouldCreateBoard(allBoards[i].id)); + } } return; }; } +function unmarkShouldCreateBoard(boardId) { + return { + type: UNMARK_SHOULD_CREATE_API_BOARD, + boardId + }; +} + export function updateApiObjects( childBoard, parentBoard, diff --git a/src/components/Board/Board.constants.js b/src/components/Board/Board.constants.js index 7d820d648..0dcc20cad 100644 --- a/src/components/Board/Board.constants.js +++ b/src/components/Board/Board.constants.js @@ -19,6 +19,8 @@ export const CHANGE_IMPROVED_PHRASE = 'cboard/Board/CHANGE_IMPROVED_PHRASE'; export const CHANGE_LIVE_MODE = 'cboard/Board/CHANGE_LIVE_MODE'; export const HISTORY_REMOVE_BOARD = 'cboard/Board/HISTORY_REMOVE_BOARD'; export const UNMARK_BOARD = 'cboard/Board/UNMARK_BOARD'; +export const UNMARK_SHOULD_CREATE_API_BOARD = + 'cboard/Board/UNMARK_SHOULD_CREATE_API_BOARD'; export const CREATE_API_BOARD_SUCCESS = 'cboard/Board/CREATE_API_BOARD_SUCCESS'; export const CREATE_API_BOARD_FAILURE = 'cboard/Board/CREATE_API_BOARD_FAILURE'; export const CREATE_API_BOARD_STARTED = 'cboard/Board/CREATE_API_BOARD_STARTED'; @@ -41,3 +43,4 @@ export const DOWNLOAD_IMAGE_SUCCESS = 'cboard/Board/DOWNLOAD_IMAGE_SUCCESS'; export const DOWNLOAD_IMAGE_FAILURE = 'cboard/Board/DOWNLOAD_IMAGE_FAILURE'; export const DEFAULT_ROWS_NUMBER = 5; export const DEFAULT_COLUMNS_NUMBER = 5; +export const REMOTE_BOARD_ID_LENGTH = 14; diff --git a/src/components/Board/Board.reducer.js b/src/components/Board/Board.reducer.js index b7db1bd49..ceaf7ab86 100644 --- a/src/components/Board/Board.reducer.js +++ b/src/components/Board/Board.reducer.js @@ -36,7 +36,9 @@ import { GET_API_MY_BOARDS_STARTED, DOWNLOAD_IMAGES_STARTED, DOWNLOAD_IMAGE_SUCCESS, - DOWNLOAD_IMAGE_FAILURE + DOWNLOAD_IMAGE_FAILURE, + UNMARK_SHOULD_CREATE_API_BOARD, + REMOTE_BOARD_ID_LENGTH } from './Board.constants'; import { LOGOUT, LOGIN_SUCCESS } from '../Account/Login/Login.constants'; @@ -289,6 +291,15 @@ function boardReducer(state = initialState, action) { : { ...board, markToUpdate: false } ) }; + case UNMARK_SHOULD_CREATE_API_BOARD: + return { + ...state, + boards: state.boards.map(board => + board.id !== action.boardId + ? board + : { ...board, shouldCreateBoard: false } + ) + }; case CHANGE_OUTPUT: return { ...state, @@ -313,6 +324,12 @@ function boardReducer(state = initialState, action) { ) { creadBoards[i].markToUpdate = true; } + + const shouldCreateBoard = + creadBoards[i].id.length < REMOTE_BOARD_ID_LENGTH; + if (shouldCreateBoard) { + creadBoards[i].shouldCreateBoard = true; + } } } } From 615f9c741ce39b1035b4574eba8b7e47300c04fe Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 23 May 2024 09:50:25 -0300 Subject: [PATCH 02/11] Replace old board id with the new one on the Navigation History --- src/components/Board/Board.actions.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 910a05682..bc08e2b92 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -758,7 +758,18 @@ export function updateApiMarkedBoards() { }; delete boardData.shouldCreateBoard; - dispatch(updateApiObjectsNoChild(boardData, false, true)); + dispatch(updateApiObjectsNoChild(boardData, false, true)) + .then(boardId => { + if (createBoard) { + dispatch( + replaceBoard({ ...boardData }, { ...boardData, id: boardId }) + ); + } + }) + .catch(err => { + console.log(err.message); + }); + dispatch(unmarkShouldCreateBoard(allBoards[i].id)); } } From 147101e6bf548839a4cf2473e5170a6104269f9b Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 23 May 2024 11:29:52 -0300 Subject: [PATCH 03/11] Extract name from NameKey to create default boards on db Todo - use intl to translateName --- src/components/Board/Board.actions.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index bc08e2b92..4ec619c84 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -749,12 +749,21 @@ export function updateApiMarkedBoards() { ) { const state = getState(); + // TODO - translate name using intl in a redux action + //name: intl.formatMessage({ id: allBoards[i].nameKey }) + const extractName = () => { + const splitedNameKey = allBoards[i].nameKey.split('.'); + const NAMEKEY_LAST_INDEX = splitedNameKey.length - 1; + return splitedNameKey[NAMEKEY_LAST_INDEX]; + }; + const name = allBoards[i].name ?? extractName(); let boardData = { ...allBoards[i], author: state.app.userData.name, email: state.app.userData.email, hidden: false, - locale: state.lang + locale: state.lang, + name }; delete boardData.shouldCreateBoard; From ab1d40fe6d478348027e4dada92c7ea084ab8256 Mon Sep 17 00:00:00 2001 From: tomivm Date: Tue, 28 May 2024 12:07:01 -0300 Subject: [PATCH 04/11] chore: Refactor updateApiObjectsNoChild to await for API calls --- src/components/Board/Board.actions.js | 34 ++++++++++++------------- src/components/Board/Board.container.js | 6 ++++- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 4ec619c84..2e7a62a20 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -503,7 +503,7 @@ export function getApiMyBoards() { } export function createApiBoard(boardData, boardId) { - return dispatch => { + return async dispatch => { dispatch(createApiBoardStarted()); boardData = { ...boardData, @@ -522,7 +522,7 @@ export function createApiBoard(boardData, boardId) { } export function updateApiBoard(boardData) { - return dispatch => { + return async dispatch => { dispatch(updateApiBoardStarted()); return API.updateBoard(boardData) .then(res => { @@ -676,10 +676,10 @@ export function updateApiObjectsNoChild( createCommunicator = false, createParentBoard = false ) { - return (dispatch, getState) => { + return async (dispatch, getState) => { //create - update parent board const action = createParentBoard ? createApiBoard : updateApiBoard; - return dispatch(action(parentBoard, parentBoard.id)) + return await dispatch(action(parentBoard, parentBoard.id)) .then(res => { const updatedParentBoardId = res.id; //add new boards to the active communicator @@ -710,8 +710,8 @@ export function updateApiObjectsNoChild( ? createApiCommunicator : updateApiCommunicator; return dispatch(caction(comm, comm.id)) - .then(() => { - dispatch(updateApiMarkedBoards()); + .then(async () => { + await dispatch(updateApiMarkedBoards()); return updatedParentBoardId; }) .catch(e => { @@ -724,7 +724,7 @@ export function updateApiObjectsNoChild( }; } export function updateApiMarkedBoards() { - return (dispatch, getState) => { + return async (dispatch, getState) => { const allBoards = [...getState().board.boards]; for (let i = 0; i < allBoards.length; i++) { if ( @@ -734,7 +734,7 @@ export function updateApiMarkedBoards() { allBoards[i].hasOwnProperty('markToUpdate') && allBoards[i].markToUpdate ) { - dispatch(updateApiBoard(allBoards[i])) + await dispatch(updateApiBoard(allBoards[i])) .then(() => { dispatch(unmarkBoard(allBoards[i].id)); return; @@ -766,23 +766,23 @@ export function updateApiMarkedBoards() { name }; delete boardData.shouldCreateBoard; + dispatch(unmarkShouldCreateBoard(boardData.id)); - dispatch(updateApiObjectsNoChild(boardData, false, true)) + dispatch(updateBoard(boardData)); + await dispatch(updateApiObjectsNoChild(boardData, false, true)) .then(boardId => { - if (createBoard) { - dispatch( - replaceBoard({ ...boardData }, { ...boardData, id: boardId }) - ); - } + dispatch( + replaceBoard({ ...boardData }, { ...boardData, id: boardId }) + ); + + return; }) .catch(err => { console.log(err.message); + return; }); - - dispatch(unmarkShouldCreateBoard(allBoards[i].id)); } } - return; }; } diff --git a/src/components/Board/Board.container.js b/src/components/Board/Board.container.js index 8a01dcc98..f88e2452c 100644 --- a/src/components/Board/Board.container.js +++ b/src/components/Board/Board.container.js @@ -535,7 +535,11 @@ export class BoardContainer extends Component { updateBoard(boardData); } //api updates - updateApiObjectsNoChild(boardData, createCommunicator, createBoard) + await updateApiObjectsNoChild( + boardData, + createCommunicator, + createBoard + ) .then(boardId => { if (createBoard) { replaceBoard({ ...boardData }, { ...boardData, id: boardId }); From d9943f82c3da4bb7e45f9c821588bebfe0b1569e Mon Sep 17 00:00:00 2001 From: tomivm Date: Tue, 28 May 2024 13:10:05 -0300 Subject: [PATCH 05/11] chore: Refactor a for inside updateApiMarkedBoards to await for API calls --- src/components/Board/Board.actions.js | 62 +++++++++++++-------------- 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 2e7a62a20..17f8611bd 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -726,39 +726,37 @@ export function updateApiObjectsNoChild( export function updateApiMarkedBoards() { return async (dispatch, getState) => { const allBoards = [...getState().board.boards]; - for (let i = 0; i < allBoards.length; i++) { + for (const board of allBoards) { + const boardsIds = getState().board.boards?.map(board => board.id); + if (!boardsIds.includes(board.id)) return; + if ( - allBoards[i].id.length > 14 && - allBoards[i].hasOwnProperty('email') && - allBoards[i].email === getState().app.userData.email && - allBoards[i].hasOwnProperty('markToUpdate') && - allBoards[i].markToUpdate + board.id.length > 14 && + board.hasOwnProperty('email') && + board.email === getState().app.userData.email && + board.hasOwnProperty('markToUpdate') && + board.markToUpdate ) { - await dispatch(updateApiBoard(allBoards[i])) - .then(() => { - dispatch(unmarkBoard(allBoards[i].id)); - return; - }) - .catch(e => { - throw new Error(e.message); - }); + try { + await dispatch(updateApiBoard(board)); + dispatch(unmarkBoard(board.id)); + } catch (e) { + throw new Error(e.message); + } } - if ( - allBoards[i].id.length < REMOTE_BOARD_ID_LENGTH && - allBoards[i].shouldCreateBoard - ) { + if (board.id.length < REMOTE_BOARD_ID_LENGTH && board.shouldCreateBoard) { const state = getState(); // TODO - translate name using intl in a redux action //name: intl.formatMessage({ id: allBoards[i].nameKey }) const extractName = () => { - const splitedNameKey = allBoards[i].nameKey.split('.'); + const splitedNameKey = board.nameKey.split('.'); const NAMEKEY_LAST_INDEX = splitedNameKey.length - 1; return splitedNameKey[NAMEKEY_LAST_INDEX]; }; - const name = allBoards[i].name ?? extractName(); + const name = board.name ?? extractName(); let boardData = { - ...allBoards[i], + ...board, author: state.app.userData.name, email: state.app.userData.email, hidden: false, @@ -769,18 +767,16 @@ export function updateApiMarkedBoards() { dispatch(unmarkShouldCreateBoard(boardData.id)); dispatch(updateBoard(boardData)); - await dispatch(updateApiObjectsNoChild(boardData, false, true)) - .then(boardId => { - dispatch( - replaceBoard({ ...boardData }, { ...boardData, id: boardId }) - ); - - return; - }) - .catch(err => { - console.log(err.message); - return; - }); + try { + const boardId = await dispatch( + updateApiObjectsNoChild(boardData, false, true) + ); + dispatch( + replaceBoard({ ...boardData }, { ...boardData, id: boardId }) + ); + } catch (err) { + console.log(err.message); + } } } }; From a2ab358765c0b188eda6171420d5534fdec40aa4 Mon Sep 17 00:00:00 2001 From: Rodri Sanchez Date: Mon, 3 Jun 2024 11:19:22 -0300 Subject: [PATCH 06/11] Refactor for loop in updateApiMarkedBoards to use async/await --- src/components/Board/Board.actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 712fbee39..385da6f11 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -744,7 +744,7 @@ export function updateApiObjectsNoChild( export function updateApiMarkedBoards() { return async (dispatch, getState) => { const allBoards = [...getState().board.boards]; - for (const board of allBoards) { + for await (const board of allBoards) { const boardsIds = getState().board.boards?.map(board => board.id); if (!boardsIds.includes(board.id)) return; From 9db7c8059aed7cf6461e51cda9d427707110b313 Mon Sep 17 00:00:00 2001 From: Rodri Sanchez Date: Mon, 3 Jun 2024 11:27:43 -0300 Subject: [PATCH 07/11] Refactor updateApiObjectsNoChild to use async/await for API calls --- src/components/Board/Board.container.js | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/components/Board/Board.container.js b/src/components/Board/Board.container.js index f88e2452c..5b6162ffa 100644 --- a/src/components/Board/Board.container.js +++ b/src/components/Board/Board.container.js @@ -535,20 +535,15 @@ export class BoardContainer extends Component { updateBoard(boardData); } //api updates - await updateApiObjectsNoChild( + const boardId = await updateApiObjectsNoChild( boardData, createCommunicator, createBoard - ) - .then(boardId => { - if (createBoard) { - replaceBoard({ ...boardData }, { ...boardData, id: boardId }); - } - this.props.history.replace(`/board/${boardId}`); - }) - .catch(err => { - console.log(err.message); - }); + ); + if (createBoard) { + replaceBoard({ ...boardData }, { ...boardData, id: boardId }); + } + this.props.history.replace(`/board/${boardId}`); } catch (err) { console.log(err.message); } finally { From f8f0d9d2749b28d351dd923e9da5fa50a9c99ed2 Mon Sep 17 00:00:00 2001 From: tomivm Date: Wed, 19 Jun 2024 09:09:30 +0200 Subject: [PATCH 08/11] Avoid create API boards if unnecessary default Boards aren't removed --- src/components/Board/Board.reducer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Board/Board.reducer.js b/src/components/Board/Board.reducer.js index ceaf7ab86..179a7f93e 100644 --- a/src/components/Board/Board.reducer.js +++ b/src/components/Board/Board.reducer.js @@ -326,7 +326,8 @@ function boardReducer(state = initialState, action) { } const shouldCreateBoard = - creadBoards[i].id.length < REMOTE_BOARD_ID_LENGTH; + creadBoards[i].id.length < REMOTE_BOARD_ID_LENGTH && + state.boards.unnecessaryDefaultBoardsRemoved; if (shouldCreateBoard) { creadBoards[i].shouldCreateBoard = true; } From 6d48087366581feccb849ca8328c20362c0fb54c Mon Sep 17 00:00:00 2001 From: tomivm Date: Wed, 19 Jun 2024 09:29:36 +0200 Subject: [PATCH 09/11] Fix var name check length of ids to know if it is local --- src/components/Board/Board.actions.js | 4 ++-- src/components/Board/Board.constants.js | 2 +- src/components/Board/Board.reducer.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 385da6f11..1bc5062f2 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -40,7 +40,7 @@ import { DOWNLOAD_IMAGE_SUCCESS, DOWNLOAD_IMAGE_FAILURE, UNMARK_SHOULD_CREATE_API_BOARD, - REMOTE_BOARD_ID_LENGTH + SHORT_ID_MAX_LENGTH } from './Board.constants'; import API from '../../api'; @@ -762,7 +762,7 @@ export function updateApiMarkedBoards() { throw new Error(e.message); } } - if (board.id.length < REMOTE_BOARD_ID_LENGTH && board.shouldCreateBoard) { + if (board.id.length < SHORT_ID_MAX_LENGTH && board.shouldCreateBoard) { const state = getState(); // TODO - translate name using intl in a redux action diff --git a/src/components/Board/Board.constants.js b/src/components/Board/Board.constants.js index 0dcc20cad..79aae6ef3 100644 --- a/src/components/Board/Board.constants.js +++ b/src/components/Board/Board.constants.js @@ -43,4 +43,4 @@ export const DOWNLOAD_IMAGE_SUCCESS = 'cboard/Board/DOWNLOAD_IMAGE_SUCCESS'; export const DOWNLOAD_IMAGE_FAILURE = 'cboard/Board/DOWNLOAD_IMAGE_FAILURE'; export const DEFAULT_ROWS_NUMBER = 5; export const DEFAULT_COLUMNS_NUMBER = 5; -export const REMOTE_BOARD_ID_LENGTH = 14; +export const SHORT_ID_MAX_LENGTH = 14; diff --git a/src/components/Board/Board.reducer.js b/src/components/Board/Board.reducer.js index 179a7f93e..dc955865a 100644 --- a/src/components/Board/Board.reducer.js +++ b/src/components/Board/Board.reducer.js @@ -38,7 +38,7 @@ import { DOWNLOAD_IMAGE_SUCCESS, DOWNLOAD_IMAGE_FAILURE, UNMARK_SHOULD_CREATE_API_BOARD, - REMOTE_BOARD_ID_LENGTH + SHORT_ID_MAX_LENGTH } from './Board.constants'; import { LOGOUT, LOGIN_SUCCESS } from '../Account/Login/Login.constants'; @@ -326,7 +326,7 @@ function boardReducer(state = initialState, action) { } const shouldCreateBoard = - creadBoards[i].id.length < REMOTE_BOARD_ID_LENGTH && + creadBoards[i].id.length < SHORT_ID_MAX_LENGTH && state.boards.unnecessaryDefaultBoardsRemoved; if (shouldCreateBoard) { creadBoards[i].shouldCreateBoard = true; From 2a745364b0104c4df82a4ec0f5275b571d33b7f9 Mon Sep 17 00:00:00 2001 From: tomivm Date: Fri, 28 Jun 2024 11:46:28 +0200 Subject: [PATCH 10/11] Avoid the use of a state to prevent create Boards --- src/components/Board/Board.reducer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/Board/Board.reducer.js b/src/components/Board/Board.reducer.js index dc955865a..4f36098ba 100644 --- a/src/components/Board/Board.reducer.js +++ b/src/components/Board/Board.reducer.js @@ -326,8 +326,7 @@ function boardReducer(state = initialState, action) { } const shouldCreateBoard = - creadBoards[i].id.length < SHORT_ID_MAX_LENGTH && - state.boards.unnecessaryDefaultBoardsRemoved; + creadBoards[i].id.length < SHORT_ID_MAX_LENGTH; if (shouldCreateBoard) { creadBoards[i].shouldCreateBoard = true; } From ef123c47af8e2362a3bd0575651f0253fc2a41fb Mon Sep 17 00:00:00 2001 From: tomivm Date: Fri, 28 Jun 2024 17:41:05 +0200 Subject: [PATCH 11/11] fix breaking changes caused by change at main over update Api action --- src/components/Board/Board.actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 385fbd4f2..6925b23e8 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -772,7 +772,7 @@ export function updateApiMarkedBoards() { dispatch(updateBoard(boardData)); try { const boardId = await dispatch( - updateApiObjectsNoChild(boardData, false, true) + updateApiObjectsNoChild(boardData, true) ); dispatch( replaceBoard({ ...boardData }, { ...boardData, id: boardId })