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

90 lines
2.7 KiB
React
Raw Normal View History

import React, { useState, useEffect, useRef } from 'react';
2021-07-28 18:45:52 +05:30
import './Drawer.scss';
2021-09-05 18:56:34 +05:30
import initMatrix from '../../../client/initMatrix';
2021-07-28 18:45:52 +05:30
import cons from '../../../client/state/cons';
import navigation from '../../../client/state/navigation';
2021-09-14 10:10:11 +05:30
import Text from '../../atoms/text/Text';
2021-07-28 18:45:52 +05:30
import ScrollView from '../../atoms/scroll/ScrollView';
import DrawerHeader from './DrawerHeader';
2021-09-03 17:58:01 +05:30
import DrawerBreadcrumb from './DrawerBreadcrumb';
import Home from './Home';
import Directs from './Directs';
2021-07-28 18:45:52 +05:30
2022-03-03 18:46:47 +05:30
import { useForceUpdate } from '../../hooks/useForceUpdate';
2022-01-26 17:03:26 +05:30
import { useSelectedTab } from '../../hooks/useSelectedTab';
import { useSelectedSpace } from '../../hooks/useSelectedSpace';
function useSystemState() {
2021-09-14 10:10:11 +05:30
const [systemState, setSystemState] = useState(null);
useEffect(() => {
const handleSystemState = (state) => {
if (state === 'ERROR' || state === 'RECONNECTING' || state === 'STOPPED') {
setSystemState({ status: 'Connection lost!' });
}
if (systemState !== null) setSystemState(null);
};
2021-09-14 10:10:11 +05:30
initMatrix.matrixClient.on('sync', handleSystemState);
return () => {
initMatrix.matrixClient.removeListener('sync', handleSystemState);
};
}, [systemState]);
2022-01-26 17:03:26 +05:30
return [systemState];
}
function Drawer() {
const [systemState] = useSystemState();
const [selectedTab] = useSelectedTab();
const [spaceId] = useSelectedSpace();
2022-03-03 18:46:47 +05:30
const [, forceUpdate] = useForceUpdate();
2022-01-26 17:03:26 +05:30
const scrollRef = useRef(null);
2022-05-04 14:22:16 +05:30
const { roomList } = initMatrix;
2022-01-26 17:03:26 +05:30
2022-03-03 18:46:47 +05:30
useEffect(() => {
2022-05-04 14:22:16 +05:30
const handleUpdate = () => {
forceUpdate();
};
roomList.on(cons.events.roomList.ROOMLIST_UPDATED, handleUpdate);
2022-03-03 18:46:47 +05:30
return () => {
2022-05-04 14:22:16 +05:30
roomList.removeListener(cons.events.roomList.ROOMLIST_UPDATED, handleUpdate);
2022-03-03 18:46:47 +05:30
};
}, []);
useEffect(() => {
requestAnimationFrame(() => {
scrollRef.current.scrollTop = 0;
});
}, [selectedTab]);
2021-07-28 18:45:52 +05:30
return (
<div className="drawer">
2021-09-03 17:58:01 +05:30
<DrawerHeader selectedTab={selectedTab} spaceId={spaceId} />
2021-07-28 18:45:52 +05:30
<div className="drawer__content-wrapper">
2022-02-23 19:48:24 +05:30
{navigation.selectedSpacePath.length > 1 && <DrawerBreadcrumb spaceId={spaceId} />}
2021-08-31 18:43:31 +05:30
<div className="rooms__wrapper">
<ScrollView ref={scrollRef} autoHide>
2021-08-31 18:43:31 +05:30
<div className="rooms-container">
{
2021-09-05 18:56:34 +05:30
selectedTab !== cons.tabs.DIRECTS
2021-09-03 17:58:01 +05:30
? <Home spaceId={spaceId} />
2022-05-04 14:22:16 +05:30
: <Directs size={roomList.directs.size} />
}
</div>
2021-07-28 18:45:52 +05:30
</ScrollView>
</div>
</div>
2021-09-14 10:10:11 +05:30
{ systemState !== null && (
<div className="drawer__state">
<Text>{systemState.status}</Text>
</div>
)}
2021-07-28 18:45:52 +05:30
</div>
);
}
export default Drawer;