@letanure/resend-cli
Version:
A command-line interface for Resend email API
126 lines • 6.04 kB
JavaScript
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