import { useCallback, useEffect, useState } from 'react'; import type { Role } from '../../types'; import { api } from '../../utils/api'; interface RoleForm { name: string; description: string; } export function RoleManagement() { const [roles, setRoles] = useState([]); const [loading, setLoading] = useState(true); const [modalOpen, setModalOpen] = useState(false); const [editingRole, setEditingRole] = useState(null); const [form, setForm] = useState({ name: '', description: '' }); const fetchRoles = useCallback(async () => { try { const data = await api.get('/admin/roles'); setRoles(data); } catch { // API 미연동 시 빈 배열 유지 } finally { setLoading(false); } }, []); useEffect(() => { fetchRoles(); }, [fetchRoles]); const openCreate = () => { setEditingRole(null); setForm({ name: '', description: '' }); setModalOpen(true); }; const openEdit = (role: Role) => { setEditingRole(role); setForm({ name: role.name, description: role.description }); setModalOpen(true); }; const handleSave = async () => { try { if (editingRole) { await api.put(`/admin/roles/${editingRole.id}`, form); } else { await api.post('/admin/roles', form); } setModalOpen(false); fetchRoles(); } catch { // 에러 처리 } }; const handleDelete = async (roleId: number) => { try { await api.delete(`/admin/roles/${roleId}`); fetchRoles(); } catch { // 에러 처리 } }; if (loading) { return (
); } return (

롤 관리

{roles.length === 0 ? (
등록된 롤이 없습니다.
) : ( roles.map((role) => (

{role.name}

{role.defaultGrant && ( 기본 )}

{role.description}

URL 패턴

{role.urlPatterns.length > 0 ? (
{role.urlPatterns.map((p) => ( {p} ))}
) : ( 없음 )}
)) )}
{/* 생성/편집 모달 */} {modalOpen && (

{editingRole ? '롤 편집' : '새 롤 생성'}

setForm({ ...form, name: e.target.value })} className="w-full px-3 py-2 border border-border-default rounded-lg text-sm bg-bg-primary text-text-primary focus:outline-none focus:ring-2 focus:ring-accent" placeholder="예: DEVELOPER" />