Skip to content

Commit 46c6698

Browse files
authored
Merge branch 'main' into Filip
2 parents dfd065d + 94c02ef commit 46c6698

File tree

5 files changed

+362
-176
lines changed

5 files changed

+362
-176
lines changed

README.md

+118-28
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,140 @@
1-
# Welcome to your Expo app 👋
1+
# Aplikacja Treebie
2+
**Nazwa aplikacji:** Treebie
3+
**Twórcy:** Jakub Lagierski, Filip Skoczylas, Jan Niewiadomski, Tymon X
24

3-
This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app).
5+
Aplikacja pozwala na wykonywania ekologicznych wyzwań, za które można odbierać punkty i ulepszać swoje drzewko. Aplikacja jest skierowana dla każdego, kto chce się przyczynić dla dobra planety.
6+
W tym formacie, dobre uczynki przestają być nudne i pozwalają na bardziej przystępne podejście do ekologii. Aplikacja jest przeznaczona na platformy iOS oraz Android.
47

5-
## Get started
8+
## Spis streści
9+
1. [Instalacja](#instalacja)
10+
2. [Struktura plików](#struktura-plikow)
11+
3. [Wykorzystane technologie](#wykorzystane-technologie)
12+
4. [Funkcjonalności](#funkcjonalnosci)
613

7-
1. Install dependencies
14+
## Instalacja
15+
16+
1. Sklonuj repozytorium
17+
18+
```bash
19+
git clone https://github.com/Fivlas/treebie.git
20+
cd treebie
21+
```
22+
23+
2. Pobierz potrzebne zależności
824

925
```bash
1026
npm install
1127
```
1228

13-
2. Start the app
29+
3. Uruchom aplikację
1430

1531
```bash
1632
npx expo start
1733
```
1834

19-
In the output, you'll find options to open the app in a
35+
W wynikach znajdziesz opcje otwierania aplikacji w formacie:
2036

2137
- [development build](https://docs.expo.dev/develop/development-builds/introduction/)
2238
- [Android emulator](https://docs.expo.dev/workflow/android-studio-emulator/)
2339
- [iOS simulator](https://docs.expo.dev/workflow/ios-simulator/)
24-
- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app development with Expo
25-
26-
You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction).
27-
28-
## Get a fresh project
29-
30-
When you're ready, run:
31-
32-
```bash
33-
npm run reset-project
40+
- [Expo Go](https://expo.dev/go)
41+
42+
## Struktura plików
43+
```bash
44+
treebie/
45+
├───%ProgramData%
46+
│ └───Microsoft
47+
│ └───Windows
48+
│ └───UUS
49+
│ └───State
50+
├───.vscode
51+
├───app
52+
│ ├───(auth)
53+
│ ├───(tabs)
54+
│ ├───ai
55+
│ ├───all
56+
│ ├───challenge
57+
│ │ └───[id]
58+
│ ├───shop
59+
│ └───tip
60+
│ └───[id]
61+
├───assets
62+
│ ├───fonts
63+
│ ├───images
64+
│ └───jsons
65+
├───components
66+
│ ├───Ai
67+
│ ├───Challenges
68+
│ ├───elements
69+
│ ├───HomePage
70+
│ ├───LoginSignup
71+
│ ├───navigation
72+
│ ├───TipsPage
73+
│ └───__tests__
74+
│ └───__snapshots__
75+
├───constants
76+
├───functions
77+
├───hooks
78+
├───scripts
79+
└───styles
3480
```
3581

36-
This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing.
37-
38-
## Learn more
39-
40-
To learn more about developing your project with Expo, look at the following resources:
41-
42-
- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into advanced topics with our [guides](https://docs.expo.dev/guides).
43-
- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web.
82+
## Wykorzystane technologie
83+
### Aplikacja wykorzystuje następujące technologie i biblioteki:
84+
- **React Native** - framework do budowania aplikacji mobilnych.
85+
- **TypeScript** - statyczne typowanie i większa czytelność kodu.
86+
- **React Navigation** - zarządzanie nawigacją między ekranami.
87+
- **Expo** - ułatwia konfigurację i testowanie aplikacji.
88+
- **Firebase** - nierelacyjna baza danych, przechowująca dane aplikacji
89+
90+
### Typowanie z TypeScript
91+
92+
W projekcie wykorzystano **TypeScript** do poprawienia czytelności kodu i minimalizacji błędów. Typy i interfejsy są zorganizowane w katalogu `treebie/typing.d.ts`, a przykładowe interfejsy obejmują:
93+
94+
- **TipData** - interfejs obsługujący właściwosći wskazówek ekologicznych
95+
- **ChallengeData** - interfejs obsługujący właściwosći wyzwań ekologicznych
96+
97+
### Baza danych
98+
99+
W aplikacji wykorzystano nierelacyjną bazę danych Firestore. Pozwala ona na szybkie i kompleksowe przechowywanie, zarządzanie oraz przeglądanie danych.
100+
W bazie danych istnieje 4 tabele (kolekcje) z polami:
101+
+ **likedTips** - kolekcja przechowuje dane o polubionych poradach
102+
+ timestamp (number) - czas dodania do polubionych
103+
+ tipId (string) - id polubionej porady
104+
+ userId (string) - id użytkownika, który polubił poradę
105+
+ **quests** - kolekcja przechowuje dane o wyzwaniach:
106+
+ title (string) - tytuł (nazwa) wyzywania
107+
+ pointsToGain (number) - punkty za wykonanie zadania
108+
+ difficultyName (string) - pisemna nazwa poziomu trudności wyzwania
109+
+ difficultyLevel (number) - poziom trudności wyrażony jako liczba
110+
+ description (string) - opis wyzywania
111+
+ challengeGroup (string) - grupa do której zalicza się wyzywanie
112+
+ **tips** - kolekcja przechowuje dane o dostępnych ekologicznych poradach
113+
+ title (string) - tytuł (nazwa) porady
114+
+ popularity (number) - ilość razy odwiedzonej porady przez użytkowników
115+
+ list (array) - tablica przechowująca konkretne wskazówki
116+
+ imageName (string) - adres URL do wyświetlanego zdjęcia
117+
+ description (string) - opis porady
118+
+ **users** - kolekcja przechowuje dane o użytkownikach
119+
+ currentQuest (string) - przechowuje id obecnie wykonywanego zadania
120+
+ email (string) - email użytkownika
121+
+ likedTips (array) - tablica przechowująca polubione porady przez użytkownika
122+
+ questsDone (array) - tablica przechowująca wykonane wyzwania
123+
+ team (number) - id wybranego drzewa użytkownika (1 lub 2)
124+
+ treeProgress (number) - punkty doświadczenia uzyskiwane przez wykonanie zadań
125+
126+
## Funkcjonalności
127+
### Użytkownik
128+
System kont w aplikacji mobilnej pozwala użytkownikom tworzyć, logować się i zarządzać swoim indywidualnym profilem w aplikacji. Oto najważniejsze możliwości, jakie oferuje system kont:
129+
+ **Rejestracja i logowanie**: Umożliwia nowym użytkownikom tworzenie kont i logowanie się na istniejące konta za pomocą adresu e-mail oraz hasła.
130+
+ **Zarządzanie danymi**: Użytkownicy mogą przeglądać swoje polubione porady czy zmieniać motyw co pozwala na personalizację i lepsze dopasowanie aplikacji do potrzeb.
131+
+ **Bezpieczeństwo i prywatność**: System kont umożliwia bezpieczne przechowywanie danych oraz zarządzanie sesjami logowania, co zwiększa ochronę kont użytkowników.
132+
System kont zwiększa użyteczność i funkcjonalność aplikacji, umożliwiając lepsze dostosowanie jej do indywidualnych potrzeb użytkowników oraz ich ochronę.
133+
### Wyzwania
134+
System wyzwań w aplikacji umożliwia użytkownikom realizację określonych zadań, za które zdobywają punkty doświadczenia (XP), co powoduje rośnięcie własnego drzewka oraz motywuje użytkownika do regularnego korzystania z aplikacji. Poniżej główne możliwości takiego systemu:
135+
+ **Różne typy wyzwań**: Wyzwania mają różny stopień trudności (łatwy, średni, trudny) oraz kategorie (challengeGroup) np. Sadzenie, Zbieranie, Zakupy
136+
+ **Nagrody za wykonanie**: Za ukończenie wyzwań użytkownicy zdobywają punkty doświadczenia, które powodują rośnięcie drzewa i zwiększenie poziomu.
137+
Taki system wyzwań poprawia zaangażowanie użytkowników, ułatwia śledzenie postępów i pozwala na połączenie przyjemnej rozgrywki z pożytecznym wpływem na środowisko.
44138

45-
## Join the community
46139

47-
Join our community of developers creating universal apps.
48140

49-
- [Expo on GitHub](https://github.com/expo/expo): View our open source platform and contribute.
50-
- [Discord community](https://chat.expo.dev): Chat with Expo users and ask questions.

app/(tabs)/_layout.tsx

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import React from 'react';
44
import {TabBarIcon} from '@/components/navigation/TabBarIcon';
55
import {Colors} from '@/constants/Colors';
66
import {useColorScheme} from '@/hooks/useColorScheme';
7-
87
export default function TabLayout() {
98
const colorScheme = useColorScheme();
109

@@ -50,6 +49,12 @@ export default function TabLayout() {
5049
),
5150
}}
5251
/>
52+
<Tabs.Screen name='explore' options={{
53+
title: "Odkrywaj",
54+
tabBarIcon: ({color, focused}) => (
55+
<TabBarIcon name={focused ? 'book' : 'book-outline'} color={color}/>
56+
),
57+
}}/>
5358
</Tabs>
5459
);
5560
}

app/(tabs)/explore.tsx

+7-125
Original file line numberDiff line numberDiff line change
@@ -1,129 +1,11 @@
1-
import { View, Text, SafeAreaView } from "react-native";
2-
import { router, useLocalSearchParams } from "expo-router";
3-
import { FIREBASE_DB } from "@/firebase.config";
4-
import { doc, getDoc } from "firebase/firestore";
5-
import { useState, useEffect } from "react";
6-
import CustomButton from "@/components/elements/CustomButton";
7-
import { StyleSheet } from "react-native";
1+
import { Text, SafeAreaView } from "react-native";
82

93
const index = () => {
10-
const [challenge, setChallenge] = useState<object | any>();
11-
const local = useLocalSearchParams();
12-
const [tempData, setTempData] = useState<[string, string, string]>([
13-
"#606c38",
14-
"#cc7a00",
15-
"#a23b3b",
16-
]);
17-
type actionType = "start" | "ongoing" | "end" | any;
18-
const [actualAction, setActualAction] = useState<actionType>("start");
19-
// const actionData = [
20-
// {
21-
// name: "start",
22-
// color: tempData[0],
23-
// },
24-
// {
25-
// name: "ongoing",
26-
// color: tempData[1],
27-
// },
28-
// {
29-
// name: "end",
30-
// color: tempData[2],
31-
// },
32-
// ];
33-
// useEffect(() => {
34-
// const getData = async (id: string) => {
35-
// try {
36-
// const docRef = doc(FIREBASE_DB, "quests", id);
37-
// const res = await getDoc(docRef);
38-
// setChallenge(res.data());
39-
// } catch (error) {
40-
// console.error("Error fetching document: ", error);
41-
// }
42-
// };
43-
// getData(local.id.toString());
44-
// }, []);
45-
type ActionDataType = {
46-
color: string;
47-
statusText: string;
48-
buttonText: string;
49-
}
50-
const getDataByAction = (): ActionDataType => {
51-
if (actualAction === "start") {
52-
return {
53-
color: "primary",
54-
statusText: "Dostępne",
55-
buttonText: "Rozpocznij",
56-
};
57-
} else if (actualAction === "ongoing") {
58-
return {
59-
color: "orange",
60-
statusText: "W trakcie",
61-
buttonText: "Zakończ",
62-
};
63-
} else if (actualAction === "end") {
64-
return {
65-
color: "red",
66-
statusText: "Zakończone",
67-
buttonText: "Zakończono",
68-
};
69-
}
70-
return {
71-
color: "red",
72-
statusText: "Error",
73-
buttonText: "Error",
74-
};
75-
};
76-
return (
77-
<SafeAreaView>
78-
<View className="p-4 h-full">
79-
<View className="p-2 rounded-lg bg-background flex flex-column justify-between h-full">
80-
<View className="flex flex-column gap-4">
81-
<Text className="text-4xl font-bold">
82-
{challenge?.title}Posadź drzewka
83-
</Text>
84-
<Text className="text-gray-400 text-xl">
85-
Kup sadzonkę drzewa i posadź ją w swojej okolicy, aby pomóc
86-
środowisku.
87-
</Text>
88-
<Text
89-
className={`text-3xl text-${getDataByAction()?.color} font-bold`}
90-
>
91-
{getDataByAction()?.statusText}
92-
</Text>
93-
</View>
94-
95-
<View className="w-full flex items-center">
96-
<View
97-
className={`w-[300px] h-[300px] rounded-full bg-${getDataByAction()?.color
98-
} flex justify-center items-center`}
99-
>
100-
<View className="w-[240px] h-[240px] rounded-full bg-white flex justify-center items-center">
101-
<Text
102-
className={`text-[50px] text-${getDataByAction()?.color}`}
103-
>
104-
50 pkt
105-
</Text>
106-
</View>
107-
</View>
108-
</View>
109-
<CustomButton
110-
title={getDataByAction()?.buttonText.toString()}
111-
buttonType="primary"
112-
textStyles="text-3xl"
113-
handlePress={() => {
114-
setActualAction(
115-
actualAction === "start"
116-
? "ongoing"
117-
: actualAction === "ongoing"
118-
? "end"
119-
: actualAction
120-
);
121-
}}
122-
/>
123-
</View>
124-
</View>
125-
</SafeAreaView>
126-
);
4+
return (
5+
<SafeAreaView>
6+
<Text>Explore route</Text>
7+
</SafeAreaView>
8+
);
1279
};
12810

129-
export default index;
11+
export default index;

0 commit comments

Comments
 (0)