import React, { useState, useContext, createContext } from "react"; interface AuthState { loggedIn: boolean; login: (password: string) => Promise; logout: () => void; headers?: HeadersInit; } const AuthContext = createContext({ loggedIn: false, login: () => Promise.resolve(false), logout: () => console.error("No parent AuthContext found!"), }); export const AuthProvider: React.FC = ({ children }) => { const [headers, setHeaders] = useState(); const logout = () => setHeaders(undefined); const login = async (password: string): Promise => { const username = process.env.NEXT_PUBLIC_EDITOR_USERNAME; if (!username) { throw new Error( "Missing NEXT_PUBLIC_EDITOR_USERNAME environment variable" ); } const newHeaders = { Authorization: `CustomBasic ${btoa(`${username}:${password}`)}`, }; const res = await fetch("/api/editor/links", { headers: newHeaders }); if (res.status === 200) { setHeaders(newHeaders); return true; } else { logout(); return false; } }; return ( {children} ); }; export function useAuth(): AuthState { return useContext(AuthContext); }