import { XCircle } from "@styled-icons/boxicons-regular"; import { observer } from "mobx-react-lite"; import { Virtuoso } from "react-virtuoso"; import { API } from "revolt.js"; import { Server } from "revolt.js"; import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; import { useEffect, useMemo, useState } from "preact/hooks"; import UserIcon from "../../../components/common/user/UserIcon"; import IconButton from "../../../components/ui/IconButton"; import Preloader from "../../../components/ui/Preloader"; import { InputBox } from "@revoltchat/ui"; interface InnerProps { ban: API.ServerBan; users: Record; server: Server; removeSelf: () => void; } const Inner = observer(({ ban, users, server, removeSelf }: InnerProps) => { const [deleting, setDelete] = useState(false); const user = users[ban._id.user]; return (
{" "} {user?.username}
{ban.reason ?? ( )}
{ setDelete(true); server.unbanUser(ban._id.user).then(removeSelf); }} disabled={deleting}>
); }); interface Props { server: Server; } export const Bans = observer(({ server }: Props) => { const [query, setQuery] = useState(""); const [result, setData] = useState< | { users: Record; bans: API.BanListResult["bans"]; } | undefined >(undefined); useEffect(() => { server .fetchBans() .then((data) => { const users: Record = {}; for (const user of data.users) { users[user._id] = user; } return { users, bans: data.bans, }; }) .then(setData); }, [server, setData]); const bans = useMemo(() => { if (!result) return; if (query) return result.bans.filter(({ _id }) => result.users[_id.user]?.username.includes(query), ); return result.bans; }, [query, result]); return (
setQuery(e.currentTarget.value)} palette="secondary" />
{typeof bans === "undefined" && } {bans && (
( { setData({ bans: result!.bans.filter( (y) => y._id.user !== bans[index]._id.user, ), users: result!.users, }); }} /> )} />
)}
); });