diff --git a/src/components/navigation/right/MemberList.tsx b/src/components/navigation/right/MemberList.tsx
new file mode 100644
index 00000000..e167c89f
--- /dev/null
+++ b/src/components/navigation/right/MemberList.tsx
@@ -0,0 +1,92 @@
+import AutoSizer from "react-virtualized-auto-sizer";
+import { FixedSizeList as List } from "react-window";
+import { User } from "revolt.js/dist/maps/Users";
+
+import { forwardRef } from "preact/compat";
+
+import { UserButton } from "../items/ButtonItem";
+
+export type MemberListEntry = string | User;
+interface ItemData {
+ entries: MemberListEntry[];
+}
+
+const PADDING_SIZE = 6;
+
+const Row = ({
+ data,
+ style,
+ index,
+}: {
+ data: ItemData;
+ index: number;
+ style: JSX.CSSProperties;
+}) => {
+ const item = data.entries[index];
+
+ return (
+
+ {typeof item === "string" ? (
+ `cat ${item}`
+ ) : (
+
+ openScreen({
+ id: "profile",
+ user_id: user._id,
+ })
+ } */
+ />
+ )}
+
+ );
+};
+
+// @ts-expect-error Copied directly from example code.
+const innerElementType = forwardRef(({ style, ...rest }, ref) => (
+
+));
+
+export default function MemberList({
+ entries,
+}: {
+ entries: MemberListEntry[];
+}) {
+ return (
+
+ {({ width, height }) => (
+
+ {
+ // eslint-disable-next-line
+ Row as any
+ }
+
+ )}
+
+ );
+}
diff --git a/src/components/navigation/right/MemberSidebar.tsx b/src/components/navigation/right/MemberSidebar.tsx
index b710b22a..aea913e1 100644
--- a/src/components/navigation/right/MemberSidebar.tsx
+++ b/src/components/navigation/right/MemberSidebar.tsx
@@ -4,9 +4,10 @@ import { Link, useParams } from "react-router-dom";
import { Presence } from "revolt-api/types/Users";
import { Channel } from "revolt.js/dist/maps/Channels";
import { Message } from "revolt.js/dist/maps/Messages";
+import { User } from "revolt.js/dist/maps/Users";
import { Text } from "preact-i18n";
-import { useContext, useEffect, useState } from "preact/hooks";
+import { useContext, useEffect, useMemo, useState } from "preact/hooks";
import { getState } from "../../../redux";
@@ -27,6 +28,7 @@ import placeholderSVG from "../items/placeholder.svg";
import { GenericSidebarBase, GenericSidebarList } from "../SidebarBase";
import { UserButton } from "../items/ButtonItem";
import { ChannelDebugInfo } from "./ChannelDebugInfo";
+import MemberList, { MemberListEntry } from "./MemberList";
export default function MemberSidebar({ channel: obj }: { channel?: Channel }) {
const { channel: channel_id } = useParams<{ channel: string }>();
@@ -90,7 +92,6 @@ export const GroupMemberSidebar = observer(
return (
-
{/*voiceActive && voiceParticipants.length !== 0 && (
@@ -161,6 +162,64 @@ export const GroupMemberSidebar = observer(
export const ServerMemberSidebar = observer(
({ channel }: { channel: Channel }) => {
+ const client = useClient();
+ const status = useContext(StatusContext);
+
+ useEffect(() => {
+ if (status === ClientStatus.ONLINE) {
+ channel.server!.fetchMembers();
+ }
+ }, [status, channel.server]);
+
+ const keys = [...client.members.keys()];
+ const entries = useMemo(() => {
+ const categories: { [key: string]: [User, string][] } = {
+ online: [],
+ offline: [],
+ };
+
+ keys.forEach((key) => {
+ const { server, user } = JSON.parse(key);
+ if (server !== channel.server_id) return;
+
+ const u = client.users.get(user);
+ if (!u) return;
+
+ const member = client.members.get(key);
+ const sort = member?.nickname ?? u.username;
+ const entry = [u, sort] as [User, string];
+
+ if (!u.online || u.status?.presence === Presence.Invisible) {
+ categories.offline.push(entry);
+ } else {
+ categories.online.push(entry);
+ }
+ });
+
+ Object.keys(categories).forEach((key) =>
+ categories[key].sort((a, b) => a[1].localeCompare(b[1])),
+ );
+
+ const entries = [];
+
+ entries.push(
+ "online",
+ ...categories.online.map((x) => x[0]),
+ "offline",
+ ...categories.offline.map((x) => x[0]),
+ );
+
+ return entries;
+ // eslint-disable-next-line
+ }, [keys]);
+
+ return (
+
+
+
+ );
+
+ /*
const client = useClient();
const { openScreen } = useIntermediate();
const status = useContext(StatusContext);
@@ -202,7 +261,6 @@ export const ServerMemberSidebar = observer(
return (
-
{users.length > 0 && (
@@ -236,7 +294,7 @@ export const ServerMemberSidebar = observer(
)}
- );
+ );*/
},
);
diff --git a/yarn.lock b/yarn.lock
index 553497ad..59823df0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -872,6 +872,13 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.14.8":
+ version "7.14.8"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446"
+ integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
version "7.14.6"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d"
@@ -879,13 +886,6 @@
dependencies:
regenerator-runtime "^0.13.4"
-"@babel/runtime@^7.14.8":
- version "7.14.8"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446"
- integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==
- dependencies:
- regenerator-runtime "^0.13.4"
-
"@babel/template@^7.12.13", "@babel/template@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4"
@@ -1466,6 +1466,20 @@
dependencies:
"@types/react" "*"
+"@types/react-virtualized-auto-sizer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz#b3187dae1dfc4c15880c9cfc5b45f2719ea6ebd4"
+ integrity sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react-window@^1.8.5":
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1"
+ integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==
+ dependencies:
+ "@types/react" "*"
+
"@types/react@*":
version "17.0.13"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.13.tgz#6b7c9a8f2868586ad87d941c02337c6888fb874f"
@@ -3033,6 +3047,11 @@ mdurl@^1.0.1:
sdp-transform "^2.14.1"
supports-color "^8.1.1"
+"memoize-one@>=3.1.1 <6":
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e"
+ integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==
+
merge-stream@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
@@ -3451,6 +3470,19 @@ react-side-effect@^2.1.0:
resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz#66c5701c3e7560ab4822a4ee2742dee215d72eb3"
integrity sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==
+react-virtualized-auto-sizer@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.5.tgz#9eeeb8302022de56fbd7a860b08513120ce36509"
+ integrity sha512-kivjYVWX15TX2IUrm8F1jaCEX8EXrpy3DD+u41WGqJ1ZqbljWpiwscV+VxOM1l7sSIM1jwi2LADjhhAJkJ9dxA==
+
+react-window@^1.8.6:
+ version "1.8.6"
+ resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.6.tgz#d011950ac643a994118632665aad0c6382e2a112"
+ integrity sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==
+ dependencies:
+ "@babel/runtime" "^7.0.0"
+ memoize-one ">=3.1.1 <6"
+
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"