sidebar-lower-section.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { type Ref, useState } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import { Question, User } from '@phosphor-icons/react'
  4. import { Dropdown } from 'react-bootstrap'
  5. import getMeta from '@/utils/meta'
  6. import OLTooltip from '@/shared/components/ol/ol-tooltip'
  7. import { NavDropdownMenuItems } from '@/shared/components/navbar/nav-dropdown-from-data'
  8. import { NavbarDropdownItemData } from '@/shared/components/types/navbar'
  9. import { useContactUsModal } from '@/shared/hooks/use-contact-us-modal'
  10. import { UserProvider } from '@/shared/context/user-context'
  11. import { AccountMenuItems } from '@/shared/components/navbar/account-menu-items'
  12. import { sendMB } from '@/infrastructure/event-tracking'
  13. export function SidebarLowerSection({
  14. showThemeToggle = false,
  15. accountRef,
  16. onAccountOpen,
  17. children,
  18. }: {
  19. showThemeToggle?: boolean
  20. accountRef?: Ref<HTMLDivElement>
  21. onAccountOpen?: () => void
  22. children?: React.ReactNode
  23. }) {
  24. const { t } = useTranslation()
  25. const [showAccountDropdown, setShowAccountDropdown] = useState(false)
  26. const [showHelpDropdown, setShowHelpDropdown] = useState(false)
  27. const { showModal: showContactUsModal, modal: contactUsModal } =
  28. useContactUsModal({
  29. autofillProjectUrl: false,
  30. })
  31. const { sessionUser, showSubscriptionLink, items } = getMeta('ol-navbar')
  32. const helpItem = items.find(
  33. item => item.text === 'help_and_resources'
  34. ) as NavbarDropdownItemData
  35. return (
  36. <>
  37. {children}
  38. <nav
  39. className="d-flex flex-row gap-3 mb-2"
  40. aria-label={t('account_help')}
  41. >
  42. {helpItem && (
  43. <Dropdown
  44. className="ds-nav-icon-dropdown"
  45. onToggle={show => {
  46. setShowHelpDropdown(show)
  47. if (show) {
  48. sendMB('menu-expand', { item: 'help', location: 'sidebar' })
  49. }
  50. }}
  51. role="menu"
  52. >
  53. <Dropdown.Toggle role="menuitem" aria-label={t('help')}>
  54. <OLTooltip
  55. description={t('help')}
  56. id="help-icon"
  57. overlayProps={{
  58. placement: 'top',
  59. }}
  60. hidden={showHelpDropdown}
  61. >
  62. <div>
  63. <Question size={24} />
  64. </div>
  65. </OLTooltip>
  66. </Dropdown.Toggle>
  67. <Dropdown.Menu
  68. as="ul"
  69. role="menu"
  70. align="end"
  71. popperConfig={{
  72. modifiers: [{ name: 'offset', options: { offset: [0, 5] } }],
  73. }}
  74. >
  75. <NavDropdownMenuItems
  76. dropdown={helpItem.dropdown}
  77. showContactUsModal={showContactUsModal}
  78. location="sidebar"
  79. />
  80. </Dropdown.Menu>
  81. </Dropdown>
  82. )}
  83. {sessionUser && (
  84. <Dropdown
  85. className="ds-nav-icon-dropdown"
  86. onToggle={show => {
  87. setShowAccountDropdown(show)
  88. if (show) {
  89. sendMB('menu-expand', {
  90. item: 'account',
  91. location: 'sidebar',
  92. })
  93. onAccountOpen?.()
  94. }
  95. }}
  96. role="menu"
  97. >
  98. <Dropdown.Toggle role="menuitem" aria-label={t('Account')}>
  99. <OLTooltip
  100. description={t('Account')}
  101. id="open-account"
  102. overlayProps={{
  103. placement: 'top',
  104. }}
  105. hidden={showAccountDropdown}
  106. >
  107. <div ref={accountRef}>
  108. <User size={24} />
  109. </div>
  110. </OLTooltip>
  111. </Dropdown.Toggle>
  112. <Dropdown.Menu
  113. as="ul"
  114. role="menu"
  115. align="end"
  116. popperConfig={{
  117. modifiers: [{ name: 'offset', options: { offset: [-50, 5] } }],
  118. }}
  119. >
  120. <AccountMenuItems
  121. sessionUser={sessionUser}
  122. showSubscriptionLink={showSubscriptionLink}
  123. showThemeToggle={showThemeToggle}
  124. />
  125. </Dropdown.Menu>
  126. </Dropdown>
  127. )}
  128. </nav>
  129. <div className="ds-nav-ds-name" translate="no">
  130. <span>Digital Science</span>
  131. </div>
  132. <UserProvider>{contactUsModal}</UserProvider>
  133. </>
  134. )
  135. }