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

148 lines
5.4 KiB
React
Raw Normal View History

2021-07-28 13:15:52 +00:00
import React, { useState, useEffect } from 'react';
import './SideBar.scss';
import initMatrix from '../../../client/initMatrix';
import cons from '../../../client/state/cons';
import colorMXID from '../../../util/colorMXID';
import logout from '../../../client/action/logout';
2021-08-30 03:01:13 +00:00
import {
2021-09-05 13:26:34 +00:00
selectTab, openInviteList, openPublicRooms, openSettings,
2021-08-30 03:01:13 +00:00
} from '../../../client/action/navigation';
import navigation from '../../../client/state/navigation';
2021-07-28 13:15:52 +00:00
import ScrollView from '../../atoms/scroll/ScrollView';
import SidebarAvatar from '../../molecules/sidebar-avatar/SidebarAvatar';
import ContextMenu, { MenuItem, MenuHeader, MenuBorder } from '../../atoms/context-menu/ContextMenu';
import HomeIC from '../../../../public/res/ic/outlined/home.svg';
import UserIC from '../../../../public/res/ic/outlined/user.svg';
import HashSearchIC from '../../../../public/res/ic/outlined/hash-search.svg';
import InviteIC from '../../../../public/res/ic/outlined/invite.svg';
import SettingsIC from '../../../../public/res/ic/outlined/settings.svg';
import PowerIC from '../../../../public/res/ic/outlined/power.svg';
function ProfileAvatarMenu() {
const mx = initMatrix.matrixClient;
return (
<ContextMenu
content={(hideMenu) => (
<>
<MenuHeader>{mx.getUserId()}</MenuHeader>
{/* <MenuItem iconSrc={UserIC} onClick={() => ''}>Profile</MenuItem> */}
{/* <MenuItem iconSrc={BellIC} onClick={() => ''}>Notification settings</MenuItem> */}
<MenuItem
iconSrc={SettingsIC}
onClick={() => { hideMenu(); openSettings(); }}
>
Settings
</MenuItem>
<MenuBorder />
<MenuItem iconSrc={PowerIC} variant="danger" onClick={logout}>Logout</MenuItem>
</>
)}
render={(toggleMenu) => (
<SidebarAvatar
onClick={toggleMenu}
tooltip={mx.getUser(mx.getUserId()).displayName}
imageSrc={mx.getUser(mx.getUserId()).avatarUrl !== null ? mx.mxcUrlToHttp(mx.getUser(mx.getUserId()).avatarUrl, 42, 42, 'crop') : null}
bgColor={colorMXID(mx.getUserId())}
text={mx.getUser(mx.getUserId()).displayName.slice(0, 1)}
/>
)}
/>
);
}
2021-08-30 03:01:13 +00:00
function SideBar() {
2021-09-05 13:26:34 +00:00
const { roomList } = initMatrix;
const mx = initMatrix.matrixClient;
const totalInviteCount = () => roomList.inviteRooms.size
+ roomList.inviteSpaces.size
+ roomList.inviteDirects.size;
2021-07-28 13:15:52 +00:00
const [totalInvites, updateTotalInvites] = useState(totalInviteCount());
2021-09-05 13:26:34 +00:00
const [selectedTab, setSelectedTab] = useState(navigation.selectedTab);
const [, forceUpdate] = useState({});
2021-07-28 13:15:52 +00:00
2021-09-05 13:26:34 +00:00
function onTabSelected(tabId) {
2021-09-03 12:28:01 +00:00
setSelectedTab(tabId);
2021-08-30 03:01:13 +00:00
}
2021-07-28 13:15:52 +00:00
function onInviteListChange() {
updateTotalInvites(totalInviteCount());
}
2021-09-05 13:26:34 +00:00
function onSpaceShortcutUpdated() {
forceUpdate({});
}
2021-07-28 13:15:52 +00:00
useEffect(() => {
2021-09-05 13:26:34 +00:00
navigation.on(cons.events.navigation.TAB_SELECTED, onTabSelected);
roomList.on(cons.events.roomList.SPACE_SHORTCUT_UPDATED, onSpaceShortcutUpdated);
2021-07-28 13:15:52 +00:00
initMatrix.roomList.on(
cons.events.roomList.INVITELIST_UPDATED,
onInviteListChange,
);
return () => {
2021-09-05 13:26:34 +00:00
navigation.removeListener(cons.events.navigation.TAB_SELECTED, onTabSelected);
roomList.removeListener(cons.events.roomList.SPACE_SHORTCUT_UPDATED, onSpaceShortcutUpdated);
2021-07-28 13:15:52 +00:00
initMatrix.roomList.removeListener(
cons.events.roomList.INVITELIST_UPDATED,
onInviteListChange,
);
};
}, []);
return (
<div className="sidebar">
<div className="sidebar__scrollable">
<ScrollView invisible>
<div className="scrollable-content">
<div className="featured-container">
2021-09-05 13:26:34 +00:00
<SidebarAvatar active={selectedTab === cons.tabs.HOME} onClick={() => selectTab(cons.tabs.HOME)} tooltip="Home" iconSrc={HomeIC} />
<SidebarAvatar active={selectedTab === cons.tabs.DIRECTS} onClick={() => selectTab(cons.tabs.DIRECTS)} tooltip="People" iconSrc={UserIC} />
2021-08-31 13:13:31 +00:00
<SidebarAvatar onClick={() => openPublicRooms()} tooltip="Public rooms" iconSrc={HashSearchIC} />
2021-07-28 13:15:52 +00:00
</div>
<div className="sidebar-divider" />
2021-09-05 13:26:34 +00:00
<div className="space-container">
{
[...roomList.spaceShortcut].map((shortcut) => {
const sRoomId = shortcut;
const room = mx.getRoom(sRoomId);
return (
<SidebarAvatar
active={selectedTab === sRoomId}
key={sRoomId}
tooltip={room.name}
bgColor={colorMXID(room.roomId)}
imageSrc={room.getAvatarUrl(initMatrix.matrixClient.baseUrl, 42, 42, 'crop') || null}
text={room.name.slice(0, 1)}
onClick={() => selectTab(shortcut)}
/>
);
})
}
</div>
2021-07-28 13:15:52 +00:00
</div>
</ScrollView>
</div>
<div className="sidebar__sticky">
<div className="sidebar-divider" />
<div className="sticky-container">
{ totalInvites !== 0 && (
<SidebarAvatar
notifyCount={totalInvites}
onClick={() => openInviteList()}
tooltip="Invites"
iconSrc={InviteIC}
/>
)}
<ProfileAvatarMenu />
</div>
</div>
</div>
);
}
export default SideBar;