diff --git a/src/app/organisms/navigation/Directs.jsx b/src/app/organisms/navigation/Directs.jsx index 639f4cd..5f2da8a 100644 --- a/src/app/organisms/navigation/Directs.jsx +++ b/src/app/organisms/navigation/Directs.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useEffect } from 'react'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; @@ -15,42 +15,26 @@ function Directs() { const { roomList, notifications } = initMatrix; const directIds = [...roomList.directs].sort(AtoZ); - const [, forceUpdate] = useState({}); - - function selectorChanged(selectedRoomId, prevSelectedRoomId) { - if (!drawerPostie.hasTopic('selector-change')) return; - const addresses = []; - if (drawerPostie.hasSubscriber('selector-change', selectedRoomId)) addresses.push(selectedRoomId); - if (drawerPostie.hasSubscriber('selector-change', prevSelectedRoomId)) addresses.push(prevSelectedRoomId); - if (addresses.length === 0) return; - drawerPostie.post('selector-change', addresses, selectedRoomId); - } - - function notiChanged(roomId, total, prevTotal) { - if (total === prevTotal) return; - if (drawerPostie.hasTopicAndSubscriber('unread-change', roomId)) { - drawerPostie.post('unread-change', roomId); - } - } - - function roomListUpdated() { - const { spaces, rooms, directs } = initMatrix.roomList; - if (!( - spaces.has(navigation.selectedRoomId) - || rooms.has(navigation.selectedRoomId) - || directs.has(navigation.selectedRoomId)) - ) { - selectRoom(null); - } - forceUpdate({}); - } - useEffect(() => { - roomList.on(cons.events.roomList.ROOMLIST_UPDATED, roomListUpdated); + const selectorChanged = (selectedRoomId, prevSelectedRoomId) => { + if (!drawerPostie.hasTopic('selector-change')) return; + const addresses = []; + if (drawerPostie.hasSubscriber('selector-change', selectedRoomId)) addresses.push(selectedRoomId); + if (drawerPostie.hasSubscriber('selector-change', prevSelectedRoomId)) addresses.push(prevSelectedRoomId); + if (addresses.length === 0) return; + drawerPostie.post('selector-change', addresses, selectedRoomId); + }; + + const notiChanged = (roomId, total, prevTotal) => { + if (total === prevTotal) return; + if (drawerPostie.hasTopicAndSubscriber('unread-change', roomId)) { + drawerPostie.post('unread-change', roomId); + } + }; + navigation.on(cons.events.navigation.ROOM_SELECTED, selectorChanged); notifications.on(cons.events.notifications.NOTI_CHANGED, notiChanged); return () => { - roomList.removeListener(cons.events.roomList.ROOMLIST_UPDATED, roomListUpdated); navigation.removeListener(cons.events.navigation.ROOM_SELECTED, selectorChanged); notifications.removeListener(cons.events.notifications.NOTI_CHANGED, notiChanged); }; diff --git a/src/app/organisms/navigation/Drawer.scss b/src/app/organisms/navigation/Drawer.scss index 81e9c8c..fb42e1d 100644 --- a/src/app/organisms/navigation/Drawer.scss +++ b/src/app/organisms/navigation/Drawer.scss @@ -64,8 +64,8 @@ } & .cat-header { - margin: var(--sp-normal); - margin-bottom: var(--sp-extra-tight); + margin-top: var(--sp-extra-tight); + padding: var(--sp-extra-tight) var(--sp-normal); text-transform: uppercase; } } \ No newline at end of file diff --git a/src/app/organisms/navigation/Home.jsx b/src/app/organisms/navigation/Home.jsx index 59207a0..8f3a215 100644 --- a/src/app/organisms/navigation/Home.jsx +++ b/src/app/organisms/navigation/Home.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; import initMatrix from '../../../client/initMatrix'; @@ -14,7 +14,6 @@ import { AtoZ } from './common'; const drawerPostie = new Postie(); function Home({ spaceId }) { - const [, forceUpdate] = useState({}); const { roomList, notifications } = initMatrix; let spaceIds = []; let roomIds = []; @@ -32,47 +31,38 @@ function Home({ spaceId }) { .filter((roomId) => !roomList.roomIdToParents.has(roomId)).sort(AtoZ); } - function selectorChanged(selectedRoomId, prevSelectedRoomId) { - if (!drawerPostie.hasTopic('selector-change')) return; - const addresses = []; - if (drawerPostie.hasSubscriber('selector-change', selectedRoomId)) addresses.push(selectedRoomId); - if (drawerPostie.hasSubscriber('selector-change', prevSelectedRoomId)) addresses.push(prevSelectedRoomId); - if (addresses.length === 0) return; - drawerPostie.post('selector-change', addresses, selectedRoomId); - } - function notiChanged(roomId, total, prevTotal) { - if (total === prevTotal) return; - if (drawerPostie.hasTopicAndSubscriber('unread-change', roomId)) { - drawerPostie.post('unread-change', roomId); - } - } - - function roomListUpdated() { - const { spaces, rooms, directs } = initMatrix.roomList; - if (!( - spaces.has(navigation.selectedRoomId) - || rooms.has(navigation.selectedRoomId) - || directs.has(navigation.selectedRoomId)) - ) { - selectRoom(null); - } - forceUpdate({}); - } - useEffect(() => { - roomList.on(cons.events.roomList.ROOMLIST_UPDATED, roomListUpdated); + const selectorChanged = (selectedRoomId, prevSelectedRoomId) => { + if (!drawerPostie.hasTopic('selector-change')) return; + const addresses = []; + if (drawerPostie.hasSubscriber('selector-change', selectedRoomId)) addresses.push(selectedRoomId); + if (drawerPostie.hasSubscriber('selector-change', prevSelectedRoomId)) addresses.push(prevSelectedRoomId); + if (addresses.length === 0) return; + drawerPostie.post('selector-change', addresses, selectedRoomId); + }; + + const notiChanged = (roomId, total, prevTotal) => { + if (total === prevTotal) return; + if (drawerPostie.hasTopicAndSubscriber('unread-change', roomId)) { + drawerPostie.post('unread-change', roomId); + } + }; + navigation.on(cons.events.navigation.ROOM_SELECTED, selectorChanged); notifications.on(cons.events.notifications.NOTI_CHANGED, notiChanged); return () => { - roomList.removeListener(cons.events.roomList.ROOMLIST_UPDATED, roomListUpdated); navigation.removeListener(cons.events.navigation.ROOM_SELECTED, selectorChanged); notifications.removeListener(cons.events.notifications.NOTI_CHANGED, notiChanged); }; }, []); + const renderCatHeader = (name) => ( + {name} + ); + return ( <> - { spaceIds.length !== 0 && Spaces } + { spaceIds.length !== 0 && renderCatHeader('Spaces') } { spaceIds.map((id) => ( ))} - { roomIds.length !== 0 && Rooms } + { roomIds.length !== 0 && renderCatHeader('Rooms') } { roomIds.map((id) => ( )) } - { directIds.length !== 0 && People } + {} + + { directIds.length !== 0 && renderCatHeader('People') } { directIds.map((id) => ( { - drawerPostie.subscribe('selector-change', roomId, selectorChanged); - drawerPostie.subscribe('unread-change', roomId, changeNotificationBadge); + drawerPostie.subscribe('selector-change', roomId, forceUpdate); + drawerPostie.subscribe('unread-change', roomId, forceUpdate); return () => { drawerPostie.unsubscribe('selector-change', roomId); drawerPostie.unsubscribe('unread-change', roomId); @@ -61,7 +55,7 @@ function Selector({ roomId={roomId} imageSrc={isDM ? imageSrc : null} iconSrc={isDM ? null : joinRuleToIconSrc(room.getJoinRule(), room.isSpaceRoom())} - isSelected={isSelected} + isSelected={navigation.selectedRoomId === roomId} isUnread={noti.hasNoti(roomId)} notificationCount={abbreviateNumber(noti.getTotalNoti(roomId))} isAlert={noti.getHighlightNoti(roomId) !== 0} diff --git a/src/client/event/roomList.js b/src/client/event/roomList.js index 0b88e0c..bc40a4c 100644 --- a/src/client/event/roomList.js +++ b/src/client/event/roomList.js @@ -1,19 +1,25 @@ import cons from '../state/cons'; import navigation from '../state/navigation'; -import { selectTab, selectSpace } from '../action/navigation'; - -const listenRoomLeave = (roomId) => { - const lRoomIndex = navigation.selectedSpacePath.indexOf(roomId); - if (lRoomIndex === -1) return; - if (lRoomIndex === 0) selectTab(cons.tabs.HOME); - else selectSpace(navigation.selectedSpacePath[lRoomIndex - 1]); -}; +import { selectTab, selectSpace, selectRoom } from '../action/navigation'; function initRoomListListener(roomList) { + const listenRoomLeave = (roomId) => { + if (navigation.selectedRoomId === roomId) { + selectRoom(null); + } + + if (navigation.selectedSpacePath.includes(roomId)) { + const idIndex = navigation.selectedSpacePath.indexOf(roomId); + if (idIndex === 0) selectTab(cons.tabs.HOME); + else selectSpace(navigation.selectedSpacePath[idIndex - 1]); + } + }; + roomList.on(cons.events.roomList.ROOM_LEAVED, listenRoomLeave); -} -function removeRoomListListener(roomList) { - roomList.removeListener(cons.events.roomList.ROOM_LEAVED, listenRoomLeave); + return () => { + roomList.removeListener(cons.events.roomList.ROOM_LEAVED, listenRoomLeave); + }; } -export { initRoomListListener, removeRoomListListener }; +// eslint-disable-next-line import/prefer-default-export +export { initRoomListListener }; diff --git a/src/client/state/AccountData.js b/src/client/state/AccountData.js index f75d861..88ba033 100644 --- a/src/client/state/AccountData.js +++ b/src/client/state/AccountData.js @@ -14,14 +14,17 @@ class AccountData extends EventEmitter { this._populateSpaceShortcut(); this._listenEvents(); - appDispatcher.register(this.roomActions.bind(this)); + appDispatcher.register(this.accountActions.bind(this)); + } + + _getAccountData() { + return this.matrixClient.getAccountData(cons.IN_CINNY_SPACES)?.getContent() || {}; } _populateSpaceShortcut() { this.spaceShortcut.clear(); - const spacesContent = this.matrixClient.getAccountData(cons.IN_CINNY_SPACES)?.getContent(); + const spacesContent = this._getAccountData(); - if (!spacesContent) return; if (spacesContent?.shortcut === undefined) return; spacesContent.shortcut.forEach((shortcut) => { @@ -35,12 +38,12 @@ class AccountData extends EventEmitter { } _updateSpaceShortcutData(shortcutList) { - const spaceContent = this.matrixClient.getAccountData(cons.IN_CINNY_SPACES)?.getContent() || {}; + const spaceContent = this._getAccountData(); spaceContent.shortcut = shortcutList; this.matrixClient.setAccountData(cons.IN_CINNY_SPACES, spaceContent); } - roomActions(action) { + accountActions(action) { const actions = { [cons.actions.accountData.CREATE_SPACE_SHORTCUT]: () => { if (this.spaceShortcut.has(action.roomId)) return;