ログアウトした場合に、ログイン情報が状態管理に残ったままだったので、リスナー関数でログイン情報をクリアするように修正します。
app/components/supabase-listener.tsx
'use client'
import { useEffect } from 'react'
import { useRouter } from 'next/navigation'
import { useSupabase } from './supabase-provider'
import useStore from '../../store'
// ユーザーがログインまたはログアウトするたびに新しいセッションを取得する
const SupabaseListener = ({ serverAccessToken }: { serverAccessToken?: string }) => {
const router = useRouter()
const { setUser } = useStore()
const { supabase } = useSupabase()
useEffect(() => {
// セッション情報取得
const getSession = async () => {
const { data } = await supabase.auth.getSession()
// ↓変更
// ユーザーIDにとメールアドレスを状態管理に設定
setUser({
id: data.session ? data.session.user.id : '',
email: data.session ? data.session.user.email : '',
})
// ↑変更
}
// リフレッシュ時にセッション情報取得
getSession()
// ログイン、ログアウトした時に認証状態を監視
const {
data: { subscription },
} = supabase.auth.onAuthStateChange((event, session) => {
setUser({ id: session?.user.id, email: session?.user.email })
// アクセストークンチェック
if (session?.access_token !== serverAccessToken) {
// キャッシュクリア
router.refresh()
}
})
return () => {
subscription.unsubscribe()
}
}, [serverAccessToken, router, supabase])
return null
}
export default SupabaseListener
これでログアウトしたら、状態がクリアされるようになりました。