()
| 320 | }, [field.id]); |
| 321 | |
| 322 | const fetchAiAnalysis = async () => { |
| 323 | setAiLoading(true); |
| 324 | setShowAnalysis(true); |
| 325 | try { |
| 326 | const ndviEstimate = ndviStats?.mean_ndvi?.toFixed(2) || "0.55"; |
| 327 | const { data, error } = await supabase.functions.invoke("analyze-field", { |
| 328 | body: { |
| 329 | fieldName: field.name, crop: field.crop, area: areaAcres, location: field.location, |
| 330 | temperature: weather?.temperature_2m ?? 25, humidity: weather?.relative_humidity_2m ?? 60, |
| 331 | windSpeed: weather?.wind_speed_10m ?? 10, soilMoisture: soilMoisture ?? 45, ndviEstimate, |
| 332 | isUrban: urban, |
| 333 | soilData: soilData ? { |
| 334 | type: soilData.classification.soil_class, |
| 335 | ph: soilData.metrics.ph, |
| 336 | soc: soilData.metrics.soc_g_per_kg, |
| 337 | nitrogen: soilData.metrics.nitrogen_g_per_kg, |
| 338 | texture: soilData.texture.usda_class, |
| 339 | waterRetention: soilData.water_retention, |
| 340 | cec: soilData.metrics.cec, |
| 341 | } : undefined, |
| 342 | aqiData: aqiData ? { pm2_5: aqiData.pm2_5, pm10: aqiData.pm10, aqi: aqiData.european_aqi } : undefined, |
| 343 | }, |
| 344 | }); |
| 345 | if (error) throw error; |
| 346 | setAiAnalysis(data.analysis); |
| 347 | setCache(ANALYSIS_CACHE_KEY, field.id, data.analysis); |
| 348 | } catch (e) { |
| 349 | console.error("AI analysis error:", e); |
| 350 | setAiAnalysis("Analysis temporarily unavailable. Please try again."); |
| 351 | } finally { setAiLoading(false); } |
| 352 | }; |
| 353 | |
| 354 | const analysisBlocks = useMemo(() => splitAnalysisBlocks(aiAnalysis), [aiAnalysis]); |
| 355 |
nothing calls this directly
no test coverage detected