compile-time-warning.tsx 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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', { time: 30 })
  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. time: 30,
  37. })
  38. setShowCompileTimeWarning(false)
  39. setDisplayStatus(displayStatus => ({ ...displayStatus, dismissed: true }))
  40. }, [getTimeSinceDisplayed, setShowCompileTimeWarning, setDisplayStatus])
  41. const handleUpgradeClick = useCallback(() => {
  42. eventTracking.sendMB('compile-time-warning-upgrade-click', {
  43. 'time-since-displayed': getTimeSinceDisplayed(),
  44. time: 30,
  45. })
  46. setShowCompileTimeWarning(false)
  47. setDisplayStatus(displayStatus => ({ ...displayStatus, dismissed: true }))
  48. }, [getTimeSinceDisplayed, setShowCompileTimeWarning, setDisplayStatus])
  49. if (!showCompileTimeWarning || displayStatus.dismissed) {
  50. return null
  51. }
  52. return (
  53. <div className="alert alert-success compile-time-warning" role="alert">
  54. <Button
  55. className="close"
  56. data-dismiss="alert"
  57. aria-label="Close"
  58. onClick={closeWarning}
  59. >
  60. <span aria-hidden="true">&times;</span>
  61. </Button>
  62. <div className="warning-content">
  63. <div className="warning-text">
  64. <Trans
  65. i18nKey="approaching_compile_timeout_limit_upgrade_for_more_compile_time"
  66. // eslint-disable-next-line react/jsx-key
  67. components={[<strong style={{ display: 'inline-block' }} />]}
  68. />
  69. </div>
  70. <div className="upgrade-prompt">
  71. <StartFreeTrialButton
  72. buttonProps={{ bsStyle: 'primary', bsSize: 'sm' }}
  73. handleClick={handleUpgradeClick}
  74. source="compile-time-warning"
  75. >
  76. {t('upgrade')}
  77. </StartFreeTrialButton>
  78. </div>
  79. </div>
  80. </div>
  81. )
  82. }
  83. export default memo(CompileTimeWarning)