forked from fr/deguapp
		
	Added biome for formatting, code formatted
This commit is contained in:
		@@ -1,34 +1,30 @@
 | 
			
		||||
{
 | 
			
		||||
  "expo": {
 | 
			
		||||
    "name": "deguapp",
 | 
			
		||||
    "slug": "deguapp",
 | 
			
		||||
    "scheme": "deguapp",
 | 
			
		||||
    "version": "1.0.0",
 | 
			
		||||
    "orientation": "portrait",
 | 
			
		||||
    "icon": "./assets/icon.png",
 | 
			
		||||
    "userInterfaceStyle": "light",
 | 
			
		||||
    "splash": {
 | 
			
		||||
      "image": "./assets/splash.png",
 | 
			
		||||
      "resizeMode": "contain",
 | 
			
		||||
      "backgroundColor": "#ffffff"
 | 
			
		||||
    },
 | 
			
		||||
    "assetBundlePatterns": [
 | 
			
		||||
      "**/*"
 | 
			
		||||
    ],
 | 
			
		||||
    "ios": {
 | 
			
		||||
      "supportsTablet": true
 | 
			
		||||
    },
 | 
			
		||||
    "android": {
 | 
			
		||||
      "adaptiveIcon": {
 | 
			
		||||
        "foregroundImage": "./assets/adaptive-icon.png",
 | 
			
		||||
        "backgroundColor": "#ffffff"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "web": {
 | 
			
		||||
      "favicon": "./assets/favicon.png"
 | 
			
		||||
    },
 | 
			
		||||
    "plugins": [
 | 
			
		||||
      "expo-router"
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
	"expo": {
 | 
			
		||||
		"name": "deguapp",
 | 
			
		||||
		"slug": "deguapp",
 | 
			
		||||
		"scheme": "deguapp",
 | 
			
		||||
		"version": "1.0.0",
 | 
			
		||||
		"orientation": "portrait",
 | 
			
		||||
		"icon": "./assets/icon.png",
 | 
			
		||||
		"userInterfaceStyle": "light",
 | 
			
		||||
		"splash": {
 | 
			
		||||
			"image": "./assets/splash.png",
 | 
			
		||||
			"resizeMode": "contain",
 | 
			
		||||
			"backgroundColor": "#ffffff"
 | 
			
		||||
		},
 | 
			
		||||
		"assetBundlePatterns": ["**/*"],
 | 
			
		||||
		"ios": {
 | 
			
		||||
			"supportsTablet": true
 | 
			
		||||
		},
 | 
			
		||||
		"android": {
 | 
			
		||||
			"adaptiveIcon": {
 | 
			
		||||
				"foregroundImage": "./assets/adaptive-icon.png",
 | 
			
		||||
				"backgroundColor": "#ffffff"
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		"web": {
 | 
			
		||||
			"favicon": "./assets/favicon.png"
 | 
			
		||||
		},
 | 
			
		||||
		"plugins": ["expo-router"]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,19 +4,19 @@ import { useAuth } from "../context/AuthContext";
 | 
			
		||||
import { View, Text } from "react-native";
 | 
			
		||||
 | 
			
		||||
export default function AppLayout() {
 | 
			
		||||
  const { authState } = useAuth();
 | 
			
		||||
	const { authState } = useAuth();
 | 
			
		||||
 | 
			
		||||
  if (authState.authenticated === null) {
 | 
			
		||||
    // micro loading co neni skoro videt ale get the fuck out se uz neloguje
 | 
			
		||||
    return (
 | 
			
		||||
      <View>
 | 
			
		||||
        <Text>Loading...</Text>
 | 
			
		||||
      </View>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  if (!authState.authenticated) {
 | 
			
		||||
    console.log("get the fuck out");
 | 
			
		||||
    return <Redirect href="/login" />;
 | 
			
		||||
  }
 | 
			
		||||
  return <Stack />;
 | 
			
		||||
	if (authState.authenticated === null) {
 | 
			
		||||
		// micro loading co neni skoro videt ale get the fuck out se uz neloguje
 | 
			
		||||
		return (
 | 
			
		||||
			<View>
 | 
			
		||||
				<Text>Loading...</Text>
 | 
			
		||||
			</View>
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
	if (!authState.authenticated) {
 | 
			
		||||
		console.log("get the fuck out");
 | 
			
		||||
		return <Redirect href="/login" />;
 | 
			
		||||
	}
 | 
			
		||||
	return <Stack />;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,21 +3,21 @@ import { Text, View } from "react-native";
 | 
			
		||||
import { useAuth } from "../context/AuthContext";
 | 
			
		||||
 | 
			
		||||
export default function Index() {
 | 
			
		||||
  const { onLogout, authState } = useAuth();
 | 
			
		||||
	const { onLogout, authState } = useAuth();
 | 
			
		||||
 | 
			
		||||
  const user = authState.user;
 | 
			
		||||
	const user = authState.user;
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
 | 
			
		||||
      <Text>Welcome {user.username}</Text>
 | 
			
		||||
      <Text
 | 
			
		||||
        onPress={() => {
 | 
			
		||||
          // The `app/(app)/_layout.tsx` will redirect to the sign-in screen.
 | 
			
		||||
          onLogout();
 | 
			
		||||
        }}
 | 
			
		||||
      >
 | 
			
		||||
        Sign Out
 | 
			
		||||
      </Text>
 | 
			
		||||
    </View>
 | 
			
		||||
  );
 | 
			
		||||
	return (
 | 
			
		||||
		<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
 | 
			
		||||
			<Text>Welcome {user.username}</Text>
 | 
			
		||||
			<Text
 | 
			
		||||
				onPress={() => {
 | 
			
		||||
					// The `app/(app)/_layout.tsx` will redirect to the sign-in screen.
 | 
			
		||||
					onLogout();
 | 
			
		||||
				}}
 | 
			
		||||
			>
 | 
			
		||||
				Sign Out
 | 
			
		||||
			</Text>
 | 
			
		||||
		</View>
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,10 +3,10 @@ import { StatusBar } from "expo-status-bar";
 | 
			
		||||
import { AuthProvider } from "./context/AuthContext";
 | 
			
		||||
 | 
			
		||||
export default function Root() {
 | 
			
		||||
  return (
 | 
			
		||||
    <AuthProvider>
 | 
			
		||||
      <StatusBar style="light" />
 | 
			
		||||
      <Slot />
 | 
			
		||||
    </AuthProvider>
 | 
			
		||||
  );
 | 
			
		||||
	return (
 | 
			
		||||
		<AuthProvider>
 | 
			
		||||
			<StatusBar style="light" />
 | 
			
		||||
			<Slot />
 | 
			
		||||
		</AuthProvider>
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,134 +6,134 @@ export const API_URL = "http://10.69.1.137:6060/api/v1";
 | 
			
		||||
const AuthContext = createContext(null);
 | 
			
		||||
 | 
			
		||||
export function useAuth() {
 | 
			
		||||
  const authContext = useContext(AuthContext);
 | 
			
		||||
  if (authContext === undefined) {
 | 
			
		||||
    throw new Error("Context is outside of provider");
 | 
			
		||||
  }
 | 
			
		||||
  return authContext;
 | 
			
		||||
	const authContext = useContext(AuthContext);
 | 
			
		||||
	if (authContext === undefined) {
 | 
			
		||||
		throw new Error("Context is outside of provider");
 | 
			
		||||
	}
 | 
			
		||||
	return authContext;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function AuthProvider({ children }) {
 | 
			
		||||
  const [authState, setAuthState] = useState({
 | 
			
		||||
    token: null,
 | 
			
		||||
    authenticated: null,
 | 
			
		||||
  });
 | 
			
		||||
	const [authState, setAuthState] = useState({
 | 
			
		||||
		token: null,
 | 
			
		||||
		authenticated: null,
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    // tohle se zavola jen poprve pri startu appky
 | 
			
		||||
    async function loadToken() {
 | 
			
		||||
      const token = await storageUtil.getItem(TOKEN_KEY);
 | 
			
		||||
      console.log(`stored: ${token}`);
 | 
			
		||||
	useEffect(() => {
 | 
			
		||||
		// tohle se zavola jen poprve pri startu appky
 | 
			
		||||
		async function loadToken() {
 | 
			
		||||
			const token = await storageUtil.getItem(TOKEN_KEY);
 | 
			
		||||
			console.log(`stored: ${token}`);
 | 
			
		||||
 | 
			
		||||
      const resUser = await fetch(`${API_URL}/auth/status`, {
 | 
			
		||||
        credentials: "include",
 | 
			
		||||
      });
 | 
			
		||||
			const resUser = await fetch(`${API_URL}/auth/status`, {
 | 
			
		||||
				credentials: "include",
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
      const userData = await resUser.json();
 | 
			
		||||
			const userData = await resUser.json();
 | 
			
		||||
 | 
			
		||||
      if (token && resUser.status == 200) {
 | 
			
		||||
        setAuthState({
 | 
			
		||||
          token: token,
 | 
			
		||||
          authenticated: true,
 | 
			
		||||
          user: userData.data,
 | 
			
		||||
        });
 | 
			
		||||
			if (token && resUser.status == 200) {
 | 
			
		||||
				setAuthState({
 | 
			
		||||
					token: token,
 | 
			
		||||
					authenticated: true,
 | 
			
		||||
					user: userData.data,
 | 
			
		||||
				});
 | 
			
		||||
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      setAuthState({
 | 
			
		||||
        authenticated: false,
 | 
			
		||||
        token: null,
 | 
			
		||||
        user: null,
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
    loadToken();
 | 
			
		||||
  }, []);
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
			setAuthState({
 | 
			
		||||
				authenticated: false,
 | 
			
		||||
				token: null,
 | 
			
		||||
				user: null,
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
		loadToken();
 | 
			
		||||
	}, []);
 | 
			
		||||
 | 
			
		||||
  async function register(username, email, password) {
 | 
			
		||||
    try {
 | 
			
		||||
      const res = await fetch(`${API_URL}/auth/signup`, {
 | 
			
		||||
        method: 'POST',
 | 
			
		||||
        credentials: 'include',
 | 
			
		||||
        headers: {
 | 
			
		||||
          "Content-Type": "application/json"
 | 
			
		||||
        },
 | 
			
		||||
        body: JSON.stringify({
 | 
			
		||||
          username,
 | 
			
		||||
          email,
 | 
			
		||||
          password
 | 
			
		||||
        })
 | 
			
		||||
      })
 | 
			
		||||
      return res;
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
      return { error: true, msg: err.response.data };
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
	async function register(username, email, password) {
 | 
			
		||||
		try {
 | 
			
		||||
			const res = await fetch(`${API_URL}/auth/signup`, {
 | 
			
		||||
				method: "POST",
 | 
			
		||||
				credentials: "include",
 | 
			
		||||
				headers: {
 | 
			
		||||
					"Content-Type": "application/json",
 | 
			
		||||
				},
 | 
			
		||||
				body: JSON.stringify({
 | 
			
		||||
					username,
 | 
			
		||||
					email,
 | 
			
		||||
					password,
 | 
			
		||||
				}),
 | 
			
		||||
			});
 | 
			
		||||
			return res;
 | 
			
		||||
		} catch (err) {
 | 
			
		||||
			return { error: true, msg: err.response.data };
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
  async function login(email, password) {
 | 
			
		||||
    try {
 | 
			
		||||
      const resLogin = await fetch(`${API_URL}/auth/signin`, {
 | 
			
		||||
        method: "POST",
 | 
			
		||||
        credentials: "include",
 | 
			
		||||
        headers: {
 | 
			
		||||
          "Content-Type": "application/json",
 | 
			
		||||
        },
 | 
			
		||||
        body: JSON.stringify({
 | 
			
		||||
          email,
 | 
			
		||||
          password,
 | 
			
		||||
        }),
 | 
			
		||||
      });
 | 
			
		||||
	async function login(email, password) {
 | 
			
		||||
		try {
 | 
			
		||||
			const resLogin = await fetch(`${API_URL}/auth/signin`, {
 | 
			
		||||
				method: "POST",
 | 
			
		||||
				credentials: "include",
 | 
			
		||||
				headers: {
 | 
			
		||||
					"Content-Type": "application/json",
 | 
			
		||||
				},
 | 
			
		||||
				body: JSON.stringify({
 | 
			
		||||
					email,
 | 
			
		||||
					password,
 | 
			
		||||
				}),
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
      const loginData = await resLogin.json();
 | 
			
		||||
			const loginData = await resLogin.json();
 | 
			
		||||
 | 
			
		||||
      const resUser = await fetch(`${API_URL}/auth/status`, {
 | 
			
		||||
        credentials: "include",
 | 
			
		||||
      });
 | 
			
		||||
			const resUser = await fetch(`${API_URL}/auth/status`, {
 | 
			
		||||
				credentials: "include",
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
      if (resUser.status != 200) {
 | 
			
		||||
        throw Error("user does not have user data");
 | 
			
		||||
      }
 | 
			
		||||
			if (resUser.status != 200) {
 | 
			
		||||
				throw Error("user does not have user data");
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
      const userData = await resUser.json();
 | 
			
		||||
			const userData = await resUser.json();
 | 
			
		||||
 | 
			
		||||
      setAuthState({
 | 
			
		||||
        token: loginData.data.jwt,
 | 
			
		||||
        authenticated: true,
 | 
			
		||||
        user: userData.data,
 | 
			
		||||
      });
 | 
			
		||||
			setAuthState({
 | 
			
		||||
				token: loginData.data.jwt,
 | 
			
		||||
				authenticated: true,
 | 
			
		||||
				user: userData.data,
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
      await storageUtil.setItem(TOKEN_KEY, loginData.data.jwt);
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
      console.error("Failed to log in", err)
 | 
			
		||||
      return { error: true, msg: err.res };
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
			await storageUtil.setItem(TOKEN_KEY, loginData.data.jwt);
 | 
			
		||||
		} catch (err) {
 | 
			
		||||
			console.error("Failed to log in", err);
 | 
			
		||||
			return { error: true, msg: err.res };
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
  async function logout() {
 | 
			
		||||
    let res = await fetch(`${API_URL}/auth/logout`, {
 | 
			
		||||
      method: "POST",
 | 
			
		||||
      credentials: "include",
 | 
			
		||||
      headers: {
 | 
			
		||||
        "Content-Type": "application/json",
 | 
			
		||||
      },
 | 
			
		||||
      body: JSON.stringify({}),
 | 
			
		||||
    });
 | 
			
		||||
    res = await res.json();
 | 
			
		||||
	async function logout() {
 | 
			
		||||
		let res = await fetch(`${API_URL}/auth/logout`, {
 | 
			
		||||
			method: "POST",
 | 
			
		||||
			credentials: "include",
 | 
			
		||||
			headers: {
 | 
			
		||||
				"Content-Type": "application/json",
 | 
			
		||||
			},
 | 
			
		||||
			body: JSON.stringify({}),
 | 
			
		||||
		});
 | 
			
		||||
		res = await res.json();
 | 
			
		||||
 | 
			
		||||
    await storageUtil.delItem(TOKEN_KEY);
 | 
			
		||||
		await storageUtil.delItem(TOKEN_KEY);
 | 
			
		||||
 | 
			
		||||
    setAuthState({
 | 
			
		||||
      token: null,
 | 
			
		||||
      authenticated: false,
 | 
			
		||||
      user: null,
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
		setAuthState({
 | 
			
		||||
			token: null,
 | 
			
		||||
			authenticated: false,
 | 
			
		||||
			user: null,
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
  const value = {
 | 
			
		||||
    onSignin: register,
 | 
			
		||||
    onLogin: login,
 | 
			
		||||
    onLogout: logout,
 | 
			
		||||
    authState,
 | 
			
		||||
  };
 | 
			
		||||
	const value = {
 | 
			
		||||
		onSignin: register,
 | 
			
		||||
		onLogin: login,
 | 
			
		||||
		onLogout: logout,
 | 
			
		||||
		authState,
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
  return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
 | 
			
		||||
	return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,32 +3,32 @@ import { Platform } from "react-native";
 | 
			
		||||
import AsyncStorage from "@react-native-async-storage/async-storage";
 | 
			
		||||
 | 
			
		||||
const storageUtil = {
 | 
			
		||||
  setItem: async (k, v) => {
 | 
			
		||||
    if (Platform.OS === "web") {
 | 
			
		||||
      // web
 | 
			
		||||
      await AsyncStorage.setItem(k, v);
 | 
			
		||||
    } else {
 | 
			
		||||
      // mobile
 | 
			
		||||
      await SecureStore.setItemAsync(k, v.toString()); // v must be string,
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  getItem: async (k) => {
 | 
			
		||||
    if (Platform.OS === "web") {
 | 
			
		||||
      // web
 | 
			
		||||
      return await AsyncStorage.getItem(k);
 | 
			
		||||
    } else {
 | 
			
		||||
      // mobile
 | 
			
		||||
      return await SecureStore.getItemAsync(k);
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  delItem: async (k) => {
 | 
			
		||||
    if (Platform.OS === "web") {
 | 
			
		||||
      // web
 | 
			
		||||
      await AsyncStorage.removeItem(k);
 | 
			
		||||
    } else {
 | 
			
		||||
      // mobile
 | 
			
		||||
      await SecureStore.deleteItemAsync(k);
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
	setItem: async (k, v) => {
 | 
			
		||||
		if (Platform.OS === "web") {
 | 
			
		||||
			// web
 | 
			
		||||
			await AsyncStorage.setItem(k, v);
 | 
			
		||||
		} else {
 | 
			
		||||
			// mobile
 | 
			
		||||
			await SecureStore.setItemAsync(k, v.toString()); // v must be string,
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	getItem: async (k) => {
 | 
			
		||||
		if (Platform.OS === "web") {
 | 
			
		||||
			// web
 | 
			
		||||
			return await AsyncStorage.getItem(k);
 | 
			
		||||
		} else {
 | 
			
		||||
			// mobile
 | 
			
		||||
			return await SecureStore.getItemAsync(k);
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	delItem: async (k) => {
 | 
			
		||||
		if (Platform.OS === "web") {
 | 
			
		||||
			// web
 | 
			
		||||
			await AsyncStorage.removeItem(k);
 | 
			
		||||
		} else {
 | 
			
		||||
			// mobile
 | 
			
		||||
			await SecureStore.deleteItemAsync(k);
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
};
 | 
			
		||||
export default storageUtil;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
import { useAuth } from "../context/AuthContext";
 | 
			
		||||
 | 
			
		||||
export function useIsAutheticated() {
 | 
			
		||||
  const { authState } = useAuth();
 | 
			
		||||
  return authState.authenticated
 | 
			
		||||
	const { authState } = useAuth();
 | 
			
		||||
	return authState.authenticated;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,111 +7,111 @@ import { colors } from "../components/style";
 | 
			
		||||
import { useAuth } from "./context/AuthContext";
 | 
			
		||||
 | 
			
		||||
function LoginPage() {
 | 
			
		||||
  const [pass, setPass] = useState("");
 | 
			
		||||
  const [email, setEmail] = useState("");
 | 
			
		||||
  const { onLogin, authState } = useAuth();
 | 
			
		||||
	const [pass, setPass] = useState("");
 | 
			
		||||
	const [email, setEmail] = useState("");
 | 
			
		||||
	const { onLogin, authState } = useAuth();
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    if (authState.authenticated) {
 | 
			
		||||
      router.replace("/");
 | 
			
		||||
    }
 | 
			
		||||
  }, [authState.authenticated]);
 | 
			
		||||
	useEffect(() => {
 | 
			
		||||
		if (authState.authenticated) {
 | 
			
		||||
			router.replace("/");
 | 
			
		||||
		}
 | 
			
		||||
	}, [authState.authenticated]);
 | 
			
		||||
 | 
			
		||||
  function login() {
 | 
			
		||||
    onLogin(email, pass);
 | 
			
		||||
  }
 | 
			
		||||
	function login() {
 | 
			
		||||
		onLogin(email, pass);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <View style={styles.container}>
 | 
			
		||||
      <View style={styles.header}>
 | 
			
		||||
        <Image
 | 
			
		||||
          source={require("../assets/deguapp_logo.png")}
 | 
			
		||||
          style={styles.logo}
 | 
			
		||||
        />
 | 
			
		||||
        <Text style={styles.h1}>Please Log In</Text>
 | 
			
		||||
      </View>
 | 
			
		||||
      <View style={styles.form}>
 | 
			
		||||
        <TextInput
 | 
			
		||||
          style={styles.input}
 | 
			
		||||
          placeholder="Enter your email"
 | 
			
		||||
          autoCapitalize="none"
 | 
			
		||||
          autoCompleteType="email"
 | 
			
		||||
          textContentType="emailAddress"
 | 
			
		||||
          keyboardType="email-address"
 | 
			
		||||
          placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
          returnKeyType="next"
 | 
			
		||||
          value={email}
 | 
			
		||||
          onChangeText={(text) => setEmail(text)}
 | 
			
		||||
        />
 | 
			
		||||
        <TextInput
 | 
			
		||||
          style={styles.input}
 | 
			
		||||
          secureTextEntry={true}
 | 
			
		||||
          placeholder="Enter your password"
 | 
			
		||||
          placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
          returnKeyType="done"
 | 
			
		||||
          value={pass}
 | 
			
		||||
          onChangeText={(text) => setPass(text)}
 | 
			
		||||
        />
 | 
			
		||||
        <View style={styles.btnContainer}>
 | 
			
		||||
          <Button
 | 
			
		||||
            style={styles.button}
 | 
			
		||||
            title="Sign Up"
 | 
			
		||||
            color={colors.charcoal}
 | 
			
		||||
            onPress={() => router.replace("/signup")}
 | 
			
		||||
          />
 | 
			
		||||
          <Button
 | 
			
		||||
            style={styles.button}
 | 
			
		||||
            title="Log In"
 | 
			
		||||
            color={colors.gold}
 | 
			
		||||
            onPress={login}
 | 
			
		||||
          />
 | 
			
		||||
        </View>
 | 
			
		||||
      </View>
 | 
			
		||||
    </View>
 | 
			
		||||
  );
 | 
			
		||||
	return (
 | 
			
		||||
		<View style={styles.container}>
 | 
			
		||||
			<View style={styles.header}>
 | 
			
		||||
				<Image
 | 
			
		||||
					source={require("../assets/deguapp_logo.png")}
 | 
			
		||||
					style={styles.logo}
 | 
			
		||||
				/>
 | 
			
		||||
				<Text style={styles.h1}>Please Log In</Text>
 | 
			
		||||
			</View>
 | 
			
		||||
			<View style={styles.form}>
 | 
			
		||||
				<TextInput
 | 
			
		||||
					style={styles.input}
 | 
			
		||||
					placeholder="Enter your email"
 | 
			
		||||
					autoCapitalize="none"
 | 
			
		||||
					autoCompleteType="email"
 | 
			
		||||
					textContentType="emailAddress"
 | 
			
		||||
					keyboardType="email-address"
 | 
			
		||||
					placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
					returnKeyType="next"
 | 
			
		||||
					value={email}
 | 
			
		||||
					onChangeText={(text) => setEmail(text)}
 | 
			
		||||
				/>
 | 
			
		||||
				<TextInput
 | 
			
		||||
					style={styles.input}
 | 
			
		||||
					secureTextEntry={true}
 | 
			
		||||
					placeholder="Enter your password"
 | 
			
		||||
					placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
					returnKeyType="done"
 | 
			
		||||
					value={pass}
 | 
			
		||||
					onChangeText={(text) => setPass(text)}
 | 
			
		||||
				/>
 | 
			
		||||
				<View style={styles.btnContainer}>
 | 
			
		||||
					<Button
 | 
			
		||||
						style={styles.button}
 | 
			
		||||
						title="Sign Up"
 | 
			
		||||
						color={colors.charcoal}
 | 
			
		||||
						onPress={() => router.replace("/signup")}
 | 
			
		||||
					/>
 | 
			
		||||
					<Button
 | 
			
		||||
						style={styles.button}
 | 
			
		||||
						title="Log In"
 | 
			
		||||
						color={colors.gold}
 | 
			
		||||
						onPress={login}
 | 
			
		||||
					/>
 | 
			
		||||
				</View>
 | 
			
		||||
			</View>
 | 
			
		||||
		</View>
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const styles = StyleSheet.create({
 | 
			
		||||
  container: {
 | 
			
		||||
    width: "100%",
 | 
			
		||||
    height: "100%",
 | 
			
		||||
    backgroundColor: colors.dark,
 | 
			
		||||
  },
 | 
			
		||||
  form: {
 | 
			
		||||
    flex: 1,
 | 
			
		||||
    alignItems: "center",
 | 
			
		||||
    paddingTop: "10%",
 | 
			
		||||
    width: "100%",
 | 
			
		||||
    gap: 15,
 | 
			
		||||
  },
 | 
			
		||||
  h1: {
 | 
			
		||||
    color: "#FFF",
 | 
			
		||||
    fontSize: 30,
 | 
			
		||||
    textAlign: "center",
 | 
			
		||||
    paddingTop: "20%",
 | 
			
		||||
  },
 | 
			
		||||
  logo: {
 | 
			
		||||
    width: "80%",
 | 
			
		||||
    resizeMode: "contain",
 | 
			
		||||
  },
 | 
			
		||||
  header: {
 | 
			
		||||
    width: "100%",
 | 
			
		||||
    alignItems: "center",
 | 
			
		||||
    paddingTop: "20%",
 | 
			
		||||
  },
 | 
			
		||||
  input: {
 | 
			
		||||
    height: "auto",
 | 
			
		||||
    width: "60%",
 | 
			
		||||
    borderColor: "gray",
 | 
			
		||||
    borderWidth: 1,
 | 
			
		||||
    borderRadius: 5,
 | 
			
		||||
    padding: 10,
 | 
			
		||||
    color: "#fff",
 | 
			
		||||
  },
 | 
			
		||||
  btnContainer: {
 | 
			
		||||
    flexDirection: "row",
 | 
			
		||||
    gap: 5,
 | 
			
		||||
  },
 | 
			
		||||
	container: {
 | 
			
		||||
		width: "100%",
 | 
			
		||||
		height: "100%",
 | 
			
		||||
		backgroundColor: colors.dark,
 | 
			
		||||
	},
 | 
			
		||||
	form: {
 | 
			
		||||
		flex: 1,
 | 
			
		||||
		alignItems: "center",
 | 
			
		||||
		paddingTop: "10%",
 | 
			
		||||
		width: "100%",
 | 
			
		||||
		gap: 15,
 | 
			
		||||
	},
 | 
			
		||||
	h1: {
 | 
			
		||||
		color: "#FFF",
 | 
			
		||||
		fontSize: 30,
 | 
			
		||||
		textAlign: "center",
 | 
			
		||||
		paddingTop: "20%",
 | 
			
		||||
	},
 | 
			
		||||
	logo: {
 | 
			
		||||
		width: "80%",
 | 
			
		||||
		resizeMode: "contain",
 | 
			
		||||
	},
 | 
			
		||||
	header: {
 | 
			
		||||
		width: "100%",
 | 
			
		||||
		alignItems: "center",
 | 
			
		||||
		paddingTop: "20%",
 | 
			
		||||
	},
 | 
			
		||||
	input: {
 | 
			
		||||
		height: "auto",
 | 
			
		||||
		width: "60%",
 | 
			
		||||
		borderColor: "gray",
 | 
			
		||||
		borderWidth: 1,
 | 
			
		||||
		borderRadius: 5,
 | 
			
		||||
		padding: 10,
 | 
			
		||||
		color: "#fff",
 | 
			
		||||
	},
 | 
			
		||||
	btnContainer: {
 | 
			
		||||
		flexDirection: "row",
 | 
			
		||||
		gap: 5,
 | 
			
		||||
	},
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default LoginPage;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,142 +7,142 @@ import { Link, router } from "expo-router";
 | 
			
		||||
import { useAuth } from "./context/AuthContext";
 | 
			
		||||
 | 
			
		||||
function SignupPage() {
 | 
			
		||||
  const [pass1, setPass1] = useState("");
 | 
			
		||||
  const [pass2, setPass2] = useState("");
 | 
			
		||||
  const [email, setEmail] = useState("");
 | 
			
		||||
  const [username, setUsername] = useState("");
 | 
			
		||||
  const { onSignin } = useAuth();
 | 
			
		||||
	const [pass1, setPass1] = useState("");
 | 
			
		||||
	const [pass2, setPass2] = useState("");
 | 
			
		||||
	const [email, setEmail] = useState("");
 | 
			
		||||
	const [username, setUsername] = useState("");
 | 
			
		||||
	const { onSignin } = useAuth();
 | 
			
		||||
 | 
			
		||||
  async function signin() {
 | 
			
		||||
    if (pass1 == pass2) {
 | 
			
		||||
      const res = await onSignin(username, email, pass1);
 | 
			
		||||
      if (res.error) {
 | 
			
		||||
        if(res.msg.message == "validation error") {
 | 
			
		||||
          alert(res.msg.data.message);
 | 
			
		||||
        } else {
 | 
			
		||||
          alert(res.msg.message)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (!res.error) {
 | 
			
		||||
        alert("You have been successfully registered. Please Log In");
 | 
			
		||||
        router.replace("/login");
 | 
			
		||||
      }
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
	async function signin() {
 | 
			
		||||
		if (pass1 == pass2) {
 | 
			
		||||
			const res = await onSignin(username, email, pass1);
 | 
			
		||||
			if (res.error) {
 | 
			
		||||
				if (res.msg.message == "validation error") {
 | 
			
		||||
					alert(res.msg.data.message);
 | 
			
		||||
				} else {
 | 
			
		||||
					alert(res.msg.message);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if (!res.error) {
 | 
			
		||||
				alert("You have been successfully registered. Please Log In");
 | 
			
		||||
				router.replace("/login");
 | 
			
		||||
			}
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
    alert("Passwords are not same!");
 | 
			
		||||
  }
 | 
			
		||||
		alert("Passwords are not same!");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <View style={styles.container}>
 | 
			
		||||
      <View style={styles.header}>
 | 
			
		||||
        <Image
 | 
			
		||||
          source={require("../assets/deguapp_logo.png")}
 | 
			
		||||
          style={styles.logo}
 | 
			
		||||
        />
 | 
			
		||||
        <Text style={styles.h1}>Please Sign Up</Text>
 | 
			
		||||
      </View>
 | 
			
		||||
	return (
 | 
			
		||||
		<View style={styles.container}>
 | 
			
		||||
			<View style={styles.header}>
 | 
			
		||||
				<Image
 | 
			
		||||
					source={require("../assets/deguapp_logo.png")}
 | 
			
		||||
					style={styles.logo}
 | 
			
		||||
				/>
 | 
			
		||||
				<Text style={styles.h1}>Please Sign Up</Text>
 | 
			
		||||
			</View>
 | 
			
		||||
 | 
			
		||||
      <View style={styles.form}>
 | 
			
		||||
        <TextInput
 | 
			
		||||
          style={styles.input}
 | 
			
		||||
          placeholder="Enter your username"
 | 
			
		||||
          placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
          returnKeyType="done"
 | 
			
		||||
          value={username}
 | 
			
		||||
          onChangeText={(username) => setUsername(username)}
 | 
			
		||||
        />
 | 
			
		||||
        <TextInput
 | 
			
		||||
          style={styles.input}
 | 
			
		||||
          placeholder="Enter your email"
 | 
			
		||||
          autoCapitalize="none"
 | 
			
		||||
          autoCompleteType="email"
 | 
			
		||||
          textContentType="emailAddress"
 | 
			
		||||
          keyboardType="email-address"
 | 
			
		||||
          placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
          returnKeyType="next"
 | 
			
		||||
          value={email}
 | 
			
		||||
          onChangeText={(email) => setEmail(email)}
 | 
			
		||||
        />
 | 
			
		||||
        <TextInput
 | 
			
		||||
          style={styles.input}
 | 
			
		||||
          secureTextEntry={true}
 | 
			
		||||
          placeholder="Enter your password"
 | 
			
		||||
          placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
          returnKeyType="done"
 | 
			
		||||
          value={pass1}
 | 
			
		||||
          onChangeText={(pass1) => setPass1(pass1)}
 | 
			
		||||
        />
 | 
			
		||||
        <TextInput
 | 
			
		||||
          style={styles.input}
 | 
			
		||||
          secureTextEntry={true}
 | 
			
		||||
          placeholder="Enter your password"
 | 
			
		||||
          placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
          returnKeyType="done"
 | 
			
		||||
          value={pass2}
 | 
			
		||||
          onChangeText={(pass2) => setPass2(pass2)}
 | 
			
		||||
        />
 | 
			
		||||
        <Button
 | 
			
		||||
          style={styles.button}
 | 
			
		||||
          title="Sign Up"
 | 
			
		||||
          color={colors.gold}
 | 
			
		||||
          onPress={signin}
 | 
			
		||||
        />
 | 
			
		||||
        <Link href="/login" style={styles.a}>
 | 
			
		||||
          Already have an account? Log In!
 | 
			
		||||
        </Link>
 | 
			
		||||
      </View>
 | 
			
		||||
    </View>
 | 
			
		||||
  );
 | 
			
		||||
			<View style={styles.form}>
 | 
			
		||||
				<TextInput
 | 
			
		||||
					style={styles.input}
 | 
			
		||||
					placeholder="Enter your username"
 | 
			
		||||
					placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
					returnKeyType="done"
 | 
			
		||||
					value={username}
 | 
			
		||||
					onChangeText={(username) => setUsername(username)}
 | 
			
		||||
				/>
 | 
			
		||||
				<TextInput
 | 
			
		||||
					style={styles.input}
 | 
			
		||||
					placeholder="Enter your email"
 | 
			
		||||
					autoCapitalize="none"
 | 
			
		||||
					autoCompleteType="email"
 | 
			
		||||
					textContentType="emailAddress"
 | 
			
		||||
					keyboardType="email-address"
 | 
			
		||||
					placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
					returnKeyType="next"
 | 
			
		||||
					value={email}
 | 
			
		||||
					onChangeText={(email) => setEmail(email)}
 | 
			
		||||
				/>
 | 
			
		||||
				<TextInput
 | 
			
		||||
					style={styles.input}
 | 
			
		||||
					secureTextEntry={true}
 | 
			
		||||
					placeholder="Enter your password"
 | 
			
		||||
					placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
					returnKeyType="done"
 | 
			
		||||
					value={pass1}
 | 
			
		||||
					onChangeText={(pass1) => setPass1(pass1)}
 | 
			
		||||
				/>
 | 
			
		||||
				<TextInput
 | 
			
		||||
					style={styles.input}
 | 
			
		||||
					secureTextEntry={true}
 | 
			
		||||
					placeholder="Enter your password"
 | 
			
		||||
					placeholderTextColor={"#aaaaaa"}
 | 
			
		||||
					returnKeyType="done"
 | 
			
		||||
					value={pass2}
 | 
			
		||||
					onChangeText={(pass2) => setPass2(pass2)}
 | 
			
		||||
				/>
 | 
			
		||||
				<Button
 | 
			
		||||
					style={styles.button}
 | 
			
		||||
					title="Sign Up"
 | 
			
		||||
					color={colors.gold}
 | 
			
		||||
					onPress={signin}
 | 
			
		||||
				/>
 | 
			
		||||
				<Link href="/login" style={styles.a}>
 | 
			
		||||
					Already have an account? Log In!
 | 
			
		||||
				</Link>
 | 
			
		||||
			</View>
 | 
			
		||||
		</View>
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const styles = StyleSheet.create({
 | 
			
		||||
  container: {
 | 
			
		||||
    width: "100%",
 | 
			
		||||
    height: "100%",
 | 
			
		||||
    backgroundColor: colors.dark,
 | 
			
		||||
  },
 | 
			
		||||
  form: {
 | 
			
		||||
    flex: 1,
 | 
			
		||||
    alignItems: "center",
 | 
			
		||||
    paddingTop: "10%",
 | 
			
		||||
    width: "100%",
 | 
			
		||||
    gap: 15,
 | 
			
		||||
  },
 | 
			
		||||
  h1: {
 | 
			
		||||
    color: "#FFF",
 | 
			
		||||
    fontSize: 30,
 | 
			
		||||
    textAlign: "center",
 | 
			
		||||
    paddingTop: "20%",
 | 
			
		||||
  },
 | 
			
		||||
  a: {
 | 
			
		||||
    color: "#FFF",
 | 
			
		||||
    fontSize: 12,
 | 
			
		||||
    fontStyle: "italic",
 | 
			
		||||
    textDecorationLine: "underline",
 | 
			
		||||
  },
 | 
			
		||||
  logo: {
 | 
			
		||||
    width: "80%",
 | 
			
		||||
    resizeMode: "contain",
 | 
			
		||||
  },
 | 
			
		||||
  header: {
 | 
			
		||||
    width: "100%",
 | 
			
		||||
    alignItems: "center",
 | 
			
		||||
    paddingTop: "20%",
 | 
			
		||||
  },
 | 
			
		||||
  input: {
 | 
			
		||||
    height: "auto",
 | 
			
		||||
    width: "60%",
 | 
			
		||||
    borderColor: "gray",
 | 
			
		||||
    borderWidth: 1,
 | 
			
		||||
    borderRadius: 5,
 | 
			
		||||
    padding: 10,
 | 
			
		||||
    color: "#fff",
 | 
			
		||||
  },
 | 
			
		||||
  btnContainer: {
 | 
			
		||||
    flexDirection: "row",
 | 
			
		||||
    gap: 5,
 | 
			
		||||
  },
 | 
			
		||||
	container: {
 | 
			
		||||
		width: "100%",
 | 
			
		||||
		height: "100%",
 | 
			
		||||
		backgroundColor: colors.dark,
 | 
			
		||||
	},
 | 
			
		||||
	form: {
 | 
			
		||||
		flex: 1,
 | 
			
		||||
		alignItems: "center",
 | 
			
		||||
		paddingTop: "10%",
 | 
			
		||||
		width: "100%",
 | 
			
		||||
		gap: 15,
 | 
			
		||||
	},
 | 
			
		||||
	h1: {
 | 
			
		||||
		color: "#FFF",
 | 
			
		||||
		fontSize: 30,
 | 
			
		||||
		textAlign: "center",
 | 
			
		||||
		paddingTop: "20%",
 | 
			
		||||
	},
 | 
			
		||||
	a: {
 | 
			
		||||
		color: "#FFF",
 | 
			
		||||
		fontSize: 12,
 | 
			
		||||
		fontStyle: "italic",
 | 
			
		||||
		textDecorationLine: "underline",
 | 
			
		||||
	},
 | 
			
		||||
	logo: {
 | 
			
		||||
		width: "80%",
 | 
			
		||||
		resizeMode: "contain",
 | 
			
		||||
	},
 | 
			
		||||
	header: {
 | 
			
		||||
		width: "100%",
 | 
			
		||||
		alignItems: "center",
 | 
			
		||||
		paddingTop: "20%",
 | 
			
		||||
	},
 | 
			
		||||
	input: {
 | 
			
		||||
		height: "auto",
 | 
			
		||||
		width: "60%",
 | 
			
		||||
		borderColor: "gray",
 | 
			
		||||
		borderWidth: 1,
 | 
			
		||||
		borderRadius: 5,
 | 
			
		||||
		padding: 10,
 | 
			
		||||
		color: "#fff",
 | 
			
		||||
	},
 | 
			
		||||
	btnContainer: {
 | 
			
		||||
		flexDirection: "row",
 | 
			
		||||
		gap: 5,
 | 
			
		||||
	},
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default SignupPage;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
module.exports = function(api) {
 | 
			
		||||
  api.cache(true);
 | 
			
		||||
  return {
 | 
			
		||||
    presets: ['babel-preset-expo'],
 | 
			
		||||
  };
 | 
			
		||||
module.exports = function (api) {
 | 
			
		||||
	api.cache(true);
 | 
			
		||||
	return {
 | 
			
		||||
		presets: ["babel-preset-expo"],
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								frontend/biome.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								frontend/biome.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
{
 | 
			
		||||
	"$schema": "https://biomejs.dev/schemas/1.7.3/schema.json",
 | 
			
		||||
	"files": {
 | 
			
		||||
		"ignore": [".expo/", ".vscode/", "node_modules/"]
 | 
			
		||||
	},
 | 
			
		||||
	"organizeImports": {
 | 
			
		||||
		"enabled": true
 | 
			
		||||
	},
 | 
			
		||||
	"linter": {
 | 
			
		||||
		"enabled": false,
 | 
			
		||||
		"rules": {
 | 
			
		||||
			"recommended": true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -2,40 +2,40 @@ import React from "react";
 | 
			
		||||
import { Text, StyleSheet, Pressable } from "react-native";
 | 
			
		||||
 | 
			
		||||
export default function Button(props) {
 | 
			
		||||
  const { onPress, title = "Save", color = "black" } = props;
 | 
			
		||||
  return (
 | 
			
		||||
    <Pressable
 | 
			
		||||
      style={({ pressed }) => [
 | 
			
		||||
        {
 | 
			
		||||
          backgroundColor: pressed
 | 
			
		||||
            ? "rgb(210, 230, 255 )"
 | 
			
		||||
            : color
 | 
			
		||||
            ? color
 | 
			
		||||
            : "black",
 | 
			
		||||
        },
 | 
			
		||||
        styles.button,
 | 
			
		||||
      ]}
 | 
			
		||||
      onPress={onPress}
 | 
			
		||||
    >
 | 
			
		||||
      <Text style={styles.text}>{title}</Text>
 | 
			
		||||
    </Pressable>
 | 
			
		||||
  );
 | 
			
		||||
	const { onPress, title = "Save", color = "black" } = props;
 | 
			
		||||
	return (
 | 
			
		||||
		<Pressable
 | 
			
		||||
			style={({ pressed }) => [
 | 
			
		||||
				{
 | 
			
		||||
					backgroundColor: pressed
 | 
			
		||||
						? "rgb(210, 230, 255 )"
 | 
			
		||||
						: color
 | 
			
		||||
							? color
 | 
			
		||||
							: "black",
 | 
			
		||||
				},
 | 
			
		||||
				styles.button,
 | 
			
		||||
			]}
 | 
			
		||||
			onPress={onPress}
 | 
			
		||||
		>
 | 
			
		||||
			<Text style={styles.text}>{title}</Text>
 | 
			
		||||
		</Pressable>
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const styles = StyleSheet.create({
 | 
			
		||||
  button: {
 | 
			
		||||
    alignItems: "center",
 | 
			
		||||
    justifyContent: "center",
 | 
			
		||||
    paddingVertical: 12,
 | 
			
		||||
    paddingHorizontal: 32,
 | 
			
		||||
    borderRadius: 4,
 | 
			
		||||
    elevation: 3,
 | 
			
		||||
  },
 | 
			
		||||
  text: {
 | 
			
		||||
    fontSize: 16,
 | 
			
		||||
    lineHeight: 21,
 | 
			
		||||
    fontWeight: "bold",
 | 
			
		||||
    letterSpacing: 0.25,
 | 
			
		||||
    color: "white",
 | 
			
		||||
  },
 | 
			
		||||
	button: {
 | 
			
		||||
		alignItems: "center",
 | 
			
		||||
		justifyContent: "center",
 | 
			
		||||
		paddingVertical: 12,
 | 
			
		||||
		paddingHorizontal: 32,
 | 
			
		||||
		borderRadius: 4,
 | 
			
		||||
		elevation: 3,
 | 
			
		||||
	},
 | 
			
		||||
	text: {
 | 
			
		||||
		fontSize: 16,
 | 
			
		||||
		lineHeight: 21,
 | 
			
		||||
		fontWeight: "bold",
 | 
			
		||||
		letterSpacing: 0.25,
 | 
			
		||||
		color: "white",
 | 
			
		||||
	},
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
export const colors = {
 | 
			
		||||
  gold: "#FFD700ff",
 | 
			
		||||
  gold: "#ffa500",
 | 
			
		||||
  brown: "#8B4513ff",
 | 
			
		||||
  green: "#228B22ff",
 | 
			
		||||
  charcoal: "#2C3E50ff",
 | 
			
		||||
  black: "#020405ff",
 | 
			
		||||
  dark: "#010611",
 | 
			
		||||
	gold: "#FFD700ff",
 | 
			
		||||
	gold: "#ffa500",
 | 
			
		||||
	brown: "#8B4513ff",
 | 
			
		||||
	green: "#228B22ff",
 | 
			
		||||
	charcoal: "#2C3E50ff",
 | 
			
		||||
	black: "#020405ff",
 | 
			
		||||
	dark: "#010611",
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										158
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										158
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -26,7 +26,8 @@
 | 
			
		||||
        "react-native-web": "~0.19.6"
 | 
			
		||||
      },
 | 
			
		||||
      "devDependencies": {
 | 
			
		||||
        "@babel/core": "^7.20.0"
 | 
			
		||||
        "@babel/core": "^7.20.0",
 | 
			
		||||
        "@biomejs/biome": "1.7.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@ampproject/remapping": {
 | 
			
		||||
@@ -2051,6 +2052,161 @@
 | 
			
		||||
        "node": ">=6.9.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@biomejs/biome": {
 | 
			
		||||
      "version": "1.7.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.7.3.tgz",
 | 
			
		||||
      "integrity": "sha512-ogFQI+fpXftr+tiahA6bIXwZ7CSikygASdqMtH07J2cUzrpjyTMVc9Y97v23c7/tL1xCZhM+W9k4hYIBm7Q6cQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "hasInstallScript": true,
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "biome": "bin/biome"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=14.21.3"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "type": "opencollective",
 | 
			
		||||
        "url": "https://opencollective.com/biome"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@biomejs/cli-darwin-arm64": "1.7.3",
 | 
			
		||||
        "@biomejs/cli-darwin-x64": "1.7.3",
 | 
			
		||||
        "@biomejs/cli-linux-arm64": "1.7.3",
 | 
			
		||||
        "@biomejs/cli-linux-arm64-musl": "1.7.3",
 | 
			
		||||
        "@biomejs/cli-linux-x64": "1.7.3",
 | 
			
		||||
        "@biomejs/cli-linux-x64-musl": "1.7.3",
 | 
			
		||||
        "@biomejs/cli-win32-arm64": "1.7.3",
 | 
			
		||||
        "@biomejs/cli-win32-x64": "1.7.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@biomejs/cli-darwin-arm64": {
 | 
			
		||||
      "version": "1.7.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.7.3.tgz",
 | 
			
		||||
      "integrity": "sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "darwin"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=14.21.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@biomejs/cli-darwin-x64": {
 | 
			
		||||
      "version": "1.7.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.7.3.tgz",
 | 
			
		||||
      "integrity": "sha512-JXCaIseKRER7dIURsVlAJacnm8SG5I0RpxZ4ya3dudASYUc68WGl4+FEN03ABY3KMIq7hcK1tzsJiWlmXyosZg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "darwin"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=14.21.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@biomejs/cli-linux-arm64": {
 | 
			
		||||
      "version": "1.7.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.7.3.tgz",
 | 
			
		||||
      "integrity": "sha512-phNTBpo7joDFastnmZsFjYcDYobLTx4qR4oPvc9tJ486Bd1SfEVPHEvJdNJrMwUQK56T+TRClOQd/8X1nnjA9w==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=14.21.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@biomejs/cli-linux-arm64-musl": {
 | 
			
		||||
      "version": "1.7.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.7.3.tgz",
 | 
			
		||||
      "integrity": "sha512-c8AlO45PNFZ1BYcwaKzdt46kYbuP6xPGuGQ6h4j3XiEDpyseRRUy/h+6gxj07XovmyxKnSX9GSZ6nVbZvcVUAw==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=14.21.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@biomejs/cli-linux-x64": {
 | 
			
		||||
      "version": "1.7.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.7.3.tgz",
 | 
			
		||||
      "integrity": "sha512-vnedYcd5p4keT3iD48oSKjOIRPYcjSNNbd8MO1bKo9ajg3GwQXZLAH+0Cvlr+eMsO67/HddWmscSQwTFrC/uPA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=14.21.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@biomejs/cli-linux-x64-musl": {
 | 
			
		||||
      "version": "1.7.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.7.3.tgz",
 | 
			
		||||
      "integrity": "sha512-UdEHKtYGWEX3eDmVWvQeT+z05T9/Sdt2+F/7zmMOFQ7boANeX8pcO6EkJPK3wxMudrApsNEKT26rzqK6sZRTRA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=14.21.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@biomejs/cli-win32-arm64": {
 | 
			
		||||
      "version": "1.7.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.7.3.tgz",
 | 
			
		||||
      "integrity": "sha512-unNCDqUKjujYkkSxs7gFIfdasttbDC4+z0kYmcqzRk6yWVoQBL4dNLcCbdnJS+qvVDNdI9rHp2NwpQ0WAdla4Q==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "win32"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=14.21.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@biomejs/cli-win32-x64": {
 | 
			
		||||
      "version": "1.7.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.7.3.tgz",
 | 
			
		||||
      "integrity": "sha512-ZmByhbrnmz/UUFYB622CECwhKIPjJLLPr5zr3edhu04LzbfcOrz16VYeNq5dpO1ADG70FORhAJkaIGdaVBG00w==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "win32"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=14.21.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@expo/bunyan": {
 | 
			
		||||
      "version": "4.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.0.tgz",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,33 +1,34 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "deguapp",
 | 
			
		||||
  "version": "1.0.0",
 | 
			
		||||
  "main": "expo-router/entry",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "start": "expo start",
 | 
			
		||||
    "android": "expo start --android",
 | 
			
		||||
    "ios": "expo start --ios",
 | 
			
		||||
    "web": "expo start --web"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@expo/metro-runtime": "~3.1.3",
 | 
			
		||||
    "@react-native-async-storage/async-storage": "^1.23.1",
 | 
			
		||||
    "@types/react": "~18.2.45",
 | 
			
		||||
    "axios": "^1.6.8",
 | 
			
		||||
    "expo": "~50.0.17",
 | 
			
		||||
    "expo-constants": "~15.4.6",
 | 
			
		||||
    "expo-linking": "~6.2.2",
 | 
			
		||||
    "expo-router": "~3.4.10",
 | 
			
		||||
    "expo-secure-store": "^12.8.1",
 | 
			
		||||
    "expo-status-bar": "~1.11.1",
 | 
			
		||||
    "react": "18.2.0",
 | 
			
		||||
    "react-dom": "18.2.0",
 | 
			
		||||
    "react-native": "0.73.6",
 | 
			
		||||
    "react-native-safe-area-context": "4.8.2",
 | 
			
		||||
    "react-native-screens": "~3.29.0",
 | 
			
		||||
    "react-native-web": "~0.19.6"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@babel/core": "^7.20.0"
 | 
			
		||||
  },
 | 
			
		||||
  "private": true
 | 
			
		||||
	"name": "deguapp",
 | 
			
		||||
	"version": "1.0.0",
 | 
			
		||||
	"main": "expo-router/entry",
 | 
			
		||||
	"scripts": {
 | 
			
		||||
		"start": "expo start",
 | 
			
		||||
		"android": "expo start --android",
 | 
			
		||||
		"ios": "expo start --ios",
 | 
			
		||||
		"web": "expo start --web"
 | 
			
		||||
	},
 | 
			
		||||
	"dependencies": {
 | 
			
		||||
		"@expo/metro-runtime": "~3.1.3",
 | 
			
		||||
		"@react-native-async-storage/async-storage": "^1.23.1",
 | 
			
		||||
		"@types/react": "~18.2.45",
 | 
			
		||||
		"axios": "^1.6.8",
 | 
			
		||||
		"expo": "~50.0.17",
 | 
			
		||||
		"expo-constants": "~15.4.6",
 | 
			
		||||
		"expo-linking": "~6.2.2",
 | 
			
		||||
		"expo-router": "~3.4.10",
 | 
			
		||||
		"expo-secure-store": "^12.8.1",
 | 
			
		||||
		"expo-status-bar": "~1.11.1",
 | 
			
		||||
		"react": "18.2.0",
 | 
			
		||||
		"react-dom": "18.2.0",
 | 
			
		||||
		"react-native": "0.73.6",
 | 
			
		||||
		"react-native-safe-area-context": "4.8.2",
 | 
			
		||||
		"react-native-screens": "~3.29.0",
 | 
			
		||||
		"react-native-web": "~0.19.6"
 | 
			
		||||
	},
 | 
			
		||||
	"devDependencies": {
 | 
			
		||||
		"@babel/core": "^7.20.0",
 | 
			
		||||
		"@biomejs/biome": "1.7.3"
 | 
			
		||||
	},
 | 
			
		||||
	"private": true
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user