Skip to content

Instantly share code, notes, and snippets.

@bpetetot
Created September 22, 2019 14:56
Show Gist options
  • Select an option

  • Save bpetetot/94503a66e04359f1baacc011cc6ca111 to your computer and use it in GitHub Desktop.

Select an option

Save bpetetot/94503a66e04359f1baacc011cc6ca111 to your computer and use it in GitHub Desktop.
import firebase from 'firebase/app'
import React, { useState, useEffect, useContext } from 'react'
import { useStorage } from 'services/storage'
import { useNetwork } from 'services/network'
const AuthContext = React.createContext()
export const useAuth = () => useContext(AuthContext)
export const AuthProvider = ({ children }) => {
const [isAuthenticated, setIsAuthenticated] = useState()
const [user, setUser] = useState()
const [loading, setLoading] = useState(true)
const [token, setToken] = useStorage('token')
const { isOnline } = useNetwork()
useEffect(() => {
firebase.auth().onAuthStateChanged(async user => {
if (user) {
// User is signed in.
const { credential } = await firebase.auth().getRedirectResult()
if (credential) {
setToken(credential.accessToken)
}
// Call GitHub API to get user info
let username
const accessToken = (credential && credential.accessToken) || token
if (accessToken && isOnline) {
try {
const resp = await fetch('https://api.github.com/user', {
method: 'GET',
headers: {
'content-type': 'application/json',
Authorization: `token ${accessToken}`,
},
})
const data = await resp.json()
username = data.login
} catch (e) {
console.error('Unable to get https://api.github.com/user')
console.error(e)
}
}
setUser({
uid: user.uid,
displayName: user.displayName,
email: user.email,
photoURL: user.photoURL,
username,
token: accessToken,
})
setIsAuthenticated(true)
} else {
setToken(null)
setUser(null)
setIsAuthenticated(false)
}
setLoading(false)
})
}, []) // eslint-disable-line
const login = async () => {
const provider = new firebase.auth.GithubAuthProvider()
provider.addScope('repo')
await firebase.auth().signInWithRedirect(provider)
}
const logout = async () => {
setToken(null)
setUser(null)
setIsAuthenticated(false)
await firebase.auth().signOut()
}
return (
<AuthContext.Provider
value={{
isAuthenticated,
user,
loading,
login,
logout,
}}
>
{children}
</AuthContext.Provider>
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment