wahanegi/vibereport

View on GitHub
app/javascript/components/UI/Menu.js

Summary

Maintainability
A
0 mins
Test Coverage
import React, {useState, useEffect, useRef} from 'react';
import {Dropdown} from "react-bootstrap";
import Button from "./Button";
import {signOutUser} from "../requests/axios_requests";
import SweetAlert from "./SweetAlert";
import complete0 from '../../../assets/images/complete0.svg'
import complete0_act from '../../../assets/images/complete0_act.svg'
import complete5_10 from '../../../assets/images/complete5_10.svg'
import complete5_10_act from '../../../assets/images/complete5_10_act.svg'
import complete15 from '../../../assets/images/complete15.svg'
import complete15_act from '../../../assets/images/complete15_act.svg'
import complete20 from '../../../assets/images/complete20.svg'
import complete20_act from '../../../assets/images/complete20_act.svg'
import complete25 from '../../../assets/images/complete25.svg'
import complete25_act from '../../../assets/images/complete25_act.svg'
import complete35 from '../../../assets/images/complete35.svg'
import complete35_act from '../../../assets/images/complete35_act.svg'
import complete45 from '../../../assets/images/complete45.svg'
import complete45_act from '../../../assets/images/complete45_act.svg'
import complete65 from '../../../assets/images/complete65.svg'
import complete65_act from '../../../assets/images/complete65_act.svg'
import complete85 from '../../../assets/images/complete85.svg'
import complete85_act from '../../../assets/images/complete85_act.svg'
import complete90 from '../../../assets/images/complete90.svg'
import complete90_act from '../../../assets/images/complete90_act.svg'
import complete100 from '../../../assets/images/complete100.svg'
import complete100_act from '../../../assets/images/complete100_act.svg'

const Menu = ({ className = '', data, steps, draft, handleSaveDraft, isResult = false }) => {
  const [showModal, setShowModal] = useState(false);
  const [activeImg, setActiveImg] = useState(false);
  const dropdownRef = useRef(null);
  const alertTitleLogout = "<div class='color-black'>Are you sure you <br/>  want to log out?</div>"
  const id = data?.response?.id
  const lastStep = isResult ? 'results' : steps[steps.length - 1];
  const isLastStepDisabled = ['emotion-entry', 'emotion-selection-web', 'results', 'rather-not-say', 'skip-ahead'].includes(lastStep);

  useEffect(() => {
    const handleClickOutside = (event) => {
      if (dropdownRef.current && !dropdownRef.current.contains(event.target)){
        setActiveImg(false);
      }
    };
    document.addEventListener('click', handleClickOutside);
  }, []);

  const handleSignOut = () => {
    setShowModal(true);
  }
  const btnElement = document.getElementsByClassName("dropdown")

  const handleChangeImg =() =>{
    if(btnElement[0]?.classList.contains('show')){
      setActiveImg(false)
    }else{
      setActiveImg(true)
    }
  };

  const location = window.location.href;
  const lastSegment = isResult ? 'results' : location.substring(location.lastIndexOf("/") + 1);
  const isStepUnsubscribe = location.substring(location.lastIndexOf("/") + 1) === 'unsubscribe'

  const segmentsMap = {
    'emotion-selection-web': { src: complete0, activeSrc: complete0_act, percent: 0 },
    'emotion-entry': { src: complete5_10, activeSrc: complete5_10_act, percent: 5 },
    'emotion-type': { src: complete5_10, activeSrc: complete5_10_act, percent: 5 },
    'meme-selection': { src: complete5_10, activeSrc: complete5_10_act, percent: 10 },
    'selected-giphy-follow': { src: complete15, activeSrc: complete15_act, percent: 15 },
    'emotion-intensity': { src: complete20, activeSrc: complete20_act, percent: 20 },
    'rather-not-say': { src: complete20, activeSrc: complete20_act, percent: 20 },
    'skip-ahead': { src: complete20, activeSrc: complete20_act, percent: 20 },
    'productivity-check': { src: complete25, activeSrc: complete25_act, percent: 25 },
    'productivity-bad-follow-up': { src: complete35, activeSrc: complete35_act, percent: 35 },
    'causes-to-celebrate': { src: complete45, activeSrc: complete45_act, percent: 45 },
    'recognition': { src: complete65, activeSrc: complete65_act, percent: 65 },
    'icebreaker-answer': { src: complete85, activeSrc: complete85_act, percent: 85 },
    'icebreaker-question': { src: complete90, activeSrc: complete90_act, percent: 90 },
    'results': { src: complete100, activeSrc: complete100_act, percent: 100 },
    'result-managers': { src: complete100, activeSrc: complete100_act, percent: 100 },
  };

  const getSrcMenu = (lastSegment, activeImg) => {
    if(isStepUnsubscribe){
      return {
        src: activeImg ? complete0_act : complete0,
      };
    }else if (segmentsMap[lastSegment]) {
      const { src, activeSrc, percent } = segmentsMap[lastSegment];
      return {
        src: activeImg ? activeSrc : src,
        percent: percent,
      };
    } else {
      return "";
    }
  };

  return (
    <div className={ `${className}` }>
      <Dropdown onClick={handleChangeImg} ref={dropdownRef}>
        <Dropdown.Toggle  id='dropdown-stick'>
          <img src={getSrcMenu(lastSegment, activeImg).src} alt='complete' />
        </Dropdown.Toggle>
        <Dropdown.Menu>
          <Dropdown.Item href="#" >
            <Button className={`btn-item-menu wb1 mx-auto my-auto${draft || isLastStepDisabled ? ' disabled-btn-draft' : ''}`}
                    disabled={draft || isLastStepDisabled} onClick={handleSaveDraft}>
              Save Draft
            </Button>
          </Dropdown.Item>
          <Dropdown.Item href="#" ><Button className='btn-item-menu wb1  mx-auto my-auto' onClick={handleSignOut}>Log Out</Button></Dropdown.Item>
        </Dropdown.Menu>
      </Dropdown>
      {!isStepUnsubscribe && (
        <div className='fs-6 text-primary text-complete' >{getSrcMenu(lastSegment).percent }% complete</div>
      )}
      {showModal && (
        <SweetAlert
          alertTitle={alertTitleLogout}
          cancelButtonText="No, go back"
          confirmButtonText="Yes, log out"
          onConfirmAction={() => {
            signOutUser(id).then(() => window.location.href = `/sign_in`);
          }}
          onDeclineAction={() => {
            setShowModal(false);
          }}
          cancelButtonClass='btn-logout-no'
          confirmButtonClass='btn-logout-yes'
        />
      )}
    </div>
  );
};

export default Menu;