Skip to content

Commit 6edf486

Browse files
committed
adds tree backend handler and optimises files
1 parent 7a9d3b6 commit 6edf486

13 files changed

+71
-283
lines changed

app/(tabs)/challenges.tsx

+1-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import { Alert, BackHandler, Platform, SafeAreaView, Text, TouchableOpacity, View } from "react-native";
1+
import { Alert, BackHandler, Platform, SafeAreaView, View } from "react-native";
22
import SearchBar from "../../components/Challenges/SearchBar";
33
import ChallengesList from "@/components/Challenges/ChallengesList";
44
import { useEffect, useState } from "react";
5-
import { Href, router } from "expo-router";
65
import { useThemeColor } from "@/hooks/useThemeColor";
76
import { ThemedText } from "@/components/ThemedText";
8-
import { Feather } from "@expo/vector-icons";
97
import AsyncStorage from "@react-native-async-storage/async-storage";
108

119
interface ParentProps {}
@@ -68,9 +66,6 @@ const Challenges: React.FC<ParentProps> = () => {
6866
<ThemedText className="text-4xl font-semibold mb-2">
6967
Wyzwania
7068
</ThemedText>
71-
<TouchableOpacity onPress={() => router.push("/shop?redirect=challenges" as Href)}>
72-
<Feather name="shopping-bag" size={24} color={textColor} />
73-
</TouchableOpacity>
7469
</View>
7570
<SearchBar getData={getQuery} />
7671
<ChallengesList queryToFilter={query} />

app/(tabs)/settings.tsx

-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@ import {ThemedText} from '@/components/ThemedText';
55
import {THEME_PREFERENCE_KEY} from "@/hooks/useColorScheme";
66
import AsyncStorage from "@react-native-async-storage/async-storage";
77
import { Href, router } from 'expo-router';
8-
import { useUser } from '@/hooks/useUser';
98

109
export default function Settings() {
1110
const [darkTheme, setDarkTheme] = useState<boolean>(false);
12-
const { user } = useUser();
1311

1412
const canChangeTheme = typeof Appearance.setColorScheme === "function";
1513

app/(tabs)/tree.tsx

+63-48
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,96 @@
11
/* eslint-disable @typescript-eslint/no-require-imports */
22
import { ThemedText } from "@/components/ThemedText";
3-
import { Feather } from "@expo/vector-icons";
4-
import { Href, router } from "expo-router";
5-
import React, { useEffect, useState } from "react";
6-
import { Image, SafeAreaView, TouchableOpacity, View } from "react-native";
3+
import { FIREBASE_DB } from "@/firebase.config";
4+
import { useUser } from "@/hooks/useUser";
5+
import { useFocusEffect } from "@react-navigation/native";
6+
import { doc, getDoc } from "firebase/firestore";
7+
import React, { useCallback, useEffect, useState } from "react";
8+
import { ActivityIndicator, Image, SafeAreaView, View } from "react-native";
79
//@ts-ignore
810
import ProgressBar from "react-native-progress/Bar";
911

1012
type Level = 1 | 2 | 3 | "MAX";
1113

1214
const Tree = () => {
13-
const USER_EXP = 0;
14-
const USER_TEAM = "1";
15+
const { user, loading } = useUser();
16+
17+
const [userExp, setUserExp] = useState<number>(0);
18+
const [userTeam, setUserTeam] = useState<string>("1");
1519
const [progress, setProgress] = useState<number>(0);
1620
const [level, setLevel] = useState<Level>(1);
21+
22+
useFocusEffect(
23+
useCallback(() => {
24+
const getData = async () => {
25+
if (loading) return;
26+
if (!user) {
27+
console.error("User is not logged in");
28+
return;
29+
}
30+
31+
try {
32+
const docRef = doc(FIREBASE_DB, "users", user.uid);
33+
const res = await getDoc(docRef);
34+
const data = res.data();
35+
36+
if (data) {
37+
setUserExp(data.treeProgress || 0);
38+
setUserTeam(data.team || "1");
39+
}
40+
} catch (error) {
41+
console.error("Error fetching document: ", error);
42+
}
43+
};
44+
45+
getData();
46+
}, [user, loading])
47+
);
1748

1849
useEffect(() => {
1950
const calculateLvl = (): Level => {
20-
if (USER_EXP >= 570) {
21-
return "MAX";
22-
} else if (USER_EXP >= 270) {
23-
return 3;
24-
} else if (USER_EXP >= 90) {
25-
return 2;
26-
} else {
27-
return 1;
28-
}
51+
if (userExp >= 570) return "MAX";
52+
if (userExp >= 270) return 3;
53+
if (userExp >= 90) return 2;
54+
return 1;
2955
};
3056

31-
// Set the level
3257
const newLevel = calculateLvl();
3358
setLevel(newLevel);
3459

35-
let nextLevelExp = 0;
36-
if (newLevel === 3) {
37-
nextLevelExp = 570;
38-
} else if (newLevel === 2) {
39-
nextLevelExp = 270;
40-
} else if (newLevel === 1) {
41-
nextLevelExp = 90;
42-
}
60+
const nextLevelExp = newLevel === 3 ? 570 : newLevel === 2 ? 270 : 90;
61+
setProgress(newLevel === "MAX" ? 1 : userExp / nextLevelExp);
62+
}, [userExp]);
4363

44-
if (newLevel !== "MAX") {
45-
const progressToNextLevel = USER_EXP / nextLevelExp;
46-
setProgress(progressToNextLevel);
47-
} else {
48-
setProgress(1);
49-
}
50-
}, [USER_EXP]);
5164

5265
const getImageSource = (): any => {
53-
switch (level) {
54-
case 1:
55-
return require(`@/assets/images/tree${USER_TEAM}-lvl1.png`);
56-
case 2:
57-
return require(`@/assets/images/tree${USER_TEAM}-lvl2.png`);
58-
case 3:
59-
return require(`@/assets/images/tree${USER_TEAM}-lvl3.png`);
60-
case "MAX":
61-
return require(`@/assets/images/tree${USER_TEAM}-lvl3.png`);
62-
default:
63-
return require(`@/assets/images/tree${USER_TEAM}-lvl1.png`);
64-
}
66+
const images: Record<string, any> = {
67+
"1-lvl1": require("@/assets/images/tree1-lvl1.png"),
68+
"1-lvl2": require("@/assets/images/tree1-lvl2.png"),
69+
"1-lvl3": require("@/assets/images/tree1-lvl3.png"),
70+
"2-lvl1": require("@/assets/images/tree2-lvl1.png"),
71+
"2-lvl2": require("@/assets/images/tree2-lvl2.png"),
72+
"2-lvl3": require("@/assets/images/tree2-lvl3.png"),
73+
};
74+
75+
const key = `${userTeam}-lvl${level === "MAX" ? 3 : level}`;
76+
return images[key] || images["1-lvl1"];
6577
};
6678

79+
if (loading) {
80+
return (
81+
<SafeAreaView className="flex-1 justify-center items-center">
82+
<ActivityIndicator size="large" color="#606c38" />
83+
</SafeAreaView>
84+
);
85+
}
86+
6787
return (
6888
<SafeAreaView className="flex-1">
6989
{/* Top Navigation Icons */}
7090
<View className="flex flex-row justify-between px-8 mt-2 items-center">
7191
<ThemedText className="text-4xl font-semibold mb-2">
7292
Twoje drzewo
7393
</ThemedText>
74-
<TouchableOpacity
75-
onPress={() => router.push("/shop?redirect=tree" as Href)}
76-
>
77-
<Feather name="shopping-bag" size={24} color="black" />
78-
</TouchableOpacity>
7994
</View>
8095

8196
{/* Main Content */}

app/_layout.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ export default function RootLayout() {
4747
<Stack.Screen name="(auth)/signup" options={{ headerShown: false }} />
4848
<Stack.Screen name="ai/index" options={{ headerShown: false }} />
4949
<Stack.Screen name="challenge/[id]/index" options={{ headerShown: false }} />
50-
<Stack.Screen name="shop/index" options={{ headerShown: false }} />
5150
<Stack.Screen name="all/index" options={{ headerShown: false }} />
5251
<Stack.Screen name="+not-found" />
5352
</Stack>

app/challenge/[id]/index.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { View, Text, SafeAreaView } from "react-native";
1+
import { Text, SafeAreaView } from "react-native";
22
import { router, useLocalSearchParams } from "expo-router";
33
import { FIREBASE_DB } from "@/firebase.config";
44
import { doc, getDoc } from "firebase/firestore";

app/shop/index.tsx

-102
This file was deleted.

app/tip/[id]/index.tsx

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable @typescript-eslint/no-require-imports */
22
import React, { useEffect, useState } from "react";
3-
import { ActivityIndicator, Image, ImageBackground, ScrollView, Text, TouchableOpacity, View } from "react-native";
3+
import { ActivityIndicator, Image, ImageBackground, ScrollView, TouchableOpacity, View } from "react-native";
44
import CustomButton from "@/components/elements/CustomButton";
55
import { Ionicons } from "@expo/vector-icons";
66
import { Href, useLocalSearchParams, router } from "expo-router";
@@ -29,7 +29,7 @@ const Index = () => {
2929
const [tip, setTip] = useState<TipFields | undefined>(undefined);
3030
const [likeId, setLikeId] = useState<string>();
3131
const { user, loading } = useUser();
32-
const [isLoading, setIsLoading] = useState(true); // New loading state for the screen
32+
const [isLoading, setIsLoading] = useState(true);
3333

3434
// Fetch Tip Data and User Likes
3535
useEffect(() => {
@@ -53,7 +53,7 @@ const Index = () => {
5353

5454
const fetchLikes = async (id: string) => {
5555
try {
56-
if (!user || loading) return; // Check if user is loaded
56+
if (!user || loading) return;
5757
const likedRef = collection(FIREBASE_DB, "likedTips");
5858
const LikesQuery = query(
5959
likedRef,
@@ -98,7 +98,7 @@ const Index = () => {
9898
} else {
9999
const docRef = await addDoc(collection(FIREBASE_DB, "likedTips"), {
100100
tipId: local.id.toString(),
101-
userId: user.uid, // Using user.uid
101+
userId: user.uid,
102102
timestamp: Date.now(),
103103
});
104104
setLikeId(docRef.id);
@@ -108,7 +108,6 @@ const Index = () => {
108108
}
109109
};
110110

111-
// Loading spinner while fetching data
112111
if (isLoading || loading) {
113112
return (
114113
<ThemedView className="flex-1 justify-center items-center">

components/Ai/JumpingBubbles.tsx

-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@ import React, { useEffect, useRef } from 'react';
22
import { View, Animated, Easing, StyleSheet } from 'react-native';
33

44
const JumpingBubbles = () => {
5-
// Create refs for each animated bubble
65
const bubble1 = useRef(new Animated.Value(1)).current;
76
const bubble2 = useRef(new Animated.Value(1)).current;
87
const bubble3 = useRef(new Animated.Value(1)).current;
98

109
useEffect(() => {
11-
// Define the jumping animation
1210
const animateBubble = (bubble: Animated.Value) => {
1311
return Animated.sequence([
1412
Animated.timing(bubble, {

components/DismissKeyboard.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { StyleSheet, Keyboard, View, TouchableWithoutFeedback } from 'react-native';
1+
import { Keyboard, View, TouchableWithoutFeedback } from 'react-native';
22
import { ReactNode } from 'react';
33

44
interface DismissKeyboardProps {

components/HelloWave.tsx

-37
This file was deleted.

0 commit comments

Comments
 (0)