revite/src/pages/settings/server/Invites.tsx

71 lines
3.1 KiB
TypeScript
Raw Normal View History

2021-06-19 22:37:12 +01:00
import styles from './Panes.module.scss';
2021-06-27 12:17:59 +02:00
import { XCircle } from "@styled-icons/boxicons-regular";
2021-06-19 22:37:12 +01:00
import { useEffect, useState } from "preact/hooks";
import Preloader from "../../../components/ui/Preloader";
import IconButton from "../../../components/ui/IconButton";
2021-06-20 20:30:42 +01:00
import UserIcon from "../../../components/common/user/UserIcon";
2021-06-19 22:37:12 +01:00
import { getChannelName } from "../../../context/revoltjs/util";
import { Invites as InvitesNS, Servers } from "revolt.js/dist/api/objects";
import { useChannels, useForceUpdate, useUsers } from "../../../context/revoltjs/hooks";
interface Props {
server: Servers.Server;
}
export function Invites({ server }: Props) {
const [invites, setInvites] = useState<InvitesNS.ServerInvite[] | undefined>(undefined);
const ctx = useForceUpdate();
const [deleting, setDelete] = useState<string[]>([]);
const users = useUsers(invites?.map(x => x.creator) ?? [], ctx);
const channels = useChannels(invites?.map(x => x.channel) ?? [], ctx);
useEffect(() => {
ctx.client.servers.fetchInvites(server._id)
.then(invites => setInvites(invites))
}, [ ]);
return (
<div className={styles.invites}>
2021-06-22 16:29:47 +01:00
{ typeof invites === 'undefined' && <Preloader type="ring" /> }
2021-06-19 22:37:12 +01:00
{
invites?.map(
invite => {
let creator = users.find(x => x?._id === invite.creator);
let channel = channels.find(x => x?._id === invite.channel);
return (
<div className={styles.invite}
data-deleting={deleting.indexOf(invite._id) > -1}>
<code>{ invite._id }</code>
<span>
<UserIcon target={creator} size={24} /> {creator?.username ?? 'unknown'}
</span>
2021-06-20 17:36:20 +01:00
<span>{ (channel && creator) ? getChannelName(ctx.client, channel, true) : '#unknown' }</span>
2021-06-19 22:37:12 +01:00
<IconButton
onClick={async () => {
setDelete([
...deleting,
invite._id
]);
await ctx.client.deleteInvite(invite._id);
setInvites(
invites?.filter(
x => x._id !== invite._id
)
);
}}
disabled={deleting.indexOf(invite._id) > -1}>
<XCircle size={24} />
</IconButton>
</div>
)
}
)
}
</div>
);
}