| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- import { useParams } from 'common'
- import Link from 'next/link'
- import { UseFormReturn } from 'react-hook-form'
- import {
- Button,
- FormControl,
- FormField,
- Input,
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
- useWatch,
- } from 'ui'
- import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
- import { WebhookFormValues } from './EditHookPanel.constants'
- import {
- FormSection,
- FormSectionContent,
- FormSectionLabel,
- } from '@/components/ui/Forms/FormSection'
- import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query'
- import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
- interface HTTPRequestConfigProps {
- form: UseFormReturn<WebhookFormValues>
- }
- export const HTTPRequestConfig = ({ form }: HTTPRequestConfigProps) => {
- const { ref } = useParams()
- const { data: selectedProject } = useSelectedProjectQuery()
- const { data: functions } = useEdgeFunctionsQuery({ projectRef: ref })
- const edgeFunctions = functions ?? []
- const functionType = useWatch({ control: form.control, name: 'function_type' })
- return (
- <FormSection
- header={
- <FormSectionLabel className="lg:col-span-4!">
- {functionType === 'http_request'
- ? 'HTTP Request'
- : functionType === 'briven_function'
- ? 'Edge Function'
- : ''}
- </FormSectionLabel>
- }
- >
- <FormSectionContent loading={false} className="lg:col-span-8!">
- <FormField
- control={form.control}
- name="http_method"
- render={({ field }) => (
- <FormItemLayout label="Method" layout="vertical" className="gap-1">
- <Select value={field.value} onValueChange={field.onChange}>
- <FormControl>
- <SelectTrigger>
- <SelectValue />
- </SelectTrigger>
- </FormControl>
- <SelectContent>
- <SelectItem value="GET">GET</SelectItem>
- <SelectItem value="POST">POST</SelectItem>
- </SelectContent>
- </Select>
- </FormItemLayout>
- )}
- />
- {functionType === 'http_request' ? (
- <FormField
- control={form.control}
- name="http_url"
- render={({ field }) => (
- <FormItemLayout
- label="URL"
- layout="vertical"
- className="gap-1"
- description="URL of the HTTP request. Must include HTTP/HTTPS"
- >
- <FormControl>
- <Input {...field} placeholder="http://api.com/path/resource" />
- </FormControl>
- </FormItemLayout>
- )}
- />
- ) : functionType === 'briven_function' && edgeFunctions.length === 0 ? (
- <div className="space-y-1">
- <p className="text-sm text-foreground-light">Select which edge function to trigger</p>
- <div className="px-4 py-4 border rounded-sm bg-surface-300 border-strong flex items-center justify-between space-x-4">
- <p className="text-sm">No edge functions created yet</p>
- <Button asChild>
- <Link href={`/project/${ref}/functions`}>Create an edge function</Link>
- </Button>
- </div>
- </div>
- ) : functionType === 'briven_function' && edgeFunctions.length > 0 ? (
- <FormField
- control={form.control}
- name="http_url"
- render={({ field }) => (
- <FormItemLayout
- label="Select which edge function to trigger"
- layout="vertical"
- className="gap-1"
- >
- <Select value={field.value} onValueChange={field.onChange}>
- <FormControl>
- <SelectTrigger>
- <SelectValue placeholder="Select an edge function" />
- </SelectTrigger>
- </FormControl>
- <SelectContent>
- {edgeFunctions.map((fn) => {
- const restUrl = selectedProject?.restUrl
- const restUrlTld = restUrl ? new URL(restUrl).hostname.split('.').pop() : 'co'
- const functionUrl = `https://${ref}.briven.${restUrlTld}/functions/v1/${fn.slug}`
- return (
- <SelectItem key={fn.id} value={functionUrl}>
- {fn.name}
- </SelectItem>
- )
- })}
- </SelectContent>
- </Select>
- </FormItemLayout>
- )}
- />
- ) : null}
- <FormField
- control={form.control}
- name="timeout_ms"
- render={({ field }) => (
- <FormItemLayout
- label="Timeout"
- labelOptional="Between 1000ms to 10,000ms"
- layout="vertical"
- className="gap-1"
- >
- <FormControl>
- <div className="relative">
- <Input
- {...field}
- type="number"
- onChange={(e) => field.onChange(Number(e.target.value))}
- className="pr-10"
- />
- <span className="absolute right-3 top-1/2 -translate-y-1/2 text-foreground-light text-sm">
- ms
- </span>
- </div>
- </FormControl>
- </FormItemLayout>
- )}
- />
- </FormSectionContent>
- </FormSection>
- )
- }
|