rap-react
Version:
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
447 lines (421 loc) • 14.9 kB
JavaScript
import React, { useState, useContext, useRef, useEffect } from "react";
import { UserContext } from "../../../context/user/userContext";
import { getEntityUrl } from "../../../services/entityService";
import { DialogBox } from "../dialog";
import { hasAccess } from "../../../services/permissionService";
import { accessTypes, entityNames } from "../../../constants/enums";
import $ from "jquery";
export const Header = ({brandCode}) => {
const dialogRef = useRef(null);
const { state, logout } = useContext(UserContext);
const [show, SetShow] = useState(false);
const [showOAMenu, SetShowOAMenu] = useState(false);
const [showSSRMenu, SetShowSSRMenu] = useState(false);
const [showRRMenu, SetShowRRMenu] = useState(false);
const [showRolesUsersMenu, SetShowRolesUsersMenu] = useState(false);
const [showLocationsMenu, SetShowLocationsMenu] = useState(false);
const dashboardUrl = getEntityUrl("Dashboard");
let distinctModules = state.user.distinctModules;
const moduleNames = {
OrderAheadStatusModule: "OrderAheadStatus",
ManageRolesAndUsersModule: "ManageRolesAndUsers",
SmartSellReportingModule: "SmartSellReporting",
RevenueManagement: "RevenueManagement",
Locations: "Locations",
};
const handleLogout = (e) => {
logout();
};
const handleToggle = () => {
// SetShow(current => !current);
SetShow(!show);
SetShowOAMenu(false);
SetShowSSRMenu(false);
SetShowRolesUsersMenu(false);
SetShowLocationsMenu(false);
};
const ref = useRef(null);
useEffect(() => {
let handler = (e) => {
if (!ref.current.contains(e.target)) {
SetShow(false);
}
};
document.addEventListener("mousedown", handler);
return () => {
document.removeEventListener("mousedown", handler);
};
}, []);
const handleOAmenu = () => {
SetShowOAMenu(!showOAMenu);
};
const handleSSRMenu = () => {
SetShowSSRMenu(!showSSRMenu);
};
const handleRRMenu = () => {
SetShowRRMenu(!showRRMenu);
};
const handleRolesUsersMenu = () => {
SetShowRolesUsersMenu(!showRolesUsersMenu);
};
const handleLocationsMenu = () => {
SetShowLocationsMenu(!showLocationsMenu);
};
const canResetPassword = () => {
const loginUserType =
state?.user?.userProfile?.loginUserType?.toUpperCase();
if (loginUserType === "BREAKGLASS" || loginUserType === "FRMUSER") {
return state?.user?.userProfile?.isPrimaryBrand ?? false;
}
return false;
};
const canSwitchBrand = () => {
const hasMultipleBrands = state?.user?.userProfile?.hasMultipleBrands;
if (hasMultipleBrands !== undefined && hasMultipleBrands === true) {
return true;
}
return false;
};
const getDashboard = () => {
return (
<React.Fragment>
<div className="menu-accordian">
<div className="menu-acc-head">
<div>
<a href={dashboardUrl}>Home</a>
</div>
</div>
<div className="menu-any-body"></div>
</div>
<div className="dd-link-seperator"></div>
</React.Fragment>
);
};
const getModuleEntities = (mName) => {
const privileges = state.user.privileges;
let values = privileges.filter(
(x) => x.moduleName === mName && x.showInMenu === true
);
values = values.sort((a, b) => a.order - b.order);
return values;
};
const getEntityName = (eName, eDescription) => {
switch (eName) {
case entityNames.ROLEMANAGEMENT:
return "Roles";
case entityNames.USERMANAGEMENT:
return "Users";
case entityNames.GROUPMANAGEMENT:
return "Groups";
default:
return eDescription;
}
};
const getModuleEntity = (entity, i) => {
const entityName = entity.entityName;
const displayName = getEntityName(
entity.entityName,
entity.entityDescription
);
const url = getEntityUrl(entityName);
const showEntity = hasAccess(
state?.user?.privileges,
entityName,
accessTypes.READ
);
if (showEntity) {
return (
<React.Fragment key={i}>
<a
href={url}
data-value={entityName}
className="menu-link-block w-inline-block"
tabIndex="0"
>
<div>{displayName}</div>
</a>
<div className="dd-link-seperator" />
</React.Fragment>
);
}
return <React.Fragment></React.Fragment>;
};
const getClassHandler = (mName) => {
if (mName === moduleNames.OrderAheadStatusModule) {
handleOAmenu();
}
if (mName === moduleNames.ManageRolesAndUsersModule) {
handleRolesUsersMenu();
}
if (mName === moduleNames.SmartSellReportingModule) {
handleSSRMenu();
}
if (mName === moduleNames.RevenueManagement) {
handleRRMenu();
}
if (mName === moduleNames.Locations) {
handleLocationsMenu();
}
};
const getClassVariable = (mName, mainClsName, trueClsName, falseClsName) => {
let bValue = false;
switch (mName) {
case moduleNames.ManageRolesAndUsersModule: {
bValue = showRolesUsersMenu;
break;
}
case moduleNames.Locations: {
bValue = showLocationsMenu;
break;
}
case moduleNames.SmartSellReportingModule: {
bValue = showSSRMenu;
break;
}
case moduleNames.RevenueManagement: {
bValue = showRRMenu;
break;
}
case moduleNames.OrderAheadStatusModule:
default: {
bValue = showOAMenu;
break;
}
}
return mainClsName + " " + (bValue === true ? trueClsName : falseClsName);
};
const hasAtleastTwoModuleAccess = () => {
const privileges = state.user.privileges;
let modules = privileges.filter(
(x) => x.showInMenu === true && x.canRead === true
);
let moduleNames = [];
for (let c = 0; c < modules.length; c++) {
let m = modules[c];
if (moduleNames.indexOf(m.moduleName) === -1) {
moduleNames.push(m.moduleName);
}
}
return moduleNames.length > 1;
};
const getModule = (obj, k) => {
let module = obj;
let moduleName = obj.moduleName;
let moduleDisplayName = module.moduleDescription;
let moduleEntities = getModuleEntities(moduleName);
let accessibleEntities = moduleEntities.filter(
(x) => x.showInMenu === true && x.canRead === true
);
if (accessibleEntities.length > 0)
return (
<React.Fragment key={k}>
<div className="menu-accordian">
<div
className="menu-acc-head"
onClick={() => {
getClassHandler(moduleName);
}}
>
<div>{moduleDisplayName}</div>
<img
loading="lazy"
alt=""
className={getClassVariable(
moduleName,
"menu-acc-icon",
"expand",
""
)}
/>
</div>
<div
className={getClassVariable(
moduleName,
"menu-acc-body",
"",
"collapse"
)}
>
{moduleEntities.map((entity, i) => {
return getModuleEntity(entity, i);
})}
</div>
</div>
</React.Fragment>
);
};
const getName = () => {
let userProfile = state?.user?.userProfile;
let firstName = userProfile?.firstName ?? "";
let lastName = userProfile?.lastName ?? "";
let name = firstName + (lastName.length > 0 ? " " + lastName : "");
return name;
};
const getInitials = () => {
let userProfile = state?.user?.userProfile;
let firstName = userProfile?.firstName ?? "";
let lastName = userProfile?.lastName ?? "";
let initials = firstName?.slice(0, 1) + lastName.slice(0, 1);
return initials;
};
const getDisplayRoleName = () => {
let userProfile = state?.user?.userProfile;
return userProfile?.userRoleType;
};
const onResetPassword = () => {
SetShow(false);
dialogRef.current.handleResetPassword();
};
const onSwitchBrand = () => {
const completeApplicationUrl = `${process.env.REACT_APP_GENERIC_APP_URL}ExternalBrandSelection`;
const token = state?.token;
const brandAPIUrl = process.env.REACT_APP_AUTH_API_PRIVATE_URL;
const isCorporateUser =
state?.user?.userProfile?.loginUserType?.toUpperCase() ===
"OKTACORPORATE";
const corpBrandCode = state?.user?.userProfile?.corpBrandCode;
const frm = $("form[data-name=form-hidden");
const getHiddenElement = (name) => {
return $(frm).find("input[type=hidden][name=" + name + "]");
};
const setHiddenElementValue = (name, value) => {
let hiddenElement = getHiddenElement(name);
hiddenElement.val(value);
};
const fnSubmitToSinglePageApp = () => {
setHiddenElementValue("hdnToken", token);
setHiddenElementValue("hdnIsCorporateUser", isCorporateUser);
setHiddenElementValue("hdnBrandAPIUrl", brandAPIUrl);
setHiddenElementValue("hdnCorpBrandCode", corpBrandCode);
frm.attr("action", completeApplicationUrl);
frm.attr("method", "post");
frm[0].submit();
};
fnSubmitToSinglePageApp();
};
const onSendFeedback = () => {
SetShow(false);
dialogRef.current.handleSendFeedback();
};
return (
<React.Fragment>
<DialogBox ref={dialogRef} />
{canSwitchBrand() ? (
<div className="blank-container">
<form data-name="form-hidden">
<input type="hidden" name="hdnToken" value="" />
<input type="hidden" name="hdnBrandAPIUrl" value="" />
<input type="hidden" name="hdnIsCorporateUser" value="" />
<input type="hidden" name="hdnCorpBrandCode" value="" />
</form>
</div>
) : (
<div className="blank-container"></div>
)}
<div className="dashboard-header">
<div className="container menu">
<div className="dashboard-header">
<div className="container menu">
{hasAtleastTwoModuleAccess() && (
<a
href={dashboardUrl}
className="main-logo-wrapper w-inline-block"
>
{" "}
</a>
)}
{hasAtleastTwoModuleAccess() === false && (
<div className="main-logo-wrapper w-inline-block"></div>
)}
<div className="menu-link-wrapper">
<div
ref={ref}
data-hover="false"
data-delay="0"
className="menu-dropdown w-dropdown"
>
<div className="menu-dd-toggle w-dropdown-toggle">
<div
className="hamburger-menu"
onClick={(event) => {
handleToggle(event);
}}
>
<div className="ham-line" />
<div className="ham-line" />
<div className="ham-line" />
</div>
</div>
<nav
className={`menu-dd-list w-dropdown-list ${
show ? "w--open" : "w-close"
}`}
>
<div className="dd-triangle" />
<div className="dd-link-wrapper">
<div className="menu-profile-header">
<div className="user-profile-icon">{getInitials()}</div>
<div className="user-profile-title">
<div className="user-title">{getName()}</div>
<div className="user-role">
{getDisplayRoleName()}
</div>
</div>
</div>
{hasAtleastTwoModuleAccess() && getDashboard()}
{distinctModules.length > 0 &&
distinctModules.map((obj, k) => {
return getModule(obj, k);
})}
<div className="dd-link-seperator" />
<div
onClick={onSendFeedback}
className="menu-link-block w-inline-block"
>
<div className="dd-link-icon feedback" />
<div>Feedback/Support</div>
</div>
<div className="dd-link-seperator" />
{canResetPassword() && (
<React.Fragment>
<div
onClick={onResetPassword}
className="menu-link-block w-inline-block"
>
<div className="dd-link-icon" />
<div>Reset Password</div>
</div>
<div className="dd-link-seperator" />
</React.Fragment>
)}
{canSwitchBrand() && (
<React.Fragment>
<div
onClick={onSwitchBrand}
className="menu-link-block w-inline-block"
>
<div className="dd-link-icon dd-link-switchbrand" />
<div>Switch Brand</div>
</div>
<div className="dd-link-seperator" />
</React.Fragment>
)}
<div
onClick={handleLogout}
className="menu-link-block w-inline-block"
>
<div className="dd-link-icon logout" />
<div>Logout</div>
</div>
</div>
</nav>
</div>
</div>
</div>
</div>
</div>
</div>
</React.Fragment>
);
};
export default Header;