From 05568ae49d83d01687934d9b6887f20b15247ec0 Mon Sep 17 00:00:00 2001 From: tomivm Date: Tue, 11 Jun 2024 17:20:00 -0300 Subject: [PATCH 01/35] Add actions to clean all boards and add the necessary default boards --- src/components/Board/Board.actions.js | 61 ++++++++++++++++++++++++- src/components/Board/Board.constants.js | 1 + src/components/Board/Board.reducer.js | 9 +++- src/helpers.js | 4 ++ 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index f06d8db12..cb5c6a502 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -38,7 +38,8 @@ import { DOWNLOAD_IMAGES_FAILURE, DOWNLOAD_IMAGES_STARTED, DOWNLOAD_IMAGE_SUCCESS, - DOWNLOAD_IMAGE_FAILURE + DOWNLOAD_IMAGE_FAILURE, + CLEAN_ALL_BOARDS } from './Board.constants'; import API from '../../api'; @@ -57,7 +58,7 @@ import { changeCommunicator } from '../Communicator/Communicator.actions'; import { isAndroid, writeCvaFile } from '../../cordova-util'; -import { DEFAULT_BOARDS } from '../../helpers'; +import { ALL_DEFAULT_BOARDS, DEFAULT_BOARDS } from '../../helpers'; import history from './../../history'; import { improvePhraseAbortController } from '../../api/api'; import shortid from 'shortid'; @@ -840,3 +841,59 @@ export function updateApiObjects( }); }; } + +export function cleanAllBoards() { + return { + type: CLEAN_ALL_BOARDS + }; +} +export function addRootBoard() { + return (dispatch, getState) => { + try { + const activeCommunicator = getActiveCommunicator(getState); + const rootBoard = activeCommunicator.rootBoard; + const board = getState().board.boards.find( + board => board.id === rootBoard + ); + if (!board) { + ALL_DEFAULT_BOARDS.advanced.some(defaultBoard => { + if (defaultBoard.id === rootBoard) { + dispatch(addBoards([defaultBoard])); + return true; + } + return false; + }); + } + } catch (e) { + console.error(e); + } + }; +} + +export function addDefaultBoards() { + return (dispatch, getState) => { + const boardsIdsToAdd = []; + // These are all boards including the boards that are getted from the API if this is called in the finally of getApiMyBoards thunk + const allStoreBoards = getState().board.boards; + allStoreBoards.forEach(includedBoard => { + includedBoard.tiles.forEach(tile => { + if (tile.loadBoard && !boardsIdsToAdd.includes(tile.loadBoard)) + boardsIdsToAdd.push(tile.loadBoard); + }); + }); + + boardsIdsToAdd.forEach(boardId => { + const allStoreBoards = getState().board.boards; + const board = allStoreBoards.find(board => board.id === boardId); + if (!board) { + ALL_DEFAULT_BOARDS.some(defaultBoard => { + if (defaultBoard.id === boardId) { + dispatch(addBoards([defaultBoard])); + return true; + } + return false; + }); + } + }); + }; +} diff --git a/src/components/Board/Board.constants.js b/src/components/Board/Board.constants.js index 7d820d648..297649f99 100644 --- a/src/components/Board/Board.constants.js +++ b/src/components/Board/Board.constants.js @@ -19,6 +19,7 @@ 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 CLEAN_ALL_BOARDS = 'cboard/Board/CLEAN_ALL_BOARDS'; 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'; diff --git a/src/components/Board/Board.reducer.js b/src/components/Board/Board.reducer.js index b7db1bd49..4e595138d 100644 --- a/src/components/Board/Board.reducer.js +++ b/src/components/Board/Board.reducer.js @@ -36,7 +36,8 @@ import { GET_API_MY_BOARDS_STARTED, DOWNLOAD_IMAGES_STARTED, DOWNLOAD_IMAGE_SUCCESS, - DOWNLOAD_IMAGE_FAILURE + DOWNLOAD_IMAGE_FAILURE, + CLEAN_ALL_BOARDS } from './Board.constants'; import { LOGOUT, LOGIN_SUCCESS } from '../Account/Login/Login.constants'; @@ -249,7 +250,11 @@ function boardReducer(state = initialState, action) { board => action.boardId.indexOf(board.id) === -1 ) }; - + case CLEAN_ALL_BOARDS: + return { + ...state, + boards: [] + }; case CREATE_TILE: return { ...state, diff --git a/src/helpers.js b/src/helpers.js index 6ac74ee2f..9327fd56f 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -5,6 +5,10 @@ export const DEFAULT_BOARDS = { advanced: boards.advanced, picSeePal: picSeePal }; +let advancedCopy = JSON.parse(JSON.stringify(DEFAULT_BOARDS.advanced)); +let picSeePalCopy = JSON.parse(JSON.stringify(DEFAULT_BOARDS.picSeePal)); + +export const ALL_DEFAULT_BOARDS = [...advancedCopy, ...picSeePalCopy]; export const dataURLtoFile = (dataurl, filename, checkExtension = false) => { // https://stackoverflow.com/a/38936042 From c0a07cb8bd03fda318d98bcf2812c827693e2303 Mon Sep 17 00:00:00 2001 From: tomivm Date: Tue, 11 Jun 2024 17:25:08 -0300 Subject: [PATCH 02/35] Clean All boards from the store before loginSuccess --- src/components/Account/Login/Login.actions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Account/Login/Login.actions.js b/src/components/Account/Login/Login.actions.js index cf96125bf..b8500c645 100644 --- a/src/components/Account/Login/Login.actions.js +++ b/src/components/Account/Login/Login.actions.js @@ -1,6 +1,6 @@ import API from '../../../api'; import { LOGIN_SUCCESS, LOGOUT } from './Login.constants'; -import { addBoards } from '../../Board/Board.actions'; +import { addBoards, cleanAllBoards } from '../../Board/Board.actions'; import { changeVoice, changePitch, @@ -172,7 +172,7 @@ export function login({ email, password, activatedData }, type = 'local') { }) .filter(b => b !== null) ); - + dispatch(cleanAllBoards()); dispatch(addBoards(apiBoards)); if (type === 'local') { dispatch( From ae9e5da81c9e598dacf02143d42be573e91e0822 Mon Sep 17 00:00:00 2001 From: tomivm Date: Tue, 11 Jun 2024 17:29:08 -0300 Subject: [PATCH 03/35] Add root board if is not on the communicator boards before login success --- src/components/Account/Login/Login.actions.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/Account/Login/Login.actions.js b/src/components/Account/Login/Login.actions.js index b8500c645..8d69d889e 100644 --- a/src/components/Account/Login/Login.actions.js +++ b/src/components/Account/Login/Login.actions.js @@ -2,6 +2,7 @@ import API from '../../../api'; import { LOGIN_SUCCESS, LOGOUT } from './Login.constants'; import { addBoards, cleanAllBoards } from '../../Board/Board.actions'; import { + addRootBoard, changeVoice, changePitch, changeRate @@ -174,6 +175,7 @@ export function login({ email, password, activatedData }, type = 'local') { ); dispatch(cleanAllBoards()); dispatch(addBoards(apiBoards)); + dispatch(addRootBoard()); if (type === 'local') { dispatch( disableTour({ From 69f5beee7b9b98c07b213dc2527da5c822886b0c Mon Sep 17 00:00:00 2001 From: tomivm Date: Tue, 11 Jun 2024 17:32:15 -0300 Subject: [PATCH 04/35] Fix addRootBoard import --- src/components/Account/Login/Login.actions.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/Account/Login/Login.actions.js b/src/components/Account/Login/Login.actions.js index 8d69d889e..979ee3de0 100644 --- a/src/components/Account/Login/Login.actions.js +++ b/src/components/Account/Login/Login.actions.js @@ -1,8 +1,11 @@ import API from '../../../api'; import { LOGIN_SUCCESS, LOGOUT } from './Login.constants'; -import { addBoards, cleanAllBoards } from '../../Board/Board.actions'; import { - addRootBoard, + addBoards, + cleanAllBoards, + addRootBoard +} from '../../Board/Board.actions'; +import { changeVoice, changePitch, changeRate From bec7283003397236bf066c458732d09d7aa48669 Mon Sep 17 00:00:00 2001 From: tomivm Date: Tue, 11 Jun 2024 17:47:38 -0300 Subject: [PATCH 05/35] refactor: Update addRootBoard import and function name to addRootBoardFromDefaultBoards --- src/components/Account/Login/Login.actions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Account/Login/Login.actions.js b/src/components/Account/Login/Login.actions.js index 979ee3de0..766a77fa1 100644 --- a/src/components/Account/Login/Login.actions.js +++ b/src/components/Account/Login/Login.actions.js @@ -3,7 +3,7 @@ import { LOGIN_SUCCESS, LOGOUT } from './Login.constants'; import { addBoards, cleanAllBoards, - addRootBoard + addRootBoardFromDefaultBoards } from '../../Board/Board.actions'; import { changeVoice, @@ -178,7 +178,7 @@ export function login({ email, password, activatedData }, type = 'local') { ); dispatch(cleanAllBoards()); dispatch(addBoards(apiBoards)); - dispatch(addRootBoard()); + dispatch(addRootBoardFromDefaultBoards()); if (type === 'local') { dispatch( disableTour({ From 408fba8bbd8f92e550265e5b7815a5bba192fb7a Mon Sep 17 00:00:00 2001 From: tomivm Date: Tue, 11 Jun 2024 22:23:55 -0300 Subject: [PATCH 06/35] refactor: Rename addRootBoard function to findAndAddRootBoardOnDefaultBoards --- src/components/Account/Login/Login.actions.js | 4 +-- src/components/Board/Board.actions.js | 30 ++++++++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/components/Account/Login/Login.actions.js b/src/components/Account/Login/Login.actions.js index 766a77fa1..829b5b9c9 100644 --- a/src/components/Account/Login/Login.actions.js +++ b/src/components/Account/Login/Login.actions.js @@ -3,7 +3,7 @@ import { LOGIN_SUCCESS, LOGOUT } from './Login.constants'; import { addBoards, cleanAllBoards, - addRootBoardFromDefaultBoards + findAndAddRootBoardOnDefaultBoards } from '../../Board/Board.actions'; import { changeVoice, @@ -178,7 +178,7 @@ export function login({ email, password, activatedData }, type = 'local') { ); dispatch(cleanAllBoards()); dispatch(addBoards(apiBoards)); - dispatch(addRootBoardFromDefaultBoards()); + dispatch(findAndAddRootBoardOnDefaultBoards()); if (type === 'local') { dispatch( disableTour({ diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index cb5c6a502..b725872e0 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -847,7 +847,7 @@ export function cleanAllBoards() { type: CLEAN_ALL_BOARDS }; } -export function addRootBoard() { +export function findAndAddRootBoardOnDefaultBoards() { return (dispatch, getState) => { try { const activeCommunicator = getActiveCommunicator(getState); @@ -856,13 +856,29 @@ export function addRootBoard() { board => board.id === rootBoard ); if (!board) { - ALL_DEFAULT_BOARDS.advanced.some(defaultBoard => { - if (defaultBoard.id === rootBoard) { - dispatch(addBoards([defaultBoard])); - return true; + const addNecessaryBoards = necessaryBoardId => { + const isRootBoardAdded = ALL_DEFAULT_BOARDS.some(defaultBoard => { + if (defaultBoard.id === necessaryBoardId) { + dispatch(addBoards([defaultBoard])); + defaultBoard.tiles.forEach(tile => { + if ( + tile.loadBoard && + !getState().board.boards.some( + board => board.id === tile.loadBoard + ) + ) { + addNecessaryBoards(tile.loadBoard); + } + }); + return true; + } + return false; + }); + if (!isRootBoardAdded) { + throw new Error('Root board not found searching on default boards'); } - return false; - }); + }; + addNecessaryBoards(rootBoard); } } catch (e) { console.error(e); From 360aa9e2f1cdab38dbec33ebe5104bede913d3e0 Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 13 Jun 2024 10:32:24 -0300 Subject: [PATCH 07/35] Refactor login to add necessary default boards for homeBoards --- src/components/Account/Login/Login.actions.js | 12 ++- src/components/Board/Board.actions.js | 92 ++++++++----------- 2 files changed, 48 insertions(+), 56 deletions(-) diff --git a/src/components/Account/Login/Login.actions.js b/src/components/Account/Login/Login.actions.js index 829b5b9c9..08f6271bc 100644 --- a/src/components/Account/Login/Login.actions.js +++ b/src/components/Account/Login/Login.actions.js @@ -3,7 +3,7 @@ import { LOGIN_SUCCESS, LOGOUT } from './Login.constants'; import { addBoards, cleanAllBoards, - findAndAddRootBoardOnDefaultBoards + addNecessaryDefaultBoardsFor } from '../../Board/Board.actions'; import { changeVoice, @@ -178,7 +178,15 @@ export function login({ email, password, activatedData }, type = 'local') { ); dispatch(cleanAllBoards()); dispatch(addBoards(apiBoards)); - dispatch(findAndAddRootBoardOnDefaultBoards()); + const userDefaultBoardsIncluded = + currentCommunicator.defaultBoardsIncluded; + if (userDefaultBoardsIncluded) { + userDefaultBoardsIncluded.forEach(({ homeBoard }) => { + dispatch(addNecessaryDefaultBoardsFor(homeBoard)); + }); + } else { + dispatch(addNecessaryDefaultBoardsFor(currentCommunicator.rootBoard)); + } if (type === 'local') { dispatch( disableTour({ diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index b725872e0..89c5222db 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -847,69 +847,53 @@ export function cleanAllBoards() { type: CLEAN_ALL_BOARDS }; } -export function findAndAddRootBoardOnDefaultBoards() { + +export function addNecessaryDefaultBoardsFor(boardIdToAdd) { return (dispatch, getState) => { - try { - const activeCommunicator = getActiveCommunicator(getState); - const rootBoard = activeCommunicator.rootBoard; + const checkedBoardsIds = []; + const addNecessaryBoards = ({ dispatch, getState, necessaryBoardId }) => { const board = getState().board.boards.find( - board => board.id === rootBoard + board => board?.id === necessaryBoardId ); - if (!board) { - const addNecessaryBoards = necessaryBoardId => { - const isRootBoardAdded = ALL_DEFAULT_BOARDS.some(defaultBoard => { - if (defaultBoard.id === necessaryBoardId) { - dispatch(addBoards([defaultBoard])); - defaultBoard.tiles.forEach(tile => { - if ( - tile.loadBoard && - !getState().board.boards.some( - board => board.id === tile.loadBoard - ) - ) { - addNecessaryBoards(tile.loadBoard); - } + const checkLoadBoards = board => { + checkedBoardsIds.push(board.id); + board.tiles.forEach(tile => { + if ( + tile.loadBoard + // !getState().board.boards.some(board => board.id === tile.loadBoard) + ) { + if (!checkedBoardsIds.includes(tile.loadBoard)) { + addNecessaryBoards({ + dispatch, + getState, + necessaryBoardId: tile.loadBoard }); - return true; } - return false; - }); - if (!isRootBoardAdded) { - throw new Error('Root board not found searching on default boards'); } - }; - addNecessaryBoards(rootBoard); + }); + }; + if (board) { + checkLoadBoards(board); + return; } + + ALL_DEFAULT_BOARDS.some(defaultBoard => { + if (defaultBoard.id === necessaryBoardId) { + dispatch(addBoards([defaultBoard])); + checkLoadBoards(defaultBoard); + return true; + } + return false; + }); + }; + try { + addNecessaryBoards({ + dispatch, + getState, + necessaryBoardId: boardIdToAdd + }); } catch (e) { console.error(e); } }; } - -export function addDefaultBoards() { - return (dispatch, getState) => { - const boardsIdsToAdd = []; - // These are all boards including the boards that are getted from the API if this is called in the finally of getApiMyBoards thunk - const allStoreBoards = getState().board.boards; - allStoreBoards.forEach(includedBoard => { - includedBoard.tiles.forEach(tile => { - if (tile.loadBoard && !boardsIdsToAdd.includes(tile.loadBoard)) - boardsIdsToAdd.push(tile.loadBoard); - }); - }); - - boardsIdsToAdd.forEach(boardId => { - const allStoreBoards = getState().board.boards; - const board = allStoreBoards.find(board => board.id === boardId); - if (!board) { - ALL_DEFAULT_BOARDS.some(defaultBoard => { - if (defaultBoard.id === boardId) { - dispatch(addBoards([defaultBoard])); - return true; - } - return false; - }); - } - }); - }; -} From 15ba033161aef802cd313dc507116989d37457c4 Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 13 Jun 2024 10:35:22 -0300 Subject: [PATCH 08/35] Add necessary default boards for remote boards --- src/components/Board/Board.actions.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 89c5222db..89cf27e12 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -510,6 +510,10 @@ export function getApiMyBoards() { }) .then(res => { dispatch(getApiMyBoardsSuccess(res)); + const newBoards = res.data; + newBoards?.forEach(({ id }) => { + dispatch(addNecessaryDefaultBoardsFor(id)); + }); return res; }) .catch(err => { From 2aeeb4a8a78b407e71300b9b7bdcdb5bbaa07baf Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 13 Jun 2024 10:37:54 -0300 Subject: [PATCH 09/35] Prevent unnecessary requests to get boards for local Ids --- src/components/Account/Login/Login.actions.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/Account/Login/Login.actions.js b/src/components/Account/Login/Login.actions.js index 08f6271bc..631899a55 100644 --- a/src/components/Account/Login/Login.actions.js +++ b/src/components/Account/Login/Login.actions.js @@ -165,12 +165,15 @@ export function login({ email, password, activatedData }, type = 'local') { id => localBoardsIds.indexOf(id) < 0 ); + const SHORT_ID_MAX_LENGTH = 14; + const apiBoards = await Promise.all( apiBoardsIds .map(async id => { let board = null; try { - board = await API.getBoard(id); + if (!(id.length < SHORT_ID_MAX_LENGTH)) + board = await API.getBoard(id); } catch (e) {} return board; }) From 1dcf25e12fc936a5cda04dcc7ed76a204925b6e2 Mon Sep 17 00:00:00 2001 From: tomivm Date: Fri, 14 Jun 2024 14:37:09 -0300 Subject: [PATCH 10/35] Add necessary Default boards on changeDefaultBoard --- src/components/Board/Board.actions.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 89cf27e12..381218b4b 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -165,6 +165,7 @@ export function changeDefaultBoard(selectedBoardNameOnJson) { const switchActiveBoard = homeBoardId => { if (homeBoardId) { + dispatch(addNecessaryDefaultBoardsFor(homeBoardId)); const goTo = `/board/${homeBoardId}`; dispatch(switchBoard(homeBoardId)); From 2cca7af16f12885b4c79ffa1ff29ebf82d2bf633 Mon Sep 17 00:00:00 2001 From: tomivm Date: Fri, 14 Jun 2024 18:45:58 -0300 Subject: [PATCH 11/35] Enforces the possibilities to find the home board if it is requested --- src/components/Board/Board.container.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/components/Board/Board.container.js b/src/components/Board/Board.container.js index 8a01dcc98..daae00aa7 100644 --- a/src/components/Board/Board.container.js +++ b/src/components/Board/Board.container.js @@ -47,7 +47,8 @@ import { downloadImages, createApiBoard, upsertApiBoard, - changeDefaultBoard + changeDefaultBoard, + addNecessaryDefaultBoardsFor } from './Board.actions'; import { upsertCommunicator, @@ -71,6 +72,7 @@ import { IS_BROWSING_FROM_APPLE_TOUCH, IS_BROWSING_FROM_SAFARI } from '../../constants'; +import { ALL_DEFAULT_BOARDS } from '../../helpers'; //import { isAndroid } from '../../cordova-util'; const ogv = require('ogv'); @@ -221,7 +223,8 @@ export class BoardContainer extends Component { changeBoard, userData, history, - getApiObjects + getApiObjects, + addNecessaryDefaultBoardsFor //downloadImages } = this.props; @@ -274,9 +277,13 @@ export class BoardContainer extends Component { if (!boardExists) { // try the root board - boardExists = boards.find(b => b.id === communicator.rootBoard); + const homeBoard = communicator.rootBoard; + if (ALL_DEFAULT_BOARDS.map({ id }.includes(homeBoard))) + addNecessaryDefaultBoardsFor(homeBoard); + boardExists = boards.find(b => b.id === homeBoard); if (!boardExists) { - boardExists = boards.find(b => b.id !== ''); + boardExists = this.tryRemoteBoard(homeBoard); + if (!boardExists) boardExists = boards.find(b => b.id !== ''); } } const boardId = boardExists.id; @@ -1783,7 +1790,8 @@ const mapDispatchToProps = { disableTour, createApiBoard, upsertApiBoard, - changeDefaultBoard + changeDefaultBoard, + addNecessaryDefaultBoardsFor }; export default connect( From f1e3fcf5f234ca9f729c7d03ff1ae68bb48c85c0 Mon Sep 17 00:00:00 2001 From: tomivm Date: Fri, 14 Jun 2024 19:30:48 -0300 Subject: [PATCH 12/35] Fix incorrect map to search ids on ALL_DEFAULT_BOARDS --- src/components/Board/Board.container.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Board/Board.container.js b/src/components/Board/Board.container.js index daae00aa7..6d232e3ce 100644 --- a/src/components/Board/Board.container.js +++ b/src/components/Board/Board.container.js @@ -278,7 +278,7 @@ export class BoardContainer extends Component { if (!boardExists) { // try the root board const homeBoard = communicator.rootBoard; - if (ALL_DEFAULT_BOARDS.map({ id }.includes(homeBoard))) + if (ALL_DEFAULT_BOARDS.map(({ id }) => id).includes(homeBoard)) addNecessaryDefaultBoardsFor(homeBoard); boardExists = boards.find(b => b.id === homeBoard); if (!boardExists) { From ee8c86c5eeecdfe6e66b1f6a99b0f052d8722bf9 Mon Sep 17 00:00:00 2001 From: tomivm Date: Fri, 14 Jun 2024 19:31:31 -0300 Subject: [PATCH 13/35] Create helper function to check if id is Remote --- src/helpers.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/helpers.js b/src/helpers.js index 9327fd56f..06770683d 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -10,6 +10,12 @@ let picSeePalCopy = JSON.parse(JSON.stringify(DEFAULT_BOARDS.picSeePal)); export const ALL_DEFAULT_BOARDS = [...advancedCopy, ...picSeePalCopy]; +export const SHORT_ID_MAX_LENGTH = 14; + +export const isRemoteIdChecker = id => { + return !(id.length < SHORT_ID_MAX_LENGTH); +}; + export const dataURLtoFile = (dataurl, filename, checkExtension = false) => { // https://stackoverflow.com/a/38936042 const arr = dataurl.split(','); From 3a7b9738e2c9f0490be4d2f5d53a7c50cae99455 Mon Sep 17 00:00:00 2001 From: tomivm Date: Fri, 14 Jun 2024 19:32:49 -0300 Subject: [PATCH 14/35] Add insurance to find Default Boards on a folder click --- src/components/Board/Board.container.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/components/Board/Board.container.js b/src/components/Board/Board.container.js index 6d232e3ce..121b45f5d 100644 --- a/src/components/Board/Board.container.js +++ b/src/components/Board/Board.container.js @@ -72,7 +72,7 @@ import { IS_BROWSING_FROM_APPLE_TOUCH, IS_BROWSING_FROM_SAFARI } from '../../constants'; -import { ALL_DEFAULT_BOARDS } from '../../helpers'; +import { ALL_DEFAULT_BOARDS, isRemoteIdChecker } from '../../helpers'; //import { isAndroid } from '../../cordova-util'; const ogv = require('ogv'); @@ -884,8 +884,22 @@ export class BoardContainer extends Component { }; if (tile.loadBoard) { + const loadBoardFinder = loadBoardSearched => { + const findBoardOnStore = boardId => + this.props.boards.find(b => b.id === boardId); + + const nextBoard = findBoardOnStore(loadBoardSearched); + if (nextBoard) return nextBoard; + if ( + ALL_DEFAULT_BOARDS.map(({ id }) => id).includes(loadBoardSearched) + ) { + addNecessaryDefaultBoardsFor(loadBoardSearched); + const nextBoard = findBoardOnStore(loadBoardFinder); + if (nextBoard) return nextBoard; + } + }; const nextBoard = - boards.find(b => b.id === tile.loadBoard) || + loadBoardFinder(tile.loadBoard) || // If the board id is invalid, try falling back to a board // with the right name. boards.find(b => b.name === tile.label); From 0f7c473bde0241e76e5fbc1efbce43daec74f320 Mon Sep 17 00:00:00 2001 From: tomivm Date: Fri, 14 Jun 2024 19:36:57 -0300 Subject: [PATCH 15/35] use remoteIdChecker helper function --- src/components/Account/Login/Login.actions.js | 6 ++---- src/components/Board/Board.container.js | 3 ++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/Account/Login/Login.actions.js b/src/components/Account/Login/Login.actions.js index 631899a55..067b4b265 100644 --- a/src/components/Account/Login/Login.actions.js +++ b/src/components/Account/Login/Login.actions.js @@ -19,6 +19,7 @@ import { } from '../../App/App.actions'; import { getVoiceURI } from '../../../i18n'; import { isCordova, isElectron } from '../../../cordova-util'; +import { isRemoteIdChecker } from '../../../helpers'; export function loginSuccess(payload) { return dispatch => { @@ -165,15 +166,12 @@ export function login({ email, password, activatedData }, type = 'local') { id => localBoardsIds.indexOf(id) < 0 ); - const SHORT_ID_MAX_LENGTH = 14; - const apiBoards = await Promise.all( apiBoardsIds .map(async id => { let board = null; try { - if (!(id.length < SHORT_ID_MAX_LENGTH)) - board = await API.getBoard(id); + if (isRemoteIdChecker(id)) board = await API.getBoard(id); } catch (e) {} return board; }) diff --git a/src/components/Board/Board.container.js b/src/components/Board/Board.container.js index 121b45f5d..ae2188751 100644 --- a/src/components/Board/Board.container.js +++ b/src/components/Board/Board.container.js @@ -282,7 +282,8 @@ export class BoardContainer extends Component { addNecessaryDefaultBoardsFor(homeBoard); boardExists = boards.find(b => b.id === homeBoard); if (!boardExists) { - boardExists = this.tryRemoteBoard(homeBoard); + if (isRemoteIdChecker(homeBoard)) + boardExists = this.tryRemoteBoard(homeBoard); if (!boardExists) boardExists = boards.find(b => b.id !== ''); } } From 952d81a6ecea64d4a8a6987f512ce601b71d8cf3 Mon Sep 17 00:00:00 2001 From: tomivm Date: Wed, 19 Jun 2024 09:22:00 +0200 Subject: [PATCH 16/35] mark unnecesaryDefaultBoardsRemoved as true on cleanAllBoards --- src/components/Board/Board.reducer.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/Board/Board.reducer.js b/src/components/Board/Board.reducer.js index 4e595138d..e7113b11f 100644 --- a/src/components/Board/Board.reducer.js +++ b/src/components/Board/Board.reducer.js @@ -51,7 +51,8 @@ const initialState = { images: [], isFixed: false, isLiveMode: false, - improvedPhrase: '' + improvedPhrase: '', + unnecesaryDefaultBoardsRemoved: false }; function reconcileBoards(localBoard, remoteBoard) { @@ -253,7 +254,8 @@ function boardReducer(state = initialState, action) { case CLEAN_ALL_BOARDS: return { ...state, - boards: [] + boards: [], + unnecesaryDefaultBoardsRemoved: true }; case CREATE_TILE: return { From 74ee5db028b5c2f47bc4a49c84fbeb71ad6bbca9 Mon Sep 17 00:00:00 2001 From: tomivm Date: Tue, 25 Jun 2024 14:09:49 +0200 Subject: [PATCH 17/35] Fix board reducer test --- src/components/Board/__tests__/Board.reducer.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Board/__tests__/Board.reducer.test.js b/src/components/Board/__tests__/Board.reducer.test.js index ebd19708c..ebec1f4be 100644 --- a/src/components/Board/__tests__/Board.reducer.test.js +++ b/src/components/Board/__tests__/Board.reducer.test.js @@ -53,7 +53,8 @@ const initialState = { isFixed: false, images: [], isLiveMode: false, - improvedPhrase: '' + improvedPhrase: '', + unnecesaryDefaultBoardsRemoved: false }; describe('reducer', () => { From 4bcd5488e7e911940da52890af63c142e631cb8d Mon Sep 17 00:00:00 2001 From: tomivm Date: Wed, 26 Jun 2024 17:04:24 +0200 Subject: [PATCH 18/35] fix getActiveComunnicator function --- src/components/Communicator/Communicator.actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Communicator/Communicator.actions.js b/src/components/Communicator/Communicator.actions.js index 13b12f766..221d30c6d 100644 --- a/src/components/Communicator/Communicator.actions.js +++ b/src/components/Communicator/Communicator.actions.js @@ -189,7 +189,7 @@ export function verifyAndUpsertCommunicator( } = getState(); const getActiveCommunicator = getState => { - getState().communicator.communicators.find( + return getState().communicator.communicators.find( c => c.id === getState().communicator.activeCommunicatorId ); }; From 150d7b620d791ad4cebbc6545ad03bd3703df03c Mon Sep 17 00:00:00 2001 From: tomivm Date: Wed, 26 Jun 2024 17:06:12 +0200 Subject: [PATCH 19/35] Concat default boards Ids in a blacklist on create API board --- src/components/Board/Board.actions.js | 10 ++++-- .../Communicator/Communicator.actions.js | 31 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 292485659..0089c8849 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -52,10 +52,15 @@ import { upsertApiCommunicator, updateDefaultBoardsIncluded, addDefaultBoardIncluded, - verifyAndUpsertCommunicator + verifyAndUpsertCommunicator, + concatDefaultBoardIdToBlacklist } from '../Communicator/Communicator.actions'; import { isAndroid, writeCvaFile } from '../../cordova-util'; -import { ALL_DEFAULT_BOARDS, DEFAULT_BOARDS } from '../../helpers'; +import { + ALL_DEFAULT_BOARDS, + DEFAULT_BOARDS, + isRemoteIdChecker +} from '../../helpers'; import history from './../../history'; import { improvePhraseAbortController } from '../../api/api'; @@ -522,6 +527,7 @@ export function createApiBoard(boardData, boardId) { }; return API.createBoard(boardData) .then(res => { + dispatch(concatDefaultBoardIdToBlacklist(boardId)); dispatch(createApiBoardSuccess(res, boardId)); return res; }) diff --git a/src/components/Communicator/Communicator.actions.js b/src/components/Communicator/Communicator.actions.js index 221d30c6d..e42490e73 100644 --- a/src/components/Communicator/Communicator.actions.js +++ b/src/components/Communicator/Communicator.actions.js @@ -291,3 +291,34 @@ export function updateDefaultBoardsIncluded(boardAlreadyIncludedData) { defaultBoardsIncluded: boardAlreadyIncludedData }; } + +export function concatDefaultBoardIdToBlacklist(boardId) { + const getActiveCommunicator = getState => { + return getState().communicator.communicators.find( + c => c.id === getState().communicator.activeCommunicatorId + ); + }; + return (dispatch, getState) => { + const updatedCommunicatorData = { ...getActiveCommunicator(getState) }; + console.log(updatedCommunicatorData); + + const concatBoardIdIfNecessary = () => { + if (!updatedCommunicatorData?.defaultBoardBlackList.includes(boardId)) + return updatedCommunicatorData?.defaultBoardBlackList.concat(boardId); + return updatedCommunicatorData?.defaultBoardBlackList; + }; + + updatedCommunicatorData.defaultBoardBlackList = updatedCommunicatorData?.defaultBoardBlackList + ? concatBoardIdIfNecessary() + : [boardId]; + + dispatch(verifyAndUpsertCommunicator(updatedCommunicatorData)); + return dispatch(upsertApiCommunicator(updatedCommunicatorData)) + .then(() => { + return updatedCommunicatorData?.defaultBoardBlackList; + }) + .catch(e => { + console.error(e.message); + }); + }; +} From aa38a14f1da4a4a5d8186796d145817fc28bf31a Mon Sep 17 00:00:00 2001 From: tomivm Date: Wed, 26 Jun 2024 17:07:12 +0200 Subject: [PATCH 20/35] remove unnecessary import --- src/components/Board/Board.actions.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 0089c8849..47700b7f2 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -56,11 +56,7 @@ import { concatDefaultBoardIdToBlacklist } from '../Communicator/Communicator.actions'; import { isAndroid, writeCvaFile } from '../../cordova-util'; -import { - ALL_DEFAULT_BOARDS, - DEFAULT_BOARDS, - isRemoteIdChecker -} from '../../helpers'; +import { ALL_DEFAULT_BOARDS, DEFAULT_BOARDS } from '../../helpers'; import history from './../../history'; import { improvePhraseAbortController } from '../../api/api'; From 54aa14d8b52710519e49b4a9d86fe8a43d68ba01 Mon Sep 17 00:00:00 2001 From: tomivm Date: Wed, 26 Jun 2024 18:25:52 +0200 Subject: [PATCH 21/35] await for concatDefaultBoardIdToBlacklist --- src/components/Board/Board.actions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 47700b7f2..b1aea19d2 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -522,8 +522,8 @@ export function createApiBoard(boardData, boardId) { isPublic: false }; return API.createBoard(boardData) - .then(res => { - dispatch(concatDefaultBoardIdToBlacklist(boardId)); + .then(async res => { + await dispatch(concatDefaultBoardIdToBlacklist(boardId)); dispatch(createApiBoardSuccess(res, boardId)); return res; }) From b18c8a2f5ce0f78826373bf40a3558206af40ebf Mon Sep 17 00:00:00 2001 From: tomivm Date: Wed, 26 Jun 2024 19:04:53 +0200 Subject: [PATCH 22/35] Remove Boards from the blacklist on update API objects --- src/components/Board/Board.actions.js | 10 +++++++++- src/components/Board/Board.constants.js | 1 + src/components/Board/Board.reducer.js | 10 +++++++++- src/components/Communicator/Communicator.actions.js | 10 +++++++++- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index b1aea19d2..6e467c89d 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -39,7 +39,8 @@ import { DOWNLOAD_IMAGES_STARTED, DOWNLOAD_IMAGE_SUCCESS, DOWNLOAD_IMAGE_FAILURE, - CLEAN_ALL_BOARDS + CLEAN_ALL_BOARDS, + REMOVE_BOARDS_FROM_LIST } from './Board.constants'; import API from '../../api'; @@ -885,3 +886,10 @@ export function addNecessaryDefaultBoardsFor(boardIdToAdd) { } }; } + +export function removeBoardsFromList(blacklist = []) { + return { + type: REMOVE_BOARDS_FROM_LIST, + blacklist + }; +} diff --git a/src/components/Board/Board.constants.js b/src/components/Board/Board.constants.js index 297649f99..d361764d4 100644 --- a/src/components/Board/Board.constants.js +++ b/src/components/Board/Board.constants.js @@ -3,6 +3,7 @@ export const ADD_BOARDS = 'cboard/Board/ADD_BOARDS'; export const CREATE_BOARD = 'cboard/Board/CREATE_BOARD'; export const UPDATE_BOARD = 'cboard/Board/UPDATE_BOARD'; export const DELETE_BOARD = 'cboard/Board/DELETE_BOARD'; +export const REMOVE_BOARDS_FROM_LIST = 'cboard/Board/REMOVE_BOARDS_FROM_LIST'; export const CHANGE_BOARD = 'cboard/Board/CHANGE_BOARD'; export const REPLACE_BOARD = 'cboard/Board/REPLACE_BOARD'; export const SWITCH_BOARD = 'cboard/Board/SWITCH_BOARD'; diff --git a/src/components/Board/Board.reducer.js b/src/components/Board/Board.reducer.js index e7113b11f..7426342b1 100644 --- a/src/components/Board/Board.reducer.js +++ b/src/components/Board/Board.reducer.js @@ -37,7 +37,8 @@ import { DOWNLOAD_IMAGES_STARTED, DOWNLOAD_IMAGE_SUCCESS, DOWNLOAD_IMAGE_FAILURE, - CLEAN_ALL_BOARDS + CLEAN_ALL_BOARDS, + REMOVE_BOARDS_FROM_LIST } from './Board.constants'; import { LOGOUT, LOGIN_SUCCESS } from '../Account/Login/Login.constants'; @@ -251,6 +252,13 @@ function boardReducer(state = initialState, action) { board => action.boardId.indexOf(board.id) === -1 ) }; + case REMOVE_BOARDS_FROM_LIST: + return { + ...state, + boards: state.boards.filter( + board => !action.blacklist?.includes(board.id) + ) + }; case CLEAN_ALL_BOARDS: return { ...state, diff --git a/src/components/Communicator/Communicator.actions.js b/src/components/Communicator/Communicator.actions.js index e42490e73..01a732e92 100644 --- a/src/components/Communicator/Communicator.actions.js +++ b/src/components/Communicator/Communicator.actions.js @@ -22,6 +22,7 @@ import { import { defaultCommunicatorID } from './Communicator.reducer'; import API from '../../api'; import shortid from 'shortid'; +import { removeBoardsFromList } from '../Board/Board.actions'; export function importCommunicator(communicator) { return { @@ -230,10 +231,17 @@ export function verifyAndUpsertCommunicator( */ export function getApiMyCommunicators() { - return dispatch => { + return (dispatch, getState) => { dispatch(getApiMyCommunicatorsStarted()); return API.getCommunicators() .then(res => { + const activeCommunicator = + res.data.find( + communicator => + communicator.id === getState().communicator.activeCommunicator + ) ?? res.data[0]; + const defaultBoardBlackList = activeCommunicator?.defaultBoardBlackList; + dispatch(removeBoardsFromList(defaultBoardBlackList)); dispatch(getApiMyCommunicatorsSuccess(res)); return res; }) From 26d968968a2561c1f9ec3403e0873bf47dde524c Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 27 Jun 2024 13:19:32 +0200 Subject: [PATCH 23/35] Remove staff to clean all boards on login --- src/components/Account/Login/Login.actions.js | 16 +--------------- src/components/Board/Board.actions.js | 10 ---------- src/components/Board/Board.constants.js | 1 - src/components/Board/Board.reducer.js | 10 +--------- .../Board/__tests__/Board.reducer.test.js | 3 +-- 5 files changed, 3 insertions(+), 37 deletions(-) diff --git a/src/components/Account/Login/Login.actions.js b/src/components/Account/Login/Login.actions.js index 067b4b265..a0d6bd9a8 100644 --- a/src/components/Account/Login/Login.actions.js +++ b/src/components/Account/Login/Login.actions.js @@ -1,10 +1,6 @@ import API from '../../../api'; import { LOGIN_SUCCESS, LOGOUT } from './Login.constants'; -import { - addBoards, - cleanAllBoards, - addNecessaryDefaultBoardsFor -} from '../../Board/Board.actions'; +import { addBoards } from '../../Board/Board.actions'; import { changeVoice, changePitch, @@ -177,17 +173,7 @@ export function login({ email, password, activatedData }, type = 'local') { }) .filter(b => b !== null) ); - dispatch(cleanAllBoards()); dispatch(addBoards(apiBoards)); - const userDefaultBoardsIncluded = - currentCommunicator.defaultBoardsIncluded; - if (userDefaultBoardsIncluded) { - userDefaultBoardsIncluded.forEach(({ homeBoard }) => { - dispatch(addNecessaryDefaultBoardsFor(homeBoard)); - }); - } else { - dispatch(addNecessaryDefaultBoardsFor(currentCommunicator.rootBoard)); - } if (type === 'local') { dispatch( disableTour({ diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 315194ccd..c336267b7 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -502,10 +502,6 @@ export function getApiMyBoards() { }) .then(res => { dispatch(getApiMyBoardsSuccess(res)); - const newBoards = res.data; - newBoards?.forEach(({ id }) => { - dispatch(addNecessaryDefaultBoardsFor(id)); - }); return res; }) .catch(err => { @@ -831,12 +827,6 @@ export function updateApiObjects( }; } -export function cleanAllBoards() { - return { - type: CLEAN_ALL_BOARDS - }; -} - export function addNecessaryDefaultBoardsFor(boardIdToAdd) { return (dispatch, getState) => { const checkedBoardsIds = []; diff --git a/src/components/Board/Board.constants.js b/src/components/Board/Board.constants.js index d361764d4..4365c968e 100644 --- a/src/components/Board/Board.constants.js +++ b/src/components/Board/Board.constants.js @@ -20,7 +20,6 @@ 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 CLEAN_ALL_BOARDS = 'cboard/Board/CLEAN_ALL_BOARDS'; 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'; diff --git a/src/components/Board/Board.reducer.js b/src/components/Board/Board.reducer.js index 7426342b1..d1f669d3d 100644 --- a/src/components/Board/Board.reducer.js +++ b/src/components/Board/Board.reducer.js @@ -37,7 +37,6 @@ import { DOWNLOAD_IMAGES_STARTED, DOWNLOAD_IMAGE_SUCCESS, DOWNLOAD_IMAGE_FAILURE, - CLEAN_ALL_BOARDS, REMOVE_BOARDS_FROM_LIST } from './Board.constants'; import { LOGOUT, LOGIN_SUCCESS } from '../Account/Login/Login.constants'; @@ -52,8 +51,7 @@ const initialState = { images: [], isFixed: false, isLiveMode: false, - improvedPhrase: '', - unnecesaryDefaultBoardsRemoved: false + improvedPhrase: '' }; function reconcileBoards(localBoard, remoteBoard) { @@ -259,12 +257,6 @@ function boardReducer(state = initialState, action) { board => !action.blacklist?.includes(board.id) ) }; - case CLEAN_ALL_BOARDS: - return { - ...state, - boards: [], - unnecesaryDefaultBoardsRemoved: true - }; case CREATE_TILE: return { ...state, diff --git a/src/components/Board/__tests__/Board.reducer.test.js b/src/components/Board/__tests__/Board.reducer.test.js index ebec1f4be..ebd19708c 100644 --- a/src/components/Board/__tests__/Board.reducer.test.js +++ b/src/components/Board/__tests__/Board.reducer.test.js @@ -53,8 +53,7 @@ const initialState = { isFixed: false, images: [], isLiveMode: false, - improvedPhrase: '', - unnecesaryDefaultBoardsRemoved: false + improvedPhrase: '' }; describe('reducer', () => { From 9d4659cb0f4580a7568e0f3653b762b119cb64d2 Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 27 Jun 2024 13:56:30 +0200 Subject: [PATCH 24/35] remove unnecessary stuff to addNecessaryDefaultBoardsFor --- src/components/Board/Board.actions.js | 57 ++----------------------- src/components/Board/Board.container.js | 29 ++++++++----- 2 files changed, 23 insertions(+), 63 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index c336267b7..dce3a2875 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -39,7 +39,6 @@ import { DOWNLOAD_IMAGES_STARTED, DOWNLOAD_IMAGE_SUCCESS, DOWNLOAD_IMAGE_FAILURE, - CLEAN_ALL_BOARDS, REMOVE_BOARDS_FROM_LIST } from './Board.constants'; @@ -57,7 +56,7 @@ import { concatDefaultBoardIdToBlacklist } from '../Communicator/Communicator.actions'; import { isAndroid, writeCvaFile } from '../../cordova-util'; -import { ALL_DEFAULT_BOARDS, DEFAULT_BOARDS } from '../../helpers'; +import { DEFAULT_BOARDS } from '../../helpers'; import history from './../../history'; import { improvePhraseAbortController } from '../../api/api'; @@ -154,7 +153,9 @@ export function changeDefaultBoard(selectedBoardNameOnJson) { const switchActiveBoard = homeBoardId => { if (homeBoardId) { - dispatch(addNecessaryDefaultBoardsFor(homeBoardId)); + const storeBoards = getState().board.boards; + const board = storeBoards.find(board => board.id === homeBoardId); + if (!board) addBoards([board]); const goTo = `/board/${homeBoardId}`; dispatch(switchBoard(homeBoardId)); @@ -827,56 +828,6 @@ export function updateApiObjects( }; } -export function addNecessaryDefaultBoardsFor(boardIdToAdd) { - return (dispatch, getState) => { - const checkedBoardsIds = []; - const addNecessaryBoards = ({ dispatch, getState, necessaryBoardId }) => { - const board = getState().board.boards.find( - board => board?.id === necessaryBoardId - ); - const checkLoadBoards = board => { - checkedBoardsIds.push(board.id); - board.tiles.forEach(tile => { - if ( - tile.loadBoard - // !getState().board.boards.some(board => board.id === tile.loadBoard) - ) { - if (!checkedBoardsIds.includes(tile.loadBoard)) { - addNecessaryBoards({ - dispatch, - getState, - necessaryBoardId: tile.loadBoard - }); - } - } - }); - }; - if (board) { - checkLoadBoards(board); - return; - } - - ALL_DEFAULT_BOARDS.some(defaultBoard => { - if (defaultBoard.id === necessaryBoardId) { - dispatch(addBoards([defaultBoard])); - checkLoadBoards(defaultBoard); - return true; - } - return false; - }); - }; - try { - addNecessaryBoards({ - dispatch, - getState, - necessaryBoardId: boardIdToAdd - }); - } catch (e) { - console.error(e); - } - }; -} - export function removeBoardsFromList(blacklist = []) { return { type: REMOVE_BOARDS_FROM_LIST, diff --git a/src/components/Board/Board.container.js b/src/components/Board/Board.container.js index 765b43a37..162b8e4de 100644 --- a/src/components/Board/Board.container.js +++ b/src/components/Board/Board.container.js @@ -47,8 +47,7 @@ import { downloadImages, createApiBoard, upsertApiBoard, - changeDefaultBoard, - addNecessaryDefaultBoardsFor + changeDefaultBoard } from './Board.actions'; import { addBoardCommunicator, @@ -222,8 +221,7 @@ export class BoardContainer extends Component { changeBoard, userData, history, - getApiObjects, - addNecessaryDefaultBoardsFor + getApiObjects //downloadImages } = this.props; @@ -277,12 +275,12 @@ export class BoardContainer extends Component { if (!boardExists) { // try the root board const homeBoard = communicator.rootBoard; - if (ALL_DEFAULT_BOARDS.map(({ id }) => id).includes(homeBoard)) - addNecessaryDefaultBoardsFor(homeBoard); boardExists = boards.find(b => b.id === homeBoard); if (!boardExists) { if (isRemoteIdChecker(homeBoard)) boardExists = this.tryRemoteBoard(homeBoard); + if (!boardExists) + boardExists = this.addDefaultBoardIfnecessary(homeBoard); if (!boardExists) boardExists = boards.find(b => b.id !== ''); } } @@ -885,8 +883,8 @@ export class BoardContainer extends Component { if ( ALL_DEFAULT_BOARDS.map(({ id }) => id).includes(loadBoardSearched) ) { - addNecessaryDefaultBoardsFor(loadBoardSearched); - const nextBoard = findBoardOnStore(loadBoardFinder); + this.addDefaultBoardIfnecessary(loadBoardSearched); + const nextBoard = findBoardOnStore(loadBoardSearched); if (nextBoard) return nextBoard; } }; @@ -1528,6 +1526,18 @@ export class BoardContainer extends Component { : []; }; + addDefaultBoardIfnecessary = boardId => { + const { boards, addBoards } = this.props; + if (!boards.find(b => b.id === boardId)) { + const board = ALL_DEFAULT_BOARDS.find(({ id }) => id === boardId); + if (board) { + addBoards([board]); + return board; + } + return; + } + }; + render() { const { navHistory, @@ -1758,8 +1768,7 @@ const mapDispatchToProps = { createApiBoard, upsertApiBoard, changeDefaultBoard, - verifyAndUpsertCommunicator, - addNecessaryDefaultBoardsFor + verifyAndUpsertCommunicator }; export default connect( From 2bf7bd11e1f6c7a1745832e5bac398da55b4c587 Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 27 Jun 2024 14:27:22 +0200 Subject: [PATCH 25/35] edite the 'check createApiBoard' test to work with new actions --- src/components/Board/__tests__/Board.actions.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Board/__tests__/Board.actions.test.js b/src/components/Board/__tests__/Board.actions.test.js index c9743e001..3027b06db 100644 --- a/src/components/Board/__tests__/Board.actions.test.js +++ b/src/components/Board/__tests__/Board.actions.test.js @@ -318,7 +318,7 @@ describe('actions', () => { boardId: '12345678901234567', type: 'cboard/Board/CREATE_API_BOARD_SUCCESS' }; - expect(actions[1]).toEqual(dataResp); + expect(actions[5]).toEqual(dataResp); expect(data).toEqual(mockBoard); }) .catch(e => { From 01a16680a5e94448bf538531ccc709dcf5df157b Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 27 Jun 2024 14:39:16 +0200 Subject: [PATCH 26/35] Add prevention to only include default board ids to the blacklist --- src/components/Communicator/Communicator.actions.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Communicator/Communicator.actions.js b/src/components/Communicator/Communicator.actions.js index 01a732e92..a54d9421d 100644 --- a/src/components/Communicator/Communicator.actions.js +++ b/src/components/Communicator/Communicator.actions.js @@ -23,6 +23,7 @@ import { defaultCommunicatorID } from './Communicator.reducer'; import API from '../../api'; import shortid from 'shortid'; import { removeBoardsFromList } from '../Board/Board.actions'; +import { ALL_DEFAULT_BOARDS } from '../../helpers'; export function importCommunicator(communicator) { return { @@ -307,8 +308,8 @@ export function concatDefaultBoardIdToBlacklist(boardId) { ); }; return (dispatch, getState) => { + if (!ALL_DEFAULT_BOARDS.includes(boardId)) return; const updatedCommunicatorData = { ...getActiveCommunicator(getState) }; - console.log(updatedCommunicatorData); const concatBoardIdIfNecessary = () => { if (!updatedCommunicatorData?.defaultBoardBlackList.includes(boardId)) From a1f9f4e9c20d46f6e4623af6535100992ecc9181 Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 27 Jun 2024 14:44:38 +0200 Subject: [PATCH 27/35] improve CREATE_API_BOARD_SUCCESS test to find action --- src/components/Board/__tests__/Board.actions.test.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/Board/__tests__/Board.actions.test.js b/src/components/Board/__tests__/Board.actions.test.js index 3027b06db..68f44024e 100644 --- a/src/components/Board/__tests__/Board.actions.test.js +++ b/src/components/Board/__tests__/Board.actions.test.js @@ -318,7 +318,10 @@ describe('actions', () => { boardId: '12345678901234567', type: 'cboard/Board/CREATE_API_BOARD_SUCCESS' }; - expect(actions[5]).toEqual(dataResp); + const successAction = actions.find( + action => action.type === types.CREATE_API_BOARD_SUCCESS + ); + expect(successAction).toEqual(dataResp); expect(data).toEqual(mockBoard); }) .catch(e => { From 1d8256c735d493fc6b70436f230a517310995009 Mon Sep 17 00:00:00 2001 From: tomivm Date: Fri, 28 Jun 2024 15:18:13 +0200 Subject: [PATCH 28/35] use Last communicator if active communicator is not finded --- src/components/Communicator/Communicator.actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Communicator/Communicator.actions.js b/src/components/Communicator/Communicator.actions.js index a54d9421d..2c37fc49e 100644 --- a/src/components/Communicator/Communicator.actions.js +++ b/src/components/Communicator/Communicator.actions.js @@ -240,7 +240,7 @@ export function getApiMyCommunicators() { res.data.find( communicator => communicator.id === getState().communicator.activeCommunicator - ) ?? res.data[0]; + ) ?? res.data[res.data.length - 1]; const defaultBoardBlackList = activeCommunicator?.defaultBoardBlackList; dispatch(removeBoardsFromList(defaultBoardBlackList)); dispatch(getApiMyCommunicatorsSuccess(res)); From 27ca47e7a8cb8843a6a613e4b9c1f00c64ef9edd Mon Sep 17 00:00:00 2001 From: tomivm Date: Fri, 28 Jun 2024 15:33:07 +0200 Subject: [PATCH 29/35] fix action to include only default board ids in the blacklist --- src/components/Communicator/Communicator.actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Communicator/Communicator.actions.js b/src/components/Communicator/Communicator.actions.js index 2c37fc49e..e8bad1684 100644 --- a/src/components/Communicator/Communicator.actions.js +++ b/src/components/Communicator/Communicator.actions.js @@ -308,7 +308,7 @@ export function concatDefaultBoardIdToBlacklist(boardId) { ); }; return (dispatch, getState) => { - if (!ALL_DEFAULT_BOARDS.includes(boardId)) return; + if (!ALL_DEFAULT_BOARDS.map(({ id }) => id).includes(boardId)) return; const updatedCommunicatorData = { ...getActiveCommunicator(getState) }; const concatBoardIdIfNecessary = () => { From 63a01e8bf9020695d4a1696e4c5254d4dfe4a7a2 Mon Sep 17 00:00:00 2001 From: tomivm Date: Mon, 1 Jul 2024 17:27:34 +0200 Subject: [PATCH 30/35] Avoid unnecessary call to API --- src/components/Communicator/Communicator.actions.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/components/Communicator/Communicator.actions.js b/src/components/Communicator/Communicator.actions.js index e8bad1684..b06a79751 100644 --- a/src/components/Communicator/Communicator.actions.js +++ b/src/components/Communicator/Communicator.actions.js @@ -321,13 +321,6 @@ export function concatDefaultBoardIdToBlacklist(boardId) { ? concatBoardIdIfNecessary() : [boardId]; - dispatch(verifyAndUpsertCommunicator(updatedCommunicatorData)); - return dispatch(upsertApiCommunicator(updatedCommunicatorData)) - .then(() => { - return updatedCommunicatorData?.defaultBoardBlackList; - }) - .catch(e => { - console.error(e.message); - }); + return dispatch(verifyAndUpsertCommunicator(updatedCommunicatorData)); }; } From 37d235681e85f0eef326fdd76e4e0a80b627fc89 Mon Sep 17 00:00:00 2001 From: tomivm Date: Mon, 1 Jul 2024 17:57:28 +0200 Subject: [PATCH 31/35] Add a default state for defaultBoardBlackList --- src/api/communicators.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/api/communicators.json b/src/api/communicators.json index d092ea107..c76acc5ed 100644 --- a/src/api/communicators.json +++ b/src/api/communicators.json @@ -6,6 +6,7 @@ "author": "Cboard Team", "email": "support@cboard.io", "rootBoard": "root", - "boards": ["root"] + "boards": ["root"], + "defaultBoardBlackList": [] } ] From 333239448676914b5f087fd3d08d0599944fb999 Mon Sep 17 00:00:00 2001 From: tomivm Date: Mon, 1 Jul 2024 20:50:26 +0200 Subject: [PATCH 32/35] move to root board if user is on the crated board in another device --- src/components/Board/Board.actions.js | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index dce3a2875..79f484ed7 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -272,8 +272,15 @@ export function previousBoard() { } export function toRootBoard() { - return { - type: TO_ROOT_BOARD + return (dispatch, getState) => { + const rootBoard = getState().communicator.communicators.find( + communicator => + communicator.id === getState().communicator.activeCommunicatorId + ).rootBoard; + history.replace(rootBoard); + return dispatch({ + type: TO_ROOT_BOARD + }); }; } @@ -829,8 +836,14 @@ export function updateApiObjects( } export function removeBoardsFromList(blacklist = []) { - return { - type: REMOVE_BOARDS_FROM_LIST, - blacklist + return (dispatch, getState) => { + const actualBoardId = getState().board.activeBoardId; + if (blacklist.includes(actualBoardId)) { + dispatch(toRootBoard()); + } + dispatch({ + type: REMOVE_BOARDS_FROM_LIST, + blacklist + }); }; } From 93b8e1bf6ced3ebb082bdcb84836b3f1393c83cc Mon Sep 17 00:00:00 2001 From: tomivm Date: Mon, 1 Jul 2024 23:28:11 +0200 Subject: [PATCH 33/35] Prevent navigation to a deletedBoard --- src/components/Board/Board.actions.js | 19 ++++++++++++------- .../Communicator/Communicator.actions.js | 7 ++++++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index 79f484ed7..f0292e843 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -273,11 +273,14 @@ export function previousBoard() { export function toRootBoard() { return (dispatch, getState) => { - const rootBoard = getState().communicator.communicators.find( - communicator => - communicator.id === getState().communicator.activeCommunicatorId - ).rootBoard; - history.replace(rootBoard); + const navHistory = getState().board.navHistory; + const firstBoardOnHistory = navHistory[0]; + const allBoardsIds = getState().board.boards.map(board => board.id); + + if (!firstBoardOnHistory || !allBoardsIds.includes(firstBoardOnHistory)) { + return null; + } + history.replace(firstBoardOnHistory); return dispatch({ type: TO_ROOT_BOARD }); @@ -835,11 +838,13 @@ export function updateApiObjects( }; } -export function removeBoardsFromList(blacklist = []) { +export function removeBoardsFromList(blacklist = [], rootBoard) { return (dispatch, getState) => { const actualBoardId = getState().board.activeBoardId; if (blacklist.includes(actualBoardId)) { - dispatch(toRootBoard()); + history.replace(rootBoard); + dispatch(switchBoard(rootBoard)); + return dispatch(toRootBoard()); } dispatch({ type: REMOVE_BOARDS_FROM_LIST, diff --git a/src/components/Communicator/Communicator.actions.js b/src/components/Communicator/Communicator.actions.js index b06a79751..8ae72c349 100644 --- a/src/components/Communicator/Communicator.actions.js +++ b/src/components/Communicator/Communicator.actions.js @@ -242,7 +242,12 @@ export function getApiMyCommunicators() { communicator.id === getState().communicator.activeCommunicator ) ?? res.data[res.data.length - 1]; const defaultBoardBlackList = activeCommunicator?.defaultBoardBlackList; - dispatch(removeBoardsFromList(defaultBoardBlackList)); + dispatch( + removeBoardsFromList( + defaultBoardBlackList, + activeCommunicator.rootBoard + ) + ); dispatch(getApiMyCommunicatorsSuccess(res)); return res; }) From 9de64fe4d4cb813bfebfaf03a7076318679c76ae Mon Sep 17 00:00:00 2001 From: tomivm Date: Wed, 3 Jul 2024 19:07:04 +0200 Subject: [PATCH 34/35] Refactor toRootBoard test --- .../Board/__tests__/Board.actions.test.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/components/Board/__tests__/Board.actions.test.js b/src/components/Board/__tests__/Board.actions.test.js index 68f44024e..bda1fc74f 100644 --- a/src/components/Board/__tests__/Board.actions.test.js +++ b/src/components/Board/__tests__/Board.actions.test.js @@ -132,11 +132,21 @@ describe('actions', () => { expect(actions.previousBoard()).toEqual(expectedAction); }); - it('should create an action to REPLACE_ME', () => { + it('should create an action to REPLACE_ME', async () => { const expectedAction = { type: types.TO_ROOT_BOARD }; - expect(actions.toRootBoard()).toEqual(expectedAction); + const store = mockStore({ + ...initialState, + board: { + ...initialState.board, + navHistory: ['12345678901234567'], + boards: [{ ...mockBoard, id: '12345678901234567' }] + } + }); + await store.dispatch(actions.toRootBoard()); + const toRootBoardAction = store.getActions()[0]; + expect(toRootBoardAction).toEqual(expectedAction); }); it('should create an action to REPLACE_ME', () => { From 0674579f2b5b2dcddc6b66471aed6c1c93a0f817 Mon Sep 17 00:00:00 2001 From: tomivm Date: Thu, 4 Jul 2024 01:47:44 +0200 Subject: [PATCH 35/35] reduce the possibilities of delete active board --- src/components/Board/Board.actions.js | 13 +++++++------ src/components/Board/Board.container.js | 3 +-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/Board/Board.actions.js b/src/components/Board/Board.actions.js index f0292e843..6ed39922d 100644 --- a/src/components/Board/Board.actions.js +++ b/src/components/Board/Board.actions.js @@ -155,11 +155,12 @@ export function changeDefaultBoard(selectedBoardNameOnJson) { if (homeBoardId) { const storeBoards = getState().board.boards; const board = storeBoards.find(board => board.id === homeBoardId); - if (!board) addBoards([board]); + if (!board) return null; const goTo = `/board/${homeBoardId}`; dispatch(switchBoard(homeBoardId)); history.replace(goTo); + return true; } }; @@ -203,9 +204,7 @@ export function changeDefaultBoard(selectedBoardNameOnJson) { homeBoardId }); - switchActiveBoard(homeBoardId); - - replaceHomeBoard(homeBoardId); + if (switchActiveBoard(homeBoardId)) replaceHomeBoard(homeBoardId); }; } @@ -281,9 +280,10 @@ export function toRootBoard() { return null; } history.replace(firstBoardOnHistory); - return dispatch({ + dispatch({ type: TO_ROOT_BOARD }); + return firstBoardOnHistory; }; } @@ -844,7 +844,8 @@ export function removeBoardsFromList(blacklist = [], rootBoard) { if (blacklist.includes(actualBoardId)) { history.replace(rootBoard); dispatch(switchBoard(rootBoard)); - return dispatch(toRootBoard()); + const rootBoardFinded = dispatch(toRootBoard()); + if (!rootBoardFinded || blacklist.includes(rootBoard)) return; } dispatch({ type: REMOVE_BOARDS_FROM_LIST, diff --git a/src/components/Board/Board.container.js b/src/components/Board/Board.container.js index b9612ddec..25175a079 100644 --- a/src/components/Board/Board.container.js +++ b/src/components/Board/Board.container.js @@ -883,8 +883,7 @@ export class BoardContainer extends Component { if ( ALL_DEFAULT_BOARDS.map(({ id }) => id).includes(loadBoardSearched) ) { - this.addDefaultBoardIfnecessary(loadBoardSearched); - const nextBoard = findBoardOnStore(loadBoardSearched); + const nextBoard = this.addDefaultBoardIfnecessary(loadBoardSearched); if (nextBoard) return nextBoard; } };