Déplacement des providers dans un dossier dédié
This commit is contained in:
77
client/components/providers/LoginProvider.tsx
Normal file
77
client/components/providers/LoginProvider.tsx
Normal file
@ -0,0 +1,77 @@
|
||||
import { Href, useRouter } from 'expo-router'
|
||||
import { useRouteInfo } from 'expo-router/build/hooks'
|
||||
import { ReactNode, useEffect } from 'react'
|
||||
import { useAuth, useAuthLogin } from '@/hooks/useAuth'
|
||||
import * as SecureStore from '@/utils/SecureStore'
|
||||
import { useLoginMutation } from '@/hooks/mutations/useLoginMutation'
|
||||
import { useGame, useSetPlayerId } from '@/hooks/useGame'
|
||||
|
||||
type Props = {
|
||||
loginRedirect: Href
|
||||
children: ReactNode
|
||||
}
|
||||
|
||||
export default function LoginProvider({ loginRedirect, children }: Props) {
|
||||
const router = useRouter()
|
||||
const route = useRouteInfo()
|
||||
const auth = useAuth()
|
||||
const authLogin = useAuthLogin()
|
||||
const loginMutation = useLoginMutation({
|
||||
authLogin,
|
||||
onError: ({ response }) => {
|
||||
if (response)
|
||||
authLogin({ name: auth.name ?? "", password: null, token: null })
|
||||
else
|
||||
authLogin({ name: auth.name ?? "", token: null })
|
||||
}
|
||||
})
|
||||
const game = useGame()
|
||||
const setPlayerId = useSetPlayerId()
|
||||
|
||||
useEffect(() => {
|
||||
(async () => {
|
||||
const storedName = await SecureStore.getItemAsync('apiName')
|
||||
const storedToken = await SecureStore.getItemAsync('apiToken')
|
||||
if (!auth.loggedIn && storedName !== null && storedName !== auth.name && storedToken !== auth.token) {
|
||||
authLogin({ name: storedName, token: storedToken })
|
||||
return
|
||||
}
|
||||
|
||||
// Si on est pas connecté⋅e, on reste sur la fenêtre de connexion
|
||||
if ((!auth.loggedIn || !auth.token) && route.pathname !== loginRedirect)
|
||||
router.navigate(loginRedirect)
|
||||
})()
|
||||
}, [auth, authLogin, router, route])
|
||||
|
||||
useEffect(() => {
|
||||
// Renouvellement auto du jeton d'authentification
|
||||
const { name, token } = auth
|
||||
const password = SecureStore.getItem('apiPassword')
|
||||
if (name === null || (password === null && token === null))
|
||||
return
|
||||
let waitTime = 0
|
||||
if (token !== null && token !== undefined) {
|
||||
const arrayToken = token.split('.')
|
||||
const tokenPayload = JSON.parse(atob(arrayToken[1]))
|
||||
const expTime: number = tokenPayload.exp * 1000
|
||||
const now: number = Math.floor(new Date().getTime())
|
||||
waitTime = expTime - now
|
||||
|
||||
const playerId = tokenPayload.playerId
|
||||
if (playerId !== game.playerId)
|
||||
setPlayerId(playerId)
|
||||
}
|
||||
const timeout = setTimeout(async () => {
|
||||
const password = SecureStore.getItem('apiPassword')
|
||||
if (password)
|
||||
loginMutation.mutate({ name, password })
|
||||
else
|
||||
authLogin({ name: name, token: null })
|
||||
}, waitTime)
|
||||
return () => clearTimeout(timeout)
|
||||
}, [auth, authLogin, game, setPlayerId])
|
||||
|
||||
return <>
|
||||
{children}
|
||||
</>
|
||||
}
|
Reference in New Issue
Block a user