import { useEffect, useState } from 'react' import { Plus, Trash2, KeyRound, Power, ShieldCheck } from 'lucide-react' import { CMS_ROLES } from '../components/rbac' import { getUsers, createUser, updateUserRole, updateUserActive, resetPassword, deleteUser, } from '../api/client' interface User { id: number; username: string; displayName?: string; role: string; active: boolean; createdAt: string | null } function friendlyError(e: any): string { const msg: string = e?.response?.data?.message || '' if (e?.response?.status === 403) return '권한이 없습니다 (SuperAdmin 전용).' if (/409|exist|이미/i.test(msg)) return '이미 존재하는 사용자명입니다.' if (/last|마지막|423/i.test(msg)) return '마지막 SuperAdmin은 강등/삭제/비활성화할 수 없습니다.' if (/404|not found/i.test(msg)) return '대상 사용자를 찾을 수 없습니다.' return '요청을 처리하지 못했습니다. 잠시 후 다시 시도하세요.' } export default function UserManagement() { const [list, setList] = useState([]) const [form, setForm] = useState({ username: '', password: '', displayName: '', role: 'AUTHOR' }) const [show, setShow] = useState(false) const [err, setErr] = useState('') const load = () => getUsers().then(r => { setList(r.data?.data || []); setErr('') }).catch(e => setErr(friendlyError(e))) useEffect(() => { load() }, []) const wrap = async (fn: () => Promise) => { try { await fn(); setErr(''); await load() } catch (e) { setErr(friendlyError(e)) } } const create = async () => { if (!form.username || !form.password) { setErr('사용자명과 비밀번호를 입력하세요.'); return } await wrap(async () => { await createUser(form); setForm({ username: '', password: '', displayName: '', role: 'AUTHOR' }); setShow(false) }) } const changeRole = (u: User, role: string) => wrap(() => updateUserRole(u.id, role)) const toggleActive = (u: User) => wrap(() => updateUserActive(u.id, !u.active)) const doReset = (u: User) => { const pw = window.prompt(`'${u.username}' 의 새 비밀번호`); if (pw) wrap(() => resetPassword(u.id, pw)) } const remove = (u: User) => { if (window.confirm(`'${u.username}' 삭제?`)) wrap(() => deleteUser(u.id)) } return (

사용자 / 권한

{err &&
{err}
} {show && (
setForm({ ...form, username: e.target.value })} className="inp" /> setForm({ ...form, displayName: e.target.value })} className="inp" /> setForm({ ...form, password: e.target.value })} className="inp" />
)}
{list.map(u => ( ))} {list.length === 0 && }
ID사용자명표시 이름역할상태생성일작업
{u.id} {u.username} {u.displayName || '-'} {u.active ? '활성' : '비활성'} {u.createdAt ? new Date(u.createdAt).toLocaleString('ko-KR') : '-'}
사용자가 없습니다.
) }