PromucFlow_constructor/app/client/src/pages/AppViewer/AppViewerPageContainer.tsx
Ayangade Adeoluwa ead4d875fa
feat: add confirmation for Datasource deletion operation (#11180)
* add confirmation for Datasource, refactor other components

* fix failing cypress tests

* fix Mongo_spec failing test
2022-02-18 07:58:36 +01:00

141 lines
4.1 KiB
TypeScript

import React, { Component } from "react";
import { Link, RouteComponentProps } from "react-router-dom";
import { connect } from "react-redux";
import { getIsFetchingPage } from "selectors/appViewSelectors";
import styled from "styled-components";
import { AppViewerRouteParams, BUILDER_PAGE_URL } from "constants/routes";
import { AppState } from "reducers";
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,
getCurrentApplicationId,
getCurrentPageName,
} from "selectors/editorSelectors";
import RequestConfirmationModal from "pages/Editor/RequestConfirmationModal";
import { getCurrentApplication } from "selectors/applicationSelectors";
import {
isPermitted,
PERMISSION_TYPE,
} from "../Applications/permissionHelpers";
import { fetchPublishedPage } from "actions/pageActions";
import { DSLWidget } from "widgets/constants";
const Section = styled.section`
background: ${(props) => props.theme.colors.artboard};
height: max-content;
min-height: 100%;
margin: 0 auto;
position: relative;
overflow-x: auto;
overflow-y: auto;
`;
type AppViewerPageContainerProps = {
isFetchingPage: boolean;
widgets?: DSLWidget;
currentPageName?: string;
currentAppName?: string;
fetchPage: (pageId: string, bustCache?: boolean) => void;
currentAppPermissions?: string[];
applicationId: string;
} & RouteComponentProps<AppViewerRouteParams>;
class AppViewerPageContainer extends Component<AppViewerPageContainerProps> {
componentDidUpdate(previously: AppViewerPageContainerProps) {
const { pageId } = this.props.match.params;
if (
pageId &&
previously.location.pathname !== this.props.location.pathname
) {
this.props.fetchPage(pageId);
}
}
render() {
let appsmithEditorLink;
if (
this.props.currentAppPermissions &&
isPermitted(
this.props.currentAppPermissions,
PERMISSION_TYPE.MANAGE_APPLICATION,
)
) {
appsmithEditorLink = (
<p>
Please add widgets to this page in the&nbsp;
<Link
to={BUILDER_PAGE_URL({
applicationId: this.props.applicationId,
pageId: this.props.match.params.pageId,
})}
>
Appsmith Editor
</Link>
</p>
);
}
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 (this.props.isFetchingPage) {
return pageLoading;
} else if (!this.props.isFetchingPage && this.props.widgets) {
return (
<Section>
{!(
this.props.widgets.children &&
this.props.widgets.children.length > 0
) && pageNotFound}
<AppPage
appName={this.props.currentAppName}
dsl={this.props.widgets}
pageId={this.props.match.params.pageId}
pageName={this.props.currentPageName}
/>
<RequestConfirmationModal />
</Section>
);
}
}
}
const mapStateToProps = (state: AppState) => {
const currentApp = getCurrentApplication(state);
return {
isFetchingPage: getIsFetchingPage(state),
widgets: getCanvasWidgetDsl(state),
currentPageName: getCurrentPageName(state),
currentAppName: currentApp?.name,
currentAppPermissions: currentApp?.userPermissions,
applicationId: getCurrentApplicationId(state),
};
};
const mapDispatchToProps = (dispatch: any) => ({
fetchPage: (pageId: string, bustCache = false) =>
dispatch(fetchPublishedPage(pageId, bustCache)),
});
export default connect(
mapStateToProps,
mapDispatchToProps,
)(AppViewerPageContainer);