Files
ALwrity/frontend/src/components/BlogWriter/ResearchPollingHandler.tsx

85 lines
2.6 KiB
TypeScript

import React, { useState, useEffect } from 'react';
import { useBlogWriterResearchPolling } from '../../hooks/usePolling';
import ResearchProgressModal from './ResearchProgressModal';
import { BlogResearchResponse } from '../../services/blogWriterApi';
import { researchCache } from '../../services/researchCache';
import { debug } from '../../utils/debug';
interface ResearchPollingHandlerProps {
taskId: string | null;
onResearchComplete: (result: BlogResearchResponse) => void;
onError?: (error: string) => void;
}
export const ResearchPollingHandler: React.FC<ResearchPollingHandlerProps> = ({
taskId,
onResearchComplete,
onError
}) => {
const [currentMessage, setCurrentMessage] = useState<string>('');
const polling = useBlogWriterResearchPolling({
onProgress: (message) => {
debug.log('[ResearchPollingHandler] progress', { message });
setCurrentMessage(message);
},
onComplete: (result) => {
debug.log('[ResearchPollingHandler] complete');
// Cache the result for future use
if (result && result.keywords) {
researchCache.cacheResult(
result.keywords,
result.industry || 'General',
result.target_audience || 'General',
result
);
}
onResearchComplete(result);
setCurrentMessage('');
},
onError: (error) => {
debug.error('[ResearchPollingHandler] error', error);
onError?.(error);
setCurrentMessage('');
}
});
// Start polling when taskId is provided
useEffect(() => {
if (taskId) {
polling.startPolling(taskId);
} else {
// Only stop if actually polling (not on every render when taskId is null)
if (polling.isPolling) {
polling.stopPolling();
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [taskId]); // Removed polling from dependencies - usePolling already handles cleanup
// Only log on meaningful changes
useEffect(() => {
debug.log('[ResearchPollingHandler] state', {
isPolling: polling.isPolling,
status: polling.currentStatus,
progressCount: polling.progressMessages?.length || 0
});
}, [polling.isPolling, polling.currentStatus, polling.progressMessages?.length]);
// Render the unified research progress modal when a task is present
return (
<ResearchProgressModal
open={Boolean(taskId)}
title="Research in progress"
status={polling.currentStatus}
messages={polling.progressMessages}
error={polling.error}
onClose={() => { /* modal is informational during processing; ignore manual close */ }}
/>
);
};
export default ResearchPollingHandler;