Files
ALwrity/frontend/src/components/OnboardingWizard/PersonaStep/personaGeneration.ts
2025-10-08 10:13:14 +05:30

164 lines
5.5 KiB
TypeScript

import { useCallback } from 'react';
import { apiClient } from '../../../api/client';
import {
generateWritingPersonas,
assessPersonaQuality,
prepareOnboardingData,
validatePersonaRequest,
PersonaGenerationRequest
} from '../../../api/personaApi';
interface PersonaGenerationProps {
onboardingData: any;
selectedPlatforms: string[];
setCorePersona: (persona: any) => void;
setPlatformPersonas: (personas: Record<string, any>) => void;
setQualityMetrics: (metrics: any) => void;
setShowPreview: (show: boolean) => void;
setGenerationStep: (step: string) => void;
setProgress: (progress: number) => void;
setIsGenerating: (generating: boolean) => void;
setError: (error: string | null) => void;
savePersonaDataToCache: (data: any) => void;
startPolling: (taskId: string) => void;
}
export const usePersonaGeneration = ({
onboardingData,
selectedPlatforms,
setCorePersona,
setPlatformPersonas,
setQualityMetrics,
setShowPreview,
setGenerationStep,
setProgress,
setIsGenerating,
setError,
savePersonaDataToCache,
startPolling
}: PersonaGenerationProps) => {
const generatePersonas = useCallback(async () => {
setIsGenerating(true);
setError(null);
setProgress(0);
setShowPreview(false);
// Clear session cache flag since we're generating fresh
sessionStorage.removeItem('persona_server_cache_checked');
try {
// Start async persona generation
const request: PersonaGenerationRequest = {
onboarding_data: prepareOnboardingData(onboardingData),
selected_platforms: selectedPlatforms,
user_preferences: null
};
console.log('Starting async persona generation...');
const response = await apiClient.post('/api/onboarding/step4/generate-personas-async', request);
if (response.data.task_id) {
console.log('Persona generation task response:', response.data);
// Check if the task is already completed (cache hit)
if (response.data.status === 'completed') {
console.log('Task already completed (cache hit), fetching result immediately');
// Fetch the completed task result
const taskResponse = await apiClient.get(`/api/onboarding/step4/persona-task/${response.data.task_id}`);
if (taskResponse.data && taskResponse.data.result) {
const result = taskResponse.data.result;
setCorePersona(result.core_persona);
setPlatformPersonas(result.platform_personas);
setQualityMetrics(result.quality_metrics);
setShowPreview(true);
setGenerationStep('preview');
setProgress(100);
savePersonaDataToCache(result);
setIsGenerating(false);
return;
}
}
// Start polling for the task
console.log('Starting polling for task:', response.data.task_id);
startPolling(response.data.task_id);
} else {
throw new Error('Failed to start persona generation task');
}
} catch (err) {
console.error('Failed to start persona generation:', err);
setError(err instanceof Error ? err.message : 'Failed to start persona generation');
setIsGenerating(false);
}
}, [onboardingData, selectedPlatforms, startPolling, setIsGenerating, setError, setProgress, setShowPreview, setCorePersona, setPlatformPersonas, setQualityMetrics, setGenerationStep, savePersonaDataToCache]);
const generateCorePersona = async (data: any) => {
const request: PersonaGenerationRequest = {
onboarding_data: prepareOnboardingData(data),
selected_platforms: selectedPlatforms,
user_preferences: null
};
// Validate request
const validationErrors = validatePersonaRequest(request);
if (validationErrors.length > 0) {
throw new Error(`Validation failed: ${validationErrors.join(', ')}`);
}
const response = await generateWritingPersonas(request);
if (!response.success) {
throw new Error(response.error || 'Failed to generate core persona');
}
return response.core_persona;
};
const generatePlatformPersonas = async (corePersona: any, platforms: string[]) => {
const request: PersonaGenerationRequest = {
onboarding_data: prepareOnboardingData(onboardingData),
selected_platforms: platforms,
user_preferences: null
};
const response = await generateWritingPersonas(request);
if (!response.success) {
throw new Error(response.error || 'Failed to generate platform personas');
}
return response.platform_personas || {};
};
const assessPersonaQualityInternal = async (corePersona: any, platformPersonas: any) => {
const response = await assessPersonaQuality({
core_persona: corePersona,
platform_personas: platformPersonas,
user_feedback: null
});
if (!response.success) {
throw new Error(response.error || 'Failed to assess persona quality');
}
return response.quality_metrics;
};
const getStepFromMessage = (message: string): string => {
if (message.includes('Initializing')) return 'analyzing';
if (message.includes('core persona')) return 'generating';
if (message.includes('platform')) return 'adapting';
if (message.includes('quality')) return 'assessing';
if (message.includes('completed')) return 'preview';
return 'generating';
};
return {
generatePersonas,
generateCorePersona,
generatePlatformPersonas,
assessPersonaQualityInternal,
getStepFromMessage
};
};