sparkletown/sparkle

View on GitHub
src/components/atoms/AdminRestricted/AdminRestricted.tsx

Summary

Maintainability
A
1 hr
Test Coverage
import React from "react";
import { useFirebase } from "react-redux-firebase";
import { useHistory } from "react-router-dom";
import { useAsyncFn } from "react-use";

import {
  DEFAULT_SPACE_SLUG,
  DEFAULT_WORLD_SLUG,
  DISABLED_DUE_TO_1324,
} from "settings";

import {
  generateAttendeeInsideUrl,
  generateAttendeeSpaceLandingUrl,
} from "utils/url";

import { useIsAdminUser } from "hooks/roles";
import { useSpaceParams } from "hooks/spaces/useSpaceParams";
import { useUser } from "hooks/useUser";

import { ButtonNG } from "components/atoms/ButtonNG";
import { SparkleLogo } from "components/atoms/SparkleLogo";

import SHAPE_DENIED from "assets/images/access-forbidden.svg";

import "./AdminRestricted.scss";

export const AdminRestricted: React.FC = ({ children }) => {
  const firebase = useFirebase();
  const history = useHistory();
  const { worldSlug, spaceSlug } = useSpaceParams();
  const { userId } = useUser();

  const { isAdminUser, isLoading: isCheckingRole } = useIsAdminUser(userId);

  const [{ loading: isLoggingOut }, logout] = useAsyncFn(async () => {
    await firebase.auth().signOut();
    history.push(
      spaceSlug ? generateAttendeeSpaceLandingUrl(worldSlug, spaceSlug) : "/"
    );
  }, [firebase, history, worldSlug, spaceSlug]);

  const redirectToDefaultRoute = () =>
    history.push(
      generateAttendeeInsideUrl({
        worldSlug: DEFAULT_WORLD_SLUG,
        spaceSlug: DEFAULT_SPACE_SLUG,
      })
    );

  const authHandler = userId ? logout : redirectToDefaultRoute;

  if (isAdminUser) return <>{children}</>;

  if (isCheckingRole)
    return (
      <div className="AdminRestricted AdminRestricted--loading">Loading...</div>
    );

  return (
    <div className="AdminRestricted AdminRestricted--forbidden">
      <div className="AdminRestricted__message-container">
        <SparkleLogo className="AdminRestricted__logo" />
        <img
          className="AdminRestricted__denied-shape"
          alt="shape indicating denied access"
          src={SHAPE_DENIED}
        />
        <p className="AdminRestricted__title">Admin Access Denied</p>
        <p>
          Oops. You cannot access Admin Panel. Please log in with your Admin
          enabled Sparkle account.
        </p>
        <p>
          If you don’t have an Admin Account, please contact your event
          organiser.
        </p>
        {DISABLED_DUE_TO_1324 && (
          <ButtonNG
            className="AdminRestricted__switch-button"
            variant="primary"
            loading={isLoggingOut}
            disabled={isLoggingOut}
            onClick={authHandler}
          >
            {userId ? "Log Out" : "Log In"}
          </ButtonNG>
        )}
      </div>
    </div>
  );
};