|
|
@@ -18,8 +18,9 @@ import { useProjectContext } from '@/shared/context/project-context'
|
|
|
import { useCodeMirrorViewContext } from '@/features/source-editor/components/codemirror-context'
|
|
|
import { useEditorContext } from '@/shared/context/editor-context'
|
|
|
import { useTrackingChangesMode } from '@/shared/hooks/use-tracking-changes-mode'
|
|
|
+import { useFeatureFlag } from '@/shared/context/split-test-context'
|
|
|
|
|
|
-function ReviewModeSwitcher() {
|
|
|
+function ReviewModeDropdownItems() {
|
|
|
const { t } = useTranslation()
|
|
|
const user = useUserContext()
|
|
|
const { saveTrackChangesForCurrentUser, saveTrackChanges } =
|
|
|
@@ -32,6 +33,108 @@ function ReviewModeSwitcher() {
|
|
|
const showViewOption = permissionsLevel === 'readOnly'
|
|
|
const view = useCodeMirrorViewContext()
|
|
|
|
|
|
+ return (
|
|
|
+ <>
|
|
|
+ <OLDropdownMenuItem
|
|
|
+ disabled={!write}
|
|
|
+ onClick={() => {
|
|
|
+ if (mode === 'edit') {
|
|
|
+ view.focus()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sendMB('editing-mode-change', {
|
|
|
+ role: permissionsLevel,
|
|
|
+ previousMode: mode,
|
|
|
+ newMode: 'edit',
|
|
|
+ })
|
|
|
+ if (user?.id) {
|
|
|
+ saveTrackChangesForCurrentUser(false)
|
|
|
+ } else {
|
|
|
+ saveTrackChanges({ on_for_guests: false })
|
|
|
+ }
|
|
|
+ view.focus()
|
|
|
+ }}
|
|
|
+ description={t('edit_content_directly')}
|
|
|
+ leadingIcon="edit"
|
|
|
+ active={write && mode === 'edit'}
|
|
|
+ >
|
|
|
+ {t('editing')}
|
|
|
+ </OLDropdownMenuItem>
|
|
|
+ <OLDropdownMenuItem
|
|
|
+ disabled={permissionsLevel === 'readOnly'}
|
|
|
+ onClick={() => {
|
|
|
+ if (mode === 'review') {
|
|
|
+ view.focus()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (!features.trackChanges) {
|
|
|
+ setUpgradeTrackChangesModal({
|
|
|
+ show: true,
|
|
|
+ location: 'review-switcher',
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ sendMB('editing-mode-change', {
|
|
|
+ role: permissionsLevel,
|
|
|
+ previousMode: mode,
|
|
|
+ newMode: 'review',
|
|
|
+ })
|
|
|
+ if (user?.id) {
|
|
|
+ saveTrackChangesForCurrentUser(true)
|
|
|
+ } else {
|
|
|
+ saveTrackChanges({ on_for_guests: true })
|
|
|
+ }
|
|
|
+ view.focus()
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ description={
|
|
|
+ permissionsLevel === 'review' && !trackedWrite
|
|
|
+ ? t('comment_only')
|
|
|
+ : t('edits_become_suggestions')
|
|
|
+ }
|
|
|
+ leadingIcon="rate_review"
|
|
|
+ active={trackedWrite && mode === 'review'}
|
|
|
+ >
|
|
|
+ {t('reviewing')}
|
|
|
+ </OLDropdownMenuItem>
|
|
|
+ {showViewOption && (
|
|
|
+ <OLDropdownMenuItem
|
|
|
+ description={t('can_view_content')}
|
|
|
+ leadingIcon="visibility"
|
|
|
+ active={mode === 'view'}
|
|
|
+ >
|
|
|
+ {t('viewing')}
|
|
|
+ </OLDropdownMenuItem>
|
|
|
+ )}
|
|
|
+ </>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+function ReviewModeSwitcher() {
|
|
|
+ const isToolbarMigration = useFeatureFlag('writefull-toolbar-migration')
|
|
|
+
|
|
|
+ if (isToolbarMigration) {
|
|
|
+ return (
|
|
|
+ <Dropdown className="review-mode-switcher" align="end">
|
|
|
+ <DropdownToggle
|
|
|
+ as={ModeSwitcherToggleButton}
|
|
|
+ id="review-mode-switcher"
|
|
|
+ />
|
|
|
+ <DropdownMenu
|
|
|
+ flip={false}
|
|
|
+ popperConfig={{ strategy: 'fixed' }}
|
|
|
+ // renderOnMount ensures the menu is in the DOM on mount so Popper.js
|
|
|
+ // can calculate its position correctly when using strategy: 'fixed'
|
|
|
+ // inside the toolbar's stacking context
|
|
|
+ renderOnMount
|
|
|
+ >
|
|
|
+ <ReviewModeDropdownItems />
|
|
|
+ </DropdownMenu>
|
|
|
+ </Dropdown>
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ // Portal variant (default): sticky container keeps the button floating
|
|
|
+ // over the editor at top-right of the scroll area.
|
|
|
return (
|
|
|
<div className="review-mode-switcher-container">
|
|
|
<Dropdown className="review-mode-switcher" align="end">
|
|
|
@@ -40,76 +143,7 @@ function ReviewModeSwitcher() {
|
|
|
id="review-mode-switcher"
|
|
|
/>
|
|
|
<DropdownMenu flip={false}>
|
|
|
- <OLDropdownMenuItem
|
|
|
- disabled={!write}
|
|
|
- onClick={() => {
|
|
|
- if (mode === 'edit') {
|
|
|
- view.focus()
|
|
|
- return
|
|
|
- }
|
|
|
- sendMB('editing-mode-change', {
|
|
|
- role: permissionsLevel,
|
|
|
- previousMode: mode,
|
|
|
- newMode: 'edit',
|
|
|
- })
|
|
|
- if (user?.id) {
|
|
|
- saveTrackChangesForCurrentUser(false)
|
|
|
- } else {
|
|
|
- saveTrackChanges({ on_for_guests: false })
|
|
|
- }
|
|
|
- view.focus()
|
|
|
- }}
|
|
|
- description={t('edit_content_directly')}
|
|
|
- leadingIcon="edit"
|
|
|
- active={write && mode === 'edit'}
|
|
|
- >
|
|
|
- {t('editing')}
|
|
|
- </OLDropdownMenuItem>
|
|
|
- <OLDropdownMenuItem
|
|
|
- disabled={permissionsLevel === 'readOnly'}
|
|
|
- onClick={() => {
|
|
|
- if (mode === 'review') {
|
|
|
- view.focus()
|
|
|
- return
|
|
|
- }
|
|
|
- if (!features.trackChanges) {
|
|
|
- setUpgradeTrackChangesModal({
|
|
|
- show: true,
|
|
|
- location: 'review-switcher',
|
|
|
- })
|
|
|
- } else {
|
|
|
- sendMB('editing-mode-change', {
|
|
|
- role: permissionsLevel,
|
|
|
- previousMode: mode,
|
|
|
- newMode: 'review',
|
|
|
- })
|
|
|
- if (user?.id) {
|
|
|
- saveTrackChangesForCurrentUser(true)
|
|
|
- } else {
|
|
|
- saveTrackChanges({ on_for_guests: true })
|
|
|
- }
|
|
|
- view.focus()
|
|
|
- }
|
|
|
- }}
|
|
|
- description={
|
|
|
- permissionsLevel === 'review' && !trackedWrite
|
|
|
- ? t('comment_only')
|
|
|
- : t('edits_become_suggestions')
|
|
|
- }
|
|
|
- leadingIcon="rate_review"
|
|
|
- active={trackedWrite && mode === 'review'}
|
|
|
- >
|
|
|
- {t('reviewing')}
|
|
|
- </OLDropdownMenuItem>
|
|
|
- {showViewOption && (
|
|
|
- <OLDropdownMenuItem
|
|
|
- description={t('can_view_content')}
|
|
|
- leadingIcon="visibility"
|
|
|
- active={mode === 'view'}
|
|
|
- >
|
|
|
- {t('viewing')}
|
|
|
- </OLDropdownMenuItem>
|
|
|
- )}
|
|
|
+ <ReviewModeDropdownItems />
|
|
|
</DropdownMenu>
|
|
|
</Dropdown>
|
|
|
</div>
|