├── assets ├── icon.png ├── favicon.png └── splash.png ├── babel.config.js ├── .expo-shared └── assets.json ├── .gitignore ├── app.json ├── database └── firebase.js ├── package.json ├── App.js └── screens ├── UsersList.js ├── CreateUserScreen.js └── UserDetailScreen.js /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FaztWeb/expo-firebase-crud/HEAD/assets/icon.png -------------------------------------------------------------------------------- /assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FaztWeb/expo-firebase-crud/HEAD/assets/favicon.png -------------------------------------------------------------------------------- /assets/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FaztWeb/expo-firebase-crud/HEAD/assets/splash.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | return { 4 | presets: ['babel-preset-expo'], 5 | }; 6 | }; 7 | -------------------------------------------------------------------------------- /.expo-shared/assets.json: -------------------------------------------------------------------------------- 1 | { 2 | "12bb71342c6255bbf50437ec8f4441c083f47cdb74bd89160c15e4f43e52a1cb": true, 3 | "40b842e832070c58deac6aa9e08fa459302ee3f9da492c7e77d93d2fbf4a56fd": true 4 | } 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/**/* 2 | .expo/* 3 | npm-debug.* 4 | *.jks 5 | *.p8 6 | *.p12 7 | *.key 8 | *.mobileprovision 9 | *.orig.* 10 | web-build/ 11 | 12 | # macOS 13 | .DS_Store 14 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "expo-firebase-crud", 4 | "slug": "expo-firebase-crud", 5 | "version": "1.0.0", 6 | "orientation": "portrait", 7 | "icon": "./assets/icon.png", 8 | "splash": { 9 | "image": "./assets/splash.png", 10 | "resizeMode": "contain", 11 | "backgroundColor": "#ffffff" 12 | }, 13 | "updates": { 14 | "fallbackToCacheTimeout": 0 15 | }, 16 | "assetBundlePatterns": [ 17 | "**/*" 18 | ], 19 | "ios": { 20 | "supportsTablet": true 21 | }, 22 | "web": { 23 | "favicon": "./assets/favicon.png" 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/firebase.js: -------------------------------------------------------------------------------- 1 | import firebase from "firebase"; 2 | import "firebase/firestore"; 3 | 4 | var firebaseConfig = { 5 | apiKey: "AIzaSyBJqKyzEvnQFKQc-y4K31zbgj9rssXHz4Y", 6 | authDomain: "react-native-97bfa.firebaseapp.com", 7 | databaseURL: "https://react-native-97bfa.firebaseio.com", 8 | projectId: "react-native-97bfa", 9 | storageBucket: "react-native-97bfa.appspot.com", 10 | messagingSenderId: "961930425654", 11 | appId: "1:961930425654:web:cdbde3f2ff278ed214ef97", 12 | }; 13 | 14 | // Initialize Firebase 15 | firebase.initializeApp(firebaseConfig); 16 | 17 | const db = firebase.firestore(); 18 | 19 | export default { 20 | firebase, 21 | db 22 | }; 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": "node_modules/expo/AppEntry.js", 3 | "scripts": { 4 | "start": "expo start", 5 | "android": "expo start --android", 6 | "ios": "expo start --ios", 7 | "web": "expo start --web", 8 | "eject": "expo eject" 9 | }, 10 | "dependencies": { 11 | "@react-native-community/masked-view": "0.1.10", 12 | "@react-navigation/native": "^5.8.0", 13 | "@react-navigation/stack": "^5.10.0", 14 | "expo": "~39.0.2", 15 | "expo-status-bar": "~1.0.2", 16 | "firebase": "^8.0.0", 17 | "react": "16.13.1", 18 | "react-dom": "16.13.1", 19 | "react-native": "https://github.com/expo/react-native/archive/sdk-39.0.4.tar.gz", 20 | "react-native-elements": "^3.0.0-alpha.1", 21 | "react-native-gesture-handler": "~1.7.0", 22 | "react-native-reanimated": "~1.13.0", 23 | "react-native-safe-area-context": "3.1.4", 24 | "react-native-screens": "~2.10.1", 25 | "react-native-web": "~0.13.12" 26 | }, 27 | "devDependencies": { 28 | "@babel/core": "~7.9.0" 29 | }, 30 | "private": true 31 | } 32 | -------------------------------------------------------------------------------- /App.js: -------------------------------------------------------------------------------- 1 | import { StatusBar } from "expo-status-bar"; 2 | import React from "react"; 3 | import { StyleSheet } from "react-native"; 4 | 5 | // Navigation 6 | import { NavigationContainer } from "@react-navigation/native"; 7 | import { createStackNavigator } from "@react-navigation/stack"; 8 | 9 | // Components 10 | import CreateUserScreen from "./screens/CreateUserScreen"; 11 | import UserDetailScreen from "./screens/UserDetailScreen"; 12 | import UsersList from "./screens/UsersList"; 13 | 14 | const Stack = createStackNavigator(); 15 | 16 | function MyStack() { 17 | return ( 18 | 29 | 34 | 39 | 44 | 45 | ); 46 | } 47 | 48 | export default function App() { 49 | return ( 50 | 51 | 52 | 53 | ); 54 | } 55 | 56 | const styles = StyleSheet.create({ 57 | container: { 58 | flex: 1, 59 | backgroundColor: "#fff", 60 | alignItems: "center", 61 | justifyContent: "center", 62 | }, 63 | }); 64 | -------------------------------------------------------------------------------- /screens/UsersList.js: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react"; 2 | import { Button, StyleSheet } from "react-native"; 3 | import { ListItem, Avatar } from "react-native-elements"; 4 | import { ScrollView } from "react-native-gesture-handler"; 5 | 6 | import firebase from "../database/firebase"; 7 | 8 | const UserScreen = (props) => { 9 | const [users, setUsers] = useState([]); 10 | 11 | useEffect(() => { 12 | firebase.db.collection("users").onSnapshot((querySnapshot) => { 13 | const users = []; 14 | querySnapshot.docs.forEach((doc) => { 15 | const { name, email, phone } = doc.data(); 16 | users.push({ 17 | id: doc.id, 18 | name, 19 | email, 20 | phone, 21 | }); 22 | }); 23 | setUsers(users); 24 | }); 25 | }, []); 26 | 27 | return ( 28 | 29 |