import React, { useState, useEffect, useRef } from "react"; import { ApplicationPayload, Page, } from "@appsmith/constants/ReduxActionConstants"; import { NavLink } from "react-router-dom"; import { getAppMode, showAppInviteUsersDialogSelector, } from "selectors/applicationSelectors"; import { useSelector } from "react-redux"; import classNames from "classnames"; import PrimaryCTA from "./PrimaryCTA"; import Button from "./AppViewerButton"; import AppInviteUsersForm from "pages/workspace/AppInviteUsersForm"; import FormDialogComponent from "components/editorComponents/form/FormDialogComponent"; 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 { createMessage, INVITE_USERS_MESSAGE, INVITE_USERS_PLACEHOLDER, } from "@appsmith/constants/messages"; import { getAppsmithConfigs } from "@appsmith/configs"; const { cloudHosting } = getAppsmithConfigs(); type AppViewerHeaderProps = { isOpen?: boolean; application?: ApplicationPayload; pages: Page[]; url?: string; setMenuOpen?: (shouldOpen: boolean) => void; headerRef?: React.RefObject; }; export function PageMenu(props: AppViewerHeaderProps) { const { application, headerRef, isOpen, pages, setMenuOpen } = props; const menuRef = useRef(); const selectedTheme = useSelector(getSelectedAppTheme); const workspaceID = useSelector(getCurrentWorkspaceId); const showAppInviteUsersDialog = useSelector( showAppInviteUsersDialogSelector, ); const headerHeight = useSelector(getAppViewHeaderHeight); const [query, setQuery] = useState(""); const { hideWatermark } = getAppsmithConfigs(); // hide menu on click outside useOnClickOutside( [menuRef, headerRef as React.RefObject], () => { if (typeof setMenuOpen === "function") { setMenuOpen?.(false); } }, ); 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); } }); } return ( <> {/* BG OVERLAY */}
{/* MAIN CONTAINER */}
{appPages.map((page) => ( ))}
{application && ( } workspaceId={workspaceID} /> )} {!hideWatermark && ( )}
); } function PageNavLink({ page, query }: { page: Page; query: string }) { 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;