PromucFlow_constructor/app/client/src/pages/Editor/index.tsx

146 lines
4.2 KiB
TypeScript
Raw Normal View History

2019-10-18 08:16:26 +00:00
import React, { Component } from "react";
2019-12-03 09:21:06 +00:00
import { Helmet } from "react-helmet";
import { connect } from "react-redux";
import { Redirect } from "react-router-dom";
import { withRouter, RouteComponentProps } from "react-router-dom";
import {
BuilderRouteParams,
getApplicationViewerPageURL,
} from "constants/routes";
2019-11-25 05:07:27 +00:00
import { AppState } from "reducers";
import MainContainer from "./MainContainer";
import { DndProvider } from "react-dnd";
import TouchBackend from "react-dnd-touch-backend";
2019-10-24 09:23:50 +00:00
import {
getCurrentApplicationId,
getCurrentPageId,
getPublishingError,
getIsEditorLoading,
getLoadingError,
2020-01-24 09:54:40 +00:00
getIsEditorInitialized,
2020-08-07 06:56:47 +00:00
getIsPublishingApplication,
} from "selectors/editorSelectors";
import { Dialog, Classes, AnchorButton } from "@blueprintjs/core";
import { initEditor } from "actions/initActions";
2020-03-24 14:05:19 +00:00
import { fetchPage } from "actions/pageActions";
import { editorInitializer } from "utils/EditorUtils";
2019-08-20 13:19:19 +00:00
2019-08-29 11:22:09 +00:00
type EditorProps = {
2019-10-24 09:23:50 +00:00
currentApplicationId?: string;
currentPageId?: string;
2019-11-08 11:02:00 +00:00
initEditor: Function;
2020-03-24 14:05:19 +00:00
fetchPage: (pageId: string) => void;
isPublishing: boolean;
isEditorLoading: boolean;
2020-01-24 09:54:40 +00:00
isEditorInitialized: boolean;
editorLoadingError: boolean;
errorPublishing: boolean;
2020-08-07 06:56:47 +00:00
};
type Props = EditorProps & RouteComponentProps<BuilderRouteParams>;
2019-08-26 12:41:21 +00:00
2020-08-07 06:56:47 +00:00
class Editor extends Component<Props> {
public state = {
isDialogOpen: false,
registered: false,
};
componentDidMount() {
editorInitializer().then(() => {
this.setState({ registered: true });
});
2020-03-24 14:05:19 +00:00
const { applicationId, pageId } = this.props.match.params;
if (applicationId && pageId) {
this.props.initEditor(applicationId, pageId);
}
}
2020-08-07 06:56:47 +00:00
componentDidUpdate(previously: Props) {
if (
previously.isPublishing &&
!(this.props.isPublishing || this.props.errorPublishing)
) {
this.setState({
isDialogOpen: true,
});
}
2020-03-24 14:05:19 +00:00
if (this.props.match.params.pageId !== previously.match.params.pageId) {
this.props.fetchPage(this.props.match.params.pageId);
}
}
handleDialogClose = () => {
this.setState({
isDialogOpen: false,
});
};
2019-08-29 11:22:09 +00:00
public render() {
if (!this.props.match.params.applicationId) {
return <Redirect to="/applications" />;
}
return (
<DndProvider
backend={TouchBackend}
options={{
enableMouseEvents: true,
}}
>
<div>
<Helmet>
<meta charSet="utf-8" />
<title>Editor | Appsmith</title>
</Helmet>
<MainContainer />
<Dialog
isOpen={this.state.isDialogOpen}
canOutsideClickClose={true}
canEscapeKeyClose={true}
title="Application Published"
onClose={this.handleDialogClose}
icon="tick-circle"
>
<div className={Classes.DIALOG_BODY}>
<p>
{
"Your awesome application is now published with the current changes!"
}
</p>
</div>
<div className={Classes.DIALOG_FOOTER}>
<div className={Classes.DIALOG_FOOTER_ACTIONS}>
<AnchorButton
target={this.props.currentApplicationId}
href={getApplicationViewerPageURL(
this.props.currentApplicationId,
this.props.currentPageId,
)}
text="View Application"
/>
</div>
</div>
</Dialog>
</div>
</DndProvider>
);
}
}
2019-10-24 09:23:50 +00:00
const mapStateToProps = (state: AppState) => ({
currentApplicationId: getCurrentApplicationId(state),
currentPageId: getCurrentPageId(state),
isPublishing: getIsPublishingApplication(state),
2020-08-07 06:56:47 +00:00
errorPublishing: getPublishingError(state),
isEditorLoading: getIsEditorLoading(state),
2020-01-24 09:54:40 +00:00
isEditorInitialized: getIsEditorInitialized(state),
editorLoadingError: getLoadingError(state),
2019-10-18 08:16:26 +00:00
});
2019-08-26 12:41:21 +00:00
2019-10-24 09:23:50 +00:00
const mapDispatchToProps = (dispatch: any) => {
return {
2020-03-24 14:05:19 +00:00
initEditor: (applicationId: string, pageId: string) =>
dispatch(initEditor(applicationId, pageId)),
fetchPage: (pageId: string) => dispatch(fetchPage(pageId)),
2019-10-24 09:23:50 +00:00
};
};
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Editor));