import React, { useState } from 'react'; import { Modal } from '../ui/Modal'; import { useUIStore } from '../../stores/uiStore'; import { useServerStore } from '../../stores/serverStore'; import { useAuthStore } from '../../stores/authStore'; import { Avatar } from '../ui/Avatar'; import { api } from '../../api/client'; import { useNavigate } from 'react-router-dom'; import type { MemberRole } from '@opencord/shared'; export function ServerSettingsModal() { const activeModal = useUIStore((s) => s.activeModal); const closeModal = useUIStore((s) => s.closeModal); const currentServerId = useServerStore((s) => s.currentServerId); const servers = useServerStore((s) => s.servers); const members = useServerStore((s) => s.members); const updateServer = useServerStore((s) => s.updateServer); const deleteServer = useServerStore((s) => s.deleteServer); const loadServerDetail = useServerStore((s) => s.loadServerDetail); const currentUser = useAuthStore((s) => s.user); const navigate = useNavigate(); const [tab, setTab] = useState<'overview' | 'members'>('overview'); const [serverName, setServerName] = useState(''); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); const [confirmDelete, setConfirmDelete] = useState(false); const isOpen = activeModal === 'serverSettings'; const server = servers.find(s => s.id === currentServerId); const isOwnerUser = server?.ownerId === currentUser?.id; React.useEffect(() => { if (server) { setServerName(server.name); } }, [server]); if (!server || !currentServerId) return null; const handleSave = async () => { setError(''); setIsLoading(true); try { await updateServer(currentServerId, { name: serverName.trim() }); setIsLoading(false); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to update server'); setIsLoading(false); } }; const handleDelete = async () => { if (!confirmDelete) { setConfirmDelete(true); return; } try { await deleteServer(currentServerId); closeModal(); navigate('/channels/@me'); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to delete server'); } }; const handleRoleChange = async (userId: string, role: MemberRole) => { try { await api.servers.updateMember(currentServerId, userId, { role }); await loadServerDetail(currentServerId); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to update role'); } }; const handleKick = async (userId: string) => { try { await api.servers.removeMember(currentServerId, userId); await loadServerDetail(currentServerId); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to kick member'); } }; return (
{/* Tabs */}
{/* Content */}
{error && (
{error}
)} {tab === 'overview' && (
setServerName(e.target.value)} className="w-full px-3 py-2 bg-discord-bg-tertiary rounded text-discord-text-primary outline-none focus:ring-2 focus:ring-discord-blurple" disabled={!isOwnerUser} />
{isOwnerUser && ( <>

Danger Zone

)}
)} {tab === 'members' && (
{members.map((member) => { const displayName = member.user.displayName ?? member.user.username; return (
{displayName}
{member.role}
{isOwnerUser && member.userId !== currentUser?.id && (
)}
); })}
)}
); }