UNPKG

@letanure/resend-cli

Version:

A command-line interface for Resend email API

126 lines 6.04 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { Spinner } from '@inkjs/ui'; import { useInput } from 'ink'; import React, { useState } from 'react'; import { SimpleForm } from '../../../components/forms/SimpleForm.js'; import { ErrorScreen } from '../../../components/ui/ErrorScreen.js'; import { Layout } from '../../../components/ui/layout.js'; import { SuccessScreen } from '../../../components/ui/SuccessScreen.js'; import { config } from '../../../config/config.js'; import { useDryRun } from '../../../contexts/DryRunProvider.js'; import { useResend } from '../../../contexts/ResendProvider.js'; import { useAudienceSelector } from '../../../hooks/index.js'; import { createContact } from './action.js'; import { createContactFields } from './fields.js'; import { CreateContactOptionsSchema } from './schema.js'; export const Form = ({ onExit }) => { const { apiKey } = useResend(); const { isDryRun } = useDryRun(); const [isSubmitting, setIsSubmitting] = useState(false); const [successData, setSuccessData] = useState(null); const [isDryRunSuccess, setIsDryRunSuccess] = useState(false); const [error, setError] = useState(null); const [selectedAudienceId, setSelectedAudienceId] = useState(''); const [persistedFormData, setPersistedFormData] = useState({}); // Get initial data combining selected IDs and persisted form data const initialFormData = React.useMemo(() => { const data = { ...persistedFormData }; if (selectedAudienceId) { data.audienceId = selectedAudienceId; } return Object.keys(data).length > 0 ? data : undefined; }, [selectedAudienceId, persistedFormData]); // Selector for audiences const audienceSelector = useAudienceSelector((audienceId) => setSelectedAudienceId(audienceId)); // Create form fields with selector callbacks const formFields = React.useMemo(() => { return createContactFields.map((field) => { if (field.name === 'audienceId') { return { ...field, onSelectorOpen: () => { // Store current form data before opening selector audienceSelector.openSelector(); }, }; } return field; }); }, [audienceSelector]); // Handle Esc/Left arrow key to go back from result screens useInput((_input, key) => { if ((key.escape || key.leftArrow) && (successData || error)) { setSuccessData(null); setIsDryRunSuccess(false); setError(null); } }, { isActive: !!(successData || error) }); const handleSubmit = async (validatedData) => { setIsSubmitting(true); try { // In dry-run mode, show validated data if (isDryRun) { setSuccessData({ ...validatedData, 'API Key': apiKey ? `${apiKey.substring(0, 10)}...` : 'Not set', Status: 'Validation successful! (Contact not created due to dry-run mode)', }); setIsDryRunSuccess(true); } else { const result = await createContact(validatedData, apiKey); if (result.success && result.data) { setSuccessData({ ...validatedData, 'Contact ID': result.data?.id || 'Unknown', 'API Key': apiKey ? `${apiKey.substring(0, 10)}...` : 'Not set', Status: 'Contact created successfully!', }); setIsDryRunSuccess(false); } else { setError({ title: 'Failed to Create Contact', message: result.error || 'Unknown error occurred', suggestion: 'Please verify your API key and contact data are correct.', }); } } } catch (err) { setError({ title: 'Unexpected Error', message: err instanceof Error ? err.message : 'An unexpected error occurred', suggestion: 'Please try again or check your network connection.', }); } finally { setIsSubmitting(false); } }; if (isSubmitting) { return (_jsx(Layout, { headerText: `${config.baseTitle} - Contacts - Create - ${isDryRun ? 'Dry Run' : 'Submitting'}`, showNavigationInstructions: false, navigationContext: "none", children: _jsx(Spinner, { label: isDryRun ? 'Validating contact data...' : 'Creating contact...' }) })); } if (successData) { return (_jsx(SuccessScreen, { data: successData, successMessage: "Contact Created Successfully", headerText: `${config.baseTitle} - Contacts - Create`, isDryRun: isDryRunSuccess, onExit: () => { setSuccessData(null); setIsDryRunSuccess(false); onExit(); } })); } if (error) { return (_jsx(ErrorScreen, { title: error.title, message: error.message, suggestion: error.suggestion, headerText: `${config.baseTitle} - Contacts - Create`, onExit: () => { setError(null); onExit(); }, showRetry: true, onRetry: () => { setError(null); setIsSubmitting(false); } })); } // Show selector when open if (audienceSelector.isOpen) { return audienceSelector.selectorComponent; } return (_jsx(Layout, { headerText: `${config.baseTitle} - Contacts - Create`, showNavigationInstructions: true, navigationContext: "form", children: _jsx(SimpleForm, { fields: formFields, validateWith: CreateContactOptionsSchema, onSubmit: handleSubmit, onCancel: onExit, initialData: initialFormData, onFormDataChange: setPersistedFormData }) })); }; //# sourceMappingURL=Form.js.map