| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- import React, { ElementType } from 'react'
- import { useTranslation } from 'react-i18next'
- import MenuButton from './menu-button'
- import CobrandingLogo from './cobranding-logo'
- import BackToProjectsButton from './back-to-projects-button'
- import UpgradePrompt from './upgrade-prompt'
- import ChatToggleButton from './chat-toggle-button'
- import LayoutDropdownButton from './layout-dropdown-button'
- import OnlineUsersWidget from './online-users-widget'
- import ProjectNameEditableLabel from './project-name-editable-label'
- import TrackChangesToggleButton from './track-changes-toggle-button'
- import HistoryToggleButton from './history-toggle-button'
- import ShareProjectButton from './share-project-button'
- import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
- import BackToEditorButton from './back-to-editor-button'
- import getMeta from '@/utils/meta'
- import { isSplitTestEnabled } from '@/utils/splitTestUtils'
- import { canUseNewEditor } from '@/features/ide-redesign/utils/new-editor-utils'
- import TryNewEditorButton from '../try-new-editor-button'
- import { OnlineUser } from '@/features/ide-react/context/online-users-context'
- import { Cobranding } from '../../../../../types/cobranding'
- const [publishModalModules] = importOverleafModules('publishModal') as {
- import: { default: ElementType }
- path: string
- }[]
- const PublishButton = publishModalModules?.import.default
- const offlineModeToolbarButtons = importOverleafModules(
- 'offlineModeToolbarButtons'
- ) as {
- import: { default: ElementType }
- path: string
- }[]
- // double opt-in
- const enableROMirrorOnClient =
- isSplitTestEnabled('ro-mirror-on-client') &&
- new URLSearchParams(window.location.search).get('ro-mirror-on-client') ===
- 'enabled'
- export type ToolbarHeaderProps = {
- cobranding: Cobranding | undefined
- onShowLeftMenuClick: () => void
- chatIsOpen: boolean
- toggleChatOpen: () => void
- reviewPanelOpen: boolean
- toggleReviewPanelOpen: (e: React.MouseEvent) => void
- historyIsOpen: boolean
- toggleHistoryOpen: () => void
- unreadMessageCount: number
- onlineUsers: OnlineUser[]
- goToUser: (user: OnlineUser) => void
- isRestrictedTokenMember: boolean | undefined
- hasPublishPermissions: boolean
- chatVisible: boolean
- projectName: string
- renameProject: (name: string) => void
- hasRenamePermissions: boolean
- openShareModal: () => void
- trackChangesVisible: boolean | undefined
- }
- const ToolbarHeader = React.memo(function ToolbarHeader({
- cobranding,
- onShowLeftMenuClick,
- chatIsOpen,
- toggleChatOpen,
- reviewPanelOpen,
- toggleReviewPanelOpen,
- historyIsOpen,
- toggleHistoryOpen,
- unreadMessageCount,
- onlineUsers,
- goToUser,
- isRestrictedTokenMember,
- hasPublishPermissions,
- chatVisible,
- projectName,
- renameProject,
- hasRenamePermissions,
- openShareModal,
- trackChangesVisible,
- }: ToolbarHeaderProps) {
- const chatEnabled = getMeta('ol-capabilities')?.includes('chat')
- const { t } = useTranslation()
- const shouldDisplayPublishButton = hasPublishPermissions && PublishButton
- return (
- <nav className="toolbar toolbar-header" aria-label={t('project_actions')}>
- <div className="toolbar-left">
- <MenuButton onClick={onShowLeftMenuClick} />
- {cobranding && cobranding.logoImgUrl && (
- <CobrandingLogo {...cobranding} />
- )}
- <BackToProjectsButton />
- {enableROMirrorOnClient &&
- offlineModeToolbarButtons.map(
- ({ path, import: { default: OfflineModeToolbarButton } }) => {
- return <OfflineModeToolbarButton key={path} />
- }
- )}
- </div>
- {getMeta('ol-showUpgradePrompt') && (
- <div className="d-flex align-items-center">
- <UpgradePrompt />
- </div>
- )}
- <ProjectNameEditableLabel
- className="toolbar-center"
- projectName={projectName}
- hasRenamePermissions={hasRenamePermissions}
- onChange={renameProject}
- />
- <div className="toolbar-right">
- {canUseNewEditor() && <TryNewEditorButton />}
- <OnlineUsersWidget onlineUsers={onlineUsers} goToUser={goToUser} />
- {historyIsOpen ? (
- <div className="d-flex align-items-center">
- <BackToEditorButton onClick={toggleHistoryOpen} />
- </div>
- ) : (
- <>
- {trackChangesVisible && (
- <TrackChangesToggleButton
- onMouseDown={toggleReviewPanelOpen}
- disabled={historyIsOpen}
- trackChangesIsOpen={reviewPanelOpen}
- />
- )}
- <ShareProjectButton onClick={openShareModal} />
- {shouldDisplayPublishButton && (
- <PublishButton cobranding={cobranding} />
- )}
- {!isRestrictedTokenMember && (
- <HistoryToggleButton onClick={toggleHistoryOpen} />
- )}
- <LayoutDropdownButton />
- {chatEnabled && chatVisible && (
- <ChatToggleButton
- chatIsOpen={chatIsOpen}
- onClick={toggleChatOpen}
- unreadMessageCount={unreadMessageCount}
- />
- )}
- </>
- )}
- </div>
- </nav>
- )
- })
- export default ToolbarHeader
|