mirror of
https://github.com/supabase/supabase.git
synced 2026-10-12 12:55:06 +03:00
- move navigation components to `apps/studio/components/layouts/Navigation` - add [FloatingMobileToolbar](https://github.com/supabase/supabase/pull/43444/changes#diff-3dffe47fd51ca851d612d8728e03b2dc344ec213d4f3a46a824d3fa32a7cc851) as quick access to tools such as search, assistant, inline editor, etc - behind feature flag and feature preview (true by default as it's a bit annoying to have to enable it all the time as previews are stored in local-storage) - fix sidebar panels closing on viewport resizing (regression from previous pr) https://github.com/user-attachments/assets/d6881e3b-5128-4306-bb82-3ca39c755dba <img width="986" height="697" alt="Screenshot 2026-03-12 at 12 40 11" src="https://github.com/user-attachments/assets/da8511e2-7d01-4237-b814-596031c747c5" />
63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
import { CommandMenuInnerContent } from 'components/interfaces/App/CommandMenu/CommandMenu'
|
|
import type { ReactNode } from 'react'
|
|
import { sidebarManagerState, useSidebarManagerSnapshot } from 'state/sidebar-manager-state'
|
|
import { CommandWrapper, MobileSheetNav } from 'ui-patterns'
|
|
|
|
import {
|
|
SIDEBAR_KEYS,
|
|
type TYPEOF_SIDEBAR_KEYS,
|
|
} from '../../ProjectLayout/LayoutSidebar/LayoutSidebarProvider'
|
|
import type { MobileSheetContentType } from './MobileSheetContext'
|
|
import { useMobileSheet } from './MobileSheetContext'
|
|
|
|
function isSidebarId(content: unknown): content is TYPEOF_SIDEBAR_KEYS {
|
|
return (
|
|
typeof content === 'string' &&
|
|
Object.values(SIDEBAR_KEYS).includes(content as TYPEOF_SIDEBAR_KEYS)
|
|
)
|
|
}
|
|
|
|
function getSheetChildren(
|
|
content: MobileSheetContentType,
|
|
activeSidebar: { id: string; component?: () => ReactNode } | null
|
|
): ReactNode {
|
|
if (content === null) return null
|
|
if (content === 'search') {
|
|
return (
|
|
<CommandWrapper className="h-full flex flex-col bg-background">
|
|
<CommandMenuInnerContent />
|
|
</CommandWrapper>
|
|
)
|
|
}
|
|
if (isSidebarId(content) && activeSidebar?.id === content) {
|
|
return activeSidebar.component?.() ?? null
|
|
}
|
|
if (!isSidebarId(content)) return content
|
|
return null
|
|
}
|
|
|
|
const StudioMobileSheetNav = () => {
|
|
const { content, setContent } = useMobileSheet()
|
|
const { activeSidebar } = useSidebarManagerSnapshot()
|
|
const sheetChildren = getSheetChildren(content, activeSidebar ?? null)
|
|
|
|
const handleOpenChange = (open: boolean) => {
|
|
if (!open) {
|
|
setContent(null)
|
|
sidebarManagerState.closeActive()
|
|
}
|
|
}
|
|
|
|
return (
|
|
<MobileSheetNav
|
|
open={content !== null}
|
|
onOpenChange={handleOpenChange}
|
|
shouldCloseOnViewportResize={!activeSidebar}
|
|
>
|
|
{sheetChildren}
|
|
</MobileSheetNav>
|
|
)
|
|
}
|
|
|
|
export { StudioMobileSheetNav }
|