import { zodResolver } from '@hookform/resolvers/zod' import { Check, ChevronsUpDown, ChevronRight } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import type { SubmitHandler } from 'react-hook-form' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { useLinkSupportTicketMutation } from 'data/feedback/link-support-ticket-mutation' import { useOrganizationsQuery } from 'data/organizations/organizations-query' import { Badge, Button, Collapsible_Shadcn_, CollapsibleContent_Shadcn_, CollapsibleTrigger_Shadcn_, CommandGroup_Shadcn_, CommandItem_Shadcn_, DialogSectionSeparator, FormControl_Shadcn_, FormField_Shadcn_, Form_Shadcn_, Input_Shadcn_, Select_Shadcn_, SelectContent_Shadcn_, SelectGroup_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, Switch, cn, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { OrganizationProjectSelector } from 'components/ui/OrganizationProjectSelector' import ShimmeringLoader from 'ui-patterns/ShimmeringLoader' import { CATEGORY_OPTIONS, type ExtendedSupportCategories } from './Support.constants' import { LinkSupportTicketFormSchema, type LinkSupportTicketFormValues, } from './LinkSupportTicketForm.schema' import { NO_ORG_MARKER, NO_PROJECT_MARKER } from './SupportForm.utils' interface LinkSupportTicketFormProps { conversationId: string } export function LinkSupportTicketForm({ conversationId }: LinkSupportTicketFormProps) { const router = useRouter() const { data: organizations } = useOrganizationsQuery() const form = useForm({ resolver: zodResolver(LinkSupportTicketFormSchema), defaultValues: { conversation_id: conversationId, organizationSlug: NO_ORG_MARKER, projectRef: NO_PROJECT_MARKER, category: '' as any, allowSupportAccess: true, }, mode: 'onSubmit', reValidateMode: 'onBlur', }) const { mutate: linkSupportTicket, isLoading } = useLinkSupportTicketMutation({ onSuccess: () => { toast.success('Support ticket linked successfully!') router.push('/') }, onError: (error) => { toast.error(`Failed to link support ticket: ${error.message}`) }, }) const organizationSlug = form.watch('organizationSlug') const selectedOrgSlug = organizationSlug === NO_ORG_MARKER ? null : organizationSlug const onSubmit: SubmitHandler = (values) => { if (!organizations) { toast.error('Organizations not loaded. Please try again.') return } const selectedOrg = organizations.find((org) => org.slug === values.organizationSlug) if (!selectedOrg) { toast.error('Selected organization not found. Please try again.') return } linkSupportTicket({ conversation_id: values.conversation_id, org_id: selectedOrg.id, project_ref: values.projectRef && values.projectRef !== NO_PROJECT_MARKER ? values.projectRef : undefined, category: values.category, allow_support_access: values.allowSupportAccess, }) } return ( ) }