sukjenogi-frontend/src/pages/CharacterEditPage.tsx

120 lines
4.1 KiB
TypeScript

import {
Box,
Button,
Container,
TextField,
Typography,
Paper,
Dialog,
DialogActions,
DialogContent,
DialogContentText,
DialogTitle,
FormControlLabel,
Checkbox
} from '@mui/material'
import { useEffect, useState } from 'react'
import { useNavigate, useParams } from 'react-router-dom'
import api from '../lib/api'
export default function CharacterEditPage() {
const { id } = useParams()
const navigate = useNavigate()
const [name, setName] = useState('')
const [server, setServer] = useState('')
const [combatPower, setCombatPower] = useState('')
const [isPublic, setIsPublic] = useState(false)
const [error, setError] = useState('')
const [openConfirm, setOpenConfirm] = useState(false)
useEffect(() => {
api.get(`/characters/${id}`)
.then(res => {
setName(res.data.name)
setServer(res.data.server || '')
setCombatPower(String(res.data.combat_power || ''))
setIsPublic(Boolean(res.data.is_public))
})
.catch(() => setError('캐릭터 정보를 불러오는 데 실패했습니다.'))
}, [id])
const handleUpdate = async () => {
try {
await api.put(`/characters/${id}`, {
name,
server,
combat_power: Number(combatPower),
is_public: isPublic
})
navigate('/characters')
} catch {
setError('캐릭터 수정에 실패했습니다.')
}
}
const handleDelete = async () => {
try {
await api.delete(`/characters/${id}`)
navigate('/characters')
} catch {
setError('캐릭터 삭제에 실패했습니다.')
}
}
return (
<Container maxWidth="sm" sx={{ mt: 4 }}>
<Typography variant="h5" gutterBottom> </Typography>
<Paper sx={{ p: 3 }}>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
<TextField
label="캐릭터 이름"
value={name}
onChange={(e) => setName(e.target.value)}
fullWidth
/>
<TextField
label="서버"
value={server}
onChange={(e) => setServer(e.target.value)}
fullWidth
/>
<TextField
label="전투력"
value={combatPower}
onChange={(e) => setCombatPower(e.target.value)}
fullWidth
type="number"
/>
<FormControlLabel
control={<Checkbox checked={isPublic} onChange={e => setIsPublic(e.target.checked)} />}
label="친구에게 노출"
/>
{error && <Typography color="error">{error}</Typography>}
<Box display="flex" justifyContent="space-between" gap={2}>
<Button variant="contained" onClick={handleUpdate}></Button>
<Button variant="outlined" color="error" onClick={() => setOpenConfirm(true)}></Button>
</Box>
</Box>
</Paper>
<Dialog
open={openConfirm}
onClose={() => setOpenConfirm(false)}
>
<DialogTitle> </DialogTitle>
<DialogContent>
<DialogContentText> ?</DialogContentText>
</DialogContent>
<DialogActions>
<Button onClick={() => setOpenConfirm(false)}></Button>
<Button onClick={handleDelete} color="error"></Button>
</DialogActions>
</Dialog>
</Container>
)
}