Skip to content
Snippets Groups Projects
OAuthPopup.tsx 1.33 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { useEffect } from "react";
    import { OAUTH_RESPONSE_MESSAGE_TYPE, OAUTH_STATE_STORAGE_KEY } from "../../commons/costants";
    
    const checkState = (receivedState: string) => {
      const state = sessionStorage.getItem(OAUTH_STATE_STORAGE_KEY);
      console.log("received:", receivedState, "expceted:", state);
      return state === receivedState;
    }
    
    const queryToObject = (query: string) => {
      const parameters = new URLSearchParams(query);
      return Object.fromEntries(parameters.entries());
    }
    
    export const OAuthPopup = () => {
      useEffect(() => {
        const payload = queryToObject(window.location.search.split("?")[1])
        const state = payload && payload.state;
        const error = payload && payload.error;
        
        if (!window.opener) {
          throw new Error("No window opener");
        }
    
        if (error) {
          window.opener.postMessage({
            type: OAUTH_RESPONSE_MESSAGE_TYPE,
            error: decodeURI(error) || "OAuth error: An error has occured."
          });
        } else if (state && checkState(state)) {
          window.opener.postMessage({
            type: OAUTH_RESPONSE_MESSAGE_TYPE,
            payload
          })
        } else {
          window.opener.postMessage({
            type: OAUTH_RESPONSE_MESSAGE_TYPE,
            error: "OAuth error: State mismatch."
          });
        }
      }, []);
    
      return (
        <div className="font-lg mx-auto mt-10">
          Loading...
        </div>
      );
    }