2021-07-24 18:46:33 +01:00
|
|
|
import { ChevronDown } from "@styled-icons/boxicons-regular";
|
|
|
|
import { isEqual } from "lodash";
|
2021-07-29 15:11:21 +01:00
|
|
|
import { observer } from "mobx-react-lite";
|
2021-07-30 20:24:53 +01:00
|
|
|
import { Member } from "revolt.js/dist/maps/Members";
|
|
|
|
import { Server } from "revolt.js/dist/maps/Servers";
|
|
|
|
import { User } from "revolt.js/dist/maps/Users";
|
2021-07-05 11:23:23 +01:00
|
|
|
|
|
|
|
import styles from "./Panes.module.scss";
|
2021-07-24 18:46:33 +01:00
|
|
|
import { Text } from "preact-i18n";
|
2021-07-05 11:23:23 +01:00
|
|
|
import { useEffect, useState } from "preact/hooks";
|
|
|
|
|
2021-07-29 15:11:21 +01:00
|
|
|
import { useClient } from "../../../context/revoltjs/RevoltClient";
|
2021-06-19 22:37:12 +01:00
|
|
|
|
2021-07-24 18:46:33 +01:00
|
|
|
import UserIcon from "../../../components/common/user/UserIcon";
|
|
|
|
import Button from "../../../components/ui/Button";
|
|
|
|
import Checkbox from "../../../components/ui/Checkbox";
|
|
|
|
import IconButton from "../../../components/ui/IconButton";
|
|
|
|
import Overline from "../../../components/ui/Overline";
|
|
|
|
|
2021-06-19 22:37:12 +01:00
|
|
|
interface Props {
|
2021-07-29 19:01:40 +01:00
|
|
|
server: Server;
|
2021-06-19 22:37:12 +01:00
|
|
|
}
|
|
|
|
|
2021-07-29 15:11:21 +01:00
|
|
|
export const Members = observer(({ server }: Props) => {
|
|
|
|
const [selected, setSelected] = useState<undefined | string>();
|
2021-07-30 20:24:53 +01:00
|
|
|
const [data, setData] = useState<
|
|
|
|
{ members: Member[]; users: User[] } | undefined
|
|
|
|
>(undefined);
|
2021-07-01 17:36:34 +01:00
|
|
|
|
2021-07-05 11:25:20 +01:00
|
|
|
useEffect(() => {
|
2021-07-30 20:24:53 +01:00
|
|
|
server.fetchMembers().then(setData);
|
2021-07-05 11:25:20 +01:00
|
|
|
}, []);
|
2021-06-19 22:37:12 +01:00
|
|
|
|
2021-07-24 18:46:33 +01:00
|
|
|
const [roles, setRoles] = useState<string[]>([]);
|
|
|
|
useEffect(() => {
|
|
|
|
if (selected) {
|
|
|
|
setRoles(
|
2021-07-30 20:24:53 +01:00
|
|
|
data!.members.find((x) => x._id.user === selected)?.roles ?? [],
|
2021-07-24 18:46:33 +01:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}, [selected]);
|
|
|
|
|
2021-07-05 11:25:20 +01:00
|
|
|
return (
|
2021-07-24 18:46:33 +01:00
|
|
|
<div className={styles.userList}>
|
2021-07-05 11:25:20 +01:00
|
|
|
<div className={styles.subtitle}>
|
2021-07-30 20:24:53 +01:00
|
|
|
{data?.members.length ?? 0} Members
|
2021-07-05 11:25:20 +01:00
|
|
|
</div>
|
2021-07-30 20:24:53 +01:00
|
|
|
{data &&
|
|
|
|
data.members.length > 0 &&
|
|
|
|
data.members
|
2021-07-31 12:09:18 +01:00
|
|
|
.map((member) => {
|
2021-07-24 18:46:33 +01:00
|
|
|
return {
|
2021-07-29 15:11:21 +01:00
|
|
|
member,
|
2021-07-31 12:09:18 +01:00
|
|
|
user: data.users.find(
|
|
|
|
(x) => x._id === member._id.user,
|
|
|
|
),
|
2021-07-24 18:46:33 +01:00
|
|
|
};
|
|
|
|
})
|
|
|
|
.map(({ member, user }) => (
|
|
|
|
<>
|
|
|
|
<div
|
|
|
|
key={member._id.user}
|
|
|
|
className={styles.member}
|
|
|
|
data-open={selected === member._id.user}
|
|
|
|
onClick={() =>
|
|
|
|
setSelected(
|
|
|
|
selected === member._id.user
|
|
|
|
? undefined
|
|
|
|
: member._id.user,
|
|
|
|
)
|
|
|
|
}>
|
|
|
|
<span>
|
|
|
|
<UserIcon target={user} size={24} />{" "}
|
|
|
|
{user?.username ?? (
|
|
|
|
<Text id="app.main.channel.unknown_user" />
|
|
|
|
)}
|
|
|
|
</span>
|
|
|
|
<IconButton className={styles.chevron}>
|
|
|
|
<ChevronDown size={24} />
|
|
|
|
</IconButton>
|
2021-07-05 11:25:20 +01:00
|
|
|
</div>
|
2021-07-24 18:46:33 +01:00
|
|
|
{selected === member._id.user && (
|
|
|
|
<div
|
|
|
|
key={"drop_" + member._id.user}
|
|
|
|
className={styles.memberView}>
|
|
|
|
<Overline type="subtle">Roles</Overline>
|
|
|
|
{Object.keys(server.roles ?? {}).map(
|
|
|
|
(key) => {
|
|
|
|
let role = server.roles![key];
|
|
|
|
return (
|
|
|
|
<Checkbox
|
|
|
|
checked={
|
|
|
|
roles.includes(key) ??
|
|
|
|
false
|
|
|
|
}
|
|
|
|
onChange={(v) => {
|
|
|
|
if (v) {
|
|
|
|
setRoles([
|
|
|
|
...roles,
|
|
|
|
key,
|
|
|
|
]);
|
|
|
|
} else {
|
|
|
|
setRoles(
|
|
|
|
roles.filter(
|
|
|
|
(x) =>
|
|
|
|
x !==
|
|
|
|
key,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}}>
|
|
|
|
<span
|
|
|
|
style={{
|
|
|
|
color: role.colour,
|
|
|
|
}}>
|
|
|
|
{role.name}
|
|
|
|
</span>
|
|
|
|
</Checkbox>
|
|
|
|
);
|
|
|
|
},
|
|
|
|
)}
|
|
|
|
<Button
|
|
|
|
compact
|
|
|
|
disabled={isEqual(
|
|
|
|
member.roles ?? [],
|
|
|
|
roles,
|
|
|
|
)}
|
2021-07-30 20:24:53 +01:00
|
|
|
onClick={() =>
|
|
|
|
member.edit({
|
|
|
|
roles,
|
|
|
|
})
|
|
|
|
}>
|
2021-07-24 18:46:33 +01:00
|
|
|
<Text id="app.special.modals.actions.save" />
|
|
|
|
</Button>
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</>
|
|
|
|
))}
|
2021-07-05 11:25:20 +01:00
|
|
|
</div>
|
|
|
|
);
|
2021-07-29 15:11:21 +01:00
|
|
|
});
|