terriajs
Version:
Geospatial data visualization platform.
139 lines (127 loc) • 4.14 kB
JSX
import { observer } from "mobx-react";
import PropTypes from "prop-types";
import React from "react";
import { withTranslation } from "react-i18next";
import styled, { withTheme } from "styled-components";
import {
Category,
HelpAction
} from "../../../../Core/AnalyticEvents/analyticEvents";
import { isJsonString } from "../../../../Core/Json";
import Icon, { StyledIcon } from "../../../../Styled/Icon";
import Text from "../../../../Styled/Text";
import { applyTranslationIfExists } from "./../../../../Language/languageHelpers";
import HelpVideoPanel from "./HelpVideoPanel";
class HelpPanelItem extends React.Component {
static displayName = "HelpPanelItem";
static propTypes = {
terria: PropTypes.object.isRequired,
viewState: PropTypes.object.isRequired,
content: PropTypes.object.isRequired,
theme: PropTypes.object,
t: PropTypes.func.isRequired,
i18n: PropTypes.object.isRequired
};
constructor(props) {
super(props);
}
render() {
const { i18n } = this.props;
const itemSelected =
this.props.viewState.selectedHelpMenuItem === this.props.content.itemName;
// `content.icon` is user defined and can possibly force the UI to lookup a
// nonexistant icon.
const title = isJsonString(this.props.content.title)
? applyTranslationIfExists(this.props.content.title, i18n)
: "";
const paneMode = this.props.content.paneMode;
const opensInPanel = paneMode !== "externalLink";
const iconGlyph = opensInPanel
? Icon.GLYPHS.right
: Icon.GLYPHS.externalLink;
return (
<div>
<MenuButton
isSelected={itemSelected}
role={paneMode === "externalLink" ? "link" : undefined}
onClick={() => {
this.props.terria.analytics?.logEvent(
Category.help,
HelpAction.itemSelected,
title
);
if (opensInPanel) {
this.props.viewState.selectHelpMenuItem(
this.props.content.itemName
);
} else if (paneMode === "externalLink" && this.props.content.url) {
window.open(this.props.content.url);
}
}}
>
<MenuItemText>{title}</MenuItemText>
<StyledIcon
styledWidth={"12px"}
fillColor={this.props.theme.textLightDimmed}
glyph={iconGlyph}
/>
</MenuButton>
{opensInPanel && (
<HelpVideoPanel
terria={this.props.terria}
viewState={this.props.viewState}
content={this.props.content}
itemString={this.props.content.itemName}
paneMode={this.props.content.paneMode}
markdownContent={this.props.content.markdownText}
videoUrl={
isJsonString(this.props.content.videoUrl)
? applyTranslationIfExists(this.props.content.videoUrl, i18n)
: undefined
}
placeholderImage={
isJsonString(this.props.content.placeholderImage)
? applyTranslationIfExists(
this.props.content.placeholderImage,
i18n
)
: undefined
}
videoCoverImageOpacity={this.props.content.videoCoverImageOpacity}
/>
)}
</div>
);
}
}
const MenuButton = styled.button`
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
height: 100%;
padding: 16px 0;
border: 0;
border-bottom: 1px solid #ddd;
background: transparent;
&:hover {
color: ${(p) => p.theme.textBlack};
& ${StyledIcon} {
fill: ${(p) => p.theme.textBlack};
}
}
color: ${(p) => (p.isSelected ? p.theme.textBlack : p.theme.textDark)};
& ${StyledIcon} {
fill: ${(p) => (p.isSelected ? p.theme.textBlack : p.theme.textDark)};
}
`;
const MenuItemText = styled(Text).attrs({
semiBold: true,
large: true
})`
padding-right: 25px;
padding-left: 5px;
text-align: left;
`;
export default withTranslation()(withTheme(HelpPanelItem));