Skip to content

Commit

Permalink
fix add / edit / remove user
Browse files Browse the repository at this point in the history
  • Loading branch information
Anchel123 committed Feb 4, 2025
1 parent cab9471 commit 34f246a
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 24 deletions.
1 change: 0 additions & 1 deletion app/api/user/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ export async function POST(req: NextRequest) {
return NextResponse.json({ message: `User ${username} already exists` }, { status: 409 })
}
} catch (err: unknown) {
console.error(err)
// Just a workaround for https://github.com/redis/node-redis/issues/2745
}

Expand Down
5 changes: 4 additions & 1 deletion app/settings/users/DeleteUser.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ import Button from "@/app/components/ui/Button";
import { securedFetch } from "@/lib/utils";
import { useToast } from "@/components/ui/use-toast";
import { useSession } from "next-auth/react";
import { Row } from "@/app/components/TableComponent";

interface DeleteUserProps {
users: User[]
setUsers: Dispatch<SetStateAction<User[]>>
setRows: Dispatch<SetStateAction<Row[]>>
}

export default function DeleteUser({ users, setUsers }: DeleteUserProps) {
export default function DeleteUser({ users, setUsers, setRows }: DeleteUserProps) {
const { data: session } = useSession()
const { toast } = useToast()

Expand All @@ -33,6 +35,7 @@ export default function DeleteUser({ users, setUsers }: DeleteUserProps) {
description: "User deleted successfully",
})
setUsers(prev => prev.filter(user => !users.find(u => user.username === u.username)))
setRows(prev => prev.filter(row => !users.find(u => row.cells[0].value === u.username)))
}
}

Expand Down
43 changes: 21 additions & 22 deletions app/settings/users/Users.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

"use client";

import React, { useCallback, useEffect, useState } from "react";
import React, { useEffect, useState } from "react";
import { CreateUser, User } from "@/app/api/user/model";
import { prepareArg, securedFetch } from "@/lib/utils";
import TableComponent, { Row } from "@/app/components/TableComponent";
Expand All @@ -25,25 +25,23 @@ export default function Users() {
const [rows, setRows] = useState<Row[]>([])
const { toast } = useToast()
const { data: session } = useSession()

const handleSetRole = useCallback(async (username: string, role: string, isUndo: boolean) => {
const oldRole = users.find(user => user.username === username)!.role

const handleSetRole = async (username: string, role: string, oldRole?: string) => {
const result = await securedFetch(`api/user/${prepareArg(username)}/?role=${role}`, {
method: 'PATCH'
}, session?.user?.role, toast)

if (result.ok) {
setUsers(users.map(user => user.username === username ? { ...user, role } : user))
setRows(rows.map(row => row.cells[0].value === username ? { ...row, cells: [{ ...row.cells[0], value: role }] } : row))
setUsers(prev => prev.map(user => user.username === username ? { ...user, role } : user))
setRows(prev => prev.map(row => row.cells[0].value === username ? { ...row, cells: [row.cells[0], { ...row.cells[1], value: role }] } : row))

toast({
title: "Success",
description: `${username} role updated successfully`,
action: isUndo ? <ToastAction altText="Undo" onClick={() => handleSetRole(username, oldRole, false)}>Undo</ToastAction> : undefined
action: oldRole ? <ToastAction altText="Undo" onClick={() => handleSetRole(username, oldRole)}>Undo</ToastAction> : undefined
})
}
}, [users, toast, rows])
}

useEffect(() => {
(async () => {
Expand All @@ -57,12 +55,12 @@ export default function Users() {
if (result.ok) {
const data = await result.json()
setUsers(data.result.map((user: User) => ({ ...user, selected: false })))
setRows(data.result.map((user: User) => ({
setRows(data.result.map(({ username, role }: User) => ({
cells: [{
value: user.username,
value: username,
}, {
value: user.role,
onChange: user.username === "default" ? undefined : (value: string) => handleSetRole(user.username, value, true),
value: role,
onChange: username === "default" ? undefined : (value: string) => handleSetRole(username, value, role),
type: "combobox"
}],
checked: false,
Expand All @@ -72,15 +70,6 @@ export default function Users() {
}, [toast])

const handleAddUser = async ({ username, password, role }: CreateUser) => {
if (!role) {
toast({
title: "Error",
description: "Select role is required",
variant: "destructive"
})
return
}

const response = await securedFetch('/api/user/', {
method: 'POST',
headers: {
Expand All @@ -95,6 +84,16 @@ export default function Users() {
description: "User added successfully",
})
setUsers(prev => [...prev, { username, role, selected: false }])
setRows(prev => [...prev, {
cells: [{
value: username,
}, {
value: role,
onChange: (value: string) => handleSetRole(username, value, role),
type: "combobox"
}],
checked: false,
}] as Row[])
}
}

Expand All @@ -108,7 +107,7 @@ export default function Users() {
>
<div className="flex flex-row-reverse gap-4">
<AddUser onAddUser={handleAddUser} />
<DeleteUser users={rows.filter(row => row.checked).map(row => users.find(user => user.username === row.cells[0].value)!)} setUsers={setUsers} />
<DeleteUser users={rows.filter(row => row.checked).map(row => users.find(user => user.username === row.cells[0].value)!)} setUsers={setUsers} setRows={setRows} />
</div>
</TableComponent>
</div >
Expand Down

0 comments on commit 34f246a

Please sign in to comment.