/** * Email node config - connection selector, folder dropdown, query, subject, body. */ import React, { useEffect, useState } from 'react'; import type { NodeConfigRendererProps } from './types'; import { fetchConnections, fetchBrowse, type UserConnection, type BrowseEntry } from '../../../../api/workflowApi'; export const EmailNodeConfig: React.FC = ({ params, updateParam, instanceId, request, nodeType = 'email.checkEmail', }) => { const [connections, setConnections] = useState([]); const [folders, setFolders] = useState([]); const [loading, setLoading] = useState(false); const [foldersLoading, setFoldersLoading] = useState(false); useEffect(() => { if (instanceId && request) { setLoading(true); fetchConnections(request, instanceId) .then(setConnections) .catch(() => setConnections([])) .finally(() => setLoading(false)); } }, [instanceId, request]); const connectionId = (params.connectionId as string) ?? ''; const selectedConn = connections.find((c) => c.id === connectionId); const mailService = selectedConn?.authority === 'google' ? 'gmail' : 'outlook'; useEffect(() => { if (instanceId && request && connectionId) { setFoldersLoading(true); fetchBrowse(request, instanceId, connectionId, mailService, '/') .then((r) => setFolders(r.items.filter((e) => e.isFolder))) .catch(() => setFolders([])) .finally(() => setFoldersLoading(false)); } else { setFolders([]); } }, [instanceId, request, connectionId, mailService]); const isDraft = nodeType === 'email.draftEmail'; const isSearch = nodeType === 'email.searchEmail'; const folderValue = (params.folder as string) ?? (isSearch ? 'All' : 'Inbox'); return ( <>
{!isDraft && (
)} {isSearch && ( <>
updateParam('query', e.target.value)} placeholder="General search term (subject, body, from)" />
updateParam('fromAddress', e.target.value)} placeholder="e.g. sender@example.com" />
updateParam('toAddress', e.target.value)} placeholder="e.g. recipient@example.com" />
updateParam('subjectContains', e.target.value)} placeholder="Word or phrase in subject" />
updateParam('bodyContains', e.target.value)} placeholder="Word or phrase in email body" />
updateParam('hasAttachment', e.target.checked)} />
updateParam('limit', parseInt(e.target.value, 10) || 100)} />
)} {nodeType === 'email.checkEmail' && ( <>
updateParam('fromAddress', e.target.value)} placeholder="e.g. sender@example.com" />
updateParam('subjectContains', e.target.value)} placeholder="Word or phrase in subject" />
updateParam('hasAttachment', e.target.checked)} />
updateParam('limit', parseInt(e.target.value, 10) || 100)} />
)} {isDraft && ( <>
updateParam('subject', e.target.value)} placeholder="Email subject (or leave empty if connected to AI node above)" />