Persist general specification analysis and expose saved results
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import { AiJobHistory } from './AiJobHistory';
|
||||
import {getToken} from '../services/auth';
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { useApp } from '../context/AppContext';
|
||||
import { Sparkles, Upload, FileText, CheckCircle2, AlertTriangle, X, Loader2, TrendingUp, Sliders, Info } from 'lucide-react';
|
||||
@@ -10,13 +12,14 @@ const tl = (n) => (typeof n === 'number' && isFinite(n) ? '₺' + n.toLocaleStri
|
||||
export const AiSpecAnalyzerModal = () => {
|
||||
const {
|
||||
isAiSpecAnalyzerOpen, setIsAiSpecAnalyzerOpen,
|
||||
analyzeSpecPdfWithGemini, aiAnalysisResults, aiAnalyzing, activeAiModel, activeTenderDetail,
|
||||
analyzeSpecPdfWithGemini, openSavedAnalysis, authUser, aiAnalysisResults, aiAnalyzing, activeAiModel, activeTenderDetail,
|
||||
} = useApp();
|
||||
|
||||
const [isAnalyzing, setIsAnalyzing] = useState(false);
|
||||
const [selectedFile, setSelectedFile] = useState(null);
|
||||
const [error, setError] = useState(null);
|
||||
const [progress, setProgress] = useState('');
|
||||
const [restoredSource,setRestoredSource]=useState(null);
|
||||
const [customBid, setCustomBid] = useState(null);
|
||||
const [aiCfg, setAiCfg] = useState(null);
|
||||
// Derin mod: ince detaylar, belge kontrol listesi ve yol haritası da üretilir.
|
||||
@@ -32,11 +35,11 @@ export const AiSpecAnalyzerModal = () => {
|
||||
// Analiz doküman panelinden de başlatılabiliyor — o durumda isAnalyzing false
|
||||
// kalır, bu yüzden context'teki ortak sinyalle birleştiriyoruz.
|
||||
const mesgul = isAnalyzing || aiAnalyzing;
|
||||
const results = aiAnalysisResults;
|
||||
const results = !activeTenderDetail || aiAnalysisResults?.tenderKey===(activeTenderDetail.ikn || activeTenderDetail.id) ? aiAnalysisResults : null;
|
||||
const bid = results?.bidAnalysis || {};
|
||||
|
||||
const runAnalysis = async (text, fileName) => {
|
||||
setError(null);
|
||||
setError(null);setRestoredSource(null);
|
||||
setIsAnalyzing(true);
|
||||
setSelectedFile(fileName);
|
||||
try {
|
||||
@@ -53,7 +56,7 @@ export const AiSpecAnalyzerModal = () => {
|
||||
};
|
||||
|
||||
const handleFile = async (file) => {
|
||||
setError(null);
|
||||
setError(null);setRestoredSource(null);
|
||||
setIsAnalyzing(true);
|
||||
setSelectedFile(file.name);
|
||||
try {
|
||||
@@ -117,6 +120,11 @@ export const AiSpecAnalyzerModal = () => {
|
||||
</div>
|
||||
|
||||
<div className="p-6 space-y-6 overflow-y-auto">
|
||||
<AiJobHistory key={`${authUser?.email}:${getToken()}:${activeTenderDetail?.ikn || ''}`} ikn={activeTenderDetail?.ikn}
|
||||
operationFilter="analiz" locked={mesgul} revision={`${isAiSpecAnalyzerOpen}:${aiAnalyzing}`}
|
||||
onOpen={async job=>{const result=await openSavedAnalysis(job);setRestoredSource({text:job.input.text,tenderKey:result.tenderKey});setSelectedFile(result.fileName || null);setCustomBid(result.bidAnalysis?.recommendedBid ?? null);setError(null);}} />
|
||||
{results && restoredSource?.tenderKey===results.tenderKey && <details className="border rounded p-3 text-sm"><summary>Kaydedilen analiz kaynak metni</summary><pre className="whitespace-pre-wrap max-h-64 overflow-auto">{restoredSource.text || 'Bu eski kayıtta kaynak metni bulunmuyor.'}</pre></details>}
|
||||
{mesgul&&<p role="status" className="text-sm text-blue-800">Analiz sunucuda sürüyor. Bu ekranı kapatabilirsiniz; sonucu Kayıtlı AI işleri bölümünden açabilirsiniz.</p>}
|
||||
|
||||
{/* AI yapılandırılmamış uyarısı */}
|
||||
{aiCfg && !aiCfg.configured && (
|
||||
|
||||
Reference in New Issue
Block a user