MobileNavigationBar.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { useParams } from 'common'
  2. import { ChevronLeft, Menu } from 'lucide-react'
  3. import Link from 'next/link'
  4. import { useState } from 'react'
  5. import { Button, cn } from 'ui'
  6. import { MobileSheetNav } from 'ui-patterns'
  7. import { HomeIcon } from '../LayoutHeader/HomeIcon'
  8. import { useMobileSheet } from './MobileSheetContext'
  9. import { OrgSelector } from './OrgSelector'
  10. import { ProjectBranchSelector } from './ProjectBranchSelector'
  11. import { ConnectButton } from '@/components/interfaces/ConnectButton/ConnectButton'
  12. import { LocalDropdown } from '@/components/interfaces/LocalDropdown'
  13. import { SidebarContent } from '@/components/interfaces/Sidebar'
  14. import { UserDropdown } from '@/components/interfaces/UserDropdown'
  15. import { FloatingMobileToolbar } from '@/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar'
  16. import { useOrganizationsQuery } from '@/data/organizations/organizations-query'
  17. import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization'
  18. import { IS_PLATFORM } from '@/lib/constants'
  19. export const ICON_SIZE = 20
  20. export const ICON_STROKE_WIDTH = 1.5
  21. const MobileNavigationBar = ({
  22. hideMobileMenu,
  23. backToDashboardURL,
  24. }: {
  25. hideMobileMenu?: boolean
  26. backToDashboardURL?: string
  27. }) => {
  28. const [isSheetOpen, setIsSheetOpen] = useState(false)
  29. const { ref: projectRef, slug } = useParams()
  30. const { data: selectedOrganization } = useSelectedOrganizationQuery()
  31. const { isPending: isLoadingOrganizations } = useOrganizationsQuery()
  32. const isProjectScope = !!projectRef
  33. const showOrgSelection = slug || isLoadingOrganizations || (selectedOrganization && projectRef)
  34. const { openMenu } = useMobileSheet()
  35. return (
  36. <div className="w-full flex flex-row md:hidden">
  37. <nav
  38. className={cn(
  39. 'group pr-3 pl-2 z-10 w-full h-12 gap-2',
  40. 'border-b bg-dash-sidebar border-default shadow-[0_0_30px_0_rgba(0,0,0,0.07)]',
  41. 'transition-width duration-200',
  42. 'hide-scrollbar flex flex-row items-center justify-between overflow-x-auto'
  43. )}
  44. >
  45. <div className={cn('flex min-w-0 shrink items-center gap-2', !IS_PLATFORM && 'pl-2')}>
  46. {backToDashboardURL && (
  47. <div className="flex items-center justify-center ml-1 flex-0 md:hidden h-full aspect-square">
  48. <Link
  49. href={backToDashboardURL}
  50. className="flex items-center justify-center bg-transparent! rounded-md min-w-[30px] w-[30px] h-[30px] border text-foreground-lighter hover:text-foreground transition-colors"
  51. >
  52. <ChevronLeft strokeWidth={1.5} size={16} />
  53. </Link>
  54. </div>
  55. )}
  56. {!IS_PLATFORM && <HomeIcon />}
  57. {isProjectScope ? (
  58. <>
  59. <ProjectBranchSelector />
  60. <ConnectButton iconOnly className="w-8 h-8" />
  61. </>
  62. ) : IS_PLATFORM && showOrgSelection ? (
  63. <OrgSelector />
  64. ) : (
  65. <HomeIcon className="ml-1" />
  66. )}
  67. </div>
  68. <div className="flex shrink-0 gap-2">
  69. {IS_PLATFORM ? <UserDropdown /> : <LocalDropdown />}
  70. {!hideMobileMenu && (
  71. <Button
  72. title="Menu dropdown button"
  73. type="default"
  74. className="flex lg:hidden border-default bg-surface-100/75 text-foreground-light rounded-md min-w-[30px] w-[30px] h-[30px] data-open:bg-overlay-hover/30"
  75. icon={<Menu />}
  76. onClick={() => openMenu()}
  77. />
  78. )}
  79. </div>
  80. </nav>
  81. <MobileSheetNav open={isSheetOpen} onOpenChange={setIsSheetOpen} data-state="expanded">
  82. <SidebarContent />
  83. </MobileSheetNav>
  84. <FloatingMobileToolbar hideMobileMenu={hideMobileMenu} />
  85. </div>
  86. )
  87. }
  88. export default MobileNavigationBar