Compare commits

..

2 Commits

Author SHA1 Message Date
970721b79e Major refactor, remove navs, add drawer menu 2025-03-31 20:09:32 -04:00
db917f82dc added menuvisible 2025-03-29 23:18:28 -04:00
7 changed files with 237 additions and 61 deletions

View File

@ -4,7 +4,8 @@ import { useTheme } from "react-native-paper";
import Profile from "@/components/Profile"; import Profile from "@/components/Profile";
import Status from "@/components/Status"; import Status from "@/components/Status";
import TopNav from "@/components/TopNav"; import TopNav from "@/components/TopNav";
import BottomNav from "@/components/BottomNav" import DrawerMenu from "@/components/DrawerMenu";
import Dialogs from "@/components/Dialogs";
import { useUser } from "@/context/UserContext"; import { useUser } from "@/context/UserContext";
import styles from "@/assets/styles"; import styles from "@/assets/styles";
import log from "@/util/log" import log from "@/util/log"
@ -15,6 +16,16 @@ const Index = () => {
const { const {
isProfileActive, isProfileActive,
setProfileActive, setProfileActive,
isMenuActive,
setMenuActive,
setAboutActive,
isAboutActive,
setPrivacyActive,
isPrivacyActive,
setBugActive,
isBugActive,
setLocationActive,
isLocationActive,
userId, userId,
userName, userName,
setUserName, setUserName,
@ -39,8 +50,27 @@ const Index = () => {
return ( return (
<View style={[styles.indexContainer, { backgroundColor: theme.colors.background }]}> <View style={[styles.indexContainer, { backgroundColor: theme.colors.background }]}>
<TopNav <DrawerMenu
isMenuActive={isMenuActive}
onClose={() => setMenuActive(false)}
toggleAbout={() => setAboutActive(!isAboutActive)}
togglePrivacy={() => setPrivacyActive(!isPrivacyActive)}
toggleBug={() => setBugActive(!isBugActive)}
toggleProfile={() => setProfileActive(true)} toggleProfile={() => setProfileActive(true)}
toggleLocation={() => setLocationActive(true)}
/>
<Dialogs
aboutVisible={isAboutActive}
privacyVisible={isPrivacyActive}
bugVisible={isBugActive}
locationVisible={isLocationActive}
toggleAbout={() => setAboutActive(!isAboutActive)}
togglePrivacy={() => setPrivacyActive(!isPrivacyActive)}
toggleBug={() => setBugActive(!isBugActive)}
toggleLocation={() => setLocationActive(!isLocationActive)}
/>
<TopNav
toggleMenu={() => setMenuActive(!isMenuActive)}
/> />
<Status <Status
id={userId} id={userId}
@ -63,9 +93,6 @@ const Index = () => {
setChanged={setUserDataChanged} setChanged={setUserDataChanged}
onClose={() => setProfileActive(false)} onClose={() => setProfileActive(false)}
/> />
<BottomNav
isProfileActive={isProfileActive}
/>
</View> </View>
); );
}; };

View File

@ -79,7 +79,13 @@ const styles = StyleSheet.create({
//Nav //Nav
logoContainer: { flex: 1, alignItems: "center" }, logoContainer: { flex: 1, alignItems: "center" },
logo: { width: 140, height: 70 }, logo: { width: 140, height: 70 },
topBar: { }, topBar: {
zIndex: 4,
flexDirection: "row",
justifyContent: "space-between",
width: "100%",
alignSelf: "stretch"
},
bottomBar: { height: 38 }, bottomBar: { height: 38 },
//index //index
indexImageBackground: { indexImageBackground: {
@ -90,6 +96,30 @@ const styles = StyleSheet.create({
opacity: 0.3, // Fades the image opacity: 0.3, // Fades the image
}, },
indexContainer: { flex: 1, alignItems: "stretch" }, indexContainer: { flex: 1, alignItems: "stretch" },
overlay: {
},
drawerContainer: {
...StyleSheet.absoluteFillObject,
marginTop: 70,
width: 200,
height: "auto",
//elevation: 4,
//backgroundColor: "rgba(0, 0, 0, 0.5)",
justifyContent: "flex-start",
alignItems: "flex-start",
zIndex: 2, // Ensures the drawer is above everything
elevation: 5, // Android shadow priority
borderRadius: 10,
},
footer: {
padding: 16,
alignItems: "center",
},
closeText: {
color: "#6200ee",
fontWeight: "bold",
},
}); });
export default styles; export default styles;

View File

@ -2,20 +2,19 @@ import {Appbar, Portal, Button, Dialog, Text, useTheme } from "react-native-pape
import { View } from "react-native"; import { View } from "react-native";
import styles from "@/assets/styles"; import styles from "@/assets/styles";
import React, {useState} from "react"; import React, {useState} from "react";
import Location from "@/components/Location";
import Broken from "@/components/Broken"; import Broken from "@/components/Broken";
interface BNProps { interface BNProps {
isProfileActive: boolean; isProfileActive: boolean;
isMenuActive: boolean;
} }
const BottomNav: React.FC<BNProps> = ({ isProfileActive }) => {
const BottomNav: React.FC<BNProps> = ({ isProfileActive, isMenuActive }) => {
const theme = useTheme(); const theme = useTheme();
const [menuVisible, setMenuVisible] = useState(false); const [menuVisible, setMenuVisible] = useState(false);
return ( return (
<View style={ isProfileActive && { display: 'none' }}> <View style={ (isProfileActive || isMenuActive )&& { display: 'none' }}>
<View style={{ backgroundColor: theme.colors.background }}> <View style={{ backgroundColor: theme.colors.background }}>
<Appbar.Header style={[styles.bottomBar, { backgroundColor: theme.colors.primaryContainer }]} > <Appbar.Header style={[styles.bottomBar, { backgroundColor: theme.colors.primaryContainer }]} >
<View style={{ alignItems: "center", flexDirection: "row", justifyContent: "space-between", padding: 10, flex: 1, paddingHorizontal: 15 }}> <View style={{ alignItems: "center", flexDirection: "row", justifyContent: "space-between", padding: 10, flex: 1, paddingHorizontal: 15 }}>

74
components/Dialogs.tsx Normal file
View File

@ -0,0 +1,74 @@
import React from "react";
import {Portal, Button, Dialog, useTheme} from "react-native-paper";
import About from "@/components/About";
import Privacy from "@/components/Privacy";
import Broken from "@/components/Broken";
interface DialogsProps {
aboutVisible: boolean;
privacyVisible: boolean;
bugVisible: boolean;
locationVisible: boolean;
toggleAbout: () => void;
togglePrivacy: () => void;
toggleBug: () => void;
toggleLocation: () => void;
}
const Dialogs: React.FC<DialogsProps> = ({ aboutVisible, privacyVisible, bugVisible, locationVisible, toggleAbout, togglePrivacy, toggleBug, toggleLocation }) => {
const theme = useTheme();
return (
<Portal>
<Dialog visible={aboutVisible} onDismiss={() => toggleAbout()}
style={{backgroundColor: theme.colors.primaryContainer}}>
<Dialog.Title style={{color: theme.colors.primary, textAlign: 'center'}}>About Us</Dialog.Title>
<About/>
<Dialog.Actions style={{justifyContent: "center"}}>
<Button onPress={() => toggleAbout()} mode="contained"
style={{backgroundColor: theme.colors.inversePrimary}}
labelStyle={{color: theme.colors.primary}}>
Close
</Button>
</Dialog.Actions>
</Dialog>
<Dialog visible={privacyVisible} onDismiss={() => togglePrivacy()}
style={{backgroundColor: theme.colors.primaryContainer}}>
<Dialog.Title style={{color: theme.colors.primary, textAlign: 'center'}}>Privacy Policy</Dialog.Title>
<Privacy/>
<Dialog.Actions style={{justifyContent: "center"}}>
<Button onPress={() => togglePrivacy()} mode="contained"
style={{backgroundColor: theme.colors.inversePrimary}}
labelStyle={{color: theme.colors.primary}}>
Close
</Button>
</Dialog.Actions>
</Dialog>
<Dialog visible={bugVisible} onDismiss={() => toggleBug()}
style={{backgroundColor: theme.colors.primaryContainer}}>
<Dialog.Title style={{color: theme.colors.primary, textAlign: 'center'}}>Report A Bug</Dialog.Title>
<Broken/>
<Dialog.Actions style={{justifyContent: "center"}}>
<Button onPress={() => toggleBug()} mode="contained"
style={{backgroundColor: theme.colors.inversePrimary}}
labelStyle={{color: theme.colors.primary}}>
Close
</Button>
</Dialog.Actions>
</Dialog>
<Dialog visible={locationVisible} onDismiss={() => toggleLocation()}
style={{backgroundColor: theme.colors.primaryContainer}}>
<Dialog.Title style={{color: theme.colors.primary, textAlign: 'center'}}>Location</Dialog.Title>
<Broken/>
<Dialog.Actions style={{justifyContent: "center"}}>
<Button onPress={() => toggleLocation()} mode="contained"
style={{backgroundColor: theme.colors.inversePrimary}}
labelStyle={{color: theme.colors.primary}}>
Close
</Button>
</Dialog.Actions>
</Dialog>
</Portal>
)
}
export default Dialogs;

66
components/DrawerMenu.tsx Normal file
View File

@ -0,0 +1,66 @@
import React from "react";
import { View } from "react-native";
import {Drawer, useTheme} from "react-native-paper";
import styles from "@/assets/styles";
interface DrawerMenuProps {
isMenuActive: boolean;
onClose: () => void;
toggleAbout: () => void;
togglePrivacy: () => void;
toggleBug: () => void;
toggleProfile: () => void;
toggleLocation: () => void;
}
const DrawerMenu: React.FC<DrawerMenuProps> = ({ isMenuActive, onClose, toggleAbout, togglePrivacy, toggleBug, toggleProfile, toggleLocation }) => {
const theme = useTheme();
if (!isMenuActive) {
return null;
}
return (
<View style={[styles.drawerContainer, { backgroundColor: theme.colors.background }]}>
<Drawer.Section>
<Drawer.Item
label="Profile"
onPress={() => {
toggleProfile();
onClose();
}}
/>
<Drawer.Item
label="Location"
onPress={() => {
toggleLocation();
onClose();
}}
/>
</Drawer.Section>
<Drawer.Section>
<Drawer.Item
label="About Us"
onPress={() => {
toggleAbout();
onClose();
}}
/>
<Drawer.Item
label="Privacy Policy"
onPress={() => {
togglePrivacy();
onClose();
}}
/>
<Drawer.Item
label="Report a Bug"
onPress={() => {
toggleBug();
onClose();
}}
/>
</Drawer.Section>
</View>
);
};
export default DrawerMenu;

View File

@ -1,34 +1,18 @@
import {Appbar, Portal, Button, Dialog, Menu, useTheme} from "react-native-paper"; import {Appbar, useTheme} from "react-native-paper";
import {Image, useColorScheme, View} from "react-native"; import {Image, useColorScheme, View} from "react-native";
import React, {useState} from "react"; import React from "react";
import styles from "@/assets/styles"; import styles from "@/assets/styles";
import About from "@/components/About";
import Privacy from "@/components/Privacy";
import Broken from "@/components/Broken";
const TopNav = ({ toggleProfile }: { toggleProfile: () => void; }) => { const TopNav = ({ toggleMenu }: { toggleMenu: () => void; }) => {
const theme = useTheme(); const theme = useTheme();
const colorScheme = useColorScheme(); const colorScheme = useColorScheme();
const [aboutVisible, setAboutVisible] = useState(false);
const [privacyVisible, setPrivacyVisible] = useState(false);
const [bugVisible, setBugVisible] = useState(false);
const [menuVisible, setMenuVisible] = useState(false);
const [menuAnchor, setMenuAnchor] = useState<{ x: number; y: number } | null>(null);
return ( return (
<View style={{ backgroundColor: theme.colors.background }}> <View style={{ backgroundColor: theme.colors.background }}>
<Appbar.Header style={[styles.topBar, { backgroundColor: theme.colors.primaryContainer }]}> <Appbar.Header style={[styles.topBar, { backgroundColor: theme.colors.primaryContainer }]}>
<View> <View>
<Menu visible={menuVisible} onDismiss={() => setMenuVisible(false)} anchor={menuAnchor} style={{ backgroundColor: theme.colors.primaryContainer }}>
<Menu.Item onPress={() => { setMenuVisible(false); setAboutVisible(true);}} title="About Us" style={{ backgroundColor: theme.colors.primaryContainer }}/>
<Menu.Item onPress={() => { setMenuVisible(false); setPrivacyVisible(true);}} title="Privacy Policy" style={{ backgroundColor: theme.colors.primaryContainer }}/>
<Menu.Item onPress={() => { setMenuVisible(false); setBugVisible(true);}} title="Report a Bug" style={{ backgroundColor: theme.colors.primaryContainer }}/>
</Menu>
<Appbar.Action icon="menu" <Appbar.Action icon="menu"
onPressIn={(event) => { onPress={toggleMenu}
setMenuAnchor({ x: event.nativeEvent.pageX, y: event.nativeEvent.pageY + 40 });
setMenuVisible(true);
}}
iconColor={theme.colors.primary} /> iconColor={theme.colors.primary} />
</View> </View>
<View style={styles.logoContainer} > <View style={styles.logoContainer} >
@ -37,37 +21,8 @@ const TopNav = ({ toggleProfile }: { toggleProfile: () => void; }) => {
require("../assets/images/pogdark_logo_inverse.png") : require("../assets/images/pogdark_logo.png") require("../assets/images/pogdark_logo_inverse.png") : require("../assets/images/pogdark_logo.png")
} style={styles.logo} resizeMode={"contain"} /> } style={styles.logo} resizeMode={"contain"} />
</View> </View>
<Appbar.Action icon="pencil" onPress={toggleProfile} iconColor={ theme.colors.primary } /> <Appbar.Action icon="pencil" color={ theme.colors.primaryContainer } />
</Appbar.Header> </Appbar.Header>
<Portal>
<Dialog visible={aboutVisible} onDismiss={() => setAboutVisible(false)} style={{ backgroundColor: theme.colors.primaryContainer }}>
<Dialog.Title style={{ color: theme.colors.primary, textAlign: 'center' }}>About Us</Dialog.Title>
<About />
<Dialog.Actions style={{ justifyContent: "center" }}>
<Button onPress={() => setAboutVisible(false)} mode="contained" style={{ backgroundColor: theme.colors.inversePrimary }} labelStyle={{ color: theme.colors.primary }}>
Close
</Button>
</Dialog.Actions>
</Dialog>
<Dialog visible={privacyVisible} onDismiss={() => setPrivacyVisible(false)} style={{ backgroundColor: theme.colors.primaryContainer }}>
<Dialog.Title style={{ color: theme.colors.primary, textAlign: 'center' }}>Privacy Policy</Dialog.Title>
<Privacy />
<Dialog.Actions style={{ justifyContent: "center" }}>
<Button onPress={() => setPrivacyVisible(false)} mode="contained" style={{ backgroundColor: theme.colors.inversePrimary }} labelStyle={{ color: theme.colors.primary }}>
Close
</Button>
</Dialog.Actions>
</Dialog>
<Dialog visible={bugVisible} onDismiss={() => setBugVisible(false)} style={{ backgroundColor: theme.colors.primaryContainer }}>
<Dialog.Title style={{ color: theme.colors.primary, textAlign: 'center' }}>Report A Bug</Dialog.Title>
<Broken />
<Dialog.Actions style={{ justifyContent: "center" }}>
<Button onPress={() => setBugVisible(false)} mode="contained" style={{ backgroundColor: theme.colors.inversePrimary }} labelStyle={{ color: theme.colors.primary }}>
Close
</Button>
</Dialog.Actions>
</Dialog>
</Portal>
</View> </View>
); );
}; };

View File

@ -11,6 +11,16 @@ export const API_URL = process.env.EXPO_PUBLIC_API_URL;
interface UserContextType { interface UserContextType {
isProfileActive: boolean; isProfileActive: boolean;
setProfileActive: (active: boolean) => void; setProfileActive: (active: boolean) => void;
isMenuActive: boolean;
setMenuActive: (active: boolean) => void;
isAboutActive: boolean;
setAboutActive: (active: boolean) => void;
isPrivacyActive: boolean;
setPrivacyActive: (active: boolean) => void;
isBugActive: boolean;
setBugActive: (active: boolean) => void;
isLocationActive: boolean;
setLocationActive: (active: boolean) => void;
userId: string; userId: string;
userName: string; userName: string;
setUserName: (name: string) => void; setUserName: (name: string) => void;
@ -34,6 +44,11 @@ interface UserProviderProps {
export const UserProvider: React.FC<UserProviderProps> = ({ children }) => { export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
const [isProfileActive, setProfileActive] = useState(false); const [isProfileActive, setProfileActive] = useState(false);
const [isMenuActive, setMenuActive] = useState(false);
const [isAboutActive, setAboutActive] = useState(false);
const [isPrivacyActive, setPrivacyActive] = useState(false);
const [isBugActive, setBugActive] = useState(false);
const [isLocationActive, setLocationActive] = useState(false);
const [userId, setUserId] = useState(""); const [userId, setUserId] = useState("");
const [userName, setUserName] = useState(""); const [userName, setUserName] = useState("");
const [userImage, setUserImage] = useState(""); const [userImage, setUserImage] = useState("");
@ -130,6 +145,16 @@ export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
value={{ value={{
isProfileActive, isProfileActive,
setProfileActive, setProfileActive,
isMenuActive,
setMenuActive,
isAboutActive,
setAboutActive,
isPrivacyActive,
setPrivacyActive,
isBugActive,
setBugActive,
isLocationActive,
setLocationActive,
userId, userId,
userName, userName,
setUserName, setUserName,