cm6-switch-away-survey.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { useCallback, useEffect, useRef, 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. const [richText] = useScopeValue('editor.showRichText')
  14. const initialRichTextPreference = useRef<boolean>(richText)
  15. useEffect(() => {
  16. // If the user has previously seen any switch-away survey, then don't show
  17. // the current one
  18. if (hasSeenCM6SwitchAwaySurvey()) return
  19. if (initialRichTextPreference.current) {
  20. if (!richText && newSourceEditor) {
  21. // If user change from rich text to cm6, we remove the rich text
  22. // preference so if user use rich text -> cm6 -> ace, we will show the
  23. // current survey
  24. initialRichTextPreference.current = false
  25. }
  26. // If the user loaded rich text initially, then don't show the survey
  27. // (we are assuming that they will not have used CM6 as much)
  28. return
  29. }
  30. if (!newSourceEditor && !richText) {
  31. setState('enabled')
  32. } else {
  33. setState('disabled')
  34. }
  35. }, [newSourceEditor, richText])
  36. useEffect(() => {
  37. const handleKeyDown = () => {
  38. const TIME_FOR_SURVEY_TO_APPEAR = 3000
  39. setTimeout(() => {
  40. if (state === 'enabled') {
  41. setState('shown')
  42. setHasSeenCM6SwitchAwaySurvey()
  43. }
  44. }, TIME_FOR_SURVEY_TO_APPEAR)
  45. }
  46. // can't access the ace editor directly, so add the keydown event
  47. // to window
  48. window?.addEventListener('keydown', handleKeyDown, { once: true })
  49. return () => window?.removeEventListener('keydown', handleKeyDown)
  50. }, [state])
  51. const handleClose = useCallback(() => {
  52. setState('disabled')
  53. }, [])
  54. const handleFollowLink = useCallback(() => {
  55. sendMB('cm6-switch-away-survey')
  56. setState('disabled')
  57. }, [])
  58. if (state !== 'shown') {
  59. return null
  60. }
  61. return (
  62. <div className="alert alert-success cm6-switch-away-survey" role="alert">
  63. <Button
  64. className="close"
  65. data-dismiss="alert"
  66. aria-label="Close"
  67. onClick={handleClose}
  68. >
  69. <span aria-hidden="true">&times;</span>
  70. </Button>
  71. <div className="warning-content">
  72. <div>
  73. <div className="warning-text">
  74. We noticed that you're still using the{' '}
  75. <strong>Source (legacy)</strong> editor.
  76. </div>
  77. <div className="warning-text">Could you let us know why?</div>
  78. </div>
  79. <div style={{ display: 'inline-flex' }}>
  80. <a
  81. href="https://forms.gle/Ygv8gLZ4N8LepQj56"
  82. className="btn btn-sm btn-info"
  83. target="_blank"
  84. rel="noreferrer"
  85. onClick={handleFollowLink}
  86. >
  87. Take survey
  88. </a>
  89. </div>
  90. </div>
  91. </div>
  92. )
  93. }