import { useState, useEffect } from "react"; import { ChatHeader } from "@/components/ChatHeader"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Download, Trash2, Sparkles, Clock, Search } from "lucide-react"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useToast } from "@/hooks/use-toast"; import { imageGenerationService, IMAGE_SIZE_OPTIONS, ImageSize } from "@/services/imageGeneration"; interface GeneratedImage { id: string; url: string; prompt: string; size: ImageSize; timestamp: Date; } export const ImageView = () => { const [prompt, setPrompt] = useState(""); const [isGenerating, setIsGenerating] = useState(false); const [selectedSize, setSelectedSize] = useState("1024x1024"); const [searchQuery, setSearchQuery] = useState(""); const [images, setImages] = useState([]); const { toast } = useToast(); // Carrega histórico do localStorage ao montar o componente useEffect(() => { const savedImages = localStorage.getItem('imageHistory'); if (savedImages) { try { const parsedImages = JSON.parse(savedImages); // Converte strings de data de volta para Date objects const imagesWithDates = parsedImages.map((img: any) => ({ ...img, timestamp: new Date(img.timestamp), })); setImages(imagesWithDates); } catch (error) { console.error('Erro ao carregar histórico de imagens:', error); } } }, []); const handleGenerate = async () => { // Valida a descrição antes de enviar const validation = imageGenerationService.validateDescription(prompt); if (!validation.valid) { toast({ title: "Descrição inválida", description: validation.error, variant: "destructive", }); return; } setIsGenerating(true); try { // Chama o serviço de geração de imagem const response = await imageGenerationService.generateImage({ description: prompt, size: selectedSize, }); // Verifica se a geração foi bem-sucedida if (response.success) { // Log da URL da imagem para debug console.log('URL da imagem gerada:', response.image_url); const newImage: GeneratedImage = { id: response.image_generation_id, url: response.image_url, prompt: response.message, size: selectedSize, timestamp: new Date(), }; const newHistory = [newImage, ...images].slice(0, 20); // Mantém apenas as últimas 20 imagens setImages(newHistory); localStorage.setItem('imageHistory', JSON.stringify(newHistory)); toast({ title: "Imagem gerada com sucesso", description: `Tamanho: ${IMAGE_SIZE_OPTIONS[selectedSize].label}`, }); // Limpa o campo de descrição após sucesso setPrompt(""); } else { throw new Error('Erro ao gerar imagem'); } } catch (error: any) { console.error('Erro na geração de imagem:', error); toast({ title: "Erro na geração", description: error.message || "Não foi possível gerar a imagem. Tente novamente.", variant: "destructive", }); } finally { setIsGenerating(false); } }; const handleDelete = (id: string) => { const newHistory = images.filter((img) => img.id !== id); setImages(newHistory); localStorage.setItem('imageHistory', JSON.stringify(newHistory)); toast({ title: "Imagem removida", description: "A imagem foi removida do histórico.", }); }; const handleDownload = async (image: GeneratedImage) => { try { await imageGenerationService.downloadImage( image.url, `${image.prompt.substring(0, 30)}_${image.size}.png` ); toast({ title: "Download iniciado", description: "A imagem está sendo baixada.", }); } catch (error) { toast({ title: "Erro no download", description: "Não foi possível baixar a imagem.", variant: "destructive", }); } }; const filteredImages = images.filter((img) => img.prompt.toLowerCase().includes(searchQuery.toLowerCase()) ); return (
{/* Main Content */}
Gerar Imagem Histórico Hist. {/* Generate Tab */}