Skip to content
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,6 @@ web-build/
.DS_Store

firebase-config.json
facebook-config.json
facebook-config.json
geminiconfig.json
geminiconfig.json
11 changes: 7 additions & 4 deletions app/screens/Items.tsx → app/screens/Account.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@ import React from "react";
import { createNativeStackNavigator } from "@react-navigation/native-stack";
import ItemEditScreen from "./ItemEdit";
import ItemListScreen from "./ItemList";
import MainLayout from "./Layout";
import { Paragraph } from "react-native-paper";

//https://reactnavigation.org/docs/hello-react-navigation
const ItemStack = createNativeStackNavigator();

const ItemScreen = () => {
return <ItemStack.Navigator>
<ItemStack.Screen name="ItemList" component={ItemListScreen} options={{ headerShown: false }} />
<ItemStack.Screen name="ItemEdit" component={ItemEditScreen} options={{ headerShown: false }} />
</ItemStack.Navigator>
return (
<MainLayout>
<Paragraph>da</Paragraph>
</MainLayout>
);
}

export default ItemScreen;
94 changes: 94 additions & 0 deletions app/screens/ChatAI.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import React, { useState } from "react";
import { View, TextInput, Button, ScrollView, StyleSheet, ActivityIndicator, Text } from "react-native";
import { Paragraph } from "react-native-paper";
import MainLayout from "./Layout";
import { fetchGeminiResponse } from "../../utils/geminiApi";

const ChatScreen = () => {
const [messages, setMessages] = useState([{ sender: "user", text: "" }]);
const [input, setInput] = useState("");
const [loading, setLoading] = useState(false);

const sendMessage = async () => {
if (!input.trim()) return;

const userMessage = { sender: "user", text: input };
setMessages((prev: any) => [...prev, userMessage]);
setInput("");
setLoading(true);

const aiText = await fetchGeminiResponse(input);
const aiMessage = { sender: "ai", text: aiText };

setMessages((prev) => [...prev, aiMessage]);
setLoading(false);
};

return (
<MainLayout>
<ScrollView style={styles.chatContainer}>
{messages.map((msg, index) => (
<View
key={index}
style={[
styles.message,
msg.sender === "user" ? styles.userMessage : styles.aiMessage,
]}
>
<Text style={styles.messageText}>{msg.text}</Text>
</View>
))}
{loading && <ActivityIndicator size="small" color="#0000ff" />}
</ScrollView>

<View style={styles.inputContainer}>
<TextInput
style={styles.input}
value={input}
onChangeText={setInput}
placeholder="Pune o intrebare"
/>
<Button title="Trimite" onPress={sendMessage} />
</View>
</MainLayout>
);
};

export default ChatScreen;

const styles = StyleSheet.create({
chatContainer: {
flex: 1,
marginBottom: 10,
},
message: {
padding: 10,
borderRadius: 8,
marginVertical: 4,
maxWidth: "80%",
},
userMessage: {
alignSelf: "flex-end",
backgroundColor: "#d1e7dd",
},
aiMessage: {
alignSelf: "flex-start",
backgroundColor: "#f8d7da",
},
messageText: {
fontSize: 16,
},
inputContainer: {
flexDirection: "row",
alignItems: "center",
marginBottom: 10,
},
input: {
flex: 1,
borderColor: "#ccc",
borderWidth: 1,
borderRadius: 8,
padding: 10,
marginRight: 8,
  },
});
19 changes: 19 additions & 0 deletions app/screens/Feed.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import React from "react";
import { createNativeStackNavigator } from "@react-navigation/native-stack";
import ItemEditScreen from "./ItemEdit";
import ItemListScreen from "./ItemList";
import MainLayout from "./Layout";
import { Paragraph } from "react-native-paper";

//https://reactnavigation.org/docs/hello-react-navigation
const ItemStack = createNativeStackNavigator();

const ItemScreen = () => {
return (
<MainLayout>
<Paragraph>da</Paragraph>
</MainLayout>
);
}

export default ItemScreen;
16 changes: 8 additions & 8 deletions app/screens/Home.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import React, { useState } from "react";
import React from "react";
import { createNativeStackNavigator } from "@react-navigation/native-stack";
import ItemEditScreen from "./ItemEdit";
import ItemListScreen from "./ItemList";
import MainLayout from "./Layout";
import { Paragraph } from "react-native-paper";

const Stack = createNativeStackNavigator();

const HomeScreen = ({ navigation }: any) => {

const [data, setData] = useState<{ label: string, quantity: number }[]>();
//https://reactnavigation.org/docs/hello-react-navigation
const ItemStack = createNativeStackNavigator();

const ItemScreen = () => {
return (
<MainLayout>
<Paragraph>Hello!</Paragraph>
<Paragraph>da</Paragraph>
</MainLayout>
);
}

export default HomeScreen;
export default ItemScreen;
9 changes: 1 addition & 8 deletions app/screens/ItemEdit.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@ import React, { useState } from "react";
import { StyleProp, ViewStyle } from "react-native";
import { Button, TextInput } from "react-native-paper";
import MainLayout from "./Layout";
import { getFirestore, setDoc, doc, addDoc, collection } from 'firebase/firestore';

const inputStyle: StyleProp<ViewStyle> = {
alignSelf: 'stretch',
margin: 20
};

const db = getFirestore();

const ItemEditScreen = ({ navigation, route }: any) => {
const [item, setItem] = useState<{ label: string, quantity: number, id?: string }>(route.params?.item || {})
Expand All @@ -32,12 +30,7 @@ const ItemEditScreen = ({ navigation, route }: any) => {
/>

<Button mode="outlined" style={{ alignSelf: 'center' }}
onPress={async () => {
if (item.id) {
await setDoc(doc(db, 'items', item.id), { label: item.label, quantity: item.quantity });
} else {
await addDoc(collection(db, 'items'), item);
}
onPress={async () => {
navigation.navigate('ItemList');
}}
>Save</Button>
Expand Down
17 changes: 5 additions & 12 deletions app/screens/ItemList.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,15 @@
import React, { useEffect, useState } from "react";
import MainLayout from "./Layout";
import { getFirestore, onSnapshot, collection } from 'firebase/firestore';
import { Button, DataTable } from "react-native-paper";

const db = getFirestore();

const ItemListScreen = ({ navigation }: any) => {

const [data, setData] = useState<{ id?: string, label: string, quantity: number }[]>([]);
const [data, setData] = useState<{ id?: string, label: string, quantity: number }[]>([
{ id: '1', label: 'Apples', quantity: 5 },
{ id: '2', label: 'Bananas', quantity: 3 },
{ id: '3', label: 'Oranges', quantity: 7 }
]);

useEffect(() => {
const unsubscribe = onSnapshot(
collection(db, 'items'),
snapshot => {
setData(snapshot.docs.map(d => ({ ...d.data() as any, id: d.id })))
});
return () => unsubscribe();
}, [data]);
/**
https://callstack.github.io/react-native-paper/data-table.html
*/
Expand Down
26 changes: 3 additions & 23 deletions app/screens/Layout.tsx
Original file line number Diff line number Diff line change
@@ -1,42 +1,22 @@
import React, { useEffect, useState } from "react";
import AsyncStorage from '@react-native-async-storage/async-storage';
import { SafeAreaView } from "react-native-safe-area-context";
import { Appbar } from "react-native-paper";
import { ActivityIndicator, View } from "react-native";
import {
getAuth,
signOut
} from 'firebase/auth';
import { initializeApp } from "firebase/app";
import firebaseConfig from "../../firebase-config.json";
import { useNavigation } from "@react-navigation/native";

const app = initializeApp(firebaseConfig);
const auth = getAuth(app);

const MainLayout = ({ children }: any) => {

const [user, setUser] = useState<{ displayName: string, email: string }>();
const [user, setUser] = useState<{ displayName: string, email: string }>({displayName: 'Jane', email: 'jane@somewhere.com'});

const navigation = useNavigation() as any;

useEffect(() => {
const fetchUser = async () => {
const storedUser = await AsyncStorage.getItem('@user');
if (!!storedUser) {
setUser(JSON.parse(storedUser));
}
}
fetchUser();
}, [])

return (
user ? <SafeAreaView>
<Appbar.Header>
<Appbar.Content title={`Welcome, ${user.displayName || user.email}`} />
<Appbar.Action icon="logout" onPress={async () => { await signOut(auth); navigation.navigate('Login') }} />
<Appbar.Action icon="logout" onPress={async () => { navigation.navigate('Login') }} />
</Appbar.Header>
<View style={{ alignSelf: 'stretch', backgroundColor: 'pink', height: '80%', display: 'flex', flexDirection: 'column' }}>{children}</View>
<View style={{ alignSelf: 'stretch', backgroundColor: 'F5F938', height: '80%', display: 'flex', flexDirection: 'column' }}>{children}</View>

</SafeAreaView> :
<ActivityIndicator />
Expand Down
33 changes: 2 additions & 31 deletions app/screens/Login.tsx
Original file line number Diff line number Diff line change
@@ -1,34 +1,10 @@
import React, { useState } from "react";
import { initializeApp } from "firebase/app";
import firebaseConfig from "../../firebase-config.json";
import AsyncStorage from '@react-native-async-storage/async-storage';
import {
getAuth,
initializeAuth,
onAuthStateChanged,
signInWithEmailAndPassword,
// @ts-ignore
getReactNativePersistence
} from 'firebase/auth';
//@ts-ignore
import ReactNativeAsyncStorage from '@react-native-async-storage/async-storage';
import { StyleProp, View, ViewStyle } from "react-native";
import { Button, TextInput } from "react-native-paper";

const app = initializeApp(firebaseConfig);
const auth = getAuth(app);
auth.setPersistence(getReactNativePersistence(ReactNativeAsyncStorage));

const LoginScreen = ({ navigation }: any) => {

onAuthStateChanged(auth, user => {
if (user != null) {
AsyncStorage.setItem('@user', JSON.stringify(user))
.then(() => navigation.navigate('Main'));
} else {
console.log('User is signed out');
}
});
const LoginScreen = ({ navigation }: any) => {

const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
Expand All @@ -40,12 +16,7 @@ const LoginScreen = ({ navigation }: any) => {
};

const signIn = async () => {
try{
const signInResult = await signInWithEmailAndPassword(auth, email, password);
console.log('User signed in: ', signInResult)
} catch (error) {
console.log('Error signing in: ', error);
}
navigation.navigate('Main')
}

return (
Expand Down
Loading