PromucFlow_constructor/app/client/src/pages/AppViewer/AppViewerPageContainer.tsx
Aman Agarwal 3bcb1daf73
fix: onPageLoad false failure issue (#14141)
1. Fixed on page load actions getting called multiple times.
2. Now Evaluation only happens once we complete the fetching of the page's all entities including js objects and actions, this avoids cases where actions are not defined when ran.

Co-authored-by: Rishabh-Rathod <rishabh.rathod@appsmith.com>
2022-06-06 09:26:14 +05:30

111 lines
3.1 KiB
TypeScript

import React, { useMemo } from "react";
import { Link, RouteComponentProps, withRouter } from "react-router-dom";
import { useSelector } from "react-redux";
import { getIsFetchingPage } from "selectors/appViewSelectors";
import styled from "styled-components";
import { AppViewerRouteParams } from "constants/routes";
import { theme } from "constants/DefaultTheme";
import { Icon, NonIdealState, Spinner } from "@blueprintjs/core";
import Centered from "components/designSystems/appsmith/CenteredWrapper";
import AppPage from "./AppPage";
import {
getCanvasWidgetDsl,
getCurrentPageName,
selectURLSlugs,
} from "selectors/editorSelectors";
import RequestConfirmationModal from "pages/Editor/RequestConfirmationModal";
import { getCurrentApplication } from "selectors/applicationSelectors";
import {
isPermitted,
PERMISSION_TYPE,
} from "../Applications/permissionHelpers";
import { builderURL } from "RouteBuilder";
const Section = styled.section<{
height: number;
}>`
height: 100%;
min-height: ${({ height }) => height}px;
margin: 0 auto;
position: relative;
overflow-x: auto;
overflow-y: auto;
`;
type AppViewerPageContainerProps = RouteComponentProps<AppViewerRouteParams>;
function AppViewerPageContainer(props: AppViewerPageContainerProps) {
const currentPageName = useSelector(getCurrentPageName);
const widgets = useSelector(getCanvasWidgetDsl);
const isFetchingPage = useSelector(getIsFetchingPage);
const currentApplication = useSelector(getCurrentApplication);
const { match } = props;
const { applicationSlug, pageSlug } = useSelector(selectURLSlugs);
// get appsmith editr link
const appsmithEditorLink = useMemo(() => {
if (
currentApplication?.userPermissions &&
isPermitted(
currentApplication?.userPermissions,
PERMISSION_TYPE.MANAGE_APPLICATION,
)
) {
return (
<p>
Please add widgets to this page in the&nbsp;
<Link
to={builderURL({
applicationSlug: applicationSlug,
pageSlug: pageSlug,
pageId: props.match.params.pageId as string,
})}
>
Appsmith Editor
</Link>
</p>
);
}
}, [currentApplication?.userPermissions]);
const pageNotFound = (
<Centered>
<NonIdealState
description={appsmithEditorLink}
icon={
<Icon
color={theme.colors.primaryOld}
icon="page-layout"
iconSize={theme.fontSizes[9]}
/>
}
title="This page seems to be blank"
/>
</Centered>
);
const pageLoading = (
<Centered>
<Spinner />
</Centered>
);
if (isFetchingPage) return pageLoading;
if (!(widgets.children && widgets.children.length > 0)) return pageNotFound;
return (
<Section height={widgets.bottomRow}>
<AppPage
appName={currentApplication?.name}
dsl={widgets}
pageId={match.params.pageId}
pageName={currentPageName}
/>
<RequestConfirmationModal />
</Section>
);
}
export default withRouter(AppViewerPageContainer);