Build and Deploy Verso / deploy (push) Successful in 14m49s
- en.json: replace 'Overleaf' with 'Verso' in 6 user-visible strings (email_already_registered, add_manager_user_not_found, compile_timeout, download_metadata, to_confirm_email address, welcome_opening_workspace) - groups-and-enterprise-banner: use dynamic appName instead of hard-coded 'Overleaf' - SidebarLowerSection: add showAccountIcons prop (default true); set false in project dashboard sidebar — account menu is already in the top-right navbar, so the bottom-left duplicate is removed for all themes - ds-nav-verso-logo: replace opacity-fade hover with scale+brightness transform so logo is fully visible at rest - Lumière: scope new-project-dropdown sidebar padding to avoid misaligning the button when it appears next to the search bar in the header Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
154 lines
5.0 KiB
TypeScript
154 lines
5.0 KiB
TypeScript
import { type Ref, useState } from 'react'
|
|
import { useTranslation } from 'react-i18next'
|
|
import { Question, User } from '@phosphor-icons/react'
|
|
import { Dropdown } from 'react-bootstrap'
|
|
import getMeta from '@/utils/meta'
|
|
import OLTooltip from '@/shared/components/ol/ol-tooltip'
|
|
import { NavDropdownMenuItems } from '@/shared/components/navbar/nav-dropdown-from-data'
|
|
import { NavbarDropdownItemData } from '@/shared/components/types/navbar'
|
|
import { useContactUsModal } from '@/shared/hooks/use-contact-us-modal'
|
|
import { UserProvider } from '@/shared/context/user-context'
|
|
import { AccountMenuItems } from '@/shared/components/navbar/account-menu-items'
|
|
import { sendMB } from '@/infrastructure/event-tracking'
|
|
import { useActiveOverallTheme } from '@/shared/hooks/use-active-overall-theme'
|
|
import versoLogo from '@/shared/svgs/verso-logo.svg'
|
|
import versoLogoDark from '@/shared/svgs/verso-logo-dark.svg'
|
|
|
|
export function SidebarLowerSection({
|
|
showThemeToggle = false,
|
|
showAccountIcons = true,
|
|
accountRef,
|
|
onAccountOpen,
|
|
children,
|
|
}: {
|
|
showThemeToggle?: boolean
|
|
showAccountIcons?: boolean
|
|
accountRef?: Ref<HTMLDivElement>
|
|
onAccountOpen?: () => void
|
|
children?: React.ReactNode
|
|
}) {
|
|
const { t } = useTranslation()
|
|
const [showAccountDropdown, setShowAccountDropdown] = useState(false)
|
|
const [showHelpDropdown, setShowHelpDropdown] = useState(false)
|
|
const { showModal: showContactUsModal, modal: contactUsModal } =
|
|
useContactUsModal({
|
|
autofillProjectUrl: false,
|
|
})
|
|
const { sessionUser, showSubscriptionLink, items } = getMeta('ol-navbar')
|
|
const { appName } = getMeta('ol-ExposedSettings')
|
|
const activeOverallTheme = useActiveOverallTheme()
|
|
const helpItem = items.find(
|
|
item => item.text === 'help_and_resources'
|
|
) as NavbarDropdownItemData
|
|
|
|
return (
|
|
<>
|
|
{children}
|
|
{showAccountIcons && <nav
|
|
className="d-flex flex-row gap-3 mb-2"
|
|
aria-label={t('account_help')}
|
|
>
|
|
{helpItem && (
|
|
<Dropdown
|
|
className="ds-nav-icon-dropdown"
|
|
onToggle={show => {
|
|
setShowHelpDropdown(show)
|
|
if (show) {
|
|
sendMB('menu-expand', { item: 'help', location: 'sidebar' })
|
|
}
|
|
}}
|
|
role="menu"
|
|
>
|
|
<Dropdown.Toggle role="menuitem" aria-label={t('help')}>
|
|
<OLTooltip
|
|
description={t('help')}
|
|
id="help-icon"
|
|
overlayProps={{
|
|
placement: 'top',
|
|
}}
|
|
hidden={showHelpDropdown}
|
|
>
|
|
<div>
|
|
<Question size={24} />
|
|
</div>
|
|
</OLTooltip>
|
|
</Dropdown.Toggle>
|
|
<Dropdown.Menu
|
|
as="ul"
|
|
role="menu"
|
|
align="end"
|
|
popperConfig={{
|
|
modifiers: [{ name: 'offset', options: { offset: [0, 5] } }],
|
|
}}
|
|
>
|
|
<NavDropdownMenuItems
|
|
dropdown={helpItem.dropdown}
|
|
showContactUsModal={showContactUsModal}
|
|
location="sidebar"
|
|
/>
|
|
</Dropdown.Menu>
|
|
</Dropdown>
|
|
)}
|
|
{sessionUser && (
|
|
<Dropdown
|
|
className="ds-nav-icon-dropdown"
|
|
onToggle={show => {
|
|
setShowAccountDropdown(show)
|
|
if (show) {
|
|
sendMB('menu-expand', {
|
|
item: 'account',
|
|
location: 'sidebar',
|
|
})
|
|
onAccountOpen?.()
|
|
}
|
|
}}
|
|
role="menu"
|
|
>
|
|
<Dropdown.Toggle role="menuitem" aria-label={t('Account')}>
|
|
<OLTooltip
|
|
description={t('Account')}
|
|
id="open-account"
|
|
overlayProps={{
|
|
placement: 'top',
|
|
}}
|
|
hidden={showAccountDropdown}
|
|
>
|
|
<div ref={accountRef}>
|
|
<User size={24} />
|
|
</div>
|
|
</OLTooltip>
|
|
</Dropdown.Toggle>
|
|
<Dropdown.Menu
|
|
as="ul"
|
|
role="menu"
|
|
align="end"
|
|
popperConfig={{
|
|
modifiers: [{ name: 'offset', options: { offset: [-50, 5] } }],
|
|
}}
|
|
>
|
|
<AccountMenuItems
|
|
sessionUser={sessionUser}
|
|
showSubscriptionLink={showSubscriptionLink}
|
|
showThemeToggle={showThemeToggle}
|
|
/>
|
|
</Dropdown.Menu>
|
|
</Dropdown>
|
|
)}
|
|
</nav>}
|
|
<a
|
|
href="/"
|
|
className="ds-nav-verso-logo"
|
|
aria-label={appName}
|
|
style={{ display: 'block', marginTop: 'var(--spacing-03)' }}
|
|
>
|
|
<img
|
|
src={activeOverallTheme === 'dark' ? versoLogoDark : versoLogo}
|
|
alt={appName}
|
|
style={{ width: '100%', height: 'auto' }}
|
|
/>
|
|
</a>
|
|
<UserProvider>{contactUsModal}</UserProvider>
|
|
</>
|
|
)
|
|
}
|