import { ShareAltOutlined, MoreOutlined } from '@ant-design/icons'; import { Button as AntButton, Switch, Tooltip, Dropdown } from 'antd'; import cn from 'classnames'; import { Link2, Keyboard, Bot, Bookmark as BookmarkIcn, BookmarkCheck, Vault, } from 'lucide-react'; import { observer } from 'mobx-react-lite'; import React, { useMemo } from 'react'; import { Icon } from 'UI'; import { PlayerContext } from 'App/components/Session/playerContext'; import { IFRAME } from 'App/constants/storageKeys'; import { useStore } from 'App/mstore'; import { checkParam, truncateStringToFit } from 'App/utils'; import SessionTabs from 'Components/Session/Player/SharedComponents/SessionTabs'; import { ShortcutGrid } from 'Components/Session_/Player/Controls/components/KeyboardHelp'; import WarnBadge from 'Components/Session_/WarnBadge'; import { toast } from 'react-toastify'; import { useModal } from 'Components/ModalContext'; import IssueForm from 'Components/Session_/Issues/IssueForm'; import QueueControls from './QueueControls'; import HighlightButton from './Highlight/HighlightButton'; import ShareModal from '../shared/SharePopup/SharePopup'; import { useTranslation } from 'react-i18next'; const disableDevtools = 'or_devtools_uxt_toggle'; function SubHeader(props) { const { uxtestingStore, integrationsStore, sessionStore, projectsStore, userStore, issueReportingStore, settingsStore } = useStore(); const { t } = useTranslation(); const { favorite } = sessionStore.current; const { isEnterprise } = userStore; const currentSession = sessionStore.current; const projectId = projectsStore.siteId; const integrations = integrationsStore.issues.list; const { player, store } = React.useContext(PlayerContext); const { location: currentLocation = 'loading...' } = store.get(); const hasIframe = localStorage.getItem(IFRAME) === 'true'; const [hideTools, setHideTools] = React.useState(false); const [isFavorite, setIsFavorite] = React.useState(favorite); const { openModal, closeModal } = useModal(); React.useEffect(() => { const hideDevtools = checkParam('hideTools'); if (hideDevtools) { setHideTools(true); } }, []); const enabledIntegration = useMemo(() => { if (!integrations || !integrations.length) { return false; } return integrations.some((i) => i.token); }, [integrations]); const issuesIntegrationList = integrationsStore.issues.list; const handleOpenIssueModal = () => { issueReportingStore.init({}); if (!issueReportingStore.projectsFetched) { issueReportingStore.fetchProjects().then((projects) => { if (projects && projects[0]) { void issueReportingStore.fetchMeta(projects[0].id); } }); } openModal( , { title: t('Create Issue'), }, ); }; const reportingProvider = issuesIntegrationList[0]?.provider || ''; const locationTruncated = truncateStringToFit( currentLocation, window.innerWidth - 200, ); const toggleDevtools = (enabled) => { localStorage.setItem(disableDevtools, enabled ? '0' : '1'); uxtestingStore.setHideDevtools(!enabled); }; const showKbHelp = () => { openModal(, { width: 320, title: t('Keyboard Shortcuts') }); }; const vaultIcon = isEnterprise ? ( ) : isFavorite ? ( ) : ( ); const toggleFavorite = () => { const onToggleFavorite = sessionStore.toggleFavorite; const ADDED_MESSAGE = isEnterprise ? t('Session added to vault') : t('Session added to your bookmarks'); const REMOVED_MESSAGE = isEnterprise ? t('Session removed from vault') : t('Session removed from your bookmarks'); onToggleFavorite(currentSession.sessionId).then(() => { toast.success(isFavorite ? REMOVED_MESSAGE : ADDED_MESSAGE); setIsFavorite(!isFavorite); }); }; const showVModeBadge = store.get().vModeBadge; const onVMode = () => { settingsStore.sessionSettings.updateKey('virtualMode', true); player.enableVMode?.(); location.reload(); } return ( <>
{!hideTools && (
openModal( , { title: t('Share Session') }, ) } > props.setActiveTab('HIGHLIGHT')} /> {vaultIcon} {isEnterprise ? t('Vault') : t('Bookmark')}
), onClick: toggleFavorite, }, { key: '4', label: (
{t('Issues')}
), disabled: !enabledIntegration, onClick: handleOpenIssueModal, }, { key: '1', label: (
{t('Keyboard Shortcuts')}
), onClick: showKbHelp, }, ] }} > {uxtestingStore.isUxt() ? ( ) : (
)}
)} {locationTruncated && ( )} ); } export default observer(SubHeader);