terriajs
Version:
Geospatial data visualization platform.
159 lines (150 loc) • 5.15 kB
JSX
import { runInAction } from "mobx";
import { observer } from "mobx-react";
import PropTypes from "prop-types";
import React from "react";
import { withTranslation } from "react-i18next";
import { withTheme } from "styled-components";
import {
Category,
HelpAction
} from "../../../../Core/AnalyticEvents/analyticEvents";
import Box from "../../../../Styled/Box";
import Button, { RawButton } from "../../../../Styled/Button";
import Icon, { StyledIcon } from "../../../../Styled/Icon";
import Spacing from "../../../../Styled/Spacing";
import Text from "../../../../Styled/Text";
import parseCustomMarkdownToReact from "../../../Custom/parseCustomMarkdownToReact";
import { withViewState } from "../../../StandardUserInterface/ViewStateContext";
import HelpPanelItem from "./HelpPanelItem";
export const HELP_PANEL_ID = "help";
class HelpPanel extends React.Component {
static displayName = "HelpPanel";
static propTypes = {
viewState: PropTypes.object.isRequired,
theme: PropTypes.object,
t: PropTypes.func.isRequired
};
constructor(props) {
super(props);
this.state = {
isAnimatingOpen: true
};
}
componentDidMount() {
// The animation timing is controlled in the CSS so the timeout can be 0 here.
setTimeout(() => this.setState({ isAnimatingOpen: false }), 0);
}
componentWillUnmount() {
// Make sure that retainSharePanel is set to false. This property is used to temporarily disable closing when Share Panel loses focus.
// If the Share Panel is open underneath help panel, we now want to allow it to close normally.
setTimeout(() => {
this.props.viewState.setRetainSharePanel(false);
}, 500); // We need to re-enable closing of share panel when loses focus.
}
render() {
const { t } = this.props;
const helpItems = this.props.viewState.terria.configParameters.helpContent;
const isExpanded = this.props.viewState.helpPanelExpanded;
const isAnimatingOpen = this.state.isAnimatingOpen;
return (
<Box
displayInlineBlock
backgroundColor={this.props.theme.textLight}
styledWidth={"320px"}
fullHeight
onClick={() => this.props.viewState.setTopElement("HelpPanel")}
css={`
position: fixed;
z-index: ${this.props.viewState.topElement === "HelpPanel"
? 99999
: 110};
transition: right 0.25s;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
right: ${isAnimatingOpen ? -320 : isExpanded ? 490 : 0}px;
`}
>
<Box position="absolute" paddedRatio={3} topRight>
<RawButton onClick={() => this.props.viewState.hideHelpPanel()}>
<StyledIcon
styledWidth={"16px"}
fillColor={this.props.theme.textDark}
opacity={"0.5"}
glyph={Icon.GLYPHS.closeLight}
/>
</RawButton>
</Box>
<Box
centered
paddedHorizontally={5}
paddedVertically={17}
displayInlineBlock
css={`
direction: ltr;
min-width: 295px;
padding-bottom: 0px;
`}
>
<Text extraBold heading textDark>
{t("helpPanel.menuPaneTitle")}
</Text>
<Spacing bottom={4} />
<Text medium textDark highlightLinks>
{parseCustomMarkdownToReact(
t("helpPanel.menuPaneBody", {
supportEmail: this.props.viewState.terria.supportEmail
})
)}
</Text>
<Spacing bottom={5} />
<Box centered>
<Button
primary
rounded
styledMinWidth={"240px"}
onClick={() => {
this.props.viewState.terria.analytics?.logEvent(
Category.help,
HelpAction.takeTour
);
runInAction(() => {
this.props.viewState.hideHelpPanel();
this.props.viewState.setTourIndex(0);
});
}}
renderIcon={() => (
<StyledIcon
light
styledWidth={"18px"}
glyph={Icon.GLYPHS.tour}
/>
)}
textProps={{
large: true
}}
css={`
${(p) => p.theme.addTerriaPrimaryBtnStyles(p)}
`}
>
{t("helpPanel.takeTour")}
</Button>
</Box>
</Box>
<Spacing bottom={10} />
<Box centered displayInlineBlock fullWidth styledPadding="0 26px">
{helpItems && (
<For each="item" index="i" of={helpItems}>
<HelpPanelItem
key={i}
terria={this.props.viewState.terria}
viewState={this.props.viewState}
content={item}
/>
</For>
)}
</Box>
</Box>
);
}
}
export default withTranslation()(withViewState(withTheme(HelpPanel)));