Created
March 5, 2020 17:44
-
-
Save bogoslavskiy/721f4683888a547c3168bdec6c4b8e70 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React from 'react'; | |
import { AsyncStorage } from 'react-native'; | |
import UUID from 'uuid-random'; | |
import { useApolloClient } from '@apollo/client'; | |
type User = { | |
_id: string; | |
name: string; | |
} | |
type AuthContextState = { | |
login: (name: string) => void; | |
logout: () => void; | |
setUser: (user: User) => void; | |
user: User; | |
}; | |
export const AuthContext = React.createContext<AuthContextState>(null); | |
export const useUser = (): User => { | |
const { user } = React.useContext(AuthContext); | |
return user; | |
}; | |
export const AuthProvider: React.FC = ({ children }) => { | |
const [userState, setUserState] = React.useState<User>(); | |
const client = useApolloClient(); | |
const setUser = React.useCallback((user: User) => { | |
setUserState(user); | |
}, []); | |
const login = React.useCallback(async (name: string) => { | |
const user = { _id: UUID(), name }; | |
await setUserToStorage(user); | |
setUserState(user); | |
}, []); | |
const logout = React.useCallback(async () => { | |
try { | |
await client.resetStore(); | |
await clearUserFromStorage(); | |
setUserState(null); | |
} catch (err) { | |
console.error(err); | |
} | |
}, []); | |
return ( | |
<AuthContext.Provider value={{ user: userState, setUser, login, logout }}> | |
{children} | |
</AuthContext.Provider> | |
); | |
}; | |
let user: User | null = null; | |
export const getUserFromStorage = async () => { | |
if (user) { | |
return user; | |
} | |
try { | |
const savedUser = await AsyncStorage.getItem('User'); | |
if (savedUser) { | |
user = JSON.parse(savedUser); | |
return user!; | |
} | |
return null; | |
} catch (err) { | |
return null; | |
} | |
}; | |
export const setUserToStorage = async (userObj: User) => { | |
try { | |
await AsyncStorage.setItem('User', JSON.stringify(userObj)); | |
user = userObj; | |
return true; | |
} catch(err) { | |
return false; | |
} | |
}; | |
export const clearUserFromStorage = async () => { | |
await AsyncStorage.removeItem('User'); | |
user = null; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment