feat(web): меню модерации участника в списке сервера

Банить и исключать нужно того, кто прямо сейчас в сервере, а не только
разбирать готовый список банов (AGENT.md 7.17).

- `MemberModerationMenu`: тайм-аут (1/10/60/1440 минут и снятие), бан с причиной
  и исключение; пункты скрыты без прав KICK_MEMBERS/BAN_MEMBERS/TIMEOUT_MEMBERS,
  себя модерировать нельзя;
- после действия обновляются списки участников и банов (без F5);
- тесты: бан с причиной, тайм-аут, исключение и скрытие меню без прав.
This commit is contained in:
2026-09-20 23:04:35 +03:00
parent dff4a25332
commit f1a195ec9d
6 changed files with 296 additions and 3 deletions
@@ -158,6 +158,13 @@ function GuildSettingsBody({ guilds }: { guilds: { id: string }[] }) {
currentUser.data?.is_instance_admin === true,
);
// Исключение и тайм-аут: владелец, ADMINISTRATOR, право или админ инстанса.
const canModerateMembers = (permission: string): boolean =>
currentUser.data?.is_instance_admin === true ||
guild.owner_id === currentUser.data?.id ||
guild.my_permissions.includes('ADMINISTRATOR') ||
guild.my_permissions.includes(permission);
// «Баны» и журнал аудита (AGENT.md 7.17, 7.18).
const canBan = canBanMembers(
guild.my_permissions,
@@ -184,10 +191,15 @@ function GuildSettingsBody({ guilds }: { guilds: { id: string }[] }) {
<>
<GuildGeneralSection key={guild.id} guild={guild} canEdit={canManage} />
<GuildMembersSection
guildId={guild.id}
members={members.data}
isPending={members.isPending}
error={members.error}
onRetry={() => void members.refetch()}
canKick={canModerateMembers('KICK_MEMBERS')}
canBan={canBan}
canTimeout={canModerateMembers('TIMEOUT_MEMBERS')}
currentUserId={currentUser.data?.id}
/>
<GuildRolesSection key={`${guild.id}-roles`} guildId={guild.id} />
{canManageEmojiSet ? (