/** * 관리자 설정 — 사용자 CRUD · 역할별 메뉴 권한 */ import React, { useCallback, useEffect, useState } from 'react'; import { createAdminUser, deleteAdminUser, fetchRolePermissions, listAdminUsers, saveRolePermissions, updateAdminUser, type UserDto, } from '../utils/backendApi'; import { ALL_MENU_IDS, MENU_LABELS, ROLE_LABELS, type UserRole, } from '../utils/permissions'; const ROLES: UserRole[] = ['ADMIN', 'USER', 'GUEST']; const AdminSettingsPanel: React.FC = () => { const [users, setUsers] = useState([]); const [rolePerms, setRolePerms] = useState>>({}); const [permRole, setPermRole] = useState('USER'); const [loading, setLoading] = useState(true); const [msg, setMsg] = useState(null); const [err, setErr] = useState(null); const [formMode, setFormMode] = useState<'create' | 'edit' | null>(null); const [editId, setEditId] = useState(null); const [fUsername, setFUsername] = useState(''); const [fPassword, setFPassword] = useState(''); const [fDisplayName, setFDisplayName] = useState(''); const [fRole, setFRole] = useState('USER'); const [fEnabled, setFEnabled] = useState(true); const refresh = useCallback(async () => { setLoading(true); setErr(null); try { const [u, p] = await Promise.all([listAdminUsers(), fetchRolePermissions()]); setUsers(u); setRolePerms(p); } catch (e) { setErr(e instanceof Error ? e.message : '데이터 로드 실패'); } finally { setLoading(false); } }, []); useEffect(() => { void refresh(); }, [refresh]); const openCreate = () => { setFormMode('create'); setEditId(null); setFUsername(''); setFPassword(''); setFDisplayName(''); setFRole('USER'); setFEnabled(true); }; const openEdit = (u: UserDto) => { setFormMode('edit'); setEditId(u.id); setFUsername(u.username); setFPassword(''); setFDisplayName(u.displayName); setFRole((u.role as UserRole) || 'USER'); setFEnabled(u.enabled); }; const submitUser = async () => { setErr(null); setMsg(null); try { if (formMode === 'create') { await createAdminUser({ username: fUsername.trim(), password: fPassword, displayName: fDisplayName.trim() || fUsername.trim(), role: fRole, enabled: fEnabled, }); setMsg('사용자가 등록되었습니다.'); } else if (formMode === 'edit' && editId != null) { await updateAdminUser(editId, { displayName: fDisplayName.trim(), role: fRole, enabled: fEnabled, ...(fPassword ? { password: fPassword } : {}), }); setMsg('사용자 정보가 저장되었습니다.'); } setFormMode(null); await refresh(); } catch (e) { setErr(e instanceof Error ? e.message : '저장 실패'); } }; const removeUser = async (id: number) => { if (!window.confirm('이 사용자를 삭제하시겠습니까?')) return; setErr(null); try { await deleteAdminUser(id); setMsg('삭제되었습니다.'); await refresh(); } catch (e) { setErr(e instanceof Error ? e.message : '삭제 실패'); } }; const savePerms = async () => { const perms = rolePerms[permRole]; if (!perms) return; setErr(null); try { await saveRolePermissions(permRole, perms); setMsg(`${ROLE_LABELS[permRole]} 역할 권한이 저장되었습니다.`); await refresh(); } catch (e) { setErr(e instanceof Error ? e.message : '권한 저장 실패'); } }; const togglePerm = (menuId: string) => { setRolePerms(prev => ({ ...prev, [permRole]: { ...(prev[permRole] ?? {}), [menuId]: !(prev[permRole]?.[menuId]), }, })); }; if (loading && users.length === 0) { return

관리자 데이터 로딩 중…

; } return (
{msg &&

{msg}

} {err &&

{err}

}

사용자 관리

{users.map(u => ( ))}
아이디 표시명 역할 상태
{u.username} {u.displayName} {ROLE_LABELS[u.role as UserRole] ?? u.role} {u.enabled ? '활성' : '비활성'}
{formMode && (

{formMode === 'create' ? '사용자 등록' : '사용자 수정'}

{formMode === 'create' && ( )}
)}

역할별 메뉴 접근 권한

역할마다 상단 메뉴·설정 하위 메뉴·알림 접근을 제어합니다. 비로그인 사용자는 게스트(GUEST) 권한이 적용됩니다.

{ROLES.map(r => ( ))}
{ALL_MENU_IDS.map(menuId => ( ))}
); }; export default AdminSettingsPanel;