import { useState } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Plus, Edit, Trash2, X } from 'lucide-react' import { getUsers, createUser, updateUser, deleteUser } from '../api/client' export default function UserList() { const qc = useQueryClient() const [modal, setModal] = useState(null) const { data: users = [], isLoading } = useQuery({ queryKey: ['users'], queryFn: () => getUsers(), }) const saveMut = useMutation({ mutationFn: (d: any) => d.id ? updateUser(d.id, d) : createUser(d), onSuccess: () => { qc.invalidateQueries({ queryKey: ['users'] }); setModal(null) }, }) const deleteMut = useMutation({ mutationFn: deleteUser, onSuccess: () => qc.invalidateQueries({ queryKey: ['users'] }), }) if (isLoading) return
로딩 중...
return (

사용자 관리

{['아이디','테넌트','역할','이메일','전화','상태','마지막 로그인','액션'].map(h => ( ))} {(users as any[]).map((u: any) => ( ))} {(users as any[]).length === 0 && ( )}
{h}
{u.username} {u.tenantCode || 'SUPER'} {u.role} {u.email || '-'} {u.phone || '-'} {u.active ? '활성' : '비활성'} {u.lastLoginAt ? new Date(u.lastLoginAt).toLocaleString('ko-KR') : '-'}
사용자가 없습니다
{modal && (

{modal.id ? '사용자 수정' : '사용자 추가'}

saveMut.mutate(d)} />
)}
) } function UserForm({ initial, onSave }: { initial: any; onSave: (d: any) => void }) { const isEdit = !!initial.id const [f, setF] = useState({ username: initial.username || '', role: initial.role || 'USER', tenantCode: initial.tenantCode || '', email: initial.email || '', phone: initial.phone || '', password: '', active: initial.active !== false, id: initial.id, }) const set = (k: string) => (e: React.ChangeEvent) => setF(p => ({ ...p, [k]: e.target.value })) const submit = (e: React.FormEvent) => { e.preventDefault() const payload: any = { username: f.username, role: f.role, tenantCode: f.tenantCode || null, email: f.email || null, phone: f.phone || null, active: f.active === true || (f as any).active === 'true', id: f.id, } // 신규 생성 시에만 비밀번호 포함(미입력 시 백엔드 기본값 사용) if (!isEdit && f.password) payload.password = f.password onSave(payload) } return (
{!isEdit && (
)}
{[ { label: '이메일', key: 'email', type: 'email' }, { label: '전화', key: 'phone' }, ].map(({ label, key, type }) => (
))}
) }