{ // children = todos os componentes que vão ficar dentro do Provider // 4️⃣ DADOS QUE QUEREMOS COMPARTILHAR const authState = { user: null, // usuário logado (null = ninguém logado) loading: false, // está carregando? (false = não) error: null // algum erro? (null = nenhum erro) }; // 5️⃣ RETORNAR O PROVIDER CO"> { // children = todos os componentes que vão ficar dentro do Provider // 4️⃣ DADOS QUE QUEREMOS COMPARTILHAR const authState = { user: null, // usuário logado (null = ninguém logado) loading: false, // está carregando? (false = não) error: null // algum erro? (null = nenhum erro) }; // 5️⃣ RETORNAR O PROVIDER CO"> { // children = todos os componentes que vão ficar dentro do Provider // 4️⃣ DADOS QUE QUEREMOS COMPARTILHAR const authState = { user: null, // usuário logado (null = ninguém logado) loading: false, // está carregando? (false = não) error: null // algum erro? (null = nenhum erro) }; // 5️⃣ RETORNAR O PROVIDER CO">
// 1️⃣ IMPORTS - O que precisamos do React
import { createContext, useContext, ReactNode } from 'react';
// createContext: função para criar um contexto
// useContext: hook para consumir um contexto
// ReactNode: tipo TypeScript que representa qualquer coisa renderizável no React
// 2️⃣ CRIAR O CONTEXT - É como criar uma "caixa" vazia
const AuthContext = createContext(undefined);
// createContext(undefined) = cria um contexto sem valor inicial
// AuthContext agora é um objeto que pode compartilhar dados
// 3️⃣ CRIAR O PROVIDER - Componente que vai "fornecer" os dados
export const AuthProvider = ({ children }: { children: ReactNode }) => {
// children = todos os componentes que vão ficar dentro do Provider
// 4️⃣ DADOS QUE QUEREMOS COMPARTILHAR
const authState = {
user: null, // usuário logado (null = ninguém logado)
loading: false, // está carregando? (false = não)
error: null // algum erro? (null = nenhum erro)
};
// 5️⃣ RETORNAR O PROVIDER COM OS DADOS
return (
<AuthContext.Provider value={authState}>
{/* value={authState} = coloca os dados dentro da "caixa" */}
{children}
{/* children = renderiza todos os componentes filhos */}
</AuthContext.Provider>
);
};
// 6️⃣ CRIAR O HOOK CUSTOMIZADO - Facilita o uso do contexto
export const useAuth = () => {
// 7️⃣ PEGAR O VALOR DO CONTEXTO
const context = useContext(AuthContext);
// useContext(AuthContext) = abre a "caixa" e pega o que tem dentro
// 8️⃣ VERIFICAÇÃO DE SEGURANÇA
if (!context) {
// Se context for undefined, significa que useAuth foi chamado
// fora do AuthProvider (erro de uso)
throw new Error('useAuth deve ser usado dentro de um <AuthProvider>');
}
// 9️⃣ RETORNAR OS DADOS
return context;
// Retorna o authState que foi colocado no value do Provider
};
/*
FLUXO COMPLETO:
1. AuthProvider envolve a aplicação
2. AuthProvider coloca authState no contexto
3. Componentes filhos chamam useAuth()
4. useAuth() pega os dados do contexto
5. Componentes recebem os dados e podem usar
EXEMPLO:
<AuthProvider> // authState disponível aqui ↓
<App> // pode usar useAuth() ✓
<Header /> // pode usar useAuth() ✓
<Main> // pode usar useAuth() ✓
<LoginButton /> // pode usar useAuth() ✓
</Main>
</App>
</AuthProvider>
<OutroComponente /> // NÃO pode usar useAuth() ✗
*/