import { forwardRef, memo, MouseEventHandler, useState } from 'react' import { Dropdown, DropdownMenu, DropdownToggle, } from '@/features/ui/components/bootstrap-5/dropdown-menu' import OLDropdownMenuItem from '@/features/ui/components/ol/ol-dropdown-menu-item' import MaterialIcon from '@/shared/components/material-icon' import classNames from 'classnames' import { useTrackChangesStateActionsContext, useTrackChangesStateContext, } from '../context/track-changes-state-context' import { useUserContext } from '@/shared/context/user-context' import { useTranslation } from 'react-i18next' import { usePermissionsContext } from '@/features/ide-react/context/permissions-context' import usePersistedState from '@/shared/hooks/use-persisted-state' import { sendMB } from '@/infrastructure/event-tracking' import { useEditorContext } from '@/shared/context/editor-context' import { useProjectContext } from '@/shared/context/project-context' import UpgradeTrackChangesModal from './upgrade-track-changes-modal' type Mode = 'view' | 'review' | 'edit' const useCurrentMode = (): Mode => { const trackChanges = useTrackChangesStateContext() const user = useUserContext() const trackChangesForCurrentUser = trackChanges?.onForEveryone || (user && user.id && trackChanges?.onForMembers[user.id]) const { permissionsLevel } = useEditorContext() if (permissionsLevel === 'readOnly') { return 'view' } else if (permissionsLevel === 'review') { return 'review' } else if (trackChangesForCurrentUser) { return 'review' } else { return 'edit' } } function ReviewModeSwitcher() { const { t } = useTranslation() const { saveTrackChangesForCurrentUser } = useTrackChangesStateActionsContext() const mode = useCurrentMode() const { permissionsLevel } = useEditorContext() const { write, trackedWrite } = usePermissionsContext() const project = useProjectContext() const [showUpgradeModal, setShowUpgradeModal] = useState(false) const showViewOption = permissionsLevel === 'readOnly' return (
{ if (mode === 'edit') { return } sendMB('editing-mode-change', { role: permissionsLevel, previousMode: mode, newMode: 'edit', }) saveTrackChangesForCurrentUser(false) }} description={t('can_edit_content')} leadingIcon="edit" active={write && mode === 'edit'} > {t('editing')} { if (mode === 'review') { return } if (!project.features.trackChanges) { setShowUpgradeModal(true) } else { sendMB('editing-mode-change', { role: permissionsLevel, previousMode: mode, newMode: 'review', }) saveTrackChangesForCurrentUser(true) } }} description={ permissionsLevel === 'review' && !trackedWrite ? t('comment_only') : t('edits_become_suggestions') } leadingIcon="rate_review" active={trackedWrite && mode === 'review'} > {t('reviewing')} {showViewOption && ( {t('viewing')} )}
) } const ModeSwitcherToggleButton = forwardRef< HTMLButtonElement, { onClick: MouseEventHandler; 'aria-expanded': boolean } >(({ onClick, 'aria-expanded': ariaExpanded }, ref) => { const { t } = useTranslation() const mode = useCurrentMode() if (mode === 'edit') { return ( ) } else if (mode === 'review') { return ( ) } return ( ) }) const ModeSwitcherToggleButtonContent = forwardRef< HTMLButtonElement, { onClick: MouseEventHandler className: string iconType: string label: string ariaExpanded: boolean } >(({ onClick, className, iconType, label, ariaExpanded }, ref) => { const [isFirstTimeUsed, setIsFirstTimeUsed] = usePersistedState( `modeSwitcherFirstTimeUsed`, true ) return ( ) }) ModeSwitcherToggleButton.displayName = 'ModeSwitcherToggleButton' ModeSwitcherToggleButtonContent.displayName = 'ModeSwitcherToggleButtonContent' export default memo(ReviewModeSwitcher)