'use client' // apps/admin/src/components/role-change-dialog.tsx // role 변경 확인 다이얼로그 — super_admin 전용 import { useState } from 'react' import { Dialog, DialogTitle, DialogContent, DialogActions, TextField, Button, FormControl, InputLabel, Select, MenuItem, } from '@mui/material' import { PhosphorText } from '@d3ro/ui/components/ds' import { d3roPalette, d3roFontMono } from '@d3ro/ui/theme' import { callAdminApi } from '@/lib/admin-api' type Role = 'user' | 'manager' | 'admin' | 'super_admin' interface RoleChangeDialogProps { open: boolean userId: string userName: string | null currentRole: Role /** 현재 로그인한 admin의 role */ callerRole?: Role onClose: () => void onSuccess: () => void } export function RoleChangeDialog({ open, userId, userName, currentRole, callerRole = 'admin', onClose, onSuccess, }: RoleChangeDialogProps): React.ReactElement { const [newRole, setNewRole] = useState(currentRole) const [memo, setMemo] = useState('') const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const handleConfirm = async (): Promise => { if (!memo.trim() || newRole === currentRole) return setLoading(true) setError(null) try { await callAdminApi('admin-users', { method: 'PATCH', body: JSON.stringify({ userId, newRole, memo: memo.trim() }), }) setMemo('') onSuccess() } catch (err) { setError(err instanceof Error ? err.message : 'Failed to change role') } finally { setLoading(false) } } return ( CHANGE USER ROLE {userName ?? userId.substring(0, 8)} : {currentRole} New Role setMemo(e.target.value)} sx={{ '& .MuiInputBase-root': { fontFamily: d3roFontMono, fontSize: 13, color: d3roPalette.text.primary, bgcolor: d3roPalette.bg.inset, }, }} /> {error && ( {error} )} ) }