diff --git a/website/src/components/Dashboard/SideMenu.tsx b/website/src/components/Dashboard/SideMenu.tsx index 30a45777..499117a2 100644 --- a/website/src/components/Dashboard/SideMenu.tsx +++ b/website/src/components/Dashboard/SideMenu.tsx @@ -1,6 +1,6 @@ import { Box, Button, Link, Text, Tooltip, useColorMode } from "@chakra-ui/react"; import { useRouter } from "next/router"; -import { FiLayout, FiSun } from "react-icons/fi"; +import { FiLayout, FiSun, FiMessageSquare } from "react-icons/fi"; import { colors } from "styles/Theme/colors"; export function SideMenu() { @@ -13,6 +13,12 @@ export function SideMenu() { desc: "Dashboard Home", icon: FiLayout, }, + { + label: "Messages", + pathname: "/messages", + desc: "Messages Dashboard", + icon: FiMessageSquare, + }, // { // label: "Leaderboard", // pathname: "#", diff --git a/website/src/components/Layout.tsx b/website/src/components/Layout.tsx index 3564d765..bf662113 100644 --- a/website/src/components/Layout.tsx +++ b/website/src/components/Layout.tsx @@ -25,4 +25,11 @@ export const getTransparentHeaderLayout = (page: React.ReactElement) => ( ); +export const getDashboardLayout = (page: React.ReactElement) => ( +
+
+ {page} +
+); + export const noLayout = (page: React.ReactElement) => page; diff --git a/website/src/components/Messages/MessageTable.tsx b/website/src/components/Messages/MessageTable.tsx new file mode 100644 index 00000000..65f6efb1 --- /dev/null +++ b/website/src/components/Messages/MessageTable.tsx @@ -0,0 +1,12 @@ +import { Box, CircularProgress, Stack, StackDivider, useColorModeValue } from "@chakra-ui/react"; +import { MessageTableEntry } from "./MessageTableEntry"; + +export function MessageTable({ messages }) { + return ( + } spacing="4"> + {messages.map((item, idx) => ( + + ))} + + ); +} diff --git a/website/src/components/Messages/MessageTableEntry.tsx b/website/src/components/Messages/MessageTableEntry.tsx new file mode 100644 index 00000000..2bc17201 --- /dev/null +++ b/website/src/components/Messages/MessageTableEntry.tsx @@ -0,0 +1,24 @@ +import { Avatar, Box, HStack, LinkBox, useColorModeValue } from "@chakra-ui/react"; +import { boolean } from "boolean"; +import NextLink from "next/link"; +import { FlaggableElement } from "../FlaggableElement"; + +export function MessageTableEntry({ item, idx }) { + const bgColor = useColorModeValue(idx % 2 === 0 ? "bg-slate-800" : "bg-black", "bg-sky-900"); + + return ( + + + + + + {item.text} + + + + + ); +} diff --git a/website/src/pages/api/messages/index.tsx b/website/src/pages/api/messages/index.tsx new file mode 100644 index 00000000..3c8d1c17 --- /dev/null +++ b/website/src/pages/api/messages/index.tsx @@ -0,0 +1,24 @@ +import { getToken } from "next-auth/jwt"; + +const handler = async (req, res) => { + const token = await getToken({ req }); + + // Return nothing if the user isn't registered. + if (!token) { + res.status(401).end(); + return; + } + + const messagesRes = await fetch(`${process.env.FASTAPI_URL}/api/v1/messages`, { + method: "GET", + headers: { + "X-API-Key": process.env.FASTAPI_KEY, + }, + }); + const messages = await messagesRes.json(); + + // Send recieved messages to the client. + res.status(200).json(messages); +}; + +export default handler; diff --git a/website/src/pages/api/messages/user.tsx b/website/src/pages/api/messages/user.tsx new file mode 100644 index 00000000..e3d22f3c --- /dev/null +++ b/website/src/pages/api/messages/user.tsx @@ -0,0 +1,29 @@ +import { getToken } from "next-auth/jwt"; + +const handler = async (req, res) => { + const token = await getToken({ req }); + + // Return nothing if the user isn't registered. + if (!token) { + res.status(401).end(); + return; + } + + //TODO: add params if needed + const params = new URLSearchParams({ + username: token.sub, + }); + + const messagesRes = await fetch(`${process.env.FASTAPI_URL}/api/v1/messages?${params}`, { + method: "GET", + headers: { + "X-API-Key": process.env.FASTAPI_KEY, + }, + }); + const messages = await messagesRes.json(); + + // Send recieved messages to the client. + res.status(200).json(messages); +}; + +export default handler; diff --git a/website/src/pages/dashboard.tsx b/website/src/pages/dashboard.tsx index dfc5cb03..8b1f6861 100644 --- a/website/src/pages/dashboard.tsx +++ b/website/src/pages/dashboard.tsx @@ -1,6 +1,7 @@ import { Box, useColorMode } from "@chakra-ui/react"; import Head from "next/head"; -import { Header } from "src/components/Header"; + +import { getDashboardLayout } from "src/components/Layout"; import { LeaderboardTable, SideMenu, TaskOption } from "src/components/Dashboard"; import { colors } from "styles/Theme/colors"; @@ -27,11 +28,6 @@ const Dashboard = () => { ); }; -Dashboard.getLayout = (page) => ( -
-
- {page} -
-); +Dashboard.getLayout = (page) => getDashboardLayout(page); export default Dashboard; diff --git a/website/src/pages/messages/index.tsx b/website/src/pages/messages/index.tsx new file mode 100644 index 00000000..9ecdeb35 --- /dev/null +++ b/website/src/pages/messages/index.tsx @@ -0,0 +1,79 @@ +import { Box, CircularProgress, SimpleGrid, Text, useColorModeValue } from "@chakra-ui/react"; +import Head from "next/head"; +import { useState } from "react"; +import useSWRImmutable from "swr/immutable"; + +import fetcher from "src/lib/fetcher"; +import { SideMenu } from "src/components/Dashboard"; +import { MessageTable } from "src/components/Messages/MessageTable"; +import { getDashboardLayout } from "src/components/Layout"; +import { colors } from "styles/Theme/colors"; + +const MessagesDashboard = () => { + const bgColor = useColorModeValue(colors.light.bg, colors.dark.bg); + const boxBgColor = useColorModeValue("white", "gray.700"); + const boxAccentColor = useColorModeValue("gray.200", "gray.900"); + + const [messages, setMessages] = useState([]); + const [userMessages, setUserMessages] = useState([]); + + const { isLoading: isLoadingAll } = useSWRImmutable("/api/messages", fetcher, { + onSuccess: (data) => { + setMessages(data); + }, + }); + + const { isLoading: isLoadingUser } = useSWRImmutable(`/api/messages/user`, fetcher, { + onSuccess: (data) => { + setUserMessages(data); + }, + }); + + return ( + <> + + Messages - Open Assistant + + + + + + + + + + + Most recent messages + + {isLoadingAll ? : } + + + + Your most recent messages + + {isLoadingUser ? : } + + + + + + + + ); +}; + +MessagesDashboard.getLayout = (page) => getDashboardLayout(page); + +export default MessagesDashboard;