cm6-switch-away-survey.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { useCallback, useEffect, useState } from 'react'
  2. import { Button } from 'react-bootstrap'
  3. import useScopeValue from '../../../shared/hooks/use-scope-value'
  4. import {
  5. hasSeenCM6SwitchAwaySurvey,
  6. setHasSeenCM6SwitchAwaySurvey,
  7. } from '../utils/switch-away-survey'
  8. import { sendMB } from '../../../infrastructure/event-tracking'
  9. type CM6SwitchAwaySurveyState = 'disabled' | 'enabled' | 'shown'
  10. export default function CM6SwitchAwaySurvey() {
  11. const [state, setState] = useState<CM6SwitchAwaySurveyState>('disabled')
  12. const [newSourceEditor] = useScopeValue('editor.newSourceEditor')
  13. useEffect(() => {
  14. // If the user has previously seen any switch-away survey, then don't show
  15. // the current one
  16. if (hasSeenCM6SwitchAwaySurvey()) return
  17. if (!newSourceEditor) {
  18. setState('enabled')
  19. } else {
  20. setState('disabled')
  21. }
  22. }, [newSourceEditor])
  23. useEffect(() => {
  24. const handleKeyDown = () => {
  25. const TIME_FOR_SURVEY_TO_APPEAR = 3000
  26. setTimeout(() => {
  27. if (state === 'enabled') {
  28. setState('shown')
  29. setHasSeenCM6SwitchAwaySurvey()
  30. }
  31. }, TIME_FOR_SURVEY_TO_APPEAR)
  32. }
  33. // can't access the ace editor directly, so add the keydown event
  34. // to window
  35. window?.addEventListener('keydown', handleKeyDown, { once: true })
  36. return () => window?.removeEventListener('keydown', handleKeyDown)
  37. }, [state])
  38. const handleClose = useCallback(() => {
  39. setState('disabled')
  40. }, [])
  41. const handleFollowLink = useCallback(() => {
  42. sendMB('cm6-switch-away-survey')
  43. setState('disabled')
  44. }, [])
  45. if (state !== 'shown') {
  46. return null
  47. }
  48. return (
  49. <div className="alert alert-success cm6-switch-away-survey" role="alert">
  50. <Button
  51. className="close"
  52. data-dismiss="alert"
  53. aria-label="Close"
  54. onClick={handleClose}
  55. bsStyle={null}
  56. >
  57. <span aria-hidden="true">&times;</span>
  58. </Button>
  59. <div className="warning-content">
  60. <div>
  61. <div className="warning-text">
  62. We noticed that you're still using the{' '}
  63. <strong>Source (legacy)</strong> editor.
  64. </div>
  65. <div className="warning-text">Could you let us know why?</div>
  66. </div>
  67. <div style={{ display: 'inline-flex' }}>
  68. <a
  69. href="https://forms.gle/Ygv8gLZ4N8LepQj56"
  70. className="btn btn-sm btn-info"
  71. target="_blank"
  72. rel="noreferrer"
  73. onClick={handleFollowLink}
  74. >
  75. Take survey
  76. </a>
  77. </div>
  78. </div>
  79. </div>
  80. )
  81. }