Add the ability to hide the channel sidebar

(the left one)
This commit is contained in:
brecert 2021-09-07 10:51:46 -04:00
parent 4787a2166f
commit ed56967e10
No known key found for this signature in database
GPG key ID: 1B2E56B9EC985B96
4 changed files with 76 additions and 7 deletions

View file

@ -4,27 +4,31 @@ import SidebarBase from "./SidebarBase";
import HomeSidebar from "./left/HomeSidebar"; import HomeSidebar from "./left/HomeSidebar";
import ServerListSidebar from "./left/ServerListSidebar"; import ServerListSidebar from "./left/ServerListSidebar";
import ServerSidebar from "./left/ServerSidebar"; import ServerSidebar from "./left/ServerSidebar";
import { useSelector } from "react-redux";
import { State } from "../../redux";
export default function LeftSidebar() { export default function LeftSidebar() {
const isOpen = useSelector((state: State) => state.sectionToggle['sidebar_channels'] ?? true)
return ( return (
<SidebarBase> <SidebarBase>
<Switch> <Switch>
<Route path="/settings" /> <Route path="/settings" />
<Route path="/server/:server/channel/:channel"> <Route path="/server/:server/channel/:channel">
<ServerListSidebar /> <ServerListSidebar />
<ServerSidebar /> {isOpen && <ServerSidebar />}
</Route> </Route>
<Route path="/server/:server"> <Route path="/server/:server">
<ServerListSidebar /> <ServerListSidebar />
<ServerSidebar /> {isOpen && <ServerSidebar />}
</Route> </Route>
<Route path="/channel/:channel"> <Route path="/channel/:channel">
<ServerListSidebar /> <ServerListSidebar />
<HomeSidebar /> {isOpen && <HomeSidebar />}
</Route> </Route>
<Route path="/"> <Route path="/">
<ServerListSidebar /> <ServerListSidebar />
<HomeSidebar /> {isOpen && <HomeSidebar />}
</Route> </Route>
</Switch> </Switch>
</SidebarBase> </SidebarBase>

View file

@ -49,10 +49,14 @@ export function Channel({ id }: { id: string }) {
} }
const MEMBERS_SIDEBAR_KEY = "sidebar_members"; const MEMBERS_SIDEBAR_KEY = "sidebar_members";
const CHANNELS_SIDEBAR_KEY = "sidebar_channels";
const TextChannel = observer(({ channel }: { channel: ChannelI }) => { const TextChannel = observer(({ channel }: { channel: ChannelI }) => {
const [showMembers, setMembers] = useState( const [showMembers, setMembers] = useState(
getState().sectionToggle[MEMBERS_SIDEBAR_KEY] ?? true, getState().sectionToggle[MEMBERS_SIDEBAR_KEY] ?? true,
); );
const [showChannels, setChannels] = useState(
getState().sectionToggle[CHANNELS_SIDEBAR_KEY] ?? true,
);
const id = channel._id; const id = channel._id;
return ( return (
@ -84,6 +88,22 @@ const TextChannel = observer(({ channel }: { channel: ChannelI }) => {
}); });
} }
}} }}
toggleChannelSidebar={() => {
setChannels(!showChannels);
if (showChannels) {
dispatch({
type: "SECTION_TOGGLE_SET",
id: CHANNELS_SIDEBAR_KEY,
state: false,
});
} else {
dispatch({
type: "SECTION_TOGGLE_UNSET",
id: CHANNELS_SIDEBAR_KEY,
});
}
}}
/> />
<ChannelMain> <ChannelMain>
<ChannelContent> <ChannelContent>

View file

@ -20,6 +20,7 @@ import HeaderActions from "./actions/HeaderActions";
export interface ChannelHeaderProps { export interface ChannelHeaderProps {
channel: Channel; channel: Channel;
toggleSidebar?: () => void; toggleSidebar?: () => void;
toggleChannelSidebar?: () => void;
} }
const Info = styled.div` const Info = styled.div`
@ -64,7 +65,16 @@ const Info = styled.div`
} }
`; `;
export default observer(({ channel, toggleSidebar }: ChannelHeaderProps) => { const IconConainer = styled.div`
cursor: pointer;
color: var(--secondary-foreground);
&:hover {
color: var(--foreground);
}
`
export default observer(({ channel, toggleSidebar, toggleChannelSidebar }: ChannelHeaderProps) => {
const { openScreen } = useIntermediate(); const { openScreen } = useIntermediate();
const name = getChannelName(channel); const name = getChannelName(channel);
@ -88,7 +98,7 @@ export default observer(({ channel, toggleSidebar }: ChannelHeaderProps) => {
return ( return (
<Header placement="primary"> <Header placement="primary">
<HamburgerAction /> <HamburgerAction />
{icon} <IconConainer onClick={toggleChannelSidebar}>{icon}</IconConainer>
<Info> <Info>
<span className="name">{name}</span> <span className="name">{name}</span>
{isTouchscreenDevice && {isTouchscreenDevice &&

View file

@ -9,12 +9,47 @@ import Emoji from "../../components/common/Emoji";
import Tooltip from "../../components/common/Tooltip"; import Tooltip from "../../components/common/Tooltip";
import Header from "../../components/ui/Header"; import Header from "../../components/ui/Header";
import CategoryButton from "../../components/ui/fluent/CategoryButton"; import CategoryButton from "../../components/ui/fluent/CategoryButton";
import { dispatch, getState } from "../../redux";
import { useState } from "preact/hooks";
import styled from "styled-components";
const CHANNELS_SIDEBAR_KEY = "sidebar_channels";
const IconConainer = styled.div`
cursor: pointer;
color: var(--secondary-foreground);
&:hover {
color: var(--foreground);
}
`
export default function Home() { export default function Home() {
const [showChannels, setChannels] = useState(
getState().sectionToggle[CHANNELS_SIDEBAR_KEY] ?? true,
);
const toggleChannelSidebar = () => {
setChannels(!showChannels);
if (showChannels) {
dispatch({
type: "SECTION_TOGGLE_SET",
id: CHANNELS_SIDEBAR_KEY,
state: false,
});
} else {
dispatch({
type: "SECTION_TOGGLE_UNSET",
id: CHANNELS_SIDEBAR_KEY,
});
}
}
return ( return (
<div className={styles.home}> <div className={styles.home}>
<Header placement="primary"> <Header placement="primary">
<HomeIcon size={24} /> <IconConainer onClick={toggleChannelSidebar} ><HomeIcon size={24} /></IconConainer>
<Text id="app.navigation.tabs.home" /> <Text id="app.navigation.tabs.home" />
</Header> </Header>
<h3> <h3>