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

87 lines
2.4 KiB
TypeScript

import React, { useState, useEffect } from 'react';
import { useResearchPolling } from '../../hooks/usePolling';
import ResearchProgressModal from './ResearchProgressModal';
import { BlogResearchResponse } from '../../services/blogWriterApi';
import { researchCache } from '../../services/researchCache';
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 = useResearchPolling({
onProgress: (message) => {
console.log('ResearchPollingHandler - Progress message received:', message);
setCurrentMessage(message);
},
onComplete: (result) => {
console.log('ResearchPollingHandler - Research completed:', result);
// 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) => {
console.error('Research polling error:', error);
onError?.(error);
setCurrentMessage('');
}
});
// Start polling when taskId is provided
useEffect(() => {
if (taskId) {
polling.startPolling(taskId);
} else {
polling.stopPolling();
}
}, [taskId]);
// Cleanup on unmount
useEffect(() => {
return () => {
polling.stopPolling();
};
}, []);
console.log('ResearchPollingHandler render:', {
taskId,
isPolling: polling.isPolling,
status: polling.currentStatus,
progressMessages: polling.progressMessages?.length,
currentMessage,
error: polling.error
});
// 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;