mirror of
https://github.com/supabase/supabase.git
synced 2026-10-10 11:55:05 +03:00
## Description This is the Scoped PAT stacked PRs root branch ## How to test ### With the `scopedPAT` enabled (default on staging) Go to https://studio-staging-git-scopedpat-merge-token-lists-supabase.vercel.app/dashboard/account/tokens. - You shouldn't see two tabs anymore - If you had classic tokens, they should have the _Legacy_ badge - You can create scoped tokens - You have a way to copy newly created tokens before closing the form side panel ### With the `scopedPAT` disabled (use the devtool to override) - You shouldn't see two tabs anymore - If you had classic tokens, they should **not** have the _Legacy_ badge - You can create classic tokens - You have a way to copy newly created tokens above the list upon form submission <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Show classic and scoped access tokens together in one list, with classic tokens labeled “Legacy” when the scoped experience is enabled. * Add scoped access token creation with a two-step configure → review → success flow (when enabled). * Add a dismissible migration notice about scoped tokens with a link to API docs. * Show “View permissions” only for scoped tokens. * **Bug Fixes** * Token deletion now supports both classic and scoped tokens with the correct confirmation and success handling. * The scoped tokens page now redirects to the unified access tokens page. * **Accessibility** * Improved accessibility by adding a label to the token “more options” action. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Ali Waseem <waseema393@gmail.com> Co-authored-by: kemal.earth <606977+kemaldotearth@users.noreply.github.com>
48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import { LOCAL_STORAGE_KEYS } from 'common'
|
|
import Link from 'next/link'
|
|
import { Badge, Button } from 'ui'
|
|
import { Admonition } from 'ui-patterns/Admonition'
|
|
|
|
import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage'
|
|
import { DOCS_URL } from '@/lib/constants'
|
|
|
|
export const MigrationAdmonition = () => {
|
|
const [isDismissed, setIsDismissed] = useLocalStorageQuery(
|
|
LOCAL_STORAGE_KEYS.SCOPED_TOKENS_MIGRATION_ADMONITION_DISMISSED,
|
|
false
|
|
)
|
|
|
|
if (isDismissed) return null
|
|
|
|
return (
|
|
<Admonition
|
|
type="default"
|
|
title="We're moving to scoped access tokens"
|
|
className="relative mb-5"
|
|
actions={
|
|
<>
|
|
{/* Awaiting correct documentation link */}
|
|
<Button asChild variant="default" size="tiny">
|
|
<Link href={`${DOCS_URL}/guides/api`} target="_blank" rel="noreferrer">
|
|
Learn more
|
|
</Link>
|
|
</Button>
|
|
<Button variant="text" onClick={() => setIsDismissed(true)} aria-label="Close">
|
|
Dismiss
|
|
</Button>
|
|
</>
|
|
}
|
|
>
|
|
<div className="flex flex-col gap-y-1.5">
|
|
<p className="text-sm text-foreground-light">
|
|
We recommend granting each new token the minimum access its integration needs.
|
|
</p>
|
|
<span className="text-sm text-foreground-light">
|
|
Pre-existing tokens are marked with a <Badge>Legacy</Badge> badge and will continue to
|
|
work until expiry or deletion.
|
|
</span>
|
|
</div>
|
|
</Admonition>
|
|
)
|
|
}
|