/* * Copyright (c) 2021-2026 ahriman team. * * This file is part of ahriman * (see https://github.com/arcan1s/ahriman). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import { AuthContext } from "contexts/AuthContext"; import { useClient } from "hooks/useClient"; import React, { type ReactNode, useCallback, useMemo, useState } from "react"; export function AuthProvider({ children }: { children: ReactNode }): React.JSX.Element { const client = useClient(); const [state, setState] = useState({ enabled: false, username: null as string | null }); const login = useCallback(async (username: string, password: string) => { await client.login({ username, password }); setState(prev => ({ ...prev, username })); }, [client]); const doLogout = useCallback(async () => { await client.logout(); setState(prev => ({ ...prev, username: null })); }, [client]); const isAuthorized = useMemo(() => !state.enabled || state.username !== null, [state.enabled, state.username]); const value = useMemo(() => ({ ...state, isAuthorized, setAuthState: setState, login, logout: doLogout, }), [state, isAuthorized, login, doLogout]); return ( {children} ); }