import React, { useState, useEffect, useRef } from 'react'; import { ShieldAlert, Zap, MessageSquare, BarChart3, RotateCcw, Camera, Mic2, ChevronRight, AlertTriangle, Send, CheckCircle2 } from 'lucide-react'; import { initializeApp } from 'firebase/app'; import { getAuth, signInAnonymously, signInWithCustomToken, onAuthStateChanged } from 'firebase/auth'; import { getFirestore, collection, addDoc, onSnapshot, query, serverTimestamp } from 'firebase/firestore'; const apiKey = ""; const MODEL_GEN = "gemini-2.5-flash-preview-09-2025"; const MODEL_TTS = "gemini-2.5-flash-preview-tts"; const App = () => { const [user, setUser] = useState(null); const [input, setInput] = useState(''); const [image, setImage] = useState(null); const [loading, setLoading] = useState(false); const [analysis, setAnalysis] = useState(null); const [history, setHistory] = useState([]); const fileInputRef = useRef(null); useEffect(() => { const firebaseConfig = JSON.parse(window.__firebase_config || '{}'); if (!firebaseConfig.apiKey) return; const app = initializeApp(firebaseConfig); const auth = getAuth(app); const db = getFirestore(app); const appId = window.__app_id || 'social-architect-v1'; const initAuth = async () => { if (window.__initial_auth_token) { await signInWithCustomToken(auth, window.__initial_auth_token); } else { await signInAnonymously(auth); } }; initAuth(); const unsubscribeAuth = onAuthStateChanged(auth, (u) => { setUser(u); if (u) { const q = query(collection(db, 'artifacts', appId, 'users', u.uid, 'analyses')); const unsubSnap = onSnapshot(q, (snapshot) => { const docs = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); setHistory(docs.sort((a, b) => b.timestamp?.seconds - a.timestamp?.seconds)); }, (err) => console.error("Firestore Error:", err)); return () => unsubSnap(); } }); return () => unsubscribeAuth(); }, []); const handleImageUpload = (e) => { const file = e.target.files[0]; if (file) { const reader = new FileReader(); reader.onloadend = () => setImage(reader.result.split(',')[1]); reader.readAsDataURL(file); } }; const playFeedback = async (text) => { try { const url = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL_TTS}:generateContent?key=${apiKey}`; const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ contents: [{ parts: [{ text: text }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Puck" } } } } }) }); const data = await res.json(); const audioData = data.candidates?.[0]?.content?.parts?.find(p => p.inlineData)?.inlineData?.data; if (audioData) { const blob = pcmToWav(audioData); const audioUrl = URL.createObjectURL(blob); new Audio(audioUrl).play(); } } catch (e) { console.error("TTS Error", e); } }; const pcmToWav = (b64) => { const bin = atob(b64); const buf = new ArrayBuffer(44 + bin.length); const view = new DataView(buf); const s = (o, str) => { for (let i=0; i { if (!input && !image) return; setLoading(true); try { const systemPrompt = ` SYSTEM PROTOCOL: SOCIAL_ARCHITECT_V2 (CALIBRATED) OBIETTIVO: Analisi dinamiche sociali. LOGICA DI VALUTAZIONE (CRITICA): 1. Complimenti espliciti ("sei bello"): Valutali come IOI (Indicator of Interest) se contestualizzati. 2. Proposte logistiche ("ci vediamo?"): Sono segnali di ALTO interesse. Punteggio minimo 8/10. 3. Distingui tra cortesia e investimento emotivo/logistico. FORMATO JSON RICHIESTO: { "metrics": { "score": 0-10, "frame": "string", "subtext": ["array 3 stringhe"] }, "feedback": { "error": "Cosa ha sbagliato l'utente o punti critici", "redFlags": ["Segnali di pericolo"] }, "replies": { "alpha": "Risposta dominante", "beta": "Risposta di mantenimento", "gamma": "Azione logistica" }, "shortSummary": "Breve riassunto per sintesi vocale" } `; const url = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL_GEN}:generateContent?key=${apiKey}`; const payload = { contents: [{ parts: [ { text: input || "Analizza questo screenshot." }, ...(image ? [{ inlineData: { mimeType: "image/png", data: image } }] : []) ] }], systemInstruction: { parts: [{ text: systemPrompt }] }, generationConfig: { responseMimeType: "application/json" } }; const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const data = await res.json(); const result = JSON.parse(data.candidates[0].content.parts[0].text); setAnalysis(result); if (user) { const db = getFirestore(); await addDoc(collection(db, 'artifacts', window.__app_id || 'social-architect-v1', 'users', user.uid, 'analyses'), { ...result, timestamp: serverTimestamp() }); } playFeedback(result.shortSummary); } catch (e) { console.error(e); } finally { setLoading(false); } }; return (

Social Architect V2

CALIBRATED_ENGINE_RUNNING