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>
);
}