| 74 | |
| 75 | export function helpTriggerWithTypes(types, allowedDomains = [], drawerClassName = null) { |
| 76 | return class HelpTrigger extends React.Component { |
| 77 | static propTypes = { |
| 78 | ...HelpTriggerPropTypes, |
| 79 | type: PropTypes.oneOf(Object.keys(types)), |
| 80 | }; |
| 81 | |
| 82 | static defaultProps = HelpTriggerDefaultProps; |
| 83 | |
| 84 | iframeRef = React.createRef(); |
| 85 | |
| 86 | iframeLoadingTimeout = null; |
| 87 | |
| 88 | state = { |
| 89 | visible: false, |
| 90 | loading: false, |
| 91 | error: false, |
| 92 | currentUrl: null, |
| 93 | }; |
| 94 | |
| 95 | componentDidMount() { |
| 96 | window.addEventListener("message", this.onPostMessageReceived, false); |
| 97 | } |
| 98 | |
| 99 | componentWillUnmount() { |
| 100 | window.removeEventListener("message", this.onPostMessageReceived); |
| 101 | clearTimeout(this.iframeLoadingTimeout); |
| 102 | } |
| 103 | |
| 104 | loadIframe = (url) => { |
| 105 | clearTimeout(this.iframeLoadingTimeout); |
| 106 | this.setState({ loading: true, error: false }); |
| 107 | |
| 108 | this.iframeRef.current.src = url; |
| 109 | this.iframeLoadingTimeout = setTimeout(() => { |
| 110 | this.setState({ error: url, loading: false }); |
| 111 | }, IFRAME_TIMEOUT); // safety |
| 112 | }; |
| 113 | |
| 114 | onIframeLoaded = () => { |
| 115 | this.setState({ loading: false }); |
| 116 | clearTimeout(this.iframeLoadingTimeout); |
| 117 | }; |
| 118 | |
| 119 | onPostMessageReceived = (event) => { |
| 120 | if (!some(allowedDomains, (domain) => startsWith(event.origin, domain))) { |
| 121 | return; |
| 122 | } |
| 123 | |
| 124 | const { type, message: currentUrl } = event.data || {}; |
| 125 | if (type !== IFRAME_URL_UPDATE_MESSAGE) { |
| 126 | return; |
| 127 | } |
| 128 | |
| 129 | this.setState({ currentUrl }); |
| 130 | }; |
| 131 | |
| 132 | getUrl = () => { |
| 133 | const helpTriggerType = get(types, this.props.type); |