compile-time-warning.tsx 3.0 KB

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