From cf7dd6f99b4f7f8f6b0d59ba81c45a580bcf28c8 Mon Sep 17 00:00:00 2001
From: Paul <paulmakles@gmail.com>
Date: Tue, 6 Jul 2021 22:52:50 +0100
Subject: [PATCH] Add collapsible sections to member sidebars.

---
 .../navigation/right/MemberSidebar.tsx        | 119 ++++++++++--------
 src/components/ui/Details.tsx                 |   1 +
 src/lib/vortex/VoiceClient.ts                 |  12 +-
 src/pages/channels/Channel.tsx                |  20 +--
 4 files changed, 82 insertions(+), 70 deletions(-)

diff --git a/src/components/navigation/right/MemberSidebar.tsx b/src/components/navigation/right/MemberSidebar.tsx
index 47a44ff..10ee673 100644
--- a/src/components/navigation/right/MemberSidebar.tsx
+++ b/src/components/navigation/right/MemberSidebar.tsx
@@ -19,6 +19,7 @@ import {
     useUsers,
 } from "../../../context/revoltjs/hooks";
 
+import CollapsibleSection from "../../common/CollapsibleSection";
 import Category from "../../ui/Category";
 import Preloader from "../../ui/Preloader";
 import placeholderSVG from "../items/placeholder.svg";
@@ -121,36 +122,39 @@ export function GroupMemberSidebar({
                         )}
                     </Fragment>
                 )*/}
-                {!((members.length === 0) /*&& voiceActive*/) && (
-                    <Category
-                        variant="uniform"
-                        text={
-                            <span>
-                                <Text id="app.main.categories.members" /> —{" "}
-                                {channel.recipients.length}
-                            </span>
-                        }
-                    />
-                )}
-                {members.length === 0 && (
-                    /*!voiceActive &&*/ <img src={placeholderSVG} />
-                )}
-                {members.map(
-                    (user) =>
-                        user && (
-                            <UserButton
-                                key={user._id}
-                                user={user}
-                                context={channel}
-                                onClick={() =>
-                                    openScreen({
-                                        id: "profile",
-                                        user_id: user._id,
-                                    })
-                                }
-                            />
-                        ),
-                )}
+                <CollapsibleSection
+                    sticky
+                    id="members"
+                    defaultValue
+                    summary={
+                        <Category
+                            variant="uniform"
+                            text={
+                                <span>
+                                    <Text id="app.main.categories.members" /> —{" "}
+                                    {channel.recipients.length}
+                                </span>
+                            }
+                        />
+                    }>
+                    {members.length === 0 && <img src={placeholderSVG} />}
+                    {members.map(
+                        (user) =>
+                            user && (
+                                <UserButton
+                                    key={user._id}
+                                    user={user}
+                                    context={channel}
+                                    onClick={() =>
+                                        openScreen({
+                                            id: "profile",
+                                            user_id: user._id,
+                                        })
+                                    }
+                                />
+                            ),
+                    )}
+                </CollapsibleSection>
             </GenericSidebarList>
         </GenericSidebarBase>
     );
@@ -235,32 +239,39 @@ export function ServerMemberSidebar({
                 <ChannelDebugInfo id={channel._id} />
                 <div>{!members && <Preloader type="ring" />}</div>
                 {members && (
-                    <Category
-                        variant="uniform"
-                        text={
-                            <span>
-                                <Text id="app.main.categories.members" /> —{" "}
-                                {users.length}
-                            </span>
-                        }
-                    />
-                )}
-                {members && users.length === 0 && <img src={placeholderSVG} />}
-                {users.map(
-                    (user) =>
-                        user && (
-                            <UserButton
-                                key={user._id}
-                                user={user}
-                                context={channel}
-                                onClick={() =>
-                                    openScreen({
-                                        id: "profile",
-                                        user_id: user._id,
-                                    })
+                    <CollapsibleSection
+                        sticky
+                        id="members"
+                        defaultValue
+                        summary={
+                            <Category
+                                variant="uniform"
+                                text={
+                                    <span>
+                                        <Text id="app.main.categories.members" />{" "}
+                                        — {users.length}
+                                    </span>
                                 }
                             />
-                        ),
+                        }>
+                        {users.length === 0 && <img src={placeholderSVG} />}
+                        {users.map(
+                            (user) =>
+                                user && (
+                                    <UserButton
+                                        key={user._id}
+                                        user={user}
+                                        context={channel}
+                                        onClick={() =>
+                                            openScreen({
+                                                id: "profile",
+                                                user_id: user._id,
+                                            })
+                                        }
+                                    />
+                                ),
+                        )}
+                    </CollapsibleSection>
                 )}
             </GenericSidebarList>
         </GenericSidebarBase>
diff --git a/src/components/ui/Details.tsx b/src/components/ui/Details.tsx
index 5696f29..05f2d71 100644
--- a/src/components/ui/Details.tsx
+++ b/src/components/ui/Details.tsx
@@ -30,6 +30,7 @@ export default styled.details<{ sticky?: boolean; large?: boolean }>`
         outline: none;
         cursor: pointer;
         list-style: none;
+        user-select: none;
         align-items: center;
         transition: 0.2s opacity;
 
diff --git a/src/lib/vortex/VoiceClient.ts b/src/lib/vortex/VoiceClient.ts
index f5e8149..fa3ac83 100644
--- a/src/lib/vortex/VoiceClient.ts
+++ b/src/lib/vortex/VoiceClient.ts
@@ -1,14 +1,8 @@
 import EventEmitter from "eventemitter3";
 import * as mediasoupClient from "mediasoup-client";
+import { types } from "mediasoup-client";
 
-import {
-    Device,
-    Producer,
-    Transport,
-} from "mediasoup-client/lib/types";
-
-import { types } from 'mediasoup-client';
-const UnsupportedError = types.UnsupportedError;
+import { Device, Producer, Transport } from "mediasoup-client/lib/types";
 
 import Signaling from "./Signaling";
 import {
@@ -20,6 +14,8 @@ import {
     WSErrorCode,
 } from "./Types";
 
+const UnsupportedError = types.UnsupportedError;
+
 interface VoiceEvents {
     ready: () => void;
     error: (error: Error) => void;
diff --git a/src/pages/channels/Channel.tsx b/src/pages/channels/Channel.tsx
index f4d0b3d..f68b29a 100644
--- a/src/pages/channels/Channel.tsx
+++ b/src/pages/channels/Channel.tsx
@@ -6,6 +6,8 @@ import { useState } from "preact/hooks";
 
 import { isTouchscreenDevice } from "../../lib/isTouchscreenDevice";
 
+import { dispatch, getState } from "../../redux";
+
 import { useChannel, useForceUpdate } from "../../context/revoltjs/hooks";
 
 import MessageBox from "../../components/common/messaging/MessageBox";
@@ -18,7 +20,6 @@ import MemberSidebar from "../../components/navigation/right/MemberSidebar";
 import ChannelHeader from "./ChannelHeader";
 import { MessageArea } from "./messaging/MessageArea";
 import VoiceHeader from "./voice/VoiceHeader";
-import { dispatch, getState } from "../../redux";
 
 const ChannelMain = styled.div`
     flex-grow: 1;
@@ -74,7 +75,7 @@ export function Channel({ id }: { id: string }) {
     }
 }
 
-const MEMBERS_SIDEBAR_KEY = 'sidebar_members';
+const MEMBERS_SIDEBAR_KEY = "sidebar_members";
 function TextChannel({ channel }: { channel: Channels.Channel }) {
     if (
         (channel.channel_type === "TextChannel" ||
@@ -115,7 +116,9 @@ function TextChannel({ channel }: { channel: Channels.Channel }) {
         }
     }
 
-    const [showMembers, setMembers] = useState(getState().sectionToggle[MEMBERS_SIDEBAR_KEY] ?? true);
+    const [showMembers, setMembers] = useState(
+        getState().sectionToggle[MEMBERS_SIDEBAR_KEY] ?? true,
+    );
 
     let id = channel._id;
     return (
@@ -127,17 +130,18 @@ function TextChannel({ channel }: { channel: Channels.Channel }) {
 
                     if (showMembers) {
                         dispatch({
-                            type: 'SECTION_TOGGLE_SET',
+                            type: "SECTION_TOGGLE_SET",
                             id: MEMBERS_SIDEBAR_KEY,
-                            state: false
+                            state: false,
                         });
                     } else {
                         dispatch({
-                            type: 'SECTION_TOGGLE_UNSET',
-                            id: MEMBERS_SIDEBAR_KEY
+                            type: "SECTION_TOGGLE_UNSET",
+                            id: MEMBERS_SIDEBAR_KEY,
                         });
                     }
-                }} />
+                }}
+            />
             <ChannelMain>
                 <ChannelContent>
                     <VoiceHeader id={id} />
-- 
GitLab