Just U is left...
This commit is contained in:
parent
1de725a54f
commit
9534bab6ce
|
@ -9,6 +9,13 @@ export interface Props {
|
||||||
todos: Todo[]
|
todos: Todo[]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function promptDeleteUser(id: string, name: string) {
|
||||||
|
if (confirm(`Are you sure you want to delete ${name} (${id})?`)) {
|
||||||
|
await fetch(`/api/user?id=${id}`, { method: 'DELETE' })
|
||||||
|
location.reload()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function Admin({ users, todos }: Props) {
|
export function Admin({ users, todos }: Props) {
|
||||||
const addUserDialog = createRef<HTMLDialogElement>()
|
const addUserDialog = createRef<HTMLDialogElement>()
|
||||||
const usersById: Record<string, User> = {}
|
const usersById: Record<string, User> = {}
|
||||||
|
@ -35,6 +42,7 @@ export function Admin({ users, todos }: Props) {
|
||||||
action='/api/user'
|
action='/api/user'
|
||||||
method='post'
|
method='post'
|
||||||
encType='multipart/form-data'
|
encType='multipart/form-data'
|
||||||
|
onSubmit={() => console.log('Submitting...')}
|
||||||
>
|
>
|
||||||
<Label for='name'>
|
<Label for='name'>
|
||||||
Name
|
Name
|
||||||
|
@ -72,10 +80,11 @@ export function Admin({ users, todos }: Props) {
|
||||||
<th>Name</th>
|
<th>Name</th>
|
||||||
<th>Avatar</th>
|
<th>Avatar</th>
|
||||||
<th>Color</th>
|
<th>Color</th>
|
||||||
|
<th>Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{users.map(({ name, avatarUrl, color }) => (
|
{users.map(({ id, name, avatarUrl, color }) => (
|
||||||
<tr>
|
<tr>
|
||||||
<td>{name}</td>
|
<td>{name}</td>
|
||||||
<td>
|
<td>
|
||||||
|
@ -86,6 +95,28 @@ export function Admin({ users, todos }: Props) {
|
||||||
<td style={`color: #${color}`}>
|
<td style={`color: #${color}`}>
|
||||||
#{color}
|
#{color}
|
||||||
</td>
|
</td>
|
||||||
|
<td>
|
||||||
|
<Button
|
||||||
|
title='Delete'
|
||||||
|
className='py-2'
|
||||||
|
onClick={() => promptDeleteUser(id, name)}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns='http://www.w3.org/2000/svg'
|
||||||
|
fill='none'
|
||||||
|
viewBox='0 0 24 24'
|
||||||
|
stroke-width='1.5'
|
||||||
|
stroke='currentColor'
|
||||||
|
class='w-6 h-6'
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap='round'
|
||||||
|
stroke-linejoin='round'
|
||||||
|
d='m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0'
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</Button>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
|
@ -53,7 +53,13 @@ export const handler: Handlers<User | null> = {
|
||||||
},
|
},
|
||||||
async DELETE(req, _ctx) {
|
async DELETE(req, _ctx) {
|
||||||
// TODO: form or query params or json
|
// TODO: form or query params or json
|
||||||
const userData = UserModel.pick({ id: true }).parse(await req.json())
|
let data
|
||||||
|
if (req.headers.get('content-type')?.includes('json')) {
|
||||||
|
data = await req.json()
|
||||||
|
} else {
|
||||||
|
data = { id: new URL(req.url).searchParams.get('id') }
|
||||||
|
}
|
||||||
|
const userData = UserModel.pick({ id: true }).parse(data)
|
||||||
const result = await db.users.delete({ where: userData })
|
const result = await db.users.delete({ where: userData })
|
||||||
return new Response(JSON.stringify(result))
|
return new Response(JSON.stringify(result))
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue