All files / pages ProfilePage.jsx

100% Statements 64/64
100% Branches 6/6
100% Functions 4/4
100% Lines 64/64

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 931x 1x 1x 1x   1x 1x 1x 1x 1x   1x 12x 12x 1x 1x   12x 12x 1x 1x 1x 1x 1x 12x 12x     12x   12x 3x 3x   9x   9x 9x 9x 9x 9x 9x   9x 9x   9x 9x 9x 9x 9x 9x 9x     9x 9x 9x 9x 9x 9x     9x 9x 9x 12x 12x 12x             12x 12x 12x 12x 12x 12x 12x               12x   1x  
import { Row, Col, Button, Accordion } from "react-bootstrap";
import RoleBadge from "main/components/Profile/RoleBadge";
import { hasRole, useCurrentUser } from "main/utils/currentUser";
import BasicLayout from "main/layouts/BasicLayout/BasicLayout";
 
import JsonView from "@uiw/react-json-view";
import { useBackendMutation } from "main/utils/useBackend";
import { toast } from "react-toastify";
import { useState } from "react";
import ConfirmationModal from "main/components/Common/ConfirmationModal";
 
const ProfilePage = () => {
  const currentUser = useCurrentUser();
  const onSuccess = (response) => {
    toast(response.message);
  };
 
  const disconnectGithub = useBackendMutation(
    () => {
      return {
        url: "/api/github/disconnect",
        method: "DELETE",
      };
    },
    { onSuccess: onSuccess },
    ["current user"],
  );
 
  const [viewModal, setViewModal] = useState(false);
 
  if (!currentUser.loggedIn) {
    return <p>Not logged in.</p>;
  }
 
  const { email, pictureUrl, fullName } = currentUser.root.user;
 
  return (
    <BasicLayout>
      <ConfirmationModal
        onYes={disconnectGithub.mutate}
        showModal={viewModal}
        setShowModal={setViewModal}
      >
        <p>Are you sure you want to disconnect your Github account?</p>
        <p>Please only do so if you know what you're doing.</p>
      </ConfirmationModal>
      <Row className="align-items-center profile-header mb-5 text-center text-md-left">
        <Col md={2}>
          <h2>User Profile</h2>
          <img
            src={pictureUrl}
            alt="Profile"
            className="rounded-circle img-fluid profile-picture mb-3 mb-md-0"
          />
        </Col>
        <Col md>
          <h2>{fullName}</h2>
          <p className="lead text-muted">{email}</p>
          <RoleBadge role={"ROLE_USER"} currentUser={currentUser} />
          <RoleBadge role={"ROLE_MEMBER"} currentUser={currentUser} />
          <RoleBadge role={"ROLE_ADMIN"} currentUser={currentUser} />
        </Col>
      </Row>
      <Row className={"mt-3 g-3"} data-testid={"ProfilePage-advancedFeatures"}>
        <h2>Advanced Features</h2>
        {hasRole(currentUser, "ROLE_GITHUB") && (
          <>
            <Col md={2}>
              <Button variant={"danger"} onClick={() => setViewModal(true)}>
                Disconnect GitHub
              </Button>
            </Col>
          </>
        )}
      </Row>
      <Row>
        <Col>
          <Accordion>
            <Accordion.Item eventKey="individual">
              <Accordion.Header>Current User Information</Accordion.Header>
              <Accordion.Body>
                <JsonView value={currentUser} />
              </Accordion.Body>
            </Accordion.Item>
          </Accordion>
        </Col>
      </Row>
    </BasicLayout>
  );
};
 
export default ProfilePage;