cinny/src/app/organisms/navigation/Drawer.jsx

91 lines
3.1 KiB
React
Raw Normal View History

import React, { useState, useEffect, useRef } from 'react';
2021-07-28 13:15:52 +00:00
import './Drawer.scss';
2021-09-05 13:26:34 +00:00
import initMatrix from '../../../client/initMatrix';
2021-07-28 13:15:52 +00:00
import cons from '../../../client/state/cons';
import navigation from '../../../client/state/navigation';
2021-09-05 13:26:34 +00:00
import { selectTab, selectSpace } from '../../../client/action/navigation';
2021-07-28 13:15:52 +00:00
import Text from '../../atoms/text/Text';
2021-07-28 13:15:52 +00:00
import ScrollView from '../../atoms/scroll/ScrollView';
import DrawerHeader from './DrawerHeader';
2021-09-03 12:28:01 +00:00
import DrawerBreadcrumb from './DrawerBreadcrumb';
import Home from './Home';
import Directs from './Directs';
2021-07-28 13:15:52 +00:00
2021-08-30 03:01:13 +00:00
function Drawer() {
const [systemState, setSystemState] = useState(null);
2021-09-05 13:26:34 +00:00
const [selectedTab, setSelectedTab] = useState(navigation.selectedTab);
2021-09-03 12:28:01 +00:00
const [spaceId, setSpaceId] = useState(navigation.selectedSpaceId);
const scrollRef = useRef(null);
2021-08-30 03:01:13 +00:00
useEffect(() => {
const onTabSelected = (tabId) => {
setSelectedTab(tabId);
};
const onSpaceSelected = (roomId) => {
setSpaceId(roomId);
};
const onRoomLeaved = (roomId) => {
const lRoomIndex = navigation.selectedSpacePath.indexOf(roomId);
if (lRoomIndex === -1) return;
if (lRoomIndex === 0) selectTab(cons.tabs.HOME);
else selectSpace(navigation.selectedSpacePath[lRoomIndex - 1]);
};
2021-09-05 13:26:34 +00:00
navigation.on(cons.events.navigation.TAB_SELECTED, onTabSelected);
2021-09-03 12:28:01 +00:00
navigation.on(cons.events.navigation.SPACE_SELECTED, onSpaceSelected);
2021-09-05 13:26:34 +00:00
initMatrix.roomList.on(cons.events.roomList.ROOM_LEAVED, onRoomLeaved);
2021-08-30 03:01:13 +00:00
return () => {
2021-09-05 13:26:34 +00:00
navigation.removeListener(cons.events.navigation.TAB_SELECTED, onTabSelected);
2021-09-03 12:28:01 +00:00
navigation.removeListener(cons.events.navigation.SPACE_SELECTED, onSpaceSelected);
2021-09-05 13:26:34 +00:00
initMatrix.roomList.removeListener(cons.events.roomList.ROOM_LEAVED, onRoomLeaved);
2021-08-30 03:01:13 +00:00
};
}, []);
useEffect(() => {
const handleSystemState = (state) => {
if (state === 'ERROR' || state === 'RECONNECTING' || state === 'STOPPED') {
setSystemState({ status: 'Connection lost!' });
}
if (systemState !== null) setSystemState(null);
};
initMatrix.matrixClient.on('sync', handleSystemState);
return () => {
initMatrix.matrixClient.removeListener('sync', handleSystemState);
};
}, [systemState]);
useEffect(() => {
requestAnimationFrame(() => {
scrollRef.current.scrollTop = 0;
});
}, [selectedTab]);
2021-07-28 13:15:52 +00:00
return (
<div className="drawer">
2021-09-03 12:28:01 +00:00
<DrawerHeader selectedTab={selectedTab} spaceId={spaceId} />
2021-07-28 13:15:52 +00:00
<div className="drawer__content-wrapper">
2021-09-05 13:26:34 +00:00
{selectedTab !== cons.tabs.DIRECTS && <DrawerBreadcrumb spaceId={spaceId} />}
2021-08-31 13:13:31 +00:00
<div className="rooms__wrapper">
<ScrollView ref={scrollRef} autoHide>
2021-08-31 13:13:31 +00:00
<div className="rooms-container">
{
2021-09-05 13:26:34 +00:00
selectedTab !== cons.tabs.DIRECTS
2021-09-03 12:28:01 +00:00
? <Home spaceId={spaceId} />
: <Directs />
}
</div>
2021-07-28 13:15:52 +00:00
</ScrollView>
</div>
</div>
{ systemState !== null && (
<div className="drawer__state">
<Text>{systemState.status}</Text>
</div>
)}
2021-07-28 13:15:52 +00:00
</div>
);
}
export default Drawer;