GenericOverlay.tsx 2.4 KB

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