compile-time-warning.tsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { memo, useCallback, useEffect } from 'react'
  2. import { Button } from 'react-bootstrap'
  3. import { Trans, useTranslation } from 'react-i18next'
  4. import * as eventTracking from '../../../infrastructure/event-tracking'
  5. import StartFreeTrialButton from '../../../shared/components/start-free-trial-button'
  6. import { useDetachCompileContext } from '../../../shared/context/detach-compile-context'
  7. import usePersistedState from '../../../shared/hooks/use-persisted-state'
  8. const ONE_DAY = 24 * 60 * 60 * 24 * 1000
  9. function CompileTimeWarning() {
  10. const { t } = useTranslation()
  11. const [displayStatus, setDisplayStatus] = usePersistedState(
  12. 'compile-time-warning-display-status',
  13. { lastDisplayTime: 0, dismissed: false },
  14. true
  15. )
  16. const { showCompileTimeWarning, setShowCompileTimeWarning } =
  17. useDetachCompileContext()
  18. useEffect(() => {
  19. if (showCompileTimeWarning) {
  20. if (
  21. displayStatus &&
  22. Date.now() - displayStatus.lastDisplayTime < ONE_DAY
  23. ) {
  24. return
  25. }
  26. setDisplayStatus({ lastDisplayTime: Date.now(), dismissed: false })
  27. eventTracking.sendMB('compile-time-warning-displayed', {})
  28. }
  29. }, [showCompileTimeWarning, displayStatus, setDisplayStatus])
  30. const getTimeSinceDisplayed = useCallback(() => {
  31. return (Date.now() - displayStatus.lastDisplayTime) / 1000
  32. }, [displayStatus])
  33. const closeWarning = useCallback(() => {
  34. eventTracking.sendMB('compile-time-warning-dismissed', {
  35. 'time-since-displayed': getTimeSinceDisplayed(),
  36. })
  37. setShowCompileTimeWarning(false)
  38. setDisplayStatus(displayStatus => ({ ...displayStatus, dismissed: true }))
  39. }, [getTimeSinceDisplayed, setShowCompileTimeWarning, setDisplayStatus])
  40. const handleUpgradeClick = useCallback(() => {
  41. eventTracking.sendMB('compile-time-warning-upgrade-click', {
  42. 'time-since-displayed': getTimeSinceDisplayed(),
  43. })
  44. setShowCompileTimeWarning(false)
  45. setDisplayStatus(displayStatus => ({ ...displayStatus, dismissed: true }))
  46. }, [getTimeSinceDisplayed, setShowCompileTimeWarning, setDisplayStatus])
  47. if (!showCompileTimeWarning || displayStatus.dismissed) {
  48. return null
  49. }
  50. return (
  51. <div className="alert alert-success compile-time-warning" role="alert">
  52. <Button
  53. className="close"
  54. data-dismiss="alert"
  55. aria-label="Close"
  56. onClick={closeWarning}
  57. >
  58. <span aria-hidden="true">&times;</span>
  59. </Button>
  60. <div className="warning-content">
  61. <div className="warning-text">
  62. <Trans
  63. i18nKey="approaching_compile_timeout_limit_upgrade_for_more_compile_time"
  64. // eslint-disable-next-line react/jsx-key
  65. components={[<strong style={{ display: 'inline-block' }} />]}
  66. />
  67. </div>
  68. <div className="upgrade-prompt">
  69. <StartFreeTrialButton
  70. buttonProps={{ bsStyle: 'primary', bsSize: 'sm' }}
  71. handleClick={handleUpgradeClick}
  72. source="compile-time-warning"
  73. >
  74. {t('upgrade')}
  75. </StartFreeTrialButton>
  76. </div>
  77. </div>
  78. </div>
  79. )
  80. }
  81. export default memo(CompileTimeWarning)