compile-time-warning.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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 TWENTY_FOUR_DAYS = 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 {
  17. showCompileTimeWarning,
  18. setShowCompileTimeWarning,
  19. deliveryLatencies,
  20. isProjectOwner,
  21. } = useDetachCompileContext()
  22. useEffect(() => {
  23. if (deliveryLatencies && deliveryLatencies.compileTimeServerE2E) {
  24. // compile-timeout-20s test
  25. if (deliveryLatencies.compileTimeServerE2E > 10000) {
  26. eventTracking.sendMB('compile-time-warning-would-display', {
  27. time: 10,
  28. newCompileTimeout: 'control',
  29. isProjectOwner,
  30. })
  31. }
  32. }
  33. }, [deliveryLatencies, isProjectOwner])
  34. useEffect(() => {
  35. if (showCompileTimeWarning) {
  36. if (
  37. displayStatus &&
  38. Date.now() - displayStatus.lastDisplayTime < TWENTY_FOUR_DAYS
  39. ) {
  40. return
  41. }
  42. setDisplayStatus({ lastDisplayTime: Date.now(), dismissed: false })
  43. eventTracking.sendMB('compile-time-warning-displayed', { time: 30 })
  44. }
  45. }, [showCompileTimeWarning, displayStatus, setDisplayStatus])
  46. const getTimeSinceDisplayed = useCallback(() => {
  47. return (Date.now() - displayStatus.lastDisplayTime) / 1000
  48. }, [displayStatus])
  49. const closeWarning = useCallback(() => {
  50. eventTracking.sendMB('compile-time-warning-dismissed', {
  51. 'time-since-displayed': getTimeSinceDisplayed(),
  52. time: 30,
  53. })
  54. setShowCompileTimeWarning(false)
  55. setDisplayStatus(displayStatus => ({ ...displayStatus, dismissed: true }))
  56. }, [getTimeSinceDisplayed, setShowCompileTimeWarning, setDisplayStatus])
  57. const handleUpgradeClick = useCallback(() => {
  58. eventTracking.sendMB('compile-time-warning-upgrade-click', {
  59. 'time-since-displayed': getTimeSinceDisplayed(),
  60. time: 30,
  61. })
  62. setShowCompileTimeWarning(false)
  63. setDisplayStatus(displayStatus => ({ ...displayStatus, dismissed: true }))
  64. }, [getTimeSinceDisplayed, setShowCompileTimeWarning, setDisplayStatus])
  65. if (!showCompileTimeWarning || displayStatus.dismissed) {
  66. return null
  67. }
  68. return (
  69. <div className="alert alert-success compile-time-warning" role="alert">
  70. <Button
  71. className="close"
  72. data-dismiss="alert"
  73. aria-label="Close"
  74. onClick={closeWarning}
  75. >
  76. <span aria-hidden="true">&times;</span>
  77. </Button>
  78. <div className="warning-content">
  79. <div className="warning-text">
  80. <Trans
  81. i18nKey="approaching_compile_timeout_limit_upgrade_for_more_compile_time"
  82. components={{
  83. strong: <strong style={{ display: 'inline-block' }} />,
  84. }}
  85. />
  86. </div>
  87. <div className="upgrade-prompt">
  88. <StartFreeTrialButton
  89. buttonProps={{ bsStyle: 'primary', bsSize: 'sm' }}
  90. handleClick={handleUpgradeClick}
  91. source="compile-time-warning"
  92. >
  93. {t('upgrade')}
  94. </StartFreeTrialButton>
  95. </div>
  96. </div>
  97. </div>
  98. )
  99. }
  100. export default memo(CompileTimeWarning)