UNPKG

@letanure/resend-cli

Version:

A command-line interface for Resend email API

119 lines 5.72 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { Alert, Spinner } from '@inkjs/ui'; import { Box, useInput } from 'ink'; import React 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, useBroadcastSelector } from '../../../hooks/index.js'; import { updateBroadcast } from './action.js'; import { updateBroadcastFields } from './fields.js'; import { updateBroadcastSchema } from './schema.js'; export const Form = ({ onExit }) => { const [result, setResult] = React.useState(null); const [loading, setLoading] = React.useState(false); const [successData, setSuccessData] = React.useState(null); const [isDryRunSuccess, setIsDryRunSuccess] = React.useState(false); const [selectedBroadcastId, setSelectedBroadcastId] = React.useState(''); const [selectedAudienceId, setSelectedAudienceId] = React.useState(''); const { isDryRun } = useDryRun(); const { apiKey } = useResend(); // Get initial data from selected IDs const initialFormData = React.useMemo(() => { const data = {}; if (selectedBroadcastId) { data.broadcastId = selectedBroadcastId; } if (selectedAudienceId) { data.audienceId = selectedAudienceId; } return Object.keys(data).length > 0 ? data : undefined; }, [selectedBroadcastId, selectedAudienceId]); // Selector for broadcasts const broadcastSelector = useBroadcastSelector((broadcastId) => setSelectedBroadcastId(broadcastId)); // Selector for audiences const audienceSelector = useAudienceSelector((audienceId) => setSelectedAudienceId(audienceId)); // Create form fields with selector callbacks const formFields = React.useMemo(() => { return updateBroadcastFields.map((field) => { if (field.name === 'broadcastId') { return { ...field, onSelectorOpen: () => broadcastSelector.openSelector(), }; } if (field.name === 'audienceId') { return { ...field, onSelectorOpen: () => audienceSelector.openSelector(), }; } return field; }); }, [broadcastSelector, audienceSelector]); const handleSubmit = async (data) => { setLoading(true); if (isDryRun) { setSuccessData({ 'Broadcast ID': data.broadcastId, Name: data.name || 'Not provided', Subject: data.subject || 'Not provided', From: data.from || 'Not provided', 'API Key': apiKey ? `${apiKey.substring(0, 10)}...` : 'Not set', 'Dry Run': 'true', Status: 'Validation successful! (Broadcast not updated due to dry-run mode)', }); setIsDryRunSuccess(true); } else { const result = await updateBroadcast(data, apiKey); if (result.success && result.data) { setSuccessData({ 'Broadcast ID': result.data.id, }); setIsDryRunSuccess(false); } else { setResult(result); } } setLoading(false); }; useInput((input, key) => { if ((input === 'q' || key.escape) && !loading) { onExit(); } }); if (successData) { return (_jsx(SuccessScreen, { data: successData, successMessage: "Broadcast Updated Successfully", headerText: `${config.baseTitle} - Broadcasts - Update`, isDryRun: isDryRunSuccess, onExit: () => { setSuccessData(null); setIsDryRunSuccess(false); onExit(); } })); } if (loading) { return (_jsx(Layout, { headerText: `${config.baseTitle} - Broadcasts - Update`, showNavigationInstructions: false, navigationContext: "none", children: _jsx(Box, { marginBottom: 1, children: _jsx(Spinner, { label: "Updating broadcast..." }) }) })); } if (result) { return (_jsx(ErrorScreen, { title: "Broadcast Update Failed", message: result.error || 'Failed to update broadcast', suggestion: "Check the broadcast ID and ensure it exists in your Resend account.", headerText: `${config.baseTitle} - Broadcasts - Update`, onExit: () => { setResult(null); onExit(); }, showRetry: true, onRetry: () => { setResult(null); setLoading(false); } })); } // Show selectors when open if (broadcastSelector.isOpen) { return broadcastSelector.selectorComponent; } if (audienceSelector.isOpen) { return audienceSelector.selectorComponent; } return (_jsxs(Layout, { headerText: `${config.baseTitle} - Broadcasts - Update`, showNavigationInstructions: true, navigationContext: "form", children: [isDryRun && (_jsx(Box, { marginBottom: 1, children: _jsx(Alert, { variant: "warning", children: "DRY RUN MODE - No API calls will be made" }) })), _jsx(SimpleForm, { fields: formFields, onSubmit: handleSubmit, onCancel: onExit, validateWith: updateBroadcastSchema, initialData: initialFormData })] })); }; //# sourceMappingURL=Form.js.map