From 68ae0970f14c836463a4494cb84d6e11a92cf42f Mon Sep 17 00:00:00 2001 From: Alejandra <90076947+alejsdev@users.noreply.github.com> Date: Mon, 29 Jan 2024 16:40:11 -0500 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20Sidebar=20to=20new=20frontend?= =?UTF-8?q?=20(#587)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/new-frontend/src/components/Sidebar.tsx | 48 +++++++++++++++++++ .../src/components/SidebarItems.tsx | 37 ++++++++++++++ src/new-frontend/src/components/UserInfo.tsx | 40 ++++++++++++++++ src/new-frontend/src/pages/Layout.tsx | 14 ++++++ 4 files changed, 139 insertions(+) create mode 100644 src/new-frontend/src/components/Sidebar.tsx create mode 100644 src/new-frontend/src/components/SidebarItems.tsx create mode 100644 src/new-frontend/src/components/UserInfo.tsx create mode 100644 src/new-frontend/src/pages/Layout.tsx diff --git a/src/new-frontend/src/components/Sidebar.tsx b/src/new-frontend/src/components/Sidebar.tsx new file mode 100644 index 0000000..d2f2e83 --- /dev/null +++ b/src/new-frontend/src/components/Sidebar.tsx @@ -0,0 +1,48 @@ +import React from 'react'; + +import { Box, Drawer, DrawerBody, DrawerCloseButton, DrawerContent, DrawerOverlay, Flex, IconButton, Image, useDisclosure } from '@chakra-ui/react'; +import { FiMenu } from 'react-icons/fi'; + +import Logo from "../assets/images/fastapi-logo.png"; +import SidebarItems from './SidebarItems'; +import UserInfo from './UserInfo'; + + +const Sidebar: React.FC = () => { + const { isOpen, onOpen, onClose } = useDisclosure(); + + return ( + <> + {/* Mobile */} + } /> + + + + + + + + Logo + + + + + + + + + {/* Desktop */} + + + + Logo + + + + + + + ); +} + +export default Sidebar; diff --git a/src/new-frontend/src/components/SidebarItems.tsx b/src/new-frontend/src/components/SidebarItems.tsx new file mode 100644 index 0000000..8970410 --- /dev/null +++ b/src/new-frontend/src/components/SidebarItems.tsx @@ -0,0 +1,37 @@ +import React from 'react'; + +import { Flex, Icon, Text } from '@chakra-ui/react'; +import { FiBriefcase, FiHome, FiLogOut, FiUser, FiUsers } from 'react-icons/fi'; +import { Link } from 'react-router-dom'; + +const items = [ + { icon: FiHome, title: 'Dashboard', path: "/" }, + { icon: FiUser, title: 'Profile', path: "/profile" }, + { icon: FiBriefcase, title: 'Items', path: "/items" }, + { icon: FiUsers, title: 'Admin', path: "/admin" }, + { icon: FiLogOut, title: 'Log out' } +]; + +const SidebarItems: React.FC = () => { + const listItems = items.map((item) => ( + + + + + {item.title} + + + + )); + + return ( + <> + {listItems} + + ); +}; + +export default SidebarItems; diff --git a/src/new-frontend/src/components/UserInfo.tsx b/src/new-frontend/src/components/UserInfo.tsx new file mode 100644 index 0000000..3cf059b --- /dev/null +++ b/src/new-frontend/src/components/UserInfo.tsx @@ -0,0 +1,40 @@ +import React, { useEffect, useState } from 'react'; + +import { Avatar, Flex, Skeleton, Text } from '@chakra-ui/react'; +import { FaUserAstronaut } from 'react-icons/fa'; + +import { UserOut, UsersService } from '../client'; + +const UserInfo: React.FC = () => { + const [userData, setUserData] = useState(); + + useEffect(() => { + const fetchUserData = async () => { + try { + const userResponse = await UsersService.readUserMe(); + setUserData(userResponse); + } catch (error) { + // TODO: Handle error to give feedback to the user + console.error(error); + } + }; + fetchUserData(); + }, []); + + return ( + <> + {userData ? ( + + } size='sm' alignSelf="center" /> + {/* TODO: Conditional tooltip based on email length */} + {userData.email} + + ) : + + } + + ); + +} + +export default UserInfo; \ No newline at end of file diff --git a/src/new-frontend/src/pages/Layout.tsx b/src/new-frontend/src/pages/Layout.tsx new file mode 100644 index 0000000..80e78f1 --- /dev/null +++ b/src/new-frontend/src/pages/Layout.tsx @@ -0,0 +1,14 @@ +import Sidebar from '../components/Sidebar'; + +import { Flex } from '@chakra-ui/react'; + +const Layout = ({ children }: { children: React.ReactNode }) => { + return ( + + + {children} + + ); +}; + +export default Layout;