parent
68f012ba62
commit
50914f289d
@ -1,40 +1,71 @@ |
||||
import React, { useState, useContext, createContext } from "react"; |
||||
|
||||
export interface AuthContextState { |
||||
loggedIn: boolean; |
||||
loginFailed: boolean; |
||||
login: (pass?: string) => void; |
||||
interface LoggedInState { |
||||
loggedIn: true; |
||||
headers: HeadersInit; |
||||
logout(): void; |
||||
} |
||||
|
||||
const DEFAULT_STATE: AuthContextState = { |
||||
loggedIn: false, |
||||
loginFailed: false, |
||||
login: () => console.error("No parent AuthContext found!"), |
||||
}; |
||||
interface LoggedOutState { |
||||
loggedIn: false; |
||||
login(password: string): Promise<boolean>; |
||||
} |
||||
|
||||
const AuthContext: React.Context<AuthContextState> = createContext( |
||||
DEFAULT_STATE |
||||
); |
||||
export type AuthState = LoggedInState | LoggedOutState; |
||||
|
||||
const password = "bubbles"; |
||||
const AuthContext = createContext({ |
||||
loggedIn: false, |
||||
login: () => { |
||||
throw new Error("No parent AuthContext found!"); |
||||
}, |
||||
} as AuthState); |
||||
|
||||
export const AuthProvider: React.FC = (props) => { |
||||
const [loggedIn, setLoggedIn] = useState(false); |
||||
const [loginFailed, setLoginFailed] = useState(false); |
||||
const [headers, setHeaders] = useState<HeadersInit | undefined>(); |
||||
|
||||
function logout() { |
||||
setLoggedIn(false); |
||||
setHeaders(undefined); |
||||
} |
||||
|
||||
function login(pass?: string): void { |
||||
if (pass === password) { |
||||
async function login(password: string): Promise<boolean> { |
||||
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) { |
||||
setLoggedIn(true); |
||||
setLoginFailed(false); |
||||
setHeaders(newHeaders); |
||||
return true; |
||||
} else { |
||||
setLoggedIn(false); |
||||
setLoginFailed(true); |
||||
logout(); |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
return ( |
||||
<AuthContext.Provider value={{ loggedIn, login, loginFailed }} {...props} /> |
||||
<AuthContext.Provider |
||||
value={ |
||||
loggedIn && headers != null |
||||
? { loggedIn, headers, logout } |
||||
: { loggedIn: false, login } |
||||
} |
||||
{...props} |
||||
/> |
||||
); |
||||
}; |
||||
|
||||
export const useAuth = () => useContext(AuthContext); |
||||
export function useAuth(): AuthState { |
||||
return useContext(AuthContext); |
||||
} |
||||
|
Loading…
Reference in new issue