diff --git a/frontend/src/hooks/useReasoningTranslation.ts b/frontend/src/hooks/useReasoningTranslation.ts index df9431df..5673e25c 100644 --- a/frontend/src/hooks/useReasoningTranslation.ts +++ b/frontend/src/hooks/useReasoningTranslation.ts @@ -29,15 +29,17 @@ export function useReasoningTranslation() { /** * Translate purchase order reasoning + * IMPORTANT: Always returns a string, never undefined */ const translatePOReasonng = (reasoningData: ReasoningData): string => { if (!reasoningData || !reasoningData.type) { - return t('purchaseOrder.low_stock_detection', { + const fallback = t('purchaseOrder.low_stock_detection', { supplier_name: 'Unknown', product_names_joined: 'Items', days_until_stockout: 7, defaultValue: 'Purchase order required for inventory replenishment' }); + return String(fallback || 'Purchase order required'); } const { type, parameters } = reasoningData; @@ -51,21 +53,24 @@ export function useReasoningTranslation() { defaultValue: `Purchase order: ${type}` }; - return t(`purchaseOrder.${type}`, params) || `Purchase order: ${type}`; + const result = t(`purchaseOrder.${type}`, params); + return String(result || `Purchase order: ${type}`); }; /** * Translate production batch reasoning + * IMPORTANT: Always returns a string, never undefined */ const translateBatchReasoning = (reasoningData: ReasoningData): string => { if (!reasoningData || !reasoningData.type) { - return t('productionBatch.forecast_demand', { + const fallback = t('productionBatch.forecast_demand', { product_name: 'Product', predicted_demand: 0, current_stock: 0, confidence_score: 85, defaultValue: 'Production batch scheduled based on demand forecast' }); + return String(fallback || 'Production batch scheduled'); } const { type, parameters } = reasoningData; @@ -73,11 +78,13 @@ export function useReasoningTranslation() { ...parameters, defaultValue: `Production batch: ${type}` }; - return t(`productionBatch.${type}`, params) || `Production batch: ${type}`; + const result = t(`productionBatch.${type}`, params); + return String(result || `Production batch: ${type}`); }; /** * Translate consequence text + * IMPORTANT: Always returns a string, never undefined */ const translateConsequence = (consequenceData?: any): string => { if (!consequenceData || !consequenceData.type) { @@ -92,30 +99,37 @@ export function useReasoningTranslation() { defaultValue: `Impact: ${consequenceData.type}` }; - return t(`consequence.${consequenceData.type}`, params) || ''; + const result = t(`consequence.${consequenceData.type}`, params); + return String(result || ''); }; /** * Translate severity level + * IMPORTANT: Always returns a string, never undefined */ const translateSeverity = (severity?: string): string => { if (!severity) return ''; - return t(`severity.${severity}`, { defaultValue: severity }) || ''; + const result = t(`severity.${severity}`, { defaultValue: severity }); + return String(result || ''); }; /** * Translate trigger source + * IMPORTANT: Always returns a string, never undefined */ const translateTrigger = (trigger?: string): string => { if (!trigger) return ''; - return t(`triggers.${trigger}`, { defaultValue: trigger }) || ''; + const result = t(`triggers.${trigger}`, { defaultValue: trigger }); + return String(result || ''); }; /** * Translate error code + * IMPORTANT: Always returns a string, never undefined */ const translateError = (errorCode: string): string => { - return t(`errors.${errorCode}`, { defaultValue: errorCode }); + const result = t(`errors.${errorCode}`, { defaultValue: errorCode }); + return String(result || errorCode); }; return { @@ -141,17 +155,17 @@ export function useReasoningFormatter() { if (!reasoningData) { const fallback = { - reasoning: translation.translatePOReasonng({} as ReasoningData) || 'Purchase order required', - consequence: '', - severity: '' + reasoning: String(translation.translatePOReasonng({} as ReasoningData) || 'Purchase order required'), + consequence: String(''), + severity: String('') }; console.log('🔍 formatPOAction: No reasoning data, returning fallback:', fallback); return fallback; } - const reasoning = translation.translatePOReasonng(reasoningData) || 'Purchase order required'; - const consequence = translation.translateConsequence(reasoningData.consequence) || ''; - const severity = translation.translateSeverity(reasoningData.consequence?.severity) || ''; + const reasoning = String(translation.translatePOReasonng(reasoningData) || 'Purchase order required'); + const consequence = String(translation.translateConsequence(reasoningData.consequence) || ''); + const severity = String(translation.translateSeverity(reasoningData.consequence?.severity) || ''); const result = { reasoning, consequence, severity }; @@ -176,15 +190,15 @@ export function useReasoningFormatter() { if (!reasoningData) { const fallback = { - reasoning: translation.translateBatchReasoning({} as ReasoningData) || 'Production batch scheduled', - urgency: 'normal' + reasoning: String(translation.translateBatchReasoning({} as ReasoningData) || 'Production batch scheduled'), + urgency: String('normal') }; console.log('🔍 formatBatchAction: No reasoning data, returning fallback:', fallback); return fallback; } - const reasoning = translation.translateBatchReasoning(reasoningData) || 'Production batch scheduled'; - const urgency = reasoningData.urgency?.level || 'normal'; + const reasoning = String(translation.translateBatchReasoning(reasoningData) || 'Production batch scheduled'); + const urgency = String(reasoningData.urgency?.level || 'normal'); const result = { reasoning, urgency };