new-editor-utils.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { useUserSettingsContext } from '@/shared/context/user-settings-context'
  2. import getMeta from '@/utils/meta'
  3. import { isSplitTestEnabled, getSplitTestVariant } from '@/utils/splitTestUtils'
  4. const ignoringUserCutoffDate =
  5. new URLSearchParams(window.location.search).get('skip-new-user-check') ===
  6. 'true'
  7. // For E2E tests, allow forcing a user to be treated as an existing user
  8. const existingUserOverride =
  9. new URLSearchParams(window.location.search).get('existing-user-override') ===
  10. 'true'
  11. // We don't want to enable the new editor on server-pro/CE until we have fully rolled it out on SaaS
  12. const { isOverleaf } = getMeta('ol-ExposedSettings')
  13. const SPLIT_TEST_USER_CUTOFF_DATE = new Date(Date.UTC(2025, 8, 23, 13, 0, 0)) // 2pm British Summer Time on September 23, 2025
  14. const NEW_USER_CUTOFF_DATE = new Date(Date.UTC(2025, 10, 12, 12, 0, 0)) // 12pm GMT on November 12, 2025
  15. export const isNewUser = () => {
  16. if (existingUserOverride) return false
  17. if (ignoringUserCutoffDate) return true
  18. const user = getMeta('ol-user')
  19. if (!user.signUpDate) return false
  20. const createdAt = new Date(user.signUpDate)
  21. return createdAt > NEW_USER_CUTOFF_DATE
  22. }
  23. export const isSplitTestUser = () => {
  24. if (existingUserOverride) return false
  25. const user = getMeta('ol-user')
  26. if (!user.signUpDate) return false
  27. const createdAt = new Date(user.signUpDate)
  28. return (
  29. createdAt > SPLIT_TEST_USER_CUTOFF_DATE && createdAt <= NEW_USER_CUTOFF_DATE
  30. )
  31. }
  32. export const canUseNewEditorAsExistingUser = () => {
  33. return !canUseNewEditorAsNewUser() && isSplitTestEnabled('editor-redesign')
  34. }
  35. export const canUseNewEditorAsNewUser = () => {
  36. const newUserTestVariant = getSplitTestVariant('editor-redesign-new-users')
  37. return (
  38. isOverleaf &&
  39. (isNewUser() || (isSplitTestUser() && newUserTestVariant !== 'default'))
  40. )
  41. }
  42. export const canUseNewEditor = () => {
  43. return canUseNewEditorAsExistingUser() || canUseNewEditorAsNewUser()
  44. }
  45. export const useIsNewEditorEnabledAsExistingUser = () => {
  46. const { userSettings } = useUserSettingsContext()
  47. const hasAccess = canUseNewEditorAsExistingUser()
  48. const enabled = userSettings.enableNewEditor
  49. return hasAccess && enabled
  50. }
  51. export const useIsNewEditorEnabled = () => {
  52. const { userSettings } = useUserSettingsContext()
  53. const hasAccess = canUseNewEditor()
  54. const enabled = userSettings.enableNewEditor
  55. return hasAccess && enabled
  56. }
  57. export const useIsNewToNewEditor = () => {
  58. const { userSettings } = useUserSettingsContext()
  59. const newEditor = useIsNewEditorEnabled()
  60. return newEditor && !userSettings.enableNewEditorLegacy
  61. }