GenericOverlay.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import * as React from 'react'
  2. import { connect } from 'react-redux'
  3. import { OverlayActionDispatch } from '../../../redux/actions/overlayActions'
  4. import { LoggerUtil } from 'common/logging/loggerutil'
  5. import './GenericOverlay.css'
  6. export interface GenericOverlayProps {
  7. title: string
  8. description: string
  9. acknowledgeText?: string
  10. dismissText?: string
  11. dismissible: boolean
  12. acknowledgeCallback?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => Promise<void>
  13. dismissCallback?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => Promise<void>
  14. }
  15. const mapDispatch = {
  16. ...OverlayActionDispatch
  17. }
  18. type InternalGenericOverlayProps = GenericOverlayProps & typeof mapDispatch
  19. class GenericOverlay extends React.Component<InternalGenericOverlayProps> {
  20. private readonly logger = LoggerUtil.getLogger('GenericOverlay')
  21. private getAcknowledgeText = (): string => {
  22. return this.props.acknowledgeText || 'OK'
  23. }
  24. private getDismissText = (): string => {
  25. return this.props.dismissText || 'Dismiss'
  26. }
  27. private onAcknowledgeClick = async (event: React.MouseEvent<HTMLButtonElement, MouseEvent>): Promise<void> => {
  28. if(this.props.acknowledgeCallback) {
  29. try {
  30. await this.props.acknowledgeCallback(event)
  31. } catch(err) {
  32. this.logger.error('Uncaught error in acknowledgement', err)
  33. }
  34. }
  35. this.props.popOverlayContent()
  36. }
  37. private onDismissClick = async (event: React.MouseEvent<HTMLButtonElement, MouseEvent>): Promise<void> => {
  38. if(this.props.dismissCallback) {
  39. try {
  40. await this.props.dismissCallback(event)
  41. } catch(err) {
  42. this.logger.error('Uncaught error in dismission', err)
  43. }
  44. }
  45. this.props.popOverlayContent()
  46. }
  47. render(): JSX.Element {
  48. return <>
  49. <div id="overlayContent">
  50. <span id="overlayTitle">{this.props.title}</span>
  51. <span id="overlayDesc">{this.props.description}</span>
  52. <div id="overlayActionContainer">
  53. <button onClick={this.onAcknowledgeClick} id="overlayAcknowledge" className="overlayKeybindEnter">{this.getAcknowledgeText()}</button>
  54. <div id="overlayDismissWrapper">
  55. { this.props.dismissible
  56. ? <button onClick={this.onDismissClick} id="overlayDismiss" className="overlayKeybindEsc">{this.getDismissText()}</button>
  57. : <></>
  58. }
  59. </div>
  60. </div>
  61. </div>
  62. </>
  63. }
  64. }
  65. export default connect<unknown, typeof mapDispatch>(undefined, mapDispatch)(GenericOverlay)