"use client"; import { useState } from 'react'; import { z } from 'zod'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@/components/ui/button'; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import { Key, Loader2 } from 'lucide-react'; const formSchema = z.object({ apiKey: z.string().min(1, 'API Key is required'), }); interface ApiKeyFormProps { onApiKeySubmit: (apiKey: string) => void; } export function ApiKeyForm({ onApiKeySubmit }: ApiKeyFormProps) { const [isLoading, setIsLoading] = useState(false); const form = useForm<z.infer<typeof formSchema>>({ resolver: zodResolver(formSchema), defaultValues: { apiKey: '', }, }); async function onSubmit(values: z.infer<typeof formSchema>) { setIsLoading(true); try { // Validate the API key by making a test request const response = await fetch('/api/vultr', { headers: { 'X-API-Key': values.apiKey, }, }); if (response.ok) { onApiKeySubmit(values.apiKey); } else { form.setError('apiKey', { type: 'manual', message: 'Invalid API Key. Please check and try again.', }); } } catch (error) { form.setError('apiKey', { type: 'manual', message: 'Failed to validate API Key. Please try again.', }); } finally { setIsLoading(false); } } return ( <div className="max-w-md mx-auto"> <div className="flex justify-center mb-6"> <div className="bg-primary/10 p-3 rounded-full"> <Key className="h-6 w-6 text-primary" /> </div> </div> <Form {...form}> <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6"> <FormField control={form.control} name="apiKey" render={({ field }) => ( <FormItem> <FormLabel>Vultr API Key</FormLabel> <FormControl> <Input placeholder="Enter your Vultr API key" type="password" autoComplete="off" {...field} /> </FormControl> <FormDescription> Your API key can be found in your Vultr account settings. </FormDescription> <FormMessage /> </FormItem> )} /> <Button type="submit" className="w-full" disabled={isLoading}> {isLoading ? ( <> <Loader2 className="mr-2 h-4 w-4 animate-spin" /> Validating... </> ) : ( 'Connect to Vultr' )} </Button> </form> </Form> </div> ); }