DocSpace-client/packages/components/snackbar/index.js

223 lines
5.9 KiB
JavaScript
Raw Normal View History

import React from "react";
import ReactDOM from "react-dom";
2021-07-14 14:12:13 +00:00
import PropType from "prop-types";
import PropTypes from "prop-types";
import Countdown, { zeroPad } from "react-countdown";
import { StyledAction, StyledSnackBar, StyledIframe } from "./styled-snackbar";
2021-07-14 14:12:13 +00:00
import StyledCrossIcon from "./styled-snackbar-action";
import StyledLogoIcon from "./styled-snackbar-logo";
import Box from "../box";
import Heading from "../heading";
import Text from "../text";
class SnackBar extends React.Component {
constructor(props) {
super(props);
this.state = { isLoaded: false };
}
static show(barConfig) {
const { parentElementId, ...rest } = barConfig;
2021-07-14 14:12:13 +00:00
let parentElementNode =
parentElementId && document.getElementById(parentElementId);
2021-06-10 14:20:09 +00:00
if (!parentElementNode) {
const snackbarNode = document.createElement("div");
snackbarNode.id = "snackbar";
document.body.appendChild(snackbarNode);
parentElementNode = snackbarNode;
}
window.snackbar = barConfig;
ReactDOM.render(<SnackBar {...rest} />, parentElementNode);
}
static close() {
if (window.snackbar && window.snackbar.parentElementId) {
const snackbar = document.querySelector("#snackbar-container");
snackbar.remove();
2021-07-21 09:40:52 +00:00
//ReactDOM.unmountComponentAtNode(window.snackbar.parentElementId);
}
}
onActionClick = (e) => {
this.props.clickAction && this.props.clickAction(e);
};
componentDidMount() {
const { onLoad } = this.props;
onLoad();
}
bannerRenderer = () => {
const { htmlContent, sectionWidth } = this.props;
return (
<div id="bar-banner" style={{ position: "relative" }}>
<StyledIframe
id="bar-frame"
src={htmlContent}
scrolling="no"
sectionWidth={sectionWidth}
onLoad={() => {
this.setState({ isLoaded: true });
}}
></StyledIframe>
{this.state.isLoaded && (
<StyledAction className="action" onClick={this.onActionClick}>
<StyledCrossIcon size="medium" />
</StyledAction>
)}
</div>
);
};
// Renderer callback with condition
countDownRenderer = ({ minutes, seconds, completed }) => {
if (completed) return <></>;
const { textColor, fontSize, fontWeight } = this.props;
// Render a countdown
return (
<Text
as="p"
color={textColor}
fontSize={fontSize}
fontWeight={fontWeight}
>
{zeroPad(minutes)}:{zeroPad(seconds)}
</Text>
);
};
render() {
const {
text,
headerText,
btnText,
textColor,
showIcon,
fontSize,
fontWeight,
textAlign,
htmlContent,
style,
countDownTime,
isCampaigns,
...rest
} = this.props;
const headerStyles = headerText ? {} : { display: "none" };
const bannerElement = this.bannerRenderer();
return (
<>
{isCampaigns ? (
<>{bannerElement}</>
) : (
<StyledSnackBar id="snackbar-container" style={style} {...rest}>
{htmlContent ? (
<div
dangerouslySetInnerHTML={{
__html: htmlContent,
}}
/>
) : (
2022-09-19 14:09:31 +00:00
<div className="text-container">
<div className="header-body" textalign={textAlign}>
{showIcon && (
<Box className="logo">
<StyledLogoIcon size="medium" color={textColor} />
</Box>
)}
<Heading
size="xsmall"
isInline={true}
className="text-header"
style={headerStyles}
2021-10-07 10:56:46 +00:00
color={textColor}
>
{headerText}
</Heading>
2022-09-19 14:09:31 +00:00
</div>
<div className="text-body">
<Text
as="p"
className={"text"}
color={textColor}
fontSize={fontSize}
fontWeight={fontWeight}
noSelect
>
{text}
</Text>
{btnText && (
<Text
color={textColor}
2022-09-19 14:09:31 +00:00
className="button"
onClick={this.onActionClick}
>
2022-09-19 14:09:31 +00:00
{btnText}
</Text>
2022-09-19 14:09:31 +00:00
)}
{countDownTime > -1 && (
<Countdown
date={Date.now() + countDownTime}
renderer={this.countDownRenderer}
onComplete={this.onActionClick}
/>
)}
</div>
</div>
)}
{!btnText && (
<button className="action" onClick={this.onActionClick}>
2022-09-19 14:09:31 +00:00
<StyledCrossIcon size="small" />
</button>
)}
</StyledSnackBar>
2021-07-26 09:31:56 +00:00
)}
</>
);
}
}
2021-06-10 14:20:09 +00:00
2021-07-14 14:12:13 +00:00
SnackBar.propTypes = {
text: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
headerText: PropTypes.string,
btnText: PropTypes.string,
backgroundImg: PropTypes.string,
backgroundColor: PropTypes.string,
textColor: PropTypes.string,
showIcon: PropTypes.bool,
clickAction: PropTypes.func,
fontSize: PropTypes.string,
fontWeight: PropTypes.string,
textAlign: PropTypes.string,
htmlContent: PropTypes.string,
style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
countDownTime: PropType.number,
sectionWidth: PropTypes.number,
isCampaigns: PropTypes.bool,
onLoad: PropTypes.func,
2022-03-14 14:39:14 +00:00
isMaintenance: PropTypes.bool,
2021-06-10 14:20:09 +00:00
};
2021-07-14 14:12:13 +00:00
2021-07-20 08:07:41 +00:00
SnackBar.defaultProps = {
backgroundColor: "#F7E6BE",
2021-07-20 08:07:41 +00:00
textColor: "#000",
2021-07-20 10:07:50 +00:00
showIcon: true,
fontSize: "13px",
fontWeight: "400",
textAlign: "left",
htmlContent: "",
countDownTime: -1,
isCampaigns: false,
2021-07-20 08:07:41 +00:00
};
2021-07-14 14:12:13 +00:00
export default SnackBar;