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;