Files
supabase/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenButton.tsx
Gildas Garcia 96d43099bb chore: refactor Button API so that it can be used a standard button (#46880)
## Problem

Our `<Button>` component breaks the default `button` contract by
redefining the `type` prop to set its variant (`primary`, `default`,
etc) instead of the button type (`submit`, `button`, etc).
This is confusing and forces to write more code when using it with
shadcn components that expect/inject the standard button props.

## Solution

- rename the `type` prop to `variant`
- rename the `htmlType` prop to `type`
- propagate the changes where necessary
- format code

## How to test

As this is just prop renaming, if it builds it's ok

---------

Co-authored-by: Ivan Vasilov <vasilov.ivan@gmail.com>
2026-06-16 23:59:58 +02:00

68 lines
1.9 KiB
TypeScript

import { ChevronDown } from 'lucide-react'
import { useState } from 'react'
import {
Button,
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from 'ui'
import { NewTokenDialog } from './NewTokenDialog'
import { type NewAccessToken } from '@/data/access-tokens/access-tokens-create-mutation'
export interface NewAccessTokenButtonProps {
onCreateToken: (token: NewAccessToken) => void
}
export const NewTokenButton = ({ onCreateToken }: NewAccessTokenButtonProps) => {
const [visible, setVisible] = useState(false)
const [tokenScope, setTokenScope] = useState<'V0' | undefined>(undefined)
return (
<>
<div className="flex items-center">
<Button
className="rounded-r-none px-3"
onClick={() => {
setTokenScope(undefined)
setVisible(true)
}}
>
Generate new token
</Button>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
variant="primary"
title="Choose token scope"
className="rounded-l-none px-[4px] py-[5px]"
icon={<ChevronDown />}
/>
</DropdownMenuTrigger>
<DropdownMenuContent align="end" side="bottom">
<DropdownMenuItem
key="experimental-token"
onClick={() => {
setTokenScope('V0')
setVisible(true)
}}
>
<div className="space-y-1">
<p className="block text-foreground">Generate token for experimental API</p>
</div>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
<NewTokenDialog
open={visible}
onOpenChange={setVisible}
tokenScope={tokenScope}
onCreateToken={onCreateToken}
/>
</>
)
}