import React, { Component } from "react"; import { Helmet } from "react-helmet"; import { connect } from "react-redux"; import { withRouter, RouteComponentProps } from "react-router-dom"; import { BuilderRouteParams, getApplicationViewerPageURL, BUILDER_PAGE_URL, } from "constants/routes"; import { AppState } from "reducers"; import MainContainer from "./MainContainer"; import { DndProvider } from "react-dnd"; import TouchBackend from "react-dnd-touch-backend"; import { getCurrentApplicationId, getCurrentPageId, getPublishingError, getIsEditorLoading, getIsEditorInitialized, getIsPublishingApplication, } from "selectors/editorSelectors"; import { Dialog, Classes, AnchorButton, Hotkey, Hotkeys, HotkeysTarget, Spinner, } from "@blueprintjs/core"; import { initEditor } from "actions/initActions"; import { editorInitializer } from "utils/EditorUtils"; import { ENTITY_EXPLORER_SEARCH_ID, ENTITY_EXPLORER_SEARCH_LOCATION_HASH, } from "constants/Explorer"; import history from "utils/history"; import CenteredWrapper from "components/designSystems/appsmith/CenteredWrapper"; import { getAppsmithConfigs } from "configs"; import { getCurrentUser } from "selectors/usersSelectors"; import { User } from "constants/userConstants"; const { cloudHosting, intercomAppID } = getAppsmithConfigs(); type EditorProps = { currentApplicationId?: string; currentPageId?: string; initEditor: Function; isPublishing: boolean; isEditorLoading: boolean; isEditorInitialized: boolean; errorPublishing: boolean; user?: User; }; type Props = EditorProps & RouteComponentProps; @HotkeysTarget class Editor extends Component { public renderHotkeys() { return ( { //TODO(abhinav): make this id into a constant. const el = document.getElementById(ENTITY_EXPLORER_SEARCH_ID); if (!el) { history.push( `${BUILDER_PAGE_URL( this.props.currentApplicationId, this.props.currentPageId, )}${ENTITY_EXPLORER_SEARCH_LOCATION_HASH}`, ); } else { el?.focus(); } e.preventDefault(); e.stopPropagation(); }} /> ); } public state = { isDialogOpen: false, registered: false, }; componentDidMount() { const { user } = this.props; editorInitializer().then(() => { this.setState({ registered: true }); }); const { applicationId, pageId } = this.props.match.params; if (applicationId && pageId) { this.props.initEditor(applicationId, pageId); } if (cloudHosting) { window.Intercom("boot", { // eslint-disable-next-line @typescript-eslint/camelcase app_id: intercomAppID, // eslint-disable-next-line @typescript-eslint/camelcase custom_launcher_selector: "#intercom-trigger", name: user?.username, email: user?.email, }); } } componentDidUpdate(previously: Props) { if (cloudHosting) window.Intercom("update"); if ( previously.isPublishing && !(this.props.isPublishing || this.props.errorPublishing) ) { this.setState({ isDialogOpen: true, }); } } shouldComponentUpdate( nextProps: Props, nextState: { isDialogOpen: boolean; registered: boolean }, ) { return ( nextProps.currentPageId !== this.props.currentPageId || nextProps.currentApplicationId !== this.props.currentApplicationId || nextProps.isEditorInitialized !== this.props.isEditorInitialized || nextProps.isPublishing !== this.props.isPublishing || nextProps.isEditorLoading !== this.props.isEditorLoading || nextProps.errorPublishing !== this.props.errorPublishing || nextState.isDialogOpen !== this.state.isDialogOpen || nextState.registered !== this.state.registered ); } handleDialogClose = () => { this.setState({ isDialogOpen: false, }); }; public render() { if (!this.props.isEditorInitialized || !this.state.registered) { return ( ); } return (
Editor | Appsmith

{"Your application is now published with the current changes!"}

); } } const mapStateToProps = (state: AppState) => ({ currentApplicationId: getCurrentApplicationId(state), currentPageId: getCurrentPageId(state), errorPublishing: getPublishingError(state), isPublishing: getIsPublishingApplication(state), isEditorLoading: getIsEditorLoading(state), isEditorInitialized: getIsEditorInitialized(state), user: getCurrentUser(state), }); const mapDispatchToProps = (dispatch: any) => { return { initEditor: (applicationId: string, pageId: string) => dispatch(initEditor(applicationId, pageId)), }; }; export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Editor));