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