57 lines
1.3 KiB
TypeScript
57 lines
1.3 KiB
TypeScript
import { useCallback, useState, type FC, type ReactNode } from "react";
|
|
import { OAuthContext } from ".";
|
|
import { codeApi } from "@/api/code";
|
|
|
|
interface IOAuthProvider {
|
|
children: ReactNode;
|
|
}
|
|
|
|
export const OAuthProvider: FC<IOAuthProvider> = ({ children }) => {
|
|
const [active, setActive] = useState(false);
|
|
const [clientID, setClientID] = useState("");
|
|
const [redirectURI, setRedirectURI] = useState("");
|
|
const [scope, setScope] = useState<string[]>([]);
|
|
const [state, setState] = useState("");
|
|
const [nonce, setNonce] = useState("");
|
|
|
|
const selectSession = useCallback(
|
|
async (token: string) => {
|
|
if (active && redirectURI) {
|
|
const codeResponse = await codeApi(token, nonce);
|
|
|
|
console.log("gen code:", { codeResponse });
|
|
|
|
const params = new URLSearchParams({
|
|
code: codeResponse.code,
|
|
state,
|
|
});
|
|
|
|
window.location.replace(`${redirectURI}?${params.toString()}`);
|
|
}
|
|
},
|
|
[active, nonce, redirectURI, state]
|
|
);
|
|
|
|
return (
|
|
<OAuthContext.Provider
|
|
value={{
|
|
active,
|
|
clientID,
|
|
redirectURI,
|
|
scope,
|
|
state,
|
|
nonce,
|
|
setActive,
|
|
setClientID,
|
|
setRedirectURI,
|
|
setScope,
|
|
setState,
|
|
setNonce,
|
|
selectSession,
|
|
}}
|
|
>
|
|
{children}
|
|
</OAuthContext.Provider>
|
|
);
|
|
};
|