import React, { useState, useEffect, useRef } from "react"; import type { ApplicationPayload, Page, } from "@appsmith/constants/ReduxActionConstants"; import { getAppMode } from "@appsmith/selectors/applicationSelectors"; import { useSelector } from "react-redux"; import classNames from "classnames"; import PrimaryCTA from "./PrimaryCTA"; import { getCurrentWorkspaceId } from "@appsmith/selectors/workspaceSelectors"; import { getSelectedAppTheme } from "selectors/appThemingSelectors"; import BrandingBadge from "./BrandingBadgeMobile"; import { getAppViewHeaderHeight } from "selectors/appViewSelectors"; import { useOnClickOutside } from "utils/hooks/useOnClickOutside"; import { useHref } from "pages/Editor/utils"; import { APP_MODE } from "entities/App"; import { builderURL, viewerURL } from "RouteBuilder"; import { trimQueryString } from "utils/helpers"; import { getAppsmithConfigs } from "@appsmith/configs"; import type { NavigationSetting } from "constants/AppConstants"; import { NAVIGATION_SETTINGS } from "constants/AppConstants"; import { get } from "lodash"; import { PageMenuContainer, StyledNavLink } from "./PageMenu.styled"; import { StyledCtaContainer } from "./Navigation/Sidebar.styled"; import ShareButton from "./Navigation/components/ShareButton"; import BackToAppsButton from "./Navigation/components/BackToAppsButton"; type NavigationProps = { isOpen?: boolean; application?: ApplicationPayload; pages: Page[]; url?: string; setMenuOpen?: (shouldOpen: boolean) => void; headerRef?: React.RefObject; }; export function PageMenu(props: NavigationProps) { const { application, headerRef, isOpen, pages, setMenuOpen } = props; const menuRef = useRef(); const selectedTheme = useSelector(getSelectedAppTheme); const workspaceID = useSelector(getCurrentWorkspaceId); const headerHeight = useSelector(getAppViewHeaderHeight); const [query, setQuery] = useState(""); const { hideWatermark } = getAppsmithConfigs(); const navColorStyle = application?.applicationDetail?.navigationSetting?.colorStyle || NAVIGATION_SETTINGS.COLOR_STYLE.LIGHT; const primaryColor = get( selectedTheme, "properties.colors.primaryColor", "inherit", ); const closeMenu = () => { if (typeof setMenuOpen === "function") { setMenuOpen?.(false); } }; // hide menu on click outside useOnClickOutside( [menuRef, headerRef as React.RefObject], () => { closeMenu(); }, ); useEffect(() => { setQuery(window.location.search); }, [location.search]); // Mark default page as first page const appPages = pages; if (appPages.length > 1) { appPages.forEach((item, i) => { if (item.isDefault) { appPages.splice(i, 1); appPages.unshift(item); } }); } // TODO: Rahul - Check how to use this function in the new layout. // const handleFormOpenOrClose = useCallback((isOpen: boolean) => { // dispatch(setShowAppInviteUsersDialog(isOpen)); // }, []); return ( <> {/* BG OVERLAY */}
{/* MAIN CONTAINER */}
{appPages.map((page) => ( ))}
{application && ( {isOpen && ( )} {!hideWatermark && ( )} )}
); } function PageNavLink({ closeMenu, navColorStyle, page, primaryColor, query, }: { page: Page; query: string; closeMenu: () => void; primaryColor: string; navColorStyle: NavigationSetting["colorStyle"]; }) { const appMode = useSelector(getAppMode); const selectedTheme = useSelector(getSelectedAppTheme); const pathname = useHref( appMode === APP_MODE.PUBLISHED ? viewerURL : builderURL, { pageId: page.pageId }, ); return ( {page.pageName} ); } export default PageMenu;