Auth Context Pattern

Provider Component and Custom Hook

Example

A common real-world pattern: one provider component owns the state, a custom hook reads it.

import { createContext, useContext, useState } from 'react';

const AuthContext = createContext(null);

function AuthProvider({ children }) {
  const [user, setUser] = useState(null);
  const login = (name) => setUser({ name });
  const logout = () => setUser(null);
  return <AuthContext.Provider value={{ user, login, logout }}>{children}</AuthContext.Provider>;
}

function useAuth() {
  return useContext(AuthContext);
}

function Header() {
  const { user, login, logout } = useAuth();
  return user
    ? <p>Hi {user.name} <button onClick={logout}>Logout</button></p>
    : <button onClick={() => login('Asha')}>Login</button>;
}

export default function App() {
  return <AuthProvider><Header /></AuthProvider>;
}

Result

When to Use Context

  • Good for data needed by many components: theme, user, language, cart.
  • Every consumer re-renders when the value changes; split big contexts (AuthContext, ThemeContext) and memoize the value object.
  • For large, frequently changing global state, consider Redux or Zustand (see Advance → Redux).