mirror of
https://github.com/supabase/supabase.git
synced 2026-06-20 22:06:04 +08:00
* update deps + image codemod (studio) * update next links (studio) * update deps * update links (ui) * remove next-transpile-modules * move next-themes dependency * chore: update ConfirmDialog * chore: remove old ConfirmModal js file. migrated to TS * dependency wrangling * remove empty page * update next links (www) * First run bump react-data-grid-v7 beta 4 * fix package-lock.json * more deps wrangling * update recharts * update sentry options * fix some broken things in www * studio fixes * fix graphiql * fix studio build * fix menu hydration * small build error * update turbo * fix www typescript errors * docs image codemod * links codemod docs * fix docs typescript errors * move useConsent to ui to prevent circular deps * Fix links * Fix homepage * Fix links * move studio/ to apps/ * Revert "move studio/ to apps/" This reverts commit1b0a985fcb. * disable outputFileTracingRoot * remove outputFileTracingRoot * fix homepage product cards * fix PrivacySettings links * Fix links * Fix the build for www. * Minor fixes for JWTGenerator. * Fix the docs and ui tests. * Revert codehike back to 0.8.3 * remove ConfirmAlert() * reenable babel because mobx hates me * fix blog image and comparison page avatar * Fix svg errors * update image synthax * Fix code hike * Move the button in a div so that it doesn't inherit its parent height and make the button look weird. * When components are defined in a component, they get recreated on each render. This makes them unstable in certain cases and causes infinite rerenders. * Replace the next/head usage with next/script. * Chore/upgrade next 13 fix table editor (#18431) * fix table editor styling and fix row deletion logic * Fix deleting selected rows from header, and fix checkboxes not clearing up * Fix deleting all rows when filter applied, and fix deleting all rows * Fix grid size styling issue * Fix TS error * Hydration errors * studio org pages fixes * fix more studio links * audit logs fixes * dropdown icon styling fixes * fix some images in www * upgrade to next 14 * try new sentry wrapper for api * see if this is even invoked * Revert "see if this is even invoked" This reverts commit86c3973ffa. * Revert "try new sentry wrapper for api" This reverts commitf67623ebad. * Revert "upgrade to next 14" This reverts commita24dd6131e. * chore: allow node version 19/20 * Try to fix the LogTable so that it renders with the newer "react-data-grid" version. * Fix type errors in the log renderer code. * Fix the replication screen. * Add the CSS for the GraphiQL. * Fix SQL editor results rendering * Lint * Fix SQL editor results height issue * Fix auth RLS not invalidating RQ when toggling RLS * Fix database tables new/edit column regressed * Fix migrations page empty state if migrations schema not yet created * Fix API side panel docs temp remove postgrest text for column description PK and FK * Fix + improve timeout handling in SQL editor --------- Co-authored-by: Jonathan Summers-Muir <MildTomato@users.noreply.github.com> Co-authored-by: Joshen Lim <joshenlimek@gmail.com> Co-authored-by: Francesco Sansalvadore <f.sansalvadore@gmail.com> Co-authored-by: Terry Sutton <saltcod@gmail.com> Co-authored-by: Ivan Vasilov <vasilov.ivan@gmail.com> Co-authored-by: Kevin Grüneberg <k.grueneberg1994@gmail.com>
222 lines
6.2 KiB
TypeScript
222 lines
6.2 KiB
TypeScript
import * as Accordion from '@radix-ui/react-accordion'
|
|
import Link from 'next/link'
|
|
import { useRouter } from 'next/router'
|
|
import { IconChevronLeft, IconChevronUp, cn } from 'ui'
|
|
import * as NavItems from './NavigationMenu.constants'
|
|
|
|
import Image from 'next/legacy/image'
|
|
|
|
import RevVersionDropdown from '~/components/RefVersionDropdown'
|
|
import { useMenuActiveRefId } from '~/hooks/useMenuState'
|
|
|
|
import React, { Fragment } from 'react'
|
|
import { ICommonItem, ICommonSection } from '~/components/reference/Reference.types'
|
|
import HomeMenuIconPicker from './HomeMenuIconPicker'
|
|
import { deepFilterSections } from './NavigationMenu.utils'
|
|
|
|
const HeaderLink = React.memo(function HeaderLink(props: any) {
|
|
return (
|
|
<span className={['text-base text-brand-600 ', !props.title && 'capitalize'].join(' ')}>
|
|
{props.title ?? props.id}
|
|
</span>
|
|
)
|
|
})
|
|
|
|
interface FunctionLinkProps {
|
|
title: string
|
|
name?: string
|
|
id: string
|
|
icon?: string
|
|
basePath: string
|
|
slug: string
|
|
isParent?: boolean
|
|
isSubItem?: boolean
|
|
}
|
|
|
|
const FunctionLink = React.memo(function FunctionLink({
|
|
title,
|
|
id,
|
|
icon,
|
|
basePath,
|
|
slug,
|
|
isParent = false,
|
|
isSubItem = false,
|
|
}: FunctionLinkProps) {
|
|
const router = useRouter()
|
|
const activeAccordionItem = useMenuActiveRefId()
|
|
|
|
const url = `${router.basePath}${basePath}/${slug}`
|
|
const active = activeAccordionItem === id
|
|
|
|
return (
|
|
<li className="function-link-item leading-5">
|
|
<a
|
|
href={url}
|
|
/**
|
|
* We don't actually want to navigate or re-render anything
|
|
* since ref links are all sub-sections on the same page
|
|
*/
|
|
onClick={(e) => {
|
|
e.preventDefault()
|
|
history.pushState({}, '', url)
|
|
document.getElementById(slug)?.scrollIntoView()
|
|
}}
|
|
className={cn(
|
|
'cursor-pointer transition text-sm hover:text-scale-1200 gap-3 relative',
|
|
isParent ? 'flex justify-between' : 'leading-3',
|
|
active ? 'text-brand' : 'text-scale-1000'
|
|
)}
|
|
>
|
|
{icon && <Image width={16} height={16} alt={icon} src={`${router.basePath}${icon}`} />}
|
|
{title}
|
|
{active && !isSubItem && (
|
|
<div
|
|
aria-hidden="true"
|
|
className="absolute -left-[13px] top-0 bottom-0 w-[1px] bg-brand-600"
|
|
></div>
|
|
)}
|
|
{isParent && (
|
|
<IconChevronUp
|
|
width={16}
|
|
className="data-open-parent:rotate-0 data-closed-parent:rotate-90 transition"
|
|
/>
|
|
)}
|
|
</a>
|
|
</li>
|
|
)
|
|
})
|
|
|
|
export interface RenderLinkProps {
|
|
section: ICommonSection
|
|
basePath: string
|
|
}
|
|
|
|
const RenderLink = React.memo(function RenderLink({ section, basePath }: RenderLinkProps) {
|
|
const activeAccordionItem = useMenuActiveRefId()
|
|
|
|
if (!('items' in section)) {
|
|
return (
|
|
<FunctionLink
|
|
title={section.title}
|
|
id={section.id}
|
|
slug={section.slug}
|
|
basePath={basePath}
|
|
isParent={false}
|
|
isSubItem
|
|
/>
|
|
)
|
|
}
|
|
|
|
let active =
|
|
section.id === activeAccordionItem ||
|
|
section.items.some((item) => item.id === activeAccordionItem)
|
|
|
|
return (
|
|
<Accordion.Root collapsible type="single" value={active ? section.id : ''}>
|
|
<Accordion.Item value={section.id}>
|
|
<FunctionLink
|
|
title={section.title}
|
|
id={section.id}
|
|
slug={section.slug}
|
|
basePath={basePath}
|
|
isParent
|
|
isSubItem
|
|
/>
|
|
<Accordion.Content className="transition data-open:animate-slide-down data-closed:animate-slide-up border-l border-scale-600 pl-3 ml-1 data-open:mt-2 grid gap-2.5">
|
|
{section.items.map((item) => {
|
|
return (
|
|
<FunctionLink
|
|
key={item.id}
|
|
title={item.title}
|
|
id={item.id}
|
|
slug={item.slug}
|
|
basePath={basePath}
|
|
isParent={false}
|
|
isSubItem={false}
|
|
/>
|
|
)
|
|
})}
|
|
</Accordion.Content>
|
|
</Accordion.Item>
|
|
</Accordion.Root>
|
|
)
|
|
})
|
|
|
|
const SideMenuTitle = ({ title }: { title: string }) => {
|
|
return (
|
|
<span className="font-mono text-xs uppercase text-scale-1200 font-medium tracking-wider">
|
|
{title}
|
|
</span>
|
|
)
|
|
}
|
|
|
|
const Divider = () => {
|
|
return <div className="h-px w-full bg-blackA-300 dark:bg-whiteA-300 my-3"></div>
|
|
}
|
|
|
|
interface NavigationMenuRefListItemsProps {
|
|
id: string
|
|
basePath: string
|
|
commonSections: ICommonItem[]
|
|
spec?: any
|
|
}
|
|
|
|
const NavigationMenuRefListItems = ({
|
|
id,
|
|
basePath,
|
|
commonSections,
|
|
spec,
|
|
}: NavigationMenuRefListItemsProps) => {
|
|
const menu = NavItems[id]
|
|
|
|
const specFunctionIds = spec?.functions.map(({ id }) => id)
|
|
const filteredSections = spec
|
|
? deepFilterSections(commonSections, specFunctionIds)
|
|
: commonSections
|
|
|
|
return (
|
|
<div className={'w-full flex flex-col gap-0 sticky top-8'}>
|
|
<Link
|
|
href="/"
|
|
className={[
|
|
'flex items-center gap-1 text-xs group mb-3',
|
|
'text-base transition-all duration-200 text-scale-1100 hover:text-brand-600 hover:cursor-pointer ',
|
|
].join(' ')}
|
|
>
|
|
<div className="relative w-2">
|
|
<div className="transition-all ease-out ml-0 group-hover:-ml-1">
|
|
<IconChevronLeft size={10} strokeWidth={3} />
|
|
</div>
|
|
</div>
|
|
<span>Back to Main Menu</span>
|
|
</Link>
|
|
<div className="flex items-center gap-3 my-3">
|
|
<HomeMenuIconPicker icon={menu.icon} width={21} height={21} />
|
|
<HeaderLink title={menu.title} url={menu.url} id={id} />
|
|
<RevVersionDropdown />
|
|
</div>
|
|
<ul className="function-link-list flex flex-col gap-2 pb-5">
|
|
{filteredSections.map((section) => {
|
|
return (
|
|
<Fragment key={section.title}>
|
|
{section.type === 'category' ? (
|
|
<>
|
|
<Divider />
|
|
<SideMenuTitle title={section.title} />
|
|
{section.items.map((item) => (
|
|
<RenderLink key={item.id} section={item} basePath={basePath} />
|
|
))}
|
|
</>
|
|
) : (
|
|
<RenderLink section={section} basePath={basePath} />
|
|
)}
|
|
</Fragment>
|
|
)
|
|
})}
|
|
</ul>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default React.memo(NavigationMenuRefListItems)
|