diff --git a/compass/app/admin/page.tsx b/compass/app/admin/page.tsx index abe2a8c..4d4781d 100644 --- a/compass/app/admin/page.tsx +++ b/compass/app/admin/page.tsx @@ -10,6 +10,7 @@ import { useEffect, useState } from "react"; export default function Page() { const [users, setUsers] = useState([]); + const [uuid, setUuid] = useState(""); useEffect(() => { async function getUser() { @@ -22,8 +23,10 @@ export default function Page() { return; } + setUuid(data.user.id); + const userListData = await fetch( - `${process.env.NEXT_PUBLIC_HOST}/api/user/all?uuid=${data.user.id}` + `/api/user/all?uuid=${data.user.id}` ); const users: User[] = await userListData.json(); @@ -38,7 +41,8 @@ export default function Page() {
{/* icon + title */} }> - + {/* TODO: REPLACE UUID WITH HTTP BEARER TOKEN */} +
); diff --git a/compass/app/api/user/all/route.ts b/compass/app/api/user/all/route.ts index 5f7259a..0f072eb 100644 --- a/compass/app/api/user/all/route.ts +++ b/compass/app/api/user/all/route.ts @@ -9,7 +9,7 @@ export async function GET(request: Request) { const { searchParams } = new URL(request.url); const uuid = searchParams.get("uuid"); - const data = await fetch(`${apiEndpoint}?user_id=${uuid}`); + const data = await fetch(`${apiEndpoint}?uuid=${uuid}`); const userData: User[] = await data.json(); // TODO: Remove make every user visible diff --git a/compass/app/api/user/create/route.ts b/compass/app/api/user/create/route.ts new file mode 100644 index 0000000..8aa152c --- /dev/null +++ b/compass/app/api/user/create/route.ts @@ -0,0 +1,41 @@ +import { NextResponse } from "next/server"; +import User from "@/utils/models/User"; + +export async function POST(request: Request) { + const apiEndpoint = `${process.env.NEXT_PUBLIC_API_HOST}/api/user/create`; + + try { + const userData = await request.json(); + userData.role = userData.role.toUpperCase(); + userData.program = userData.program.map((program: string) => + program.toUpperCase() + ); + + console.log("USER DATA", JSON.stringify(userData)); + + const { searchParams } = new URL(request.url); + const uuid = searchParams.get("uuid"); + + // Send the POST request to the backend + const response = await fetch(`${apiEndpoint}?uuid=${uuid}`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(userData), + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const createdUser: User = await response.json(); + return NextResponse.json(createdUser, { status: response.status }); + } catch (error) { + console.error("Error creating user:", error); + return NextResponse.json( + { error: "Failed to create user" }, + { status: 500 } + ); + } +} diff --git a/compass/components/Drawer/CreateDrawer.tsx b/compass/components/Drawer/CreateDrawer.tsx index d31173d..d8511b7 100644 --- a/compass/components/Drawer/CreateDrawer.tsx +++ b/compass/components/Drawer/CreateDrawer.tsx @@ -26,8 +26,6 @@ const CreateDrawer: FunctionComponent = ({ e: React.ChangeEvent ) => { const { name, value } = e.target; - console.log(newItemContent); - console.log(Object.keys(newItemContent).length); setNewItemContent((prev: any) => ({ ...prev, [name]: value, @@ -45,6 +43,7 @@ const CreateDrawer: FunctionComponent = ({ const handleCreate = () => { if (onCreate(newItemContent)) { + console.log("newItemContent", newItemContent); setNewItemContent({}); setIsOpen(false); } diff --git a/compass/components/Drawer/Drawer.tsx b/compass/components/Drawer/Drawer.tsx index 97d6c15..a572036 100644 --- a/compass/components/Drawer/Drawer.tsx +++ b/compass/components/Drawer/Drawer.tsx @@ -79,13 +79,14 @@ const Drawer: FunctionComponent = ({ return row; }); }); + + console.log("Send API request to update row content"); } setIsOpen(!isOpen); if (isFull) { setIsFull(!isFull); } - console.log("Send API request to update row content"); }; const toggleDrawerFullScreen = () => setIsFull(!isFull); diff --git a/compass/components/Table/Table.tsx b/compass/components/Table/Table.tsx index 9a9433b..2b208fc 100644 --- a/compass/components/Table/Table.tsx +++ b/compass/components/Table/Table.tsx @@ -27,6 +27,7 @@ type TableProps = { setData: Dispatch>; columns: ColumnDef[]; details: Details[]; + createEndpoint: string; }; /** Validates that all required fields in a new item have values */ @@ -76,9 +77,22 @@ export default function Table({ setData, columns, details, + createEndpoint, }: TableProps) { const columnHelper = createColumnHelper(); + const createRow = async (newItem: any) => { + const response = await fetch(createEndpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(newItem), + }); + + return response; + }; + // /** Sorting function based on visibility */ // const visibilitySort = (a: T, b: T) => // a.visible === b.visible ? 0 : a.visible ? -1 : 1; @@ -224,8 +238,16 @@ export default function Table({ return false; } - newItem.visible = true; - setData((prev) => [...prev, newItem]); + createRow(newItem).then((response) => { + if (response.ok) { + newItem.visible = true; + setData((prev) => [ + ...prev, + newItem, + ]); + } + }); + return true; }} /> diff --git a/compass/components/Table/UserTable.tsx b/compass/components/Table/UserTable.tsx index 58b018a..d4b1a38 100644 --- a/compass/components/Table/UserTable.tsx +++ b/compass/components/Table/UserTable.tsx @@ -19,6 +19,7 @@ import { Tag } from "../TagsInput/Tag"; type UserTableProps = { data: User[]; setData: Dispatch>; + uuid: string; }; /** @@ -26,7 +27,7 @@ type UserTableProps = { * @param props.data Stateful list of users to be displayed by the table * @param props.setData State setter for the list of users */ -export default function UserTable({ data, setData }: UserTableProps) { +export default function UserTable({ data, setData, uuid }: UserTableProps) { const columnHelper = createColumnHelper(); const [rolePresets, setRolePresets] = useState([ @@ -144,6 +145,7 @@ export default function UserTable({ data, setData }: UserTableProps) { setData={setData} columns={columns} details={userDetails} + createEndpoint={`/api/user/create?uuid=${uuid}`} /> ); }