Skip to content

Instantly share code, notes, and snippets.

@bogoslavskiy
Created March 5, 2020 17:44
Show Gist options
  • Save bogoslavskiy/721f4683888a547c3168bdec6c4b8e70 to your computer and use it in GitHub Desktop.
Save bogoslavskiy/721f4683888a547c3168bdec6c4b8e70 to your computer and use it in GitHub Desktop.
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