From 098a0f469d42d021cf0d6bacb0ba9fe9c8a07763 Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Thu, 4 Apr 2024 23:45:05 +0000 Subject: [PATCH] App Page Mobile Ready --- frontend-next/src/app/app/page.js | 39 +++++++++++++++---- frontend-next/src/components/app/datatypes.js | 26 +++++++++++++ frontend-next/src/components/app/header.js | 13 ++++++- .../components/app/profile/ProfilePanel.js | 2 +- .../src/components/app/sidebar/home.js | 11 +++--- 5 files changed, 75 insertions(+), 16 deletions(-) diff --git a/frontend-next/src/app/app/page.js b/frontend-next/src/app/app/page.js index b8a6c96..5c93a9e 100644 --- a/frontend-next/src/app/app/page.js +++ b/frontend-next/src/app/app/page.js @@ -4,6 +4,7 @@ import { useState, useEffect } from "react"; // Dependencies import { useGeolocated } from "react-geolocated"; +import Drawer from '@mui/material/Drawer'; // Firebase Imports import { auth, database } from "../../../firebase-config"; @@ -15,6 +16,8 @@ import { Header } from "../../components/app/header"; import { HomePage } from "../../components/app/page/home"; import { Sidebar } from "../../components/app/sidebar/home"; +import {useWindowSize} from "../../components/app/datatypes"; + /** * Contains most everything for the app homepage * @returns {Object} Home Page @@ -24,6 +27,17 @@ function Home() { const [user, setUser] = useState(null); // user data const [loadingLoc, setLoadingLoc] = useState(true); // location variable loading, true = loading, false = finished loading const [authUser] = useAuthState(auth) // auth user object (used to obtain other user object) + const [drawerOpen, setDrawerOpen] = useState(true); // drawer open state + + var windowSize = useWindowSize() + useEffect(() => { + if (windowSize.width < 767) { + setDrawerOpen(false) + console.log(windowSize, drawerOpen) + } else { + setDrawerOpen(true) + } + }, [windowSize]) // Authentication Verification / Redirection if Profile Data not Filled out useEffect(() => { @@ -55,15 +69,16 @@ function Home() { }, [coords]) return ( -
+
{user && ( -
+
{/* Left Side of Page */} -
+
{/* Header */}
{setDrawerOpen(!drawerOpen)}} /> {/* Main Page Section */}
@@ -76,11 +91,19 @@ function Home() {
{/* Sidebar (Right Side of Page) */} - + 767? "persistent": "temporary"} onClose={() => {setDrawerOpen(false)}} sx={{ + width: 400, + marginTop: 10, + flexShrink: 0, + '& .MuiDrawer-paper': { + width: 400, + borderLeft: 0, + }, + }}> +
+ +
+
)}
diff --git a/frontend-next/src/components/app/datatypes.js b/frontend-next/src/components/app/datatypes.js index 93f2afe..ecc875d 100644 --- a/frontend-next/src/components/app/datatypes.js +++ b/frontend-next/src/components/app/datatypes.js @@ -1,4 +1,5 @@ import Link from "next/link" +import { useEffect, useState } from "react"; // Colors for Messages const userColors = [ @@ -26,6 +27,31 @@ let dateOptions = { minute: "2-digit", }; +/** + * Grabs Window Size + * @returns {Object} - Window Size Object (width, height) + */ +export function useWindowSize() { + const [windowSize, setWindowSize] = useState({ + width: undefined, + height: undefined, + }); + + useEffect(() => { + function handleResize() { + setWindowSize({ + width: window.innerWidth, + height: window.innerHeight, + }); + } + window.addEventListener("resize", handleResize); + handleResize(); + return () => window.removeEventListener("resize", handleResize); + }, []); + return windowSize; +} + + /** * Generates Color based on string hash * @param {String} user_str - Username / String for hashing diff --git a/frontend-next/src/components/app/header.js b/frontend-next/src/components/app/header.js index e5005df..a50acf6 100644 --- a/frontend-next/src/components/app/header.js +++ b/frontend-next/src/components/app/header.js @@ -9,6 +9,9 @@ import { ref, set, remove } from "firebase/database"; import { NotificationPanel } from "./notifications/notifications"; import { ProfilePanel } from "./profile/ProfilePanel" +// Icons +import MenuIcon from '@mui/icons-material/Menu'; + /** * Closes Chat * @param {JSON} chatRoomObj - Chat Room Object @@ -69,7 +72,7 @@ function removeFromMyRooms(chatRoomObj, user) { * @prop {JSON} chatRoomObj - Chat Room Object * @prop {JSON} user - User Object */ -export function Header({mainTab,chatRoomObj,user,}) { +export function Header({mainTab,chatRoomObj,user,sidebarControl}) { if (mainTab == "chat") { var roomName = chatRoomObj.name + "-" + chatRoomObj.timestamp; @@ -128,6 +131,14 @@ export function Header({mainTab,chatRoomObj,user,}) { {/*Profile Dropdown */} + + {/* Sidebar Control (for small screens) */} +
{sidebarControl()}} + > + +
); diff --git a/frontend-next/src/components/app/profile/ProfilePanel.js b/frontend-next/src/components/app/profile/ProfilePanel.js index 4df9d11..2f787f3 100644 --- a/frontend-next/src/components/app/profile/ProfilePanel.js +++ b/frontend-next/src/components/app/profile/ProfilePanel.js @@ -23,7 +23,7 @@ export function ProfilePanel({user}) { return ( -
+
{user.firstName}
-
+
+
classNames( - 'w-[31%]', + 'w-[30%]', selected ? 'bg-cyan-500 text-white font-bold shadow hover:bg-white/[0.6] hover:text-black' : 'hover:bg-cyan-500/[0.6] hover:text-white hover:font-bold' )} defaultIndex={1}>Nearby classNames( - 'w-[31%]', + 'w-[30%]', selected ? 'bg-cyan-500 text-white font-bold shadow hover:bg-white/[0.6] hover:text-black' : 'hover:bg-cyan-500/[0.6] hover:text-white hover:font-bold' )}>My Rooms classNames( - 'w-[31%]', + 'w-[30%]', selected ? 'bg-cyan-500 text-white font-bold shadow hover:bg-white/[0.6] hover:text-black' : 'hover:bg-cyan-500/[0.6] hover:text-white hover:font-bold'