import { Localizer, Text } from "preact-i18n"; import { useContext } from "preact/hooks"; import { Home, Users, Tool, Save } from "@styled-icons/feather"; import styled from "styled-components"; import Category from '../../ui/Category'; import PaintCounter from "../../../lib/PaintCounter"; import UserHeader from "../../common/user/UserHeader"; import { Channels } from "revolt.js/dist/api/objects"; import { connectState } from "../../../redux/connector"; import ConnectionStatus from '../items/ConnectionStatus'; import { WithDispatcher } from "../../../redux/reducers"; import { Unreads } from "../../../redux/reducers/unreads"; import { mapChannelWithUnread, useUnreads } from "./common"; import { Users as UsersNS } from 'revolt.js/dist/api/objects'; import ButtonItem, { ChannelButton } from '../items/ButtonItem'; import { AppContext } from "../../../context/revoltjs/RevoltClient"; import { isTouchscreenDevice } from "../../../lib/isTouchscreenDevice"; import { Link, Redirect, useLocation, useParams } from "react-router-dom"; import { useIntermediate } from "../../../context/intermediate/Intermediate"; import { useDMs, useForceUpdate, useUsers } from "../../../context/revoltjs/hooks"; type Props = WithDispatcher & { unreads: Unreads; } const HomeBase = styled.div` height: 100%; width: 240px; display: flex; flex-shrink: 0; flex-direction: column; background: var(--secondary-background); `; const HomeList = styled.div` padding: 6px; flex-grow: 1; overflow-y: scroll; > svg { width: 100%; } `; function HomeSidebar(props: Props) { const { pathname } = useLocation(); const client = useContext(AppContext); const { channel } = useParams<{ channel: string }>(); const { openScreen } = useIntermediate(); const ctx = useForceUpdate(); const channels = useDMs(ctx); const obj = channels.find(x => x?._id === channel); if (channel && !obj) return ; if (obj) useUnreads({ ...props, channel: obj }); 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 ( {!isTouchscreenDevice && ( <> user?.relationship === UsersNS.Relationship.Incoming ) !== "undefined" ? 'unread' : undefined } > )} {import.meta.env.DEV && ( )} ) as any } action={() => openScreen({ id: "special_input", type: "create_group" })} /> {channelsArr.length === 0 && } {channelsArr.map(x => { let user; if (x.channel_type === 'DirectMessage') { let recipient = client.channels.getRecipient(x._id); user = users.find(x => x?._id === recipient); if (!user) { console.warn(`Skipped DM ${x._id} because user was missing.`); return null; } } return ( ); })} ); }; export default connectState( HomeSidebar, state => { return { unreads: state.unreads }; }, true, true );