diff --git a/src/components/common/AutoComplete.tsx b/src/components/common/AutoComplete.tsx index 28fecbf8..a6fdf1cb 100644 --- a/src/components/common/AutoComplete.tsx +++ b/src/components/common/AutoComplete.tsx @@ -187,8 +187,9 @@ export function useAutoComplete( if (type === "channel" && searchClues?.channels) { const channels = client.servers .get(searchClues.channels.server) - ?.channels.map((x) => client.channels.get(x)) - .filter((x) => typeof x !== "undefined") as Channel[]; + ?.channels.filter( + (x) => typeof x !== "undefined", + ) as Channel[]; const matches = ( search.length > 0 diff --git a/src/components/common/ChannelIcon.tsx b/src/components/common/ChannelIcon.tsx index 301b009a..c020ec37 100644 --- a/src/components/common/ChannelIcon.tsx +++ b/src/components/common/ChannelIcon.tsx @@ -1,11 +1,9 @@ import { Hash, VolumeFull } from "@styled-icons/boxicons-regular"; import { observer } from "mobx-react-lite"; -import { Channels } from "revolt.js/dist/api/objects"; +import { Channel } from "revolt.js/dist/maps/Channels"; import { useContext } from "preact/hooks"; -import { Channel } from "../../mobx"; - import { AppContext } from "../../context/revoltjs/RevoltClient"; import { ImageIconBase, IconBaseProps } from "./IconBase"; diff --git a/src/components/common/IconBase.tsx b/src/components/common/IconBase.tsx index 305e5a3b..533c4f0e 100644 --- a/src/components/common/IconBase.tsx +++ b/src/components/common/IconBase.tsx @@ -1,4 +1,4 @@ -import { Attachment } from "revolt.js/dist/api/objects"; +import { Attachment } from "revolt-api/types/Autumn"; import styled, { css } from "styled-components"; export interface IconBaseProps { diff --git a/src/components/common/ServerHeader.tsx b/src/components/common/ServerHeader.tsx index fc0d64ea..a14f48e3 100644 --- a/src/components/common/ServerHeader.tsx +++ b/src/components/common/ServerHeader.tsx @@ -2,13 +2,9 @@ import { Cog } from "@styled-icons/boxicons-solid"; import { observer } from "mobx-react-lite"; import { Link } from "react-router-dom"; import { ServerPermission } from "revolt.js/dist/api/permissions"; +import { Server } from "revolt.js/dist/maps/Servers"; import styled from "styled-components"; -import { Server } from "../../mobx"; - -import { useClient } from "../../context/revoltjs/RevoltClient"; -import { useServerPermission } from "../../context/revoltjs/hooks"; - import Header from "../ui/Header"; import IconButton from "../ui/IconButton"; @@ -21,14 +17,7 @@ const ServerName = styled.div` `; export default observer(({ server }: Props) => { - const permissions = useServerPermission(server._id); - const client = useClient(); - - const bannerURL = client.servers.getBannerURL( - server._id, - { width: 480 }, - true, - ); + const bannerURL = server.generateBannerURL({ width: 480 }); return (
{ background: bannerURL ? `url('${bannerURL}')` : undefined, }}> {server.name} - {(permissions & ServerPermission.ManageServer) > 0 && ( + {(server.permission & ServerPermission.ManageServer) > 0 && (
diff --git a/src/components/common/ServerIcon.tsx b/src/components/common/ServerIcon.tsx index 5208918a..6863f738 100644 --- a/src/components/common/ServerIcon.tsx +++ b/src/components/common/ServerIcon.tsx @@ -1,10 +1,9 @@ import { observer } from "mobx-react-lite"; +import { Server } from "revolt.js/dist/maps/Servers"; import styled from "styled-components"; import { useContext } from "preact/hooks"; -import { Server } from "../../mobx"; - import { AppContext } from "../../context/revoltjs/RevoltClient"; import { IconBaseProps, ImageIconBase } from "./IconBase"; diff --git a/src/components/common/messaging/MessageBase.tsx b/src/components/common/messaging/MessageBase.tsx index a42f62fb..2149cb23 100644 --- a/src/components/common/messaging/MessageBase.tsx +++ b/src/components/common/messaging/MessageBase.tsx @@ -1,3 +1,5 @@ +import { observer } from "mobx-react-lite"; +import { Message } from "revolt.js/dist/maps/Messages"; import styled, { css, keyframes } from "styled-components"; import { decodeTime } from "ulid"; @@ -6,7 +8,6 @@ import { Text } from "preact-i18n"; import { useDictionary } from "../../../lib/i18n"; import { dayjs } from "../../../context/Locale"; -import { MessageObject } from "../../../context/revoltjs/util"; import Tooltip from "../Tooltip"; @@ -192,57 +193,54 @@ export const DetailBase = styled.div` } `; -export function MessageDetail({ - message, - position, -}: { - message: MessageObject; - position: "left" | "top"; -}) { - const dict = useDictionary(); +export const MessageDetail = observer( + ({ message, position }: { message: Message; position: "left" | "top" }) => { + const dict = useDictionary(); - if (position === "left") { - if (message.edited) { + if (position === "left") { + if (message.edited) { + return ( + <> + + + + + + + + ); + } return ( <> -
{context?.channel_type === "Group" && - context.owner === user._id && ( + context.owner_id === user._id && ( }> diff --git a/src/components/navigation/left/HomeSidebar.tsx b/src/components/navigation/left/HomeSidebar.tsx index 187680b4..9f4fe3eb 100644 --- a/src/components/navigation/left/HomeSidebar.tsx +++ b/src/components/navigation/left/HomeSidebar.tsx @@ -6,8 +6,7 @@ import { } from "@styled-icons/boxicons-solid"; import { observer } from "mobx-react-lite"; import { Link, Redirect, useLocation, useParams } from "react-router-dom"; -import { Channels } from "revolt.js/dist/api/objects"; -import { Users as UsersNS } from "revolt.js/dist/api/objects"; +import { RelationshipStatus } from "revolt-api/types/Users"; import { Text } from "preact-i18n"; import { useContext, useEffect } from "preact/hooks"; @@ -16,7 +15,6 @@ import ConditionalLink from "../../../lib/ConditionalLink"; import PaintCounter from "../../../lib/PaintCounter"; import { isTouchscreenDevice } from "../../../lib/isTouchscreenDevice"; -import { useData } from "../../../mobx/State"; import { dispatch } from "../../../redux"; import { connectState } from "../../../redux/connector"; import { Unreads } from "../../../redux/reducers/unreads"; @@ -42,8 +40,7 @@ const HomeSidebar = observer((props: Props) => { const { channel } = useParams<{ channel: string }>(); const { openScreen } = useIntermediate(); - const store = useData(); - const channels = [...store.channels.values()] + const channels = [...client.channels.values()] .filter( (x) => x.channel_type === "DirectMessage" || @@ -51,7 +48,7 @@ const HomeSidebar = observer((props: Props) => { ) .map((x) => mapChannelWithUnread(x, props.unreads)); - const obj = store.channels.get(channel); + const obj = client.channels.get(channel); if (channel && !obj) return ; if (obj) useUnreads({ ...props, channel: obj }); @@ -87,10 +84,10 @@ const HomeSidebar = observer((props: Props) => { user?.relationship === - UsersNS.Relationship.Incoming, + RelationshipStatus.Incoming, ) !== "undefined" ? "unread" : undefined @@ -139,11 +136,7 @@ const HomeSidebar = observer((props: Props) => { let user; if (x.channel.channel_type === "DirectMessage") { if (!x.channel.active) return null; - - const recipient = client.channels.getRecipient( - x.channel._id, - ); - user = store.users.get(recipient); + user = x.channel.recipient; if (!user) { console.warn( diff --git a/src/components/navigation/left/ServerListSidebar.tsx b/src/components/navigation/left/ServerListSidebar.tsx index fc60f94c..a00897e1 100644 --- a/src/components/navigation/left/ServerListSidebar.tsx +++ b/src/components/navigation/left/ServerListSidebar.tsx @@ -1,7 +1,7 @@ import { Plus } from "@styled-icons/boxicons-regular"; import { observer } from "mobx-react-lite"; import { useLocation, useParams } from "react-router-dom"; -import { Channel, Servers, Users } from "revolt.js/dist/api/objects"; +import { RelationshipStatus } from "revolt-api/types/Users"; import styled, { css } from "styled-components"; import { attachContextMenu, openContextMenu } from "preact-context-menu"; @@ -10,7 +10,6 @@ import ConditionalLink from "../../../lib/ConditionalLink"; import PaintCounter from "../../../lib/PaintCounter"; import { isTouchscreenDevice } from "../../../lib/isTouchscreenDevice"; -import { useData } from "../../../mobx/State"; import { connectState } from "../../../redux/connector"; import { LastOpened } from "../../../redux/reducers/last_opened"; import { Unreads } from "../../../redux/reducers/unreads"; @@ -175,14 +174,12 @@ interface Props { } export const ServerListSidebar = observer(({ unreads, lastOpened }: Props) => { - const store = useData(); const client = useClient(); - const self = store.users.get(client.user!._id); const { server: server_id } = useParams<{ server?: string }>(); - const server = server_id ? store.servers.get(server_id) : undefined; - const activeServers = [...store.servers.values()]; - const channels = [...store.channels.values()].map((x) => + const server = server_id ? client.servers.get(server_id) : undefined; + const activeServers = [...client.servers.values()]; + const channels = [...client.channels.values()].map((x) => mapChannelWithUnread(x, unreads), ); @@ -192,7 +189,7 @@ export const ServerListSidebar = observer(({ unreads, lastOpened }: Props) => { const servers = activeServers.map((server) => { let alertCount = 0; - for (const id of server.channels) { + for (const id of server.channel_ids) { const channel = channels.find((x) => x.channel?._id === id); if (channel?.alertCount) { alertCount += channel.alertCount; @@ -201,7 +198,7 @@ export const ServerListSidebar = observer(({ unreads, lastOpened }: Props) => { return { server, - unread: (typeof server.channels.find((x) => + unread: (typeof server.channel_ids.find((x) => unreadChannels.includes(x), ) !== "undefined" ? alertCount > 0 @@ -230,8 +227,8 @@ export const ServerListSidebar = observer(({ unreads, lastOpened }: Props) => { } if ( - [...store.users.values()].find( - (x) => x.relationship === Users.Relationship.Incoming, + [...client.users.values()].find( + (x) => x.relationship === RelationshipStatus.Incoming, ) ) { alertCount++; @@ -254,9 +251,13 @@ export const ServerListSidebar = observer(({ unreads, lastOpened }: Props) => { onClick={() => homeActive && openContextMenu("Status") }> - + - +
diff --git a/src/components/navigation/left/ServerSidebar.tsx b/src/components/navigation/left/ServerSidebar.tsx index de7dd7ed..cd230593 100644 --- a/src/components/navigation/left/ServerSidebar.tsx +++ b/src/components/navigation/left/ServerSidebar.tsx @@ -1,6 +1,5 @@ import { observer } from "mobx-react-lite"; import { Redirect, useParams } from "react-router"; -import { Channels } from "revolt.js/dist/api/objects"; import styled from "styled-components"; import { attachContextMenu } from "preact-context-menu"; @@ -9,11 +8,12 @@ import { useEffect } from "preact/hooks"; import ConditionalLink from "../../../lib/ConditionalLink"; import PaintCounter from "../../../lib/PaintCounter"; -import { useData } from "../../../mobx/State"; import { dispatch } from "../../../redux"; import { connectState } from "../../../redux/connector"; import { Unreads } from "../../../redux/reducers/unreads"; +import { useClient } from "../../../context/revoltjs/RevoltClient"; + import CollapsibleSection from "../../common/CollapsibleSection"; import ServerHeader from "../../common/ServerHeader"; import Category from "../../ui/Category"; @@ -50,14 +50,14 @@ const ServerList = styled.div` `; const ServerSidebar = observer((props: Props) => { - const store = useData(); + const client = useClient(); const { server: server_id, channel: channel_id } = useParams<{ server: string; channel?: string }>(); - const server = store.servers.get(server_id); + const server = client.servers.get(server_id); if (!server) return ; - const channel = channel_id ? store.channels.get(channel_id) : undefined; + const channel = channel_id ? client.channels.get(channel_id) : undefined; if (channel_id && !channel) return ; if (channel) useUnreads({ ...props, channel }); @@ -71,11 +71,11 @@ const ServerSidebar = observer((props: Props) => { }); }, [channel_id]); - const uncategorised = new Set(server.channels); + const uncategorised = new Set(server.channel_ids); const elements = []; function addChannel(id: string) { - const entry = store.channels.get(id); + const entry = client.channels.get(id); if (!entry) return; const active = channel?._id === entry._id; diff --git a/src/components/navigation/left/common.ts b/src/components/navigation/left/common.ts index 1096bf1c..4f085d82 100644 --- a/src/components/navigation/left/common.ts +++ b/src/components/navigation/left/common.ts @@ -1,11 +1,12 @@ +import { autorun } from "mobx"; +import { Channel } from "revolt.js/dist/maps/Channels"; + import { useLayoutEffect } from "preact/hooks"; -import { Channel } from "../../../mobx"; import { dispatch } from "../../../redux"; import { Unreads } from "../../../redux/reducers/unreads"; import { useClient } from "../../../context/revoltjs/RevoltClient"; -import { HookContext, useForceUpdate } from "../../../context/revoltjs/hooks"; type UnreadProps = { channel: Channel; @@ -16,7 +17,10 @@ export function useUnreads({ channel, unreads }: UnreadProps) { const client = useClient(); useLayoutEffect(() => { - function checkUnread(target?: Channel) { + function checkUnread( + target: Channel, + last_message: Channel["last_message"], + ) { if (!target) return; if (target._id !== channel._id) return; if ( @@ -46,10 +50,7 @@ export function useUnreads({ channel, unreads }: UnreadProps) { } } - checkUnread(channel); - - client.channels.addListener("mutation", checkUnread); - return () => client.channels.removeListener("mutation", checkUnread); + return autorun(() => checkUnread(channel!, channel!.last_message)); }, [channel, unreads]); } diff --git a/src/components/navigation/right/MemberSidebar.tsx b/src/components/navigation/right/MemberSidebar.tsx index 838acd38..579692c7 100644 --- a/src/components/navigation/right/MemberSidebar.tsx +++ b/src/components/navigation/right/MemberSidebar.tsx @@ -1,15 +1,15 @@ import { observer } from "mobx-react-lite"; -import { useParams } from "react-router"; import { Link } from "react-router-dom"; -import { User } from "revolt.js"; -import { Channels, Message, Servers, Users } from "revolt.js/dist/api/objects"; +import { Presence } from "revolt-api/types/Users"; +import { Channel } from "revolt.js/dist/maps/Channels"; +import Members, { Member } from "revolt.js/dist/maps/Members"; +import { Message } from "revolt.js/dist/maps/Messages"; +import { User } from "revolt.js/dist/maps/Users"; import { ClientboundNotification } from "revolt.js/dist/websocket/notifications"; import { Text } from "preact-i18n"; import { useContext, useEffect, useState } from "preact/hooks"; -import { Channel } from "../../../mobx"; -import { useData } from "../../../mobx/State"; import { getState } from "../../../redux"; import { useIntermediate } from "../../../context/intermediate/Intermediate"; @@ -17,8 +17,8 @@ import { AppContext, ClientStatus, StatusContext, + useClient, } from "../../../context/revoltjs/RevoltClient"; -import { HookContext } from "../../../context/revoltjs/hooks"; import CollapsibleSection from "../../common/CollapsibleSection"; import Button from "../../ui/Button"; @@ -46,10 +46,10 @@ export const GroupMemberSidebar = observer( ({ channel }: { channel: Channel }) => { const { openScreen } = useIntermediate(); - const store = useData(); - const members = channel.recipients - ?.map((member) => store.users.get(member)!) - .filter((x) => typeof x !== "undefined"); + const client = useClient(); + const members = channel.recipients?.filter( + (x) => typeof x !== "undefined", + ); /*const voice = useContext(VoiceContext); const voiceActive = voice.roomId === channel._id; @@ -70,14 +70,12 @@ export const GroupMemberSidebar = observer( // ! FIXME: should probably rewrite all this code const l = +( - (a.online && - a.status?.presence !== Users.Presence.Invisible) ?? + (a!.online && a!.status?.presence !== Presence.Invisible) ?? false ) | 0; const r = +( - (b.online && - b.status?.presence !== Users.Presence.Invisible) ?? + (b!.online && b!.status?.presence !== Presence.Invisible) ?? false ) | 0; @@ -86,14 +84,14 @@ export const GroupMemberSidebar = observer( return n; } - return a.username.localeCompare(b.username); + return a!.username.localeCompare(b!.username); }); return ( - + {/*voiceActive && voiceParticipants.length !== 0 && ( @@ -163,71 +161,32 @@ export const GroupMemberSidebar = observer( export const ServerMemberSidebar = observer( ({ channel }: { channel: Channel }) => { - const [members, setMembers] = useState( - undefined, - ); - - const store = useData(); - const users = members - ?.map((member) => store.users.get(member._id.user)!) - .filter((x) => typeof x !== "undefined"); - + const client = useClient(); const { openScreen } = useIntermediate(); const status = useContext(StatusContext); - const client = useContext(AppContext); useEffect(() => { - if ( - status === ClientStatus.ONLINE && - typeof members === "undefined" - ) { - store - .fetchMembers(channel.server!) - .then((members) => setMembers(members)); + if (status === ClientStatus.ONLINE) { + channel.server!.fetchMembers(); } }, [status]); - // ! FIXME: temporary code - useEffect(() => { - function onPacket(packet: ClientboundNotification) { - if (!members) return; - if (packet.type === "ServerMemberJoin") { - if (packet.id !== channel.server) return; - setMembers([ - ...members, - { _id: { server: packet.id, user: packet.user } }, - ]); - } else if (packet.type === "ServerMemberLeave") { - if (packet.id !== channel.server) return; - setMembers( - members.filter( - (x) => - !( - x._id.user === packet.user && - x._id.server === packet.id - ), - ), - ); - } - } - - client.addListener("packet", onPacket); - return () => client.removeListener("packet", onPacket); - }, [members]); + let users = [...client.members.keys()] + .filter((x) => x.server === channel.server_id) + .map((y) => client.users.get(y.user)!) + .filter((z) => typeof z !== "undefined"); // copy paste from above - users?.sort((a, b) => { + users.sort((a, b) => { // ! FIXME: should probably rewrite all this code const l = +( - (a.online && - a.status?.presence !== Users.Presence.Invisible) ?? + (a.online && a.status?.presence !== Presence.Invisible) ?? false ) | 0; const r = +( - (b.online && - b.status?.presence !== Users.Presence.Invisible) ?? + (b.online && b.status?.presence !== Presence.Invisible) ?? false ) | 0; @@ -243,9 +202,9 @@ export const ServerMemberSidebar = observer( - -
{!members && }
- {members && ( + +
{users.length === 0 && }
+ {users.length > 0 && ( }> - {(users?.length ?? 0) === 0 && ( - - )} - {users?.map( + {users.map( (user) => user && ( ([]); async function search() { - const data = await client.channels.searchWithUsers( - channel, - { query, sort }, - true, - ); + const data = await channel.searchWithUsers({ query, sort }); setResults(data.messages); } @@ -340,7 +292,6 @@ function Search({ channel }: { channel: string }) { }}> {results.map((message) => { let href = ""; - const channel = client.channels.get(message.channel); if (channel?.channel_type === "TextChannel") { href += `/server/${channel.server}`; } @@ -355,10 +306,7 @@ function Search({ channel }: { channel: string }) { padding: "6px", background: "var(--primary-background)", }}> - - @ - {client.users.get(message.author)?.username} - + @{message.author?.username}
{message.content} diff --git a/src/context/Voice.tsx b/src/context/Voice.tsx index 9fe0676e..43fbb9df 100644 --- a/src/context/Voice.tsx +++ b/src/context/Voice.tsx @@ -1,3 +1,5 @@ +import { Channel } from "revolt.js/dist/maps/Channels"; + import { createContext } from "preact"; import { useContext, useEffect, useMemo, useRef, useState } from "preact/hooks"; @@ -21,7 +23,7 @@ export enum VoiceStatus { } export interface VoiceOperations { - connect: (channelId: string) => Promise; + connect: (channel: Channel) => Promise; disconnect: () => void; isProducing: (type: ProduceType) => boolean; startProducing: (type: ProduceType) => Promise; @@ -79,27 +81,25 @@ export default function Voice({ children }: Props) { const isConnecting = useRef(false); const operations: VoiceOperations = useMemo(() => { return { - connect: async (channelId) => { + connect: async (channel) => { if (!client?.supported()) throw new Error("RTC is unavailable"); isConnecting.current = true; - setStatus(VoiceStatus.CONNECTING, channelId); + setStatus(VoiceStatus.CONNECTING, channel._id); try { - const call = await revoltClient.channels.joinCall( - channelId, - ); + const call = await channel.joinCall(); if (!isConnecting.current) { setStatus(VoiceStatus.READY); - return; + return channel; } // ! FIXME: use configuration to check if voso is enabled // await client.connect("wss://voso.revolt.chat/ws"); await client.connect( "wss://voso.revolt.chat/ws", - channelId, + channel._id, ); setStatus(VoiceStatus.AUTHENTICATING); @@ -111,11 +111,12 @@ export default function Voice({ children }: Props) { } catch (error) { console.error(error); setStatus(VoiceStatus.READY); - return; + return channel; } setStatus(VoiceStatus.CONNECTED); isConnecting.current = false; + return channel; }, disconnect: () => { if (!client?.supported()) throw new Error("RTC is unavailable"); diff --git a/src/context/index.tsx b/src/context/index.tsx index 46966c08..f7a3ccb6 100644 --- a/src/context/index.tsx +++ b/src/context/index.tsx @@ -1,6 +1,5 @@ import { BrowserRouter as Router } from "react-router-dom"; -import MobXState from "../mobx/State"; import State from "../redux/State"; import { Children } from "../types/Preact"; @@ -20,9 +19,7 @@ export default function Context({ children }: { children: Children }) { - - {children} - + {children} diff --git a/src/context/intermediate/Intermediate.tsx b/src/context/intermediate/Intermediate.tsx index d472b09b..9ff66571 100644 --- a/src/context/intermediate/Intermediate.tsx +++ b/src/context/intermediate/Intermediate.tsx @@ -57,7 +57,7 @@ export type Screen = } | { type: "create_role"; - server: string; + server: Server; callback: (id: string) => void; } )) diff --git a/src/context/intermediate/modals/Input.tsx b/src/context/intermediate/modals/Input.tsx index 16eb0115..a08f1da6 100644 --- a/src/context/intermediate/modals/Input.tsx +++ b/src/context/intermediate/modals/Input.tsx @@ -1,4 +1,5 @@ import { useHistory } from "react-router"; +import { Server } from "revolt.js/dist/maps/Servers"; import { ulid } from "ulid"; import { Text } from "preact-i18n"; @@ -81,7 +82,7 @@ type SpecialProps = { onClose: () => void } & ( | "set_custom_status" | "add_friend"; } - | { type: "create_role"; server: string; callback: (id: string) => void } + | { type: "create_role"; server: Server; callback: (id: string) => void } ); export function SpecialInputModal(props: SpecialProps) { @@ -134,10 +135,7 @@ export function SpecialInputModal(props: SpecialProps) { } field={} callback={async (name) => { - const role = await client.servers.createRole( - props.server, - name, - ); + const role = await props.server.createRole(name); props.callback(role.id); }} /> @@ -151,7 +149,7 @@ export function SpecialInputModal(props: SpecialProps) { field={} defaultValue={client.user?.status?.text} callback={(text) => - client.users.editUser({ + client.users.edit({ status: { ...client.user?.status, text: text.trim().length > 0 ? text : undefined, @@ -166,7 +164,14 @@ export function SpecialInputModal(props: SpecialProps) { client.users.addFriend(username)} + callback={(username) => + client + .req( + "PUT", + `/users/${username}/friend` as "/users/id/friend", + ) + .then(undefined) + } /> ); } diff --git a/src/context/intermediate/modals/Prompt.tsx b/src/context/intermediate/modals/Prompt.tsx index ebe44d70..34564e9e 100644 --- a/src/context/intermediate/modals/Prompt.tsx +++ b/src/context/intermediate/modals/Prompt.tsx @@ -1,6 +1,9 @@ import { observer } from "mobx-react-lite"; import { useHistory } from "react-router-dom"; -import { Channels, Servers, Users } from "revolt.js/dist/api/objects"; +import { Channel } from "revolt.js/dist/maps/Channels"; +import { Message as MessageI } from "revolt.js/dist/maps/Messages"; +import { Server } from "revolt.js/dist/maps/Servers"; +import { User } from "revolt.js/dist/maps/Users"; import { ulid } from "ulid"; import styles from "./Prompt.module.scss"; @@ -9,9 +12,6 @@ import { useContext, useEffect, useState } from "preact/hooks"; import { TextReact } from "../../../lib/i18n"; -import { Channel, Server, User } from "../../../mobx"; -import { useData } from "../../../mobx/State"; - import Message from "../../../components/common/messaging/Message"; import UserIcon from "../../../components/common/user/UserIcon"; import InputBox from "../../../components/ui/InputBox"; @@ -21,7 +21,7 @@ import Radio from "../../../components/ui/Radio"; import { Children } from "../../../types/Preact"; import { AppContext } from "../../revoltjs/RevoltClient"; -import { mapMessage, takeError } from "../../revoltjs/util"; +import { takeError } from "../../revoltjs/util"; import { useIntermediate } from "../Intermediate"; interface Props { @@ -60,7 +60,7 @@ type SpecialProps = { onClose: () => void } & ( | { type: "leave_server"; target: Server } | { type: "delete_server"; target: Server } | { type: "delete_channel"; target: Channel } - | { type: "delete_message"; target: Channels.Message } + | { type: "delete_message"; target: MessageI } | { type: "create_invite"; target: Channel; @@ -104,9 +104,7 @@ export const SpecialPromptModal = observer((props: SpecialProps) => { name = props.target.username; break; case "close_dm": - name = client.users.get( - client.channels.getRecipient(props.target._id), - )?.username; + name = props.target.recipient?.username; break; default: name = props.target.name; @@ -137,27 +135,19 @@ export const SpecialPromptModal = observer((props: SpecialProps) => { try { switch (props.type) { case "unfriend_user": - await client.users.removeFriend( - props.target._id, - ); + await props.target.removeFriend(); break; case "block_user": - await client.users.blockUser( - props.target._id, - ); + await props.target.blockUser(); break; case "leave_group": case "close_dm": case "delete_channel": - await client.channels.delete( - props.target._id, - ); + props.target.delete(); break; case "leave_server": case "delete_server": - await client.servers.delete( - props.target._id, - ); + props.target.delete(); break; } @@ -203,11 +193,7 @@ export const SpecialPromptModal = observer((props: SpecialProps) => { setProcessing(true); try { - await client.channels.deleteMessage( - props.target.channel, - props.target._id, - ); - + props.target.deleteMessage(); onClose(); } catch (err) { setError(takeError(err)); @@ -229,7 +215,7 @@ export const SpecialPromptModal = observer((props: SpecialProps) => { id={`app.special.modals.prompt.confirm_delete_message_long`} /> @@ -247,8 +233,8 @@ export const SpecialPromptModal = observer((props: SpecialProps) => { useEffect(() => { setProcessing(true); - client.channels - .createInvite(props.target._id) + props.target + .createInvite() .then((code) => setCode(code)) .catch((err) => setError(takeError(err))) .finally(() => setProcessing(false)); @@ -306,10 +292,13 @@ export const SpecialPromptModal = observer((props: SpecialProps) => { setProcessing(true); try { - await client.members.kickMember( - props.target._id, - props.user._id, - ); + client.members + .get({ + server: props.target._id, + user: props.user._id, + }) + ?.kick(); + onClose(); } catch (err) { setError(takeError(err)); @@ -357,11 +346,9 @@ export const SpecialPromptModal = observer((props: SpecialProps) => { setProcessing(true); try { - await client.servers.banUser( - props.target._id, - props.user._id, - { reason }, - ); + await props.target.banUser(props.user._id, { + reason, + }); onClose(); } catch (err) { setError(takeError(err)); @@ -420,14 +407,11 @@ export const SpecialPromptModal = observer((props: SpecialProps) => { try { const channel = - await client.servers.createChannel( - props.target._id, - { - type, - name, - nonce: ulid(), - }, - ); + await props.target.createChannel({ + type, + name, + nonce: ulid(), + }); history.push( `/server/${props.target._id}/channel/${channel._id}`, diff --git a/src/context/intermediate/popovers/ChannelInfo.tsx b/src/context/intermediate/popovers/ChannelInfo.tsx index 3b15cd7f..a2f41f87 100644 --- a/src/context/intermediate/popovers/ChannelInfo.tsx +++ b/src/context/intermediate/popovers/ChannelInfo.tsx @@ -1,15 +1,12 @@ import { X } from "@styled-icons/boxicons-regular"; import { observer } from "mobx-react-lite"; +import { Channel } from "revolt.js/dist/maps/Channels"; import styles from "./ChannelInfo.module.scss"; -import { Channel } from "../../../mobx"; - import Modal from "../../../components/ui/Modal"; import Markdown from "../../../components/markdown/Markdown"; -import { useClient } from "../../revoltjs/RevoltClient"; -import { useForceUpdate } from "../../revoltjs/hooks"; import { getChannelName } from "../../revoltjs/util"; interface Props { @@ -26,12 +23,11 @@ export const ChannelInfo = observer(({ channel, onClose }: Props) => { return null; } - const client = useClient(); return (
-

{getChannelName(client, channel, true)}

+

{getChannelName(channel, true)}

diff --git a/src/context/intermediate/popovers/ImageViewer.tsx b/src/context/intermediate/popovers/ImageViewer.tsx index b3f049e7..73d4a07f 100644 --- a/src/context/intermediate/popovers/ImageViewer.tsx +++ b/src/context/intermediate/popovers/ImageViewer.tsx @@ -1,11 +1,7 @@ -import { - Attachment, - AttachmentMetadata, - EmbedImage, -} from "revolt.js/dist/api/objects"; +import { Attachment, AttachmentMetadata } from "revolt-api/types/Autumn"; +import { EmbedImage } from "revolt-api/types/January"; import styles from "./ImageViewer.module.scss"; -import { useContext, useEffect } from "preact/hooks"; import AttachmentActions from "../../../components/common/messaging/attachments/AttachmentActions"; import EmbedMediaActions from "../../../components/common/messaging/embed/EmbedMediaActions"; diff --git a/src/context/intermediate/popovers/PendingRequests.tsx b/src/context/intermediate/popovers/PendingRequests.tsx index 03449e8e..df7d66bd 100644 --- a/src/context/intermediate/popovers/PendingRequests.tsx +++ b/src/context/intermediate/popovers/PendingRequests.tsx @@ -1,10 +1,9 @@ import { observer } from "mobx-react-lite"; +import { User } from "revolt.js/dist/maps/Users"; import styles from "./UserPicker.module.scss"; import { Text } from "preact-i18n"; -import { User } from "../../../mobx"; - import Modal from "../../../components/ui/Modal"; import { Friend } from "../../../pages/friends/Friend"; diff --git a/src/context/intermediate/popovers/UserPicker.tsx b/src/context/intermediate/popovers/UserPicker.tsx index 3eaeb1d5..3d2cec3c 100644 --- a/src/context/intermediate/popovers/UserPicker.tsx +++ b/src/context/intermediate/popovers/UserPicker.tsx @@ -1,14 +1,14 @@ -import { Users } from "revolt.js/dist/api/objects"; +import { RelationshipStatus } from "revolt-api/types/Users"; import styles from "./UserPicker.module.scss"; import { Text } from "preact-i18n"; import { useState } from "preact/hooks"; -import { useData } from "../../../mobx/State"; - import UserCheckbox from "../../../components/common/user/UserCheckbox"; import Modal from "../../../components/ui/Modal"; +import { useClient } from "../../revoltjs/RevoltClient"; + interface Props { omit?: string[]; onClose: () => void; @@ -19,7 +19,7 @@ export function UserPicker(props: Props) { const [selected, setSelected] = useState([]); const omit = [...(props.omit || []), "00000000000000000000000000"]; - const store = useData(); + const client = useClient(); return (
- {[...store.users.values()] + {[...client.users.values()] .filter( (x) => x && - x.relationship === Users.Relationship.Friend && + x.relationship === RelationshipStatus.Friend && !omit.includes(x._id), ) .map((x) => ( diff --git a/src/pages/channels/actions/HeaderActions.tsx b/src/pages/channels/actions/HeaderActions.tsx index e3edd59f..4451399e 100644 --- a/src/pages/channels/actions/HeaderActions.tsx +++ b/src/pages/channels/actions/HeaderActions.tsx @@ -91,7 +91,7 @@ function VoiceActions({ channel }: Pick) { { disconnect(); - connect(channel._id); + connect(channel); }}> diff --git a/src/pages/friends/Friend.tsx b/src/pages/friends/Friend.tsx index 219f613f..d796dced 100644 --- a/src/pages/friends/Friend.tsx +++ b/src/pages/friends/Friend.tsx @@ -48,10 +48,10 @@ export const Friend = observer(({ user }: Props) => { onClick={(ev) => stopPropagation( ev, - user.openDM().then((channel) => { - connect(channel._id); - history.push(`/channel/${channel._id}`); - }), + user + .openDM() + .then(connect) + .then((x) => history.push(`/channel/${x._id}`)), ) }> diff --git a/src/pages/settings/server/Roles.tsx b/src/pages/settings/server/Roles.tsx index 4431e471..cf5044f1 100644 --- a/src/pages/settings/server/Roles.tsx +++ b/src/pages/settings/server/Roles.tsx @@ -97,7 +97,7 @@ export const Roles = observer(({ server }: Props) => { openScreen({ id: "special_input", type: "create_role", - server: server._id, + server, callback: (id) => setRole(id), }) }