diff --git a/frontend/app.json b/frontend/app.json
index 1ace0dd..433b24a 100644
--- a/frontend/app.json
+++ b/frontend/app.json
@@ -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"]
+ }
}
diff --git a/frontend/app/(app)/_layout.js b/frontend/app/(app)/_layout.js
index 672ca02..2e9b476 100644
--- a/frontend/app/(app)/_layout.js
+++ b/frontend/app/(app)/_layout.js
@@ -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 (
-
- Loading...
-
- );
- }
- if (!authState.authenticated) {
- console.log("get the fuck out");
- return ;
- }
- return ;
+ if (authState.authenticated === null) {
+ // micro loading co neni skoro videt ale get the fuck out se uz neloguje
+ return (
+
+ Loading...
+
+ );
+ }
+ if (!authState.authenticated) {
+ console.log("get the fuck out");
+ return ;
+ }
+ return ;
}
diff --git a/frontend/app/(app)/index.js b/frontend/app/(app)/index.js
index 98fe6cc..d032440 100644
--- a/frontend/app/(app)/index.js
+++ b/frontend/app/(app)/index.js
@@ -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 (
-
- Welcome {user.username}
- {
- // The `app/(app)/_layout.tsx` will redirect to the sign-in screen.
- onLogout();
- }}
- >
- Sign Out
-
-
- );
+ return (
+
+ Welcome {user.username}
+ {
+ // The `app/(app)/_layout.tsx` will redirect to the sign-in screen.
+ onLogout();
+ }}
+ >
+ Sign Out
+
+
+ );
}
diff --git a/frontend/app/_layout.js b/frontend/app/_layout.js
index 18f23a4..60387a1 100644
--- a/frontend/app/_layout.js
+++ b/frontend/app/_layout.js
@@ -3,10 +3,10 @@ import { StatusBar } from "expo-status-bar";
import { AuthProvider } from "./context/AuthContext";
export default function Root() {
- return (
-
-
-
-
- );
+ return (
+
+
+
+
+ );
}
diff --git a/frontend/app/context/AuthContext.js b/frontend/app/context/AuthContext.js
index f5d202e..1a08b36 100644
--- a/frontend/app/context/AuthContext.js
+++ b/frontend/app/context/AuthContext.js
@@ -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 {children};
+ return {children};
}
diff --git a/frontend/app/context/storage.js b/frontend/app/context/storage.js
index a55e8d0..501ab6b 100644
--- a/frontend/app/context/storage.js
+++ b/frontend/app/context/storage.js
@@ -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;
diff --git a/frontend/app/hooks/useIsAutheticated.js b/frontend/app/hooks/useIsAutheticated.js
index 99c8cec..760b1e5 100644
--- a/frontend/app/hooks/useIsAutheticated.js
+++ b/frontend/app/hooks/useIsAutheticated.js
@@ -1,6 +1,6 @@
import { useAuth } from "../context/AuthContext";
export function useIsAutheticated() {
- const { authState } = useAuth();
- return authState.authenticated
+ const { authState } = useAuth();
+ return authState.authenticated;
}
diff --git a/frontend/app/login.js b/frontend/app/login.js
index 2f0622d..e8ac95e 100644
--- a/frontend/app/login.js
+++ b/frontend/app/login.js
@@ -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 (
-
-
-
- Please Log In
-
-
- setEmail(text)}
- />
- setPass(text)}
- />
-
-
-
-
- );
+ return (
+
+
+
+ Please Log In
+
+
+ setEmail(text)}
+ />
+ setPass(text)}
+ />
+
+ router.replace("/signup")}
+ />
+
+
+
+
+ );
}
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;
diff --git a/frontend/app/signup.js b/frontend/app/signup.js
index 920c394..0ad1bbf 100644
--- a/frontend/app/signup.js
+++ b/frontend/app/signup.js
@@ -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 (
-
-
-
- Please Sign Up
-
+ return (
+
+
+
+ Please Sign Up
+
-
- setUsername(username)}
- />
- setEmail(email)}
- />
- setPass1(pass1)}
- />
- setPass2(pass2)}
- />
-
-
- Already have an account? Log In!
-
-
-
- );
+
+ setUsername(username)}
+ />
+ setEmail(email)}
+ />
+ setPass1(pass1)}
+ />
+ setPass2(pass2)}
+ />
+
+
+ Already have an account? Log In!
+
+
+
+ );
}
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;
diff --git a/frontend/babel.config.js b/frontend/babel.config.js
index 2900afe..4cb208f 100644
--- a/frontend/babel.config.js
+++ b/frontend/babel.config.js
@@ -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"],
+ };
};
diff --git a/frontend/biome.json b/frontend/biome.json
new file mode 100644
index 0000000..47cc9d1
--- /dev/null
+++ b/frontend/biome.json
@@ -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
+ }
+ }
+}
diff --git a/frontend/components/Button.js b/frontend/components/Button.js
index 93199d2..b32a01c 100644
--- a/frontend/components/Button.js
+++ b/frontend/components/Button.js
@@ -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 (
- [
- {
- backgroundColor: pressed
- ? "rgb(210, 230, 255 )"
- : color
- ? color
- : "black",
- },
- styles.button,
- ]}
- onPress={onPress}
- >
- {title}
-
- );
+ const { onPress, title = "Save", color = "black" } = props;
+ return (
+ [
+ {
+ backgroundColor: pressed
+ ? "rgb(210, 230, 255 )"
+ : color
+ ? color
+ : "black",
+ },
+ styles.button,
+ ]}
+ onPress={onPress}
+ >
+ {title}
+
+ );
}
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",
+ },
});
diff --git a/frontend/components/style.js b/frontend/components/style.js
index 5da40b5..6a1c6ab 100644
--- a/frontend/components/style.js
+++ b/frontend/components/style.js
@@ -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",
};
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 2f0ba90..0c908b3 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -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",
diff --git a/frontend/package.json b/frontend/package.json
index 82778be..7a2d595 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -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
}