diff --git a/src/components/common/ServerHeader.tsx b/src/components/common/ServerHeader.tsx index 91cc0b39453c1d2441a15c4661a87fe3a4250130..fc0d64eace6f44ce733153aa15f4fd308241b67e 100644 --- a/src/components/common/ServerHeader.tsx +++ b/src/components/common/ServerHeader.tsx @@ -1,26 +1,30 @@ import { Cog } from "@styled-icons/boxicons-solid"; +import { observer } from "mobx-react-lite"; import { Link } from "react-router-dom"; -import { Server } from "revolt.js/dist/api/objects"; import { ServerPermission } from "revolt.js/dist/api/permissions"; import styled from "styled-components"; -import { HookContext, useServerPermission } from "../../context/revoltjs/hooks"; +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"; interface Props { server: Server; - ctx: HookContext; } const ServerName = styled.div` flex-grow: 1; `; -export default function ServerHeader({ server, ctx }: Props) { - const permissions = useServerPermission(server._id, ctx); - const bannerURL = ctx.client.servers.getBannerURL( +export default observer(({ server }: Props) => { + const permissions = useServerPermission(server._id); + const client = useClient(); + + const bannerURL = client.servers.getBannerURL( server._id, { width: 480 }, true, @@ -46,4 +50,4 @@ export default function ServerHeader({ server, ctx }: Props) { )} </Header> ); -} +}); diff --git a/src/components/common/ServerIcon.tsx b/src/components/common/ServerIcon.tsx index 168af8ae3b2d586d0f5e20bed6e962465731c6bb..5208918a79eeb68160c7c2c87b73b4daf21c71b2 100644 --- a/src/components/common/ServerIcon.tsx +++ b/src/components/common/ServerIcon.tsx @@ -1,8 +1,10 @@ -import { Server } from "revolt.js/dist/api/objects"; +import { observer } from "mobx-react-lite"; 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"; @@ -22,48 +24,50 @@ const ServerText = styled.div` `; const fallback = "/assets/group.png"; -export default function ServerIcon( - props: Props & Omit<JSX.HTMLAttributes<HTMLImageElement>, keyof Props>, -) { - const client = useContext(AppContext); +export default observer( + ( + props: Props & Omit<JSX.HTMLAttributes<HTMLImageElement>, keyof Props>, + ) => { + const client = useContext(AppContext); + + const { + target, + attachment, + size, + animate, + server_name, + children, + as, + ...imgProps + } = props; + const iconURL = client.generateFileURL( + target?.icon ?? attachment, + { max_side: 256 }, + animate, + ); - const { - target, - attachment, - size, - animate, - server_name, - children, - as, - ...imgProps - } = props; - const iconURL = client.generateFileURL( - target?.icon ?? attachment, - { max_side: 256 }, - animate, - ); + if (typeof iconURL === "undefined") { + const name = target?.name ?? server_name ?? ""; - if (typeof iconURL === "undefined") { - const name = target?.name ?? server_name ?? ""; + return ( + <ServerText style={{ width: size, height: size }}> + {name + .split(" ") + .map((x) => x[0]) + .filter((x) => typeof x !== "undefined")} + </ServerText> + ); + } return ( - <ServerText style={{ width: size, height: size }}> - {name - .split(" ") - .map((x) => x[0]) - .filter((x) => typeof x !== "undefined")} - </ServerText> + <ImageIconBase + {...imgProps} + width={size} + height={size} + src={iconURL} + loading="lazy" + aria-hidden="true" + /> ); - } - - return ( - <ImageIconBase - {...imgProps} - width={size} - height={size} - src={iconURL} - loading="lazy" - aria-hidden="true" - /> - ); -} + }, +); diff --git a/src/components/common/user/UserShort.tsx b/src/components/common/user/UserShort.tsx index 3eab5a101c812bdf3188534d10864dcdb6b085a4..ec47c0d0c4eaed3e2e86812a8bfacf9eb817232e 100644 --- a/src/components/common/user/UserShort.tsx +++ b/src/components/common/user/UserShort.tsx @@ -1,16 +1,9 @@ import { observer } from "mobx-react-lite"; -import { useParams } from "react-router-dom"; import { Text } from "preact-i18n"; import { User } from "../../../mobx"; -import { - useForceUpdate, - useMember, - useServer, -} from "../../../context/revoltjs/hooks"; - import UserIcon from "./UserIcon"; export const Username = observer( diff --git a/src/components/navigation/left/ServerListSidebar.tsx b/src/components/navigation/left/ServerListSidebar.tsx index b0a462f9282f7efb87a3741fdf12094b9fed38c3..fc60f94c74314c2e06b5a7918cd4f5223e6d6843 100644 --- a/src/components/navigation/left/ServerListSidebar.tsx +++ b/src/components/navigation/left/ServerListSidebar.tsx @@ -17,7 +17,6 @@ import { Unreads } from "../../../redux/reducers/unreads"; import { useIntermediate } from "../../../context/intermediate/Intermediate"; import { useClient } from "../../../context/revoltjs/RevoltClient"; -import { useForceUpdate, useServers } from "../../../context/revoltjs/hooks"; import logoSVG from "../../../assets/logo.svg"; import ServerIcon from "../../common/ServerIcon"; @@ -180,8 +179,9 @@ export const ServerListSidebar = observer(({ unreads, lastOpened }: Props) => { const client = useClient(); const self = store.users.get(client.user!._id); - const ctx = useForceUpdate(); - const activeServers = useServers(undefined, ctx) as Servers.Server[]; + 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) => mapChannelWithUnread(x, unreads), ); @@ -200,7 +200,7 @@ export const ServerListSidebar = observer(({ unreads, lastOpened }: Props) => { } return { - ...server, + server, unread: (typeof server.channels.find((x) => unreadChannels.includes(x), ) !== "undefined" @@ -213,9 +213,6 @@ export const ServerListSidebar = observer(({ unreads, lastOpened }: Props) => { }); const path = useLocation().pathname; - const { server: server_id } = useParams<{ server?: string }>(); - const server = servers.find((x) => x!._id == server_id); - const { openScreen } = useIntermediate(); let homeUnread: "mention" | "unread" | undefined; @@ -267,24 +264,29 @@ export const ServerListSidebar = observer(({ unreads, lastOpened }: Props) => { </ConditionalLink> <LineDivider /> {servers.map((entry) => { - const active = entry!._id === server?._id; - const id = lastOpened[entry!._id]; + const active = entry.server._id === server?._id; + const id = lastOpened[entry.server._id]; return ( <ConditionalLink active={active} - to={`/server/${entry!._id}${ + to={`/server/${entry.server._id}${ id ? `/channel/${id}` : "" }`}> <ServerEntry active={active} onContextMenu={attachContextMenu("Menu", { - server: entry!._id, + server: entry.server._id, })}> <Swoosh /> - <Tooltip content={entry.name} placement="right"> + <Tooltip + content={entry.server.name} + placement="right"> <Icon size={42} unread={entry.unread}> - <ServerIcon size={32} target={entry} /> + <ServerIcon + size={32} + target={entry.server} + /> </Icon> </Tooltip> </ServerEntry> diff --git a/src/components/navigation/left/ServerSidebar.tsx b/src/components/navigation/left/ServerSidebar.tsx index bd49a772fc17be2866bf35351a9fae6d496650b2..de7dd7ed465c98dbbb4bc2fcaaa1a4f5dd45e4e9 100644 --- a/src/components/navigation/left/ServerSidebar.tsx +++ b/src/components/navigation/left/ServerSidebar.tsx @@ -14,8 +14,6 @@ import { dispatch } from "../../../redux"; import { connectState } from "../../../redux/connector"; import { Unreads } from "../../../redux/reducers/unreads"; -import { useForceUpdate, useServer } from "../../../context/revoltjs/hooks"; - import CollapsibleSection from "../../common/CollapsibleSection"; import ServerHeader from "../../common/ServerHeader"; import Category from "../../ui/Category"; @@ -52,18 +50,16 @@ const ServerList = styled.div` `; const ServerSidebar = observer((props: Props) => { + const store = useData(); const { server: server_id, channel: channel_id } = - useParams<{ server?: string; channel?: string }>(); - const ctx = useForceUpdate(); + useParams<{ server: string; channel?: string }>(); - const server = useServer(server_id, ctx); + const server = store.servers.get(server_id); if (!server) return <Redirect to="/" />; - const store = useData(); - const channel = channel_id ? store.channels.get(channel_id) : undefined; if (channel_id && !channel) return <Redirect to={`/server/${server_id}`} />; - if (channel) useUnreads({ ...props, channel }, ctx); + if (channel) useUnreads({ ...props, channel }); useEffect(() => { if (!channel_id) return; @@ -125,7 +121,7 @@ const ServerSidebar = observer((props: Props) => { return ( <ServerBase> - <ServerHeader server={server} ctx={ctx} /> + <ServerHeader server={server} /> <ConnectionStatus /> <ServerList onContextMenu={attachContextMenu("Menu", { diff --git a/src/components/navigation/left/common.ts b/src/components/navigation/left/common.ts index 6f60ba63cd7cec755b8599ef0245939c2efc580d..1096bf1c65f9cab9b3b9e84ec3aac203132b10ba 100644 --- a/src/components/navigation/left/common.ts +++ b/src/components/navigation/left/common.ts @@ -4,6 +4,7 @@ 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 = { @@ -11,11 +12,8 @@ type UnreadProps = { unreads: Unreads; }; -export function useUnreads( - { channel, unreads }: UnreadProps, - context?: HookContext, -) { - const ctx = useForceUpdate(context); +export function useUnreads({ channel, unreads }: UnreadProps) { + const client = useClient(); useLayoutEffect(() => { function checkUnread(target?: Channel) { @@ -40,7 +38,7 @@ export function useUnreads( message, }); - ctx.client.req( + client.req( "PUT", `/channels/${channel._id}/ack/${message}` as "/channels/id/ack/id", ); @@ -50,9 +48,8 @@ export function useUnreads( checkUnread(channel); - ctx.client.channels.addListener("mutation", checkUnread); - return () => - ctx.client.channels.removeListener("mutation", checkUnread); + client.channels.addListener("mutation", checkUnread); + return () => client.channels.removeListener("mutation", checkUnread); }, [channel, unreads]); } diff --git a/src/context/intermediate/Intermediate.tsx b/src/context/intermediate/Intermediate.tsx index 72e7fe2abe0061a758b0dd3c12a889dd672d1c3a..f73cbae2b1b04d0f761f9519205793b456203c4c 100644 --- a/src/context/intermediate/Intermediate.tsx +++ b/src/context/intermediate/Intermediate.tsx @@ -13,7 +13,7 @@ import { useContext, useEffect, useMemo, useState } from "preact/hooks"; import { internalSubscribe } from "../../lib/eventEmitter"; -import { Channel, User } from "../../mobx"; +import { Channel, Server, User } from "../../mobx"; import { Action } from "../../components/ui/Modal"; @@ -36,19 +36,19 @@ export type Screen = | ({ id: "special_prompt" } & ( | { type: "leave_group"; target: Channel } | { type: "close_dm"; target: Channel } - | { type: "leave_server"; target: Servers.Server } - | { type: "delete_server"; target: Servers.Server } + | { type: "leave_server"; target: Server } + | { type: "delete_server"; target: Server } | { type: "delete_channel"; target: Channel } | { type: "delete_message"; target: Channels.Message } | { type: "create_invite"; target: Channel; } - | { type: "kick_member"; target: Servers.Server; user: User } - | { type: "ban_member"; target: Servers.Server; user: User } + | { type: "kick_member"; target: Server; user: User } + | { type: "ban_member"; target: Server; user: User } | { type: "unfriend_user"; target: User } | { type: "block_user"; target: User } - | { type: "create_channel"; target: Servers.Server } + | { type: "create_channel"; target: Server } )) | ({ id: "special_input" } & ( | { diff --git a/src/context/intermediate/modals/Prompt.tsx b/src/context/intermediate/modals/Prompt.tsx index ea9b2764cd920c4963356b5256292e9a3d07da8c..ebe44d70dab55566ebe5e6a914b2f2adb5fb41ee 100644 --- a/src/context/intermediate/modals/Prompt.tsx +++ b/src/context/intermediate/modals/Prompt.tsx @@ -9,7 +9,7 @@ import { useContext, useEffect, useState } from "preact/hooks"; import { TextReact } from "../../../lib/i18n"; -import { Channel, User } from "../../../mobx"; +import { Channel, Server, User } from "../../../mobx"; import { useData } from "../../../mobx/State"; import Message from "../../../components/common/messaging/Message"; @@ -57,19 +57,19 @@ export function PromptModal({ type SpecialProps = { onClose: () => void } & ( | { type: "leave_group"; target: Channel } | { type: "close_dm"; target: Channel } - | { type: "leave_server"; target: Servers.Server } - | { type: "delete_server"; target: Servers.Server } + | { type: "leave_server"; target: Server } + | { type: "delete_server"; target: Server } | { type: "delete_channel"; target: Channel } | { type: "delete_message"; target: Channels.Message } | { type: "create_invite"; target: Channel; } - | { type: "kick_member"; target: Servers.Server; user: User } - | { type: "ban_member"; target: Servers.Server; user: User } + | { type: "kick_member"; target: Server; user: User } + | { type: "ban_member"; target: Server; user: User } | { type: "unfriend_user"; target: User } | { type: "block_user"; target: User } - | { type: "create_channel"; target: Servers.Server } + | { type: "create_channel"; target: Server } ); export const SpecialPromptModal = observer((props: SpecialProps) => { diff --git a/src/context/revoltjs/hooks.ts b/src/context/revoltjs/hooks.ts index 1f97286c19802a1a2e146cec9e798f40a82b26c9..956c0976c3574623179ace7d71d273631a781f94 100644 --- a/src/context/revoltjs/hooks.ts +++ b/src/context/revoltjs/hooks.ts @@ -77,20 +77,6 @@ function useObject( : map.toArray(); } -export function useServer(id?: string, context?: HookContext) { - if (typeof id === "undefined") return; - return useObject("servers", id, context) as - | Readonly<Servers.Server> - | undefined; -} - -export function useServers(ids?: string[], context?: HookContext) { - return useObject("servers", ids, context) as ( - | Readonly<Servers.Server> - | undefined - )[]; -} - export function useMember(id?: string, context?: HookContext) { if (typeof id === "undefined") return; return useObject("members", id, context) as diff --git a/src/lib/ContextMenus.tsx b/src/lib/ContextMenus.tsx index d1e3bbe1fec2d5bd0fd59077e619cd26058b092e..bc48ac90ec286f79a00ec5b3913350b3d4d07dfe 100644 --- a/src/lib/ContextMenus.tsx +++ b/src/lib/ContextMenus.tsx @@ -34,7 +34,7 @@ import { import { Text } from "preact-i18n"; import { useContext } from "preact/hooks"; -import { Channel, User } from "../mobx"; +import { Channel, Server, User } from "../mobx"; import { useData } from "../mobx/State"; import { dispatch } from "../redux"; import { connectState } from "../redux/connector"; @@ -55,7 +55,6 @@ import { import { useChannelPermission, useForceUpdate, - useServer, useServerPermission, useUserPermission, } from "../context/revoltjs/hooks"; @@ -99,8 +98,8 @@ type Action = | { action: "open_link"; link: string } | { action: "copy_link"; link: string } | { action: "remove_member"; channel: string; user: User } - | { action: "kick_member"; target: Servers.Server; user: User } - | { action: "ban_member"; target: Servers.Server; user: User } + | { action: "kick_member"; target: Server; user: User } + | { action: "ban_member"; target: Server; user: User } | { action: "view_profile"; user: User } | { action: "message_user"; user: User } | { action: "block_user"; user: User } @@ -111,7 +110,7 @@ type Action = | { action: "set_presence"; presence: Users.Presence } | { action: "set_status" } | { action: "clear_status" } - | { action: "create_channel"; target: Servers.Server } + | { action: "create_channel"; target: Server } | { action: "create_invite"; target: Channel; @@ -122,8 +121,8 @@ type Action = target: Channel; } | { action: "close_dm"; target: Channel } - | { action: "leave_server"; target: Servers.Server } - | { action: "delete_server"; target: Servers.Server } + | { action: "leave_server"; target: Server } + | { action: "delete_server"; target: Server } | { action: "open_notification_options"; channel: Channel } | { action: "open_settings" } | { action: "open_channel_settings"; id: string } @@ -139,7 +138,8 @@ type Props = { notifications: Notifications; }; -// ! FIXME: no observers here! +// ! FIXME: I dare someone to re-write this +// Tip: This should just be split into separate context menus per logical area. function ContextMenus(props: Props) { const { openScreen, writeClipboard } = useIntermediate(); const client = useContext(AppContext); @@ -495,7 +495,7 @@ function ContextMenus(props: Props) { } if (server_list) { - const server = useServer(server_list, forceUpdate); + const server = store.servers.get(server_list); const permissions = useServerPermission( server_list, forceUpdate, @@ -539,10 +539,9 @@ function ContextMenus(props: Props) { targetChannel.channel_type === "VoiceChannel") ? targetChannel : undefined; - const server = useServer( - serverChannel ? serverChannel.server! : sid, - forceUpdate, - ); + + const s = serverChannel ? serverChannel.server! : sid; + const server = s ? store.servers.get(s) : undefined; const channelPermissions = targetChannel ? useChannelPermission(targetChannel._id, forceUpdate) diff --git a/src/pages/settings/ServerSettings.tsx b/src/pages/settings/ServerSettings.tsx index dca442201808c16714cc7acbeebfc47fe09fc1c4..98027cfe84c6ace1ada87e13de0af05b8e417149 100644 --- a/src/pages/settings/ServerSettings.tsx +++ b/src/pages/settings/ServerSettings.tsx @@ -5,7 +5,6 @@ import { Route, useHistory, useParams } from "react-router-dom"; import { Text } from "preact-i18n"; import RequiresOnline from "../../context/revoltjs/RequiresOnline"; -import { useServer } from "../../context/revoltjs/hooks"; import Category from "../../components/ui/Category"; @@ -16,10 +15,12 @@ import { Invites } from "./server/Invites"; import { Members } from "./server/Members"; import { Overview } from "./server/Overview"; import { Roles } from "./server/Roles"; +import { useData } from "../../mobx/State"; export default function ServerSettings() { const { server: sid } = useParams<{ server: string }>(); - const server = useServer(sid); + const store = useData(); + const server = store.servers.get(sid); if (!server) return null; const history = useHistory(); diff --git a/src/pages/settings/channel/Permissions.tsx b/src/pages/settings/channel/Permissions.tsx index c7fc235224e4027c79875c3d97ed184b5c81dbc2..ba64a70ea715da5b29f9c2ab937503ba00a9db74 100644 --- a/src/pages/settings/channel/Permissions.tsx +++ b/src/pages/settings/channel/Permissions.tsx @@ -5,9 +5,9 @@ import { ChannelPermission } from "revolt.js/dist/api/permissions"; import { useContext, useEffect, useState } from "preact/hooks"; import { Channel } from "../../../mobx"; +import { useData } from "../../../mobx/State"; import { AppContext } from "../../../context/revoltjs/RevoltClient"; -import { useServer } from "../../../context/revoltjs/hooks"; import Button from "../../../components/ui/Button"; import Checkbox from "../../../components/ui/Checkbox"; @@ -31,11 +31,12 @@ interface Props { export default observer(({ channel }: Props) => { const [selected, setSelected] = useState("default"); const client = useContext(AppContext); + const store = useData(); type R = { name: string; permissions: number }; const roles: { [key: string]: R } = {}; if (channel.channel_type !== "Group") { - const server = useServer(channel.server!); + const server = store.servers.get(channel.server!); const a = server?.roles ?? {}; for (const b of Object.keys(a)) { roles[b] = { diff --git a/src/pages/settings/server/Bans.tsx b/src/pages/settings/server/Bans.tsx index b196a2085944aea3091bc9a384accf5708fca43b..93935de1efa6392b6b67a1774b949135f9b7cfcf 100644 --- a/src/pages/settings/server/Bans.tsx +++ b/src/pages/settings/server/Bans.tsx @@ -1,4 +1,5 @@ import { XCircle } from "@styled-icons/boxicons-regular"; +import { observer } from "mobx-react-lite"; import { Servers, Users } from "revolt.js/dist/api/objects"; import { Route } from "revolt.js/dist/api/routes"; @@ -6,6 +7,8 @@ import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; import { useContext, useEffect, useState } from "preact/hooks"; +import { Server } from "../../../mobx"; + import { AppContext } from "../../../context/revoltjs/RevoltClient"; import UserIcon from "../../../components/common/user/UserIcon"; @@ -13,10 +16,10 @@ import IconButton from "../../../components/ui/IconButton"; import Preloader from "../../../components/ui/Preloader"; interface Props { - server: Servers.Server; + server: Server; } -export function Bans({ server }: Props) { +export const Bans = observer(({ server }: Props) => { const client = useContext(AppContext); const [deleting, setDelete] = useState<string[]>([]); const [data, setData] = useState< @@ -81,4 +84,4 @@ export function Bans({ server }: Props) { })} </div> ); -} +}); diff --git a/src/pages/settings/server/Categories.tsx b/src/pages/settings/server/Categories.tsx index 6e75222c5814cb58a8b416fdb86c3c1804028468..ad68880ad516fa8c8b96eb66bf83b7cc04672ad8 100644 --- a/src/pages/settings/server/Categories.tsx +++ b/src/pages/settings/server/Categories.tsx @@ -9,6 +9,7 @@ import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; import { useContext, useEffect, useState } from "preact/hooks"; +import { Server } from "../../../mobx"; import { useData } from "../../../mobx/State"; import { AppContext } from "../../../context/revoltjs/RevoltClient"; @@ -23,7 +24,7 @@ import Preloader from "../../../components/ui/Preloader"; import Tip from "../../../components/ui/Tip"; interface Props { - server: Servers.Server; + server: Server; } // ! FIXME: really bad code diff --git a/src/pages/settings/server/Invites.tsx b/src/pages/settings/server/Invites.tsx index 6e072447a4f8c783b4bfa3e9f339c2d283531bf7..8c06e954d1e8f085f23ee6346a8047dd50fc47e0 100644 --- a/src/pages/settings/server/Invites.tsx +++ b/src/pages/settings/server/Invites.tsx @@ -6,6 +6,7 @@ import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; import { useEffect, useState } from "preact/hooks"; +import { Server } from "../../../mobx"; import { useData } from "../../../mobx/State"; import { useClient } from "../../../context/revoltjs/RevoltClient"; @@ -16,7 +17,7 @@ import IconButton from "../../../components/ui/IconButton"; import Preloader from "../../../components/ui/Preloader"; interface Props { - server: Servers.Server; + server: Server; } export const Invites = observer(({ server }: Props) => { diff --git a/src/pages/settings/server/Members.tsx b/src/pages/settings/server/Members.tsx index 69f3aa97f252707814249b73923de059abc46149..3e4f4ebea0f7bd67960ccb601a2a75165485a654 100644 --- a/src/pages/settings/server/Members.tsx +++ b/src/pages/settings/server/Members.tsx @@ -7,6 +7,7 @@ import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; import { useEffect, useState } from "preact/hooks"; +import { Server } from "../../../mobx"; import { useData } from "../../../mobx/State"; import { useClient } from "../../../context/revoltjs/RevoltClient"; @@ -18,7 +19,7 @@ import IconButton from "../../../components/ui/IconButton"; import Overline from "../../../components/ui/Overline"; interface Props { - server: Servers.Server; + server: Server; } export const Members = observer(({ server }: Props) => { diff --git a/src/pages/settings/server/Overview.tsx b/src/pages/settings/server/Overview.tsx index ba25104c8ae0629f55843a435c7d2107170c5249..93f128ee10836b420dcfdcd82778057667554376 100644 --- a/src/pages/settings/server/Overview.tsx +++ b/src/pages/settings/server/Overview.tsx @@ -1,6 +1,6 @@ import isEqual from "lodash.isequal"; import { observer } from "mobx-react-lite"; -import { Servers, Server } from "revolt.js/dist/api/objects"; +import { Servers } from "revolt.js/dist/api/objects"; import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; @@ -8,6 +8,7 @@ import { useContext, useEffect, useState } from "preact/hooks"; import TextAreaAutoSize from "../../../lib/TextAreaAutoSize"; +import { Server } from "../../../mobx"; import { useData } from "../../../mobx/State"; import { FileUploader } from "../../../context/revoltjs/FileUploads"; @@ -19,7 +20,7 @@ import ComboBox from "../../../components/ui/ComboBox"; import InputBox from "../../../components/ui/InputBox"; interface Props { - server: Servers.Server; + server: Server; } export const Overview = observer(({ server }: Props) => { @@ -51,7 +52,7 @@ export const Overview = observer(({ server }: Props) => { if (description !== server.description) changes.description = description; if (!isEqual(systemMessages, server.system_messages)) - changes.system_messages = systemMessages; + changes.system_messages = systemMessages ?? undefined; client.servers.edit(server._id, changes); setChanged(false); diff --git a/src/pages/settings/server/Roles.tsx b/src/pages/settings/server/Roles.tsx index f765e82986c0efcc4fb5fbcaf202ea21d69fd7b9..12142e1b3492e7953d70a457711dc48a769bc08f 100644 --- a/src/pages/settings/server/Roles.tsx +++ b/src/pages/settings/server/Roles.tsx @@ -1,5 +1,6 @@ import { Plus } from "@styled-icons/boxicons-regular"; import isEqual from "lodash.isequal"; +import { observer } from "mobx-react-lite"; import { Servers } from "revolt.js/dist/api/objects"; import { ChannelPermission, @@ -10,6 +11,8 @@ import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; import { useContext, useEffect, useState } from "preact/hooks"; +import { Server } from "../../../mobx"; + import { useIntermediate } from "../../../context/intermediate/Intermediate"; import { AppContext } from "../../../context/revoltjs/RevoltClient"; @@ -24,13 +27,13 @@ import Tip from "../../../components/ui/Tip"; import ButtonItem from "../../../components/navigation/items/ButtonItem"; interface Props { - server: Servers.Server; + server: Server; } const I32ToU32 = (arr: number[]) => arr.map((x) => x >>> 0); // ! FIXME: bad code :) -export function Roles({ server }: Props) { +export const Roles = observer(({ server }: Props) => { const [role, setRole] = useState("default"); const { openScreen } = useIntermediate(); const client = useContext(AppContext); @@ -227,4 +230,4 @@ export function Roles({ server }: Props) { </div> </div> ); -} +});