PromucFlow_constructor/app/client/src/pages/Editor/index.tsx
Hetu Nandu 7f8befc365
Update support menu (#259)
Add a default help menu with
* Report a Github issues link
* Documentation link
* Github discussions link
* Intercom link support
* App version id support
2020-08-14 15:17:47 +05:30

216 lines
6.2 KiB
TypeScript

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<BuilderRouteParams>;
@HotkeysTarget
class Editor extends Component<Props> {
public renderHotkeys() {
return (
<Hotkeys>
<Hotkey
global={true}
combo="meta + f"
label="Search entities"
onKeyDown={(e: any) => {
//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();
}}
/>
</Hotkeys>
);
}
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 (
<CenteredWrapper style={{ height: "calc(100vh - 48px)" }}>
<Spinner />
</CenteredWrapper>
);
}
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 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>
);
}
}
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));