Skip to content

Commit 4fe66bb

Browse files
complete appwrite auth app
1 parent cd4c376 commit 4fe66bb

File tree

9 files changed

+689
-0
lines changed

9 files changed

+689
-0
lines changed

appwriteauth11/.env

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
APPWRITE_ENDPOINT='https://cloud.appwrite.io/v1'
2+
APPWRITE_PROJECT_ID='646b4406a3cd89842af0'
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { View, Text } from 'react-native'
2+
import React, { FC, createContext } from 'react'
3+
4+
import Appwrite from './service'
5+
import { PropsWithChildren } from 'react';
6+
import { useState } from 'react';
7+
8+
type AppContextType = {
9+
appwrite: Appwrite;
10+
isLoggedIn: boolean;
11+
setIsLoggedIn: (isLoggedIn: boolean) => void
12+
}
13+
14+
export const AppwriteContext = createContext<AppContextType>({
15+
appwrite: new Appwrite(),
16+
isLoggedIn: false,
17+
setIsLoggedIn: () => {}
18+
})
19+
20+
export const AppwriteProvider: FC<PropsWithChildren> = ({children}) => {
21+
const [isLoggedIn, setIsLoggedIn] = useState(false)
22+
const defaultValue = {
23+
appwrite: new Appwrite(),
24+
isLoggedIn,
25+
setIsLoggedIn,
26+
}
27+
return (
28+
<AppwriteContext.Provider value={defaultValue}>
29+
{children}
30+
</AppwriteContext.Provider>
31+
)
32+
}
33+
34+
export default AppwriteContext
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { ActivityIndicator, StyleSheet, Text, View } from 'react-native'
2+
import React from 'react'
3+
4+
const Loading = () => {
5+
return (
6+
<View style={styles.container}>
7+
<ActivityIndicator size="large" color="#1d9bf0" />
8+
<Text>Loading</Text>
9+
</View>
10+
)
11+
}
12+
13+
14+
const styles = StyleSheet.create({
15+
container: {
16+
flex: 1,
17+
alignItems: 'center',
18+
justifyContent: 'center'
19+
}
20+
})
21+
22+
export default Loading
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { StyleSheet, Text, View } from 'react-native'
2+
import React from 'react'
3+
import { createNativeStackNavigator} from '@react-navigation/native-stack'
4+
5+
import Home from '../screens/Home'
6+
7+
export type AppStackParamList = {
8+
Home: undefined;
9+
}
10+
11+
const Stack = createNativeStackNavigator<AppStackParamList>();
12+
13+
14+
export const AppStack = () => {
15+
return (
16+
<Stack.Navigator
17+
screenOptions={{
18+
headerTitleAlign:'center',
19+
headerBackTitleVisible: false
20+
}}
21+
>
22+
<Stack.Screen name='Home' component={Home} />
23+
</Stack.Navigator>
24+
)
25+
}
26+
27+
28+
29+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { StyleSheet, Text, View } from 'react-native'
2+
import React from 'react'
3+
import { createNativeStackNavigator} from '@react-navigation/native-stack'
4+
5+
import Signup from '../screens/Signup'
6+
import Login from '../screens/Login'
7+
8+
export type AuthStackParamList = {
9+
Login: undefined;
10+
Signup: undefined;
11+
}
12+
13+
const Stack = createNativeStackNavigator<AuthStackParamList>();
14+
15+
16+
export const AuthStack = () => {
17+
return (
18+
<Stack.Navigator
19+
screenOptions={{
20+
headerTitleAlign: 'center',
21+
headerBackTitleVisible: false,
22+
}}>
23+
<Stack.Screen name="Login" component={Login} />
24+
<Stack.Screen name="Signup" component={Signup} />
25+
</Stack.Navigator>
26+
);
27+
}
28+
29+
30+
31+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { View, Text } from 'react-native'
2+
import React, { useContext, useEffect, useState } from 'react'
3+
import {NavigationContainer} from '@react-navigation/native'
4+
5+
import {AppwriteContext} from '../appwrite/AppwriteContext';
6+
import Loading from '../components/Loading';
7+
8+
//Routes
9+
import { AppStack } from './AppStack';
10+
import { AuthStack } from './AuthStack';
11+
12+
13+
14+
export const Router = () => {
15+
const [isLoading, setIsLoading] = useState<boolean>(true)
16+
const {appwrite, isLoggedIn,setIsLoggedIn} = useContext(AppwriteContext)
17+
18+
useEffect(() => {
19+
appwrite
20+
.getCurrentUser()
21+
.then(response => {
22+
setIsLoading(false)
23+
if (response) {
24+
setIsLoggedIn(true)
25+
}
26+
})
27+
.catch(_ => {
28+
setIsLoading(false)
29+
setIsLoggedIn(false)
30+
})
31+
}, [appwrite, setIsLoggedIn])
32+
33+
if (isLoading) {
34+
return <Loading />
35+
}
36+
37+
return (
38+
<NavigationContainer>
39+
{isLoggedIn ? <AppStack /> : <AuthStack/> }
40+
</NavigationContainer>
41+
)
42+
}
43+
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import { StyleSheet, Text, View, SafeAreaView, Image } from 'react-native'
2+
import React, { useContext, useState, useEffect } from 'react'
3+
//react native elements
4+
import { FAB } from '@rneui/themed'
5+
//Snackbar
6+
import Snackbar from 'react-native-snackbar'
7+
8+
//context API
9+
import {AppwriteContext} from '../appwrite/AppwriteContext'
10+
11+
type UserObj = {
12+
name: String;
13+
email: String;
14+
}
15+
16+
17+
18+
const Home = () => {
19+
const [userData, setUserData] = useState<UserObj>()
20+
const {appwrite, setIsLoggedIn} = useContext(AppwriteContext)
21+
22+
const handleLogout = () => {
23+
appwrite.logout()
24+
.then(() => {
25+
setIsLoggedIn(false);
26+
Snackbar.show({
27+
text: 'Logout Successful',
28+
duration: Snackbar.LENGTH_SHORT
29+
})
30+
})
31+
}
32+
33+
useEffect(() => {
34+
appwrite.getCurrentUser()
35+
.then(response => {
36+
if (response) {
37+
const user: UserObj = {
38+
name: response.name,
39+
email: response.email
40+
}
41+
setUserData(user)
42+
}
43+
})
44+
}, [appwrite])
45+
46+
47+
48+
return (
49+
<SafeAreaView style={styles.container}>
50+
<View style={styles.welcomeContainer}>
51+
<Image
52+
source={{
53+
uri: 'https://appwrite.io/images-ee/blog/og-private-beta.png',
54+
width: 400,
55+
height: 300,
56+
cache: 'default',
57+
}}
58+
resizeMode="contain"
59+
/>
60+
<Text style={styles.message}>
61+
Build Fast. Scale Big. All in One Place.
62+
</Text>
63+
{userData && (
64+
<View style={styles.userContainer}>
65+
<Text style={styles.userDetails}>Name: {userData.name}</Text>
66+
<Text style={styles.userDetails}>Email: {userData.email}</Text>
67+
</View>
68+
)}
69+
</View>
70+
<FAB
71+
placement="right"
72+
color="#f02e65"
73+
size="large"
74+
title="Logout"
75+
icon={{name: 'logout', color: '#FFFFFF'}}
76+
onPress={handleLogout}
77+
/>
78+
</SafeAreaView>
79+
);
80+
81+
}
82+
83+
const styles = StyleSheet.create({
84+
container: {
85+
flex: 1,
86+
backgroundColor: '#0B0D32',
87+
},
88+
welcomeContainer: {
89+
padding: 12,
90+
91+
flex: 1,
92+
alignItems: 'center',
93+
},
94+
message: {
95+
fontSize: 26,
96+
fontWeight: '500',
97+
color: '#FFFFFF',
98+
},
99+
userContainer: {
100+
marginTop: 24,
101+
},
102+
userDetails: {
103+
fontSize: 20,
104+
color: '#FFFFFF',
105+
},
106+
});
107+
108+
export default Home

0 commit comments

Comments
 (0)