// Vercel API token form — rendered inside a Dialog by DeployTool import { useState, useCallback } from 'react' import { useClient } from 'sanity' import { Stack, Text, TextInput, Button, Card, Dialog, Flex } from '@sanity/ui' import { CheckmarkCircleIcon } from '@sanity/icons' interface TokenSetupProps { /** Called after the token is successfully saved */ onSaved: () => void /** Called when the user dismisses — only available when a token already exists */ onCancel?: () => void } const TOKEN_DOC_ID = 'config.vercelDeploy' export function TokenSetup({ onSaved, onCancel }: TokenSetupProps) { const client = useClient({ apiVersion: '2025-01-01' }) const [token, setToken] = useState('') const [saving, setSaving] = useState(false) const [error, setError] = useState(null) const save = useCallback(async () => { if (!token.trim()) return setSaving(true) setError(null) try { await client.createOrReplace({ _id: TOKEN_DOC_ID, _type: 'vercelDeploy.config', accessToken: token.trim(), }) onSaved() } catch (err) { setError(err instanceof Error ? err.message : 'Failed to save token') } finally { setSaving(false) } }, [client, token, onSaved]) return ( {onCancel && ( ) }