How to use Supabase auth with React Context
Expose supabase with createClient
useSupabase.ts
import { createClient } from '@supabase/supabase-js'const supabaseUrl = process.env.SUPABASE_URL
const supabaseAnonKey = process.env.SUPABASE_ANON_KEYexport const supabase = createClient(supabaseUrl!, supabaseAnonKey!)export const signIn = async () => {
await supabase.auth.signInWithOAuth({
provider: 'twitter'
});
}export const signOut = async () => {
await supabase.auth.signOut();
}{ await supabase.auth.signInWithOAuth({ provider: ‘twitter’ }); } export const signOut = async () => { await supabase.auth.signOut(); }” tabindex=”0" role=”button” style=”box-sizing: border-box; position: relative; display: inline-block; padding: 0px !important; font-size: 14px; font-weight: var( — base-text-weight-medium, 500); line-height: 20px; white-space: nowrap; vertical-align: middle; cursor: pointer; user-select: none; border-width: 1px; border-style: solid; border-color: var( — button-default-borderColor-rest, var( — color-btn-border)); border-image: initial; border-radius: 6px; appearance: none; color: var( — button-default-fgColor-rest, var( — color-btn-text)); background-color: var( — button-default-bgColor-rest, var( — color-btn-bg)); box-shadow: var( — button-default-shadow-resting, var( — color-btn-shadow)),var( — button-default-shadow-inset, var( — color-btn-inset-shadow)); transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color, box-shadow, border-color; margin: var( — base-size-8, 8px) !important;”>
Wrap auth state in React Context
AuthProvider.tsx
import React, { useContext, createContext, useState, useEffect } from 'react'
import { Session, User } from '@supabase/supabase-js'
import { supabase } from './useSupabase'interface AuthProviderProps {
children: React.ReactNode
}type AuthContextType = {
session: Session | null,
user: User | null
}const AuthContext = createContext<AuthContextType>({
session: null,
user: null
})const AuthProvider = (props: AuthProviderProps) => {
const [user, setUser] = useState<User | null>(null)
const [session, setSession] = useState<Session | null>(null)
const [loading, setLoading] = useState<boolean>(true) useEffect(() => {
const { data: listener } = supabase.auth.onAuthStateChange((_event, session) => {
setSession(session)
setUser(session?.user || null)
setLoading(false)
}) const setData = async () => {
const { data : {session}, error } = await supabase.auth.getSession()
if (error) {
throw error
} setSession(session)
setUser(session?.user || null)
setLoading(false)
} setData()
return () => {
listener?.subscription.unsubscribe()
}
}, []) const value = {
session,
user
} return (
<AuthContext.Provider value={value}>
{props.children}
</AuthContext.Provider>
)
}export const useAuth = () => {
return useContext(AuthContext)
}export default AuthProvider





