diff --git a/src/client/action/accountData.js b/src/client/action/accountData.js index 00ddf230..4d2d2e5c 100644 --- a/src/client/action/accountData.js +++ b/src/client/action/accountData.js @@ -14,3 +14,17 @@ export function deleteSpaceShortcut(roomId) { roomId, }); } + +export function categorizeSpace(roomId) { + appDispatcher.dispatch({ + type: cons.actions.accountData.CATEGORIZE_SPACE, + roomId, + }); +} + +export function unCategorizeSpace(roomId) { + appDispatcher.dispatch({ + type: cons.actions.accountData.UNCATEGORIZE_SPACE, + roomId, + }); +} diff --git a/src/client/state/AccountData.js b/src/client/state/AccountData.js index 88ba0335..f20c20e5 100644 --- a/src/client/state/AccountData.js +++ b/src/client/state/AccountData.js @@ -12,6 +12,10 @@ class AccountData extends EventEmitter { this.spaceShortcut = new Set(); this._populateSpaceShortcut(); + + this.categorizedSpaces = new Set(); + this._populateCategorizedSpaces(); + this._listenEvents(); appDispatcher.register(this.accountActions.bind(this)); @@ -43,6 +47,27 @@ class AccountData extends EventEmitter { this.matrixClient.setAccountData(cons.IN_CINNY_SPACES, spaceContent); } + _populateCategorizedSpaces() { + this.categorizedSpaces.clear(); + const spaceContent = this._getAccountData(); + + if (spaceContent?.categorized === undefined) return; + + spaceContent.categorized.forEach((spaceId) => { + if (this.spaces.has(spaceId)) this.categorizedSpaces.add(spaceId); + }); + if (spaceContent.categorized.length !== this.categorizedSpaces.size) { + // TODO: we can wait for sync to complete or else we may end up removing valid space id + this._updateCategorizedSpacesData([...this.categorizedSpaces]); + } + } + + _updateCategorizedSpacesData(categorizedSpaceList) { + const spaceContent = this._getAccountData(); + spaceContent.categorized = categorizedSpaceList; + this.matrixClient.setAccountData(cons.IN_CINNY_SPACES, spaceContent); + } + accountActions(action) { const actions = { [cons.actions.accountData.CREATE_SPACE_SHORTCUT]: () => { @@ -57,6 +82,18 @@ class AccountData extends EventEmitter { this._updateSpaceShortcutData([...this.spaceShortcut]); this.emit(cons.events.accountData.SPACE_SHORTCUT_UPDATED, action.roomId); }, + [cons.actions.accountData.CATEGORIZE_SPACE]: () => { + if (this.categorizedSpaces.has(action.roomId)) return; + this.categorizedSpaces.add(action.roomId); + this._updateCategorizedSpacesData([...this.categorizedSpaces]); + this.emit(cons.events.accountData.CATEGORIZE_SPACE_UPDATED, action.roomId); + }, + [cons.actions.accountData.UNCATEGORIZE_SPACE]: () => { + if (!this.categorizedSpaces.has(action.roomId)) return; + this.categorizedSpaces.delete(action.roomId); + this._updateCategorizedSpacesData([...this.categorizedSpaces]); + this.emit(cons.events.accountData.CATEGORIZE_SPACE_UPDATED, action.roomId); + }, }; actions[action.type]?.(); } @@ -66,6 +103,8 @@ class AccountData extends EventEmitter { if (event.getType() !== cons.IN_CINNY_SPACES) return; this._populateSpaceShortcut(); this.emit(cons.events.accountData.SPACE_SHORTCUT_UPDATED); + this._populateCategorizedSpaces(); + this.emit(cons.events.accountData.CATEGORIZE_SPACE_UPDATED); }); this.roomList.on(cons.events.roomList.ROOM_LEAVED, (roomId) => { @@ -75,6 +114,11 @@ class AccountData extends EventEmitter { this._updateSpaceShortcutData([...this.spaceShortcut]); this.emit(cons.events.accountData.SPACE_SHORTCUT_UPDATED, roomId); } + if (this.categorizedSpaces.has(roomId)) { + this.categorizedSpaces.delete(roomId); + this._updateCategorizedSpacesData([...this.categorizedSpaces]); + this.emit(cons.events.accountData.CATEGORIZE_SPACE_UPDATED, roomId); + } }); } } diff --git a/src/client/state/cons.js b/src/client/state/cons.js index d277ea1f..aae179f9 100644 --- a/src/client/state/cons.js +++ b/src/client/state/cons.js @@ -55,6 +55,8 @@ const cons = { accountData: { CREATE_SPACE_SHORTCUT: 'CREATE_SPACE_SHORTCUT', DELETE_SPACE_SHORTCUT: 'DELETE_SPACE_SHORTCUT', + CATEGORIZE_SPACE: 'CATEGORIZE_SPACE', + UNCATEGORIZE_SPACE: 'UNCATEGORIZE_SPACE', }, settings: { TOGGLE_SYSTEM_THEME: 'TOGGLE_SYSTEM_THEME', @@ -97,6 +99,7 @@ const cons = { }, accountData: { SPACE_SHORTCUT_UPDATED: 'SPACE_SHORTCUT_UPDATED', + CATEGORIZE_SPACE_UPDATED: 'CATEGORIZE_SPACE_UPDATED', }, notifications: { NOTI_CHANGED: 'NOTI_CHANGED',