Gmagl
fix: correcciones críticas y refactorización de componentes
3eebcd0
Raw
History Blame Contribute Delete
7.54 kB
"use client";
import { useState } from "react";
import { PawPrint, RefreshCw } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { ScrollArea } from "@/components/ui/scroll-area";
import { Label } from "@/components/ui/label";
import { toast } from "sonner";
import { apiFetch, type Pet } from "./types";
interface Props { pets: Pet[]; onCreated: () => void; }
const petTypes = [
{ value: "dog", label: "🐕 Perro" },
{ value: "cat", label: "🐱 Gato" },
{ value: "bird", label: "🐦 Pájaro" },
{ value: "rabbit", label: "🐰 Conejo" },
{ value: "hamster", label: "🐹 Hámster" }
];
export default function PetsTab({ pets, onCreated }: Props) {
const [petName, setPetName] = useState("");
const [petType, setPetType] = useState("dog");
const [petBreed, setPetBreed] = useState("");
const [petPersonality, setPetPersonality] = useState("");
const [petLoading, setPetLoading] = useState(false);
const handleCreatePet = async () => {
if (!petName.trim()) { toast.error("Dale un nombre a tu mascota"); return; }
setPetLoading(true);
try {
const result = await apiFetch("/pets", {
method: "POST",
body: JSON.stringify({
name: petName, type: petType,
breed: petBreed || undefined,
personality: petPersonality || undefined,
generateReference: true
}),
});
if (result.success) {
toast.success(`Mascota "${petName}" creada (+${result.engagementBoost}% engagement)`);
setPetName(""); setPetBreed(""); setPetPersonality("");
onCreated();
} else toast.error(result.error);
} catch { toast.error("Error"); }
finally { setPetLoading(false); }
};
return (
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
<Card className="bg-slate-900/50 border-slate-800">
<CardHeader>
<CardTitle className="flex items-center gap-2"><PawPrint className="h-5 w-5 text-amber-400" />Crear Mascota</CardTitle>
<CardDescription>Las mascotas aumentan el engagement hasta un 35%</CardDescription>
</CardHeader>
<CardContent className="space-y-4">
<div className="grid grid-cols-2 gap-4">
<div>
<Label className="text-xs text-slate-400">Nombre</Label>
<Input placeholder="Max, Luna..." value={petName} onChange={(e) => setPetName(e.target.value)} className="bg-slate-800 border-slate-700 mt-1" />
</div>
<div>
<Label className="text-xs text-slate-400">Tipo</Label>
<Select value={petType} onValueChange={setPetType}>
<SelectTrigger className="bg-slate-800 border-slate-700 mt-1"><SelectValue /></SelectTrigger>
<SelectContent>
{petTypes.map((pt) => (
<SelectItem key={pt.value} value={pt.value}>{pt.label}</SelectItem>
))}
</SelectContent>
</Select>
</div>
</div>
<div className="grid grid-cols-2 gap-4">
<div>
<Label className="text-xs text-slate-400">Raza (opcional)</Label>
<Input placeholder="Golden Retriever..." value={petBreed} onChange={(e) => setPetBreed(e.target.value)} className="bg-slate-800 border-slate-700 mt-1" />
</div>
<div>
<Label className="text-xs text-slate-400">Personalidad</Label>
<Select value={petPersonality} onValueChange={setPetPersonality}>
<SelectTrigger className="bg-slate-800 border-slate-700 mt-1"><SelectValue placeholder="Seleccionar" /></SelectTrigger>
<SelectContent>
<SelectItem value="playful">Juguetón</SelectItem>
<SelectItem value="calm">Tranquilo</SelectItem>
<SelectItem value="energetic">Energético</SelectItem>
<SelectItem value="curious">Curioso</SelectItem>
<SelectItem value="lazy">Perezoso</SelectItem>
</SelectContent>
</Select>
</div>
</div>
<Button onClick={handleCreatePet} disabled={petLoading} className="w-full bg-amber-600 hover:bg-amber-700">
{petLoading ? <RefreshCw className="h-4 w-4 mr-2 animate-spin" /> : <PawPrint className="h-4 w-4 mr-2" />}Crear Mascota
</Button>
</CardContent>
</Card>
<Card className="bg-slate-900/50 border-slate-800">
<CardHeader><CardTitle>Mis Mascotas</CardTitle></CardHeader>
<CardContent>
<ScrollArea className="h-64">
{pets.length === 0 ? (
<div className="text-center py-8 text-slate-400">
<PawPrint className="h-12 w-12 mx-auto mb-3 opacity-50" />
<p>No tienes mascotas</p>
<p className="text-xs mt-1">Las mascotas aumentan el engagement</p>
</div>
) : (
<div className="space-y-2">
{pets.map((p) => (
<div key={p.id} className="p-3 rounded-lg bg-slate-800/50 flex items-center justify-between">
<div className="flex items-center gap-3">
<div className="w-10 h-10 rounded-lg bg-gradient-to-br from-amber-500 to-orange-500 flex items-center justify-center">
<PawPrint className="h-5 w-5 text-white" />
</div>
<div>
<p className="font-medium">{p.name}</p>
<p className="text-xs text-slate-400">{p.breed || p.type} • {p.personality || "Sin personalidad"}</p>
</div>
</div>
<Badge className="bg-green-500/20 text-green-400">+35%</Badge>
</div>
))}
</div>
)}
</ScrollArea>
</CardContent>
</Card>
</div>
);
}