diff --git a/src/components/navigation/left/HomeSidebar.tsx b/src/components/navigation/left/HomeSidebar.tsx index d014de108e53c75ab3a86331a47b7318fc6abcd1..a3082f354d517245725f3ff00e264bf3b6f7adc8 100644 --- a/src/components/navigation/left/HomeSidebar.tsx +++ b/src/components/navigation/left/HomeSidebar.tsx @@ -7,7 +7,7 @@ import { WithDispatcher } from "../../../redux/reducers"; import { Unreads } from "../../../redux/reducers/unreads"; import { connectState } from "../../../redux/connector"; import { AppContext } from "../../../context/revoltjs/RevoltClient"; -import { useChannels, useForceUpdate, useUsers } from "../../../context/revoltjs/hooks"; +import { useChannels, useDMs, useForceUpdate, useUsers } from "../../../context/revoltjs/hooks"; import { Users as UsersNS } from 'revolt.js/dist/api/objects'; import { mapChannelWithUnread, useUnreads } from "./common"; import { Channels } from "revolt.js/dist/api/objects"; @@ -47,22 +47,24 @@ function HomeSidebar(props: Props) { const { pathname } = useLocation(); const client = useContext(AppContext); const { channel } = useParams<{ channel: string }>(); - const { openScreen, writeClipboard } = useIntermediate(); + const { openScreen } = useIntermediate(); const ctx = useForceUpdate(); - const users = useUsers(undefined, ctx); - const channels = useChannels(undefined, ctx); + const channels = useDMs(ctx); const obj = channels.find(x => x?._id === channel); if (channel && !obj) return <Redirect to="/" />; if (obj) useUnreads({ ...props, channel: obj }); - const channelsArr = (channels - .filter( - x => x && (x.channel_type === "Group" || (x.channel_type === 'DirectMessage' && x.active)) - ) as (Channels.GroupChannel | Channels.DirectMessageChannel)[]) + const channelsArr = channels + .filter(x => x.channel_type !== 'SavedMessages') .map(x => mapChannelWithUnread(x, props.unreads)); + const users = useUsers( + (channelsArr as (Channels.DirectMessageChannel | Channels.GroupChannel)[]) + .reduce((prev: any, cur) => [ ...prev, ...cur.recipients ], []) + , ctx); + channelsArr.sort((b, a) => a.timestamp.localeCompare(b.timestamp)); return ( diff --git a/src/context/revoltjs/hooks.ts b/src/context/revoltjs/hooks.ts index e8ccb64fd2ff99c4ec93734c243ecdd893ba4c88..bb9fae1389013fa928be172cf54df6666b2f4312 100644 --- a/src/context/revoltjs/hooks.ts +++ b/src/context/revoltjs/hooks.ts @@ -68,6 +68,29 @@ export function useServers(ids?: string[], context?: HookContext) { return useObject('servers', ids, context) as (Readonly<Servers.Server> | undefined)[]; } +export function useDMs(context?: HookContext) { + const ctx = useForceUpdate(context); + + function mutation(target: string) { + let channel = ctx.client.channels.get(target); + if (channel) { + if ((channel.channel_type === 'DirectMessage' && channel.active) || channel.channel_type === 'Group') { + ctx.forceUpdate(); + } + } + } + + const map = ctx.client.channels; + useEffect(() => { + map.addListener("update", mutation); + return () => map.removeListener("update", mutation); + }, []); + + return map + .toArray() + .filter(x => x.channel_type === 'DirectMessage' || x.channel_type === 'Group' || x.channel_type === 'SavedMessages') as (Channels.GroupChannel | Channels.DirectMessageChannel | Channels.SavedMessagesChannel)[]; +} + export function useUserPermission(id: string, context?: HookContext) { const ctx = useForceUpdate(context);