import React, { useState, useEffect, useRef } from 'react'; import { createClient } from '@supabase/supabase-js'; // --- CONFIG --- const SUPABASE_URL = "https://whpciwshxecjvalksicw.supabase.co"; const SUPABASE_ANON_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6IndocGNpd3NoeGVjanZhbGtzaWN3Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzAxNDQyNjYsImV4cCI6MjA4NTcyMDI2Nn0.TwWAlQCUstvGykPhaDhPAVpTyg2MV7eltG7JFvjZ-zU"; // <--- PASTE KEY HERE const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY); const AI_MODELS = [ { id: 'openai/dall-e-3', name: 'TEK 3 (Best)' }, { id: 'google/imagen-4.0-preview', name: 'TEK 4 HD (Real)' }, { id: 'gemini-2.5-flash-image', name: 'TEK NANO HD (Fast)' }, ]; const ASPECT_RATIOS = [ { id: '1:1', name: 'Square' }, { id: '16:9', name: 'Wide' }, { id: '9:16', name: 'Portrait' }, ]; function App() { const [session, setSession] = useState(null); const [prompt, setPrompt] = useState(""); const [selectedModel, setSelectedModel] = useState(AI_MODELS[0].id); const [selectedRatio, setSelectedRatio] = useState(ASPECT_RATIOS[0].id); const [generating, setGenerating] = useState(false); const [imageSrc, setImageSrc] = useState(null); const [inputImage, setInputImage] = useState(null); const [previewUrl, setPreviewUrl] = useState(null); const fileInputRef = useRef(null); const [deferredPrompt, setDeferredPrompt] = useState(null); const [showInstallBanner, setShowInstallBanner] = useState(false); const [isIOS, setIsIOS] = useState(false); useEffect(() => { supabase.auth.getSession().then(({ data: { session } }) => setSession(session)); const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, session) => setSession(session)); const isIosDevice = /ipad|iphone|ipod/.test(navigator.userAgent.toLowerCase()) && !window.MSStream; const isInStandaloneMode = window.matchMedia('(display-mode: standalone)').matches || window.navigator.standalone === true; if (isIosDevice && !isInStandaloneMode) { setIsIOS(true); setTimeout(() => setShowInstallBanner(true), 3000); } window.addEventListener('beforeinstallprompt', (e) => { e.preventDefault(); setDeferredPrompt(e); if (!isInStandaloneMode) setShowInstallBanner(true); }); return () => subscription.unsubscribe(); }, []); const handleInstallClick = async () => { if (deferredPrompt) { deferredPrompt.prompt(); setDeferredPrompt(null); setShowInstallBanner(false); } }; const handleLogin = async () => { const { error } = await supabase.auth.signInAnonymously(); if (error) alert("Login failed: " + error.message); }; const handleFileChange = (e) => { const file = e.target.files[0]; if (file) { setInputImage(file); setPreviewUrl(URL.createObjectURL(file)); } }; const handleGenerate = async () => { if (!prompt) return; setGenerating(true); setImageSrc(null); try { if (!window.puter.auth.isSignedIn()) await window.puter.auth.signIn(); const ratioText = selectedRatio === '1:1' ? '' : ` --ar ${selectedRatio}`; const finalPrompt = prompt + ratioText; let imgElement; if (inputImage && !selectedModel.includes('dall-e')) { imgElement = await window.puter.ai.txt2img(finalPrompt, { model: selectedModel, image: inputImage }); } else { if (inputImage) alert("Note: TEK 3 ignores input images for now."); imgElement = await window.puter.ai.txt2img(finalPrompt, { model: selectedModel }); } setImageSrc(imgElement.src); } catch (e) { alert("Error: " + (e.message || "Failed")); } finally { setGenerating(false); } }; // --- NEW START SCREEN (TEK DREAMS) --- if (!session) { return (
{/* The Outer Glass Box */}
{/* The Inner Glass Box */}
TEK DREAMS
); } // --- MAIN APP --- return (
{/* HEADER */}
TEK BUILD
{/* VIEWPORT */}
{generating ? (
) : imageSrc ? (
Generated
) : (
)}
{/* PWA BANNER */} {showInstallBanner && (
{isIOS ? (
📲
Tap Share then "Add to Home Screen"
) : (
Install App?
)}
)} {/* INPUT DOCK */}
{generating ? "Dreaming..." : (imageSrc ? "Done" : "Ready to dream")}
{previewUrl && (
)}
fileInputRef.current.click()} style={{ height: '48px', width: '48px', borderRadius: '50%', background: 'rgba(255,255,255,0.1)', display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', flexShrink: 0 }}> 📷