import { useState } from 'react'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router'; import { deleteGuild, guildQueryKey, leaveGuild } from '@/api/guilds'; import { instanceQueryKey } from '@/api/instance'; import { myGuildsQueryKey } from '@/api/users'; import { ErrorNotice } from '@/components/ui/ErrorNotice'; import { Modal } from '@/components/ui/Modal'; import { Button } from '@/components/ui/primitives'; import { useSessionStore } from '@/stores/session'; import { SettingsSection } from '@/pages/settings/SettingsSection'; interface GuildDangerSectionProps { guildId: string; guildName: string; /** Владелец не может покинуть сервер — только удалить его. */ isOwner: boolean; /** Администратор инстанса может удалить любой сервер. */ isInstanceAdmin: boolean; } type ConfirmAction = 'leave' | 'delete'; /** «Опасная зона»: выход с сервера и удаление сервера с подтверждением. */ export function GuildDangerSection({ guildId, guildName, isOwner, isInstanceAdmin, }: GuildDangerSectionProps) { const { t } = useTranslation(); const navigate = useNavigate(); const queryClient = useQueryClient(); const [confirm, setConfirm] = useState(null); // Последнее действие: пока окно закрывается, тексты не должны «прыгать». const [lastAction, setLastAction] = useState('leave'); const ask = (action: ConfirmAction): void => { setLastAction(action); setConfirm(action); }; /** После выхода/удаления возвращаемся в приложение и обновляем снапшот. */ const afterExit = (): void => { setConfirm(null); useSessionStore.getState().removeGuild(guildId); useSessionStore.getState().selectSettingsGuild(null); void queryClient.invalidateQueries({ queryKey: myGuildsQueryKey }); void queryClient.invalidateQueries({ queryKey: instanceQueryKey }); void queryClient.removeQueries({ queryKey: guildQueryKey(guildId) }); void navigate('/app', { replace: true }); }; const leave = useMutation({ mutationFn: () => leaveGuild(guildId), onSuccess: afterExit, }); const remove = useMutation({ mutationFn: () => deleteGuild(guildId), onSuccess: afterExit, }); const canDelete = isOwner || isInstanceAdmin; const pending = leave.isPending || remove.isPending; return (
{isOwner ? (

{t('settings.servers.danger.leaveOwnerHint')}

) : (

{t('settings.servers.danger.leaveHint')}

)} {canDelete ? (

{t('settings.servers.danger.deleteHint')}

) : null}
{leave.isError ? : null} {remove.isError ? : null} setConfirm(null)} footer={ <> } >

{t( lastAction === 'delete' ? 'settings.servers.danger.deleteConfirmBody' : 'settings.servers.danger.leaveConfirmBody', { name: guildName }, )}

); }