'use client' import { useCallback, useState } from 'react' import { Chip, ChipModal, ChipModalBody, ChipModalError, ChipModalField, ChipModalFooter, ChipModalHeader, } from '@sim/emcn' import { requestJson } from '@/lib/api/client/request' import { integrationRequestContract } from '@/lib/api/contracts/common' type SubmitStatus = 'idle' | 'submitting' | 'success' | 'error' export function RequestIntegrationModal() { const [open, setOpen] = useState(false) const [status, setStatus] = useState('idle') const [integrationName, setIntegrationName] = useState('') const [email, setEmail] = useState('') const [useCase, setUseCase] = useState('') const resetForm = useCallback(() => { setIntegrationName('') setEmail('') setUseCase('') setStatus('idle') }, []) const handleOpenChange = useCallback( (nextOpen: boolean) => { setOpen(nextOpen) if (!nextOpen) resetForm() }, [resetForm] ) const handleSubmit = useCallback(async () => { if (!integrationName.trim() || !email.trim()) return setStatus('submitting') try { await requestJson(integrationRequestContract, { body: { integrationName: integrationName.trim(), email: email.trim(), useCase: useCase.trim() || undefined, }, }) setStatus('success') setTimeout(() => setOpen(false), 1500) } catch { setStatus('error') } }, [integrationName, email, useCase]) const canSubmit = integrationName.trim() && email.trim() && status === 'idle' return ( <> setOpen(true)}> Request an integration handleOpenChange(false)}> Request an Integration {status === 'success' ? (

Request submitted. We'll follow up at {email}.

) : ( <> setIntegrationName(value)} placeholder='e.g. Stripe, HubSpot, Snowflake' maxLength={200} autoComplete='off' required /> setEmail(value)} placeholder='you@company.com' autoComplete='email' required /> Use case (optional) } value={useCase} onChange={(value) => setUseCase(value)} placeholder='What would you automate with this integration?' rows={3} maxLength={2000} /> {status === 'error' && ( Something went wrong. Please try again. )} )}
{status === 'success' ? ( handleOpenChange(false)} primaryAction={{ label: 'Done', onClick: () => handleOpenChange(false) }} /> ) : ( setOpen(false)} cancelDisabled={status === 'submitting'} primaryAction={{ label: status === 'submitting' ? 'Submitting...' : 'Submit request', onClick: handleSubmit, disabled: !canSubmit && status !== 'error', }} /> )}
) }