123 lines
3.8 KiB
JavaScript
123 lines
3.8 KiB
JavaScript
import React, { createContext, useContext, useState, useEffect } from 'react';
|
|
import API_KEY from './apiKeys';
|
|
// 1. Criação do Contexto
|
|
const AuthContext = createContext(null);
|
|
|
|
// Hook customizado para facilitar o uso nos componentes
|
|
export function useAuth() {
|
|
const context = useContext(AuthContext);
|
|
if (!context) {
|
|
// Isso é crucial para evitar o erro "useAuth() is undefined"
|
|
throw new Error('useAuth must be used within an AuthProvider');
|
|
}
|
|
return context;
|
|
}
|
|
|
|
// O Provedor Principal
|
|
export function AuthProvider({ children }) {
|
|
const [accessToken, setAccessToken] = useState(null);
|
|
const [tokenType, setTokenType] = useState(null);
|
|
const [refreshToken, setRefreshToken] = useState(null);
|
|
|
|
// 🔑 Carrega o token do localStorage na inicialização
|
|
useEffect(() => {
|
|
// Essa lógica garante que o token permanece após o refresh da página
|
|
const storedToken = localStorage.getItem('access_token');
|
|
const storedTokenType = localStorage.getItem('token_type');
|
|
const storedRefreshToken = localStorage.getItem('refresh_token');
|
|
|
|
if (storedToken && storedTokenType) {
|
|
setAccessToken(storedToken);
|
|
setTokenType(storedTokenType);
|
|
// O refreshToken é essencial para a renovação futura
|
|
setRefreshToken(storedRefreshToken);
|
|
}
|
|
}, []);
|
|
|
|
// --- FUNÇÕES DE MUDANÇA (SET/CLEAR) ---
|
|
|
|
/**
|
|
* Função para salvar os tokens após um login ou renovação (refresh).
|
|
* @param {Object} tokenResponse O objeto completo retornado pelo Supabase Auth.
|
|
*/
|
|
const setAuthTokens = (tokenResponse) => {
|
|
console.log("TOKEN ADICIONADO")
|
|
|
|
if (tokenResponse && tokenResponse.access_token && tokenResponse.token_type) {
|
|
// 1. Atualiza o estado do React
|
|
setAccessToken(tokenResponse.access_token);
|
|
setTokenType(tokenResponse.token_type);
|
|
setRefreshToken(tokenResponse.refresh_token);
|
|
|
|
// 2. Persiste no localStorage (para não perder ao recarregar a página)
|
|
localStorage.setItem('access_token', tokenResponse.access_token);
|
|
localStorage.setItem('token_type', tokenResponse.token_type);
|
|
localStorage.setItem('refresh_token', tokenResponse.refresh_token);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Função para remover todos os tokens (Logout).
|
|
*/
|
|
const clearAuthTokens = () => {
|
|
setAccessToken(null);
|
|
setTokenType(null);
|
|
setRefreshToken(null);
|
|
// Remove do localStorage
|
|
localStorage.removeItem('access_token');
|
|
localStorage.removeItem('token_type');
|
|
localStorage.removeItem('refresh_token');
|
|
};
|
|
|
|
// --- FUNÇÕES DE USO (GET) ---
|
|
|
|
/**
|
|
* Retorna a string completa para o cabeçalho Authorization (ex: "Bearer <token>").
|
|
*/
|
|
const getAuthorizationHeader = () =>
|
|
accessToken && tokenType ? `${tokenType} ${accessToken}` : '';
|
|
|
|
// --- VALOR DO CONTEXTO ---
|
|
|
|
const RefreshingToken = () => {
|
|
console.log("refresh token", refreshToken)
|
|
var myHeaders = new Headers();
|
|
myHeaders.append("Content-Type", "application/json");
|
|
myHeaders.append("apikey", API_KEY)
|
|
|
|
var raw = JSON.stringify({
|
|
"refresh_token": refreshToken
|
|
});
|
|
|
|
var requestOptions = {
|
|
method: 'POST',
|
|
headers: myHeaders,
|
|
body: raw,
|
|
redirect: 'follow'
|
|
};
|
|
|
|
fetch(`https://yuanqfswhberkoevtmfr.supabase.co/auth/v1/token?grant_type=refresh_token`, requestOptions)
|
|
.then(response => response.json())
|
|
.then(result => setAuthTokens(result))
|
|
.catch(error => console.log('error', error));
|
|
}
|
|
|
|
const contextValue = {
|
|
accessToken,
|
|
tokenType,
|
|
refreshToken,
|
|
isAuthenticated: !!accessToken,
|
|
setAuthTokens, // Usado para CRIAR/MUDAR (Login/Refresh)
|
|
clearAuthTokens, // Usado para MUDAR (Logout)
|
|
getAuthorizationHeader, // Usado para PEGAR (Endpoints)
|
|
RefreshingToken
|
|
};
|
|
|
|
|
|
|
|
return (
|
|
<AuthContext.Provider value={contextValue}>
|
|
{children}
|
|
</AuthContext.Provider>
|
|
);
|
|
} |