UserSettingsHelper.mjs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import SplitTestHandler from '../SplitTests/SplitTestHandler.mjs'
  2. // Copied from services/web/frontend/js/features/ide-redesign/utils/new-editor-utils.ts
  3. const SPLIT_TEST_USER_CUTOFF_DATE = new Date(Date.UTC(2025, 8, 23, 13, 0, 0)) // 2pm British Summer Time on September 23, 2025
  4. const NEW_USER_CUTOFF_DATE = new Date(Date.UTC(2025, 10, 12, 12, 0, 0)) // 12pm GMT on November 12, 2025
  5. async function getEnableNewEditorLegacyDefault(req, res, user) {
  6. if (req.query['existing-user-override'] === 'true') {
  7. return false
  8. }
  9. if (req.query['skip-new-user-check'] === 'true') {
  10. return true
  11. }
  12. if (user.signUpDate >= NEW_USER_CUTOFF_DATE) {
  13. return true
  14. }
  15. if (user.signUpDate >= SPLIT_TEST_USER_CUTOFF_DATE) {
  16. const assignment = await SplitTestHandler.promises.getAssignment(
  17. req,
  18. res,
  19. 'editor-redesign-new-users'
  20. )
  21. return assignment.variant !== 'default'
  22. }
  23. return false
  24. }
  25. const SYSTEM_THEME_USER_CUTOFF_DATE = new Date(Date.UTC(2026, 2, 2, 12, 0, 0)) // 12pm GMT on March 2, 2026
  26. async function getOverallTheme(req, res, user) {
  27. if (user.ace.overallTheme != null) {
  28. return user.ace.overallTheme
  29. }
  30. if (user.signUpDate < SYSTEM_THEME_USER_CUTOFF_DATE) {
  31. // default / dark
  32. return ''
  33. }
  34. const systemOverallSplitTestAssignment =
  35. await SplitTestHandler.promises.getAssignment(
  36. req,
  37. res,
  38. 'new-user-system-overall-theme'
  39. )
  40. if (systemOverallSplitTestAssignment.variant === 'system') {
  41. return 'system'
  42. }
  43. // default / dark
  44. return ''
  45. }
  46. async function buildUserSettings(req, res, user) {
  47. const defaultLegacyEnableNewEditor = await getEnableNewEditorLegacyDefault(
  48. req,
  49. res,
  50. user
  51. )
  52. const enableNewEditorStageFour = user.ace.enableNewEditorStageFour ?? true
  53. const enableNewEditorLegacy =
  54. user.ace.enableNewEditor ?? defaultLegacyEnableNewEditor
  55. return {
  56. mode: user.ace.mode,
  57. editorTheme: user.ace.theme,
  58. editorLightTheme: user.ace.lightTheme,
  59. editorDarkTheme: user.ace.darkTheme,
  60. fontSize: user.ace.fontSize,
  61. autoComplete: user.ace.autoComplete,
  62. autoPairDelimiters: user.ace.autoPairDelimiters,
  63. pdfViewer: user.ace.pdfViewer,
  64. syntaxValidation: user.ace.syntaxValidation,
  65. fontFamily: user.ace.fontFamily || 'lucida',
  66. lineHeight: user.ace.lineHeight || 'normal',
  67. overallTheme: await getOverallTheme(req, res, user),
  68. mathPreview: user.ace.mathPreview,
  69. breadcrumbs: user.ace.breadcrumbs,
  70. referencesSearchMode: user.ace.referencesSearchMode,
  71. enableNewEditor: enableNewEditorStageFour,
  72. enableNewEditorLegacy,
  73. darkModePdf: user.ace.darkModePdf ?? false,
  74. }
  75. }
  76. export default {
  77. buildUserSettings,
  78. }