jurmy24's picture
feat: add viewer code
72f0edb
raw
history blame
4.48 kB
import React from "react";
import Header from "../components/Header";
import Carousel from "../components/Carousel";
import { ContentItem } from "../lib/types";
import ChatWindow from "../components/ChatWindow";
import { useUrdfs, useCategories } from "@/hooks/useUrdfData";
import { Skeleton } from "@/components/ui/skeleton";
const Explore: React.FC = () => {
const { data: urdfs, isLoading: isLoadingUrdfs } = useUrdfs();
const { data: categories, isLoading: isLoadingCategories } = useCategories();
// Group content items by categories
const categorizedContent = React.useMemo(() => {
if (!urdfs) return {};
return urdfs.reduce((acc, item) => {
item.categories.forEach((category) => {
if (!acc[category]) {
acc[category] = [];
}
acc[category].push(item);
});
return acc;
}, {} as Record<string, ContentItem[]>);
}, [urdfs]);
// Get unique categories
const uniqueCategories = Object.keys(categorizedContent).sort();
return (
<div className="min-h-screen bg-netflix-background text-netflix-text">
<Header />
{/* Cosmic background wrapper */}
<div className="cosmic-background fixed inset-0 z-0">
{/* Cosmic background with stars */}
<div className="absolute inset-0 bg-[#0a0a14] overflow-hidden">
<div className="absolute inset-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwMCIgaGVpZ2h0PSIyMDAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxmaWx0ZXIgaWQ9Im4iPjxmZVR1cmJ1bGVuY2UgdHlwZT0iZnJhY3RhbE5vaXNlIiBiYXNlRnJlcXVlbmN5PSIuNyIgbnVtT2N0YXZlcz0iMTAiIHN0aXRjaFRpbGVzPSJzdGl0Y2giLz48ZmVCbGVuZCBtb2RlPSJzY3JlZW4iLz48L2ZpbHRlcj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWx0ZXI9InVybCgjbikiIG9wYWNpdHk9Ii4xIi8+PC9zdmc+')] bg-repeat opacity-30"></div>
{/* Subtle animated gradient overlay */}
<div className="absolute inset-0 bg-gradient-to-b from-indigo-900/20 via-transparent to-black/30"></div>
{/* Random stars */}
<div className="stars absolute inset-0"></div>
</div>
</div>
<div className="pt-24 relative z-10">
{/* Main content area */}
<main className="container mx-auto px-4 pb-8 max-w-full">
{/* Page title */}
<div className="mb-6 text-center">
<h1 className="text-4xl md:text-6xl font-bold tracking-tighter text-white animate-fade-in">
Explore All Robots
</h1>
<p className="mt-4 text-xl text-gray-300 max-w-3xl mx-auto">
Browse our complete collection of robotics systems and deployable
URDF units
</p>
</div>
{/* Chat window right below the title */}
<section className="mb-12 max-w-4xl mx-auto">
<div className="glass-panel">
<ChatWindow />
</div>
</section>
{/* Content sections */}
<div className="relative z-10">
{isLoadingUrdfs || isLoadingCategories ? (
// Loading skeleton
<div className="space-y-20">
{[1, 2, 3].map((i) => (
<section key={i} className="category-section min-h-[20vh]">
<Skeleton className="h-10 w-48 mb-8" />
<div className="glass-panel p-6 rounded-xl">
<div className="flex gap-4">
{[1, 2, 3, 4].map((j) => (
<Skeleton key={j} className="h-64 w-full" />
))}
</div>
</div>
</section>
))}
</div>
) : (
<div className="space-y-20">
{uniqueCategories.map((category) => (
<section
key={category}
className="category-section min-h-[20vh]"
>
<h2 className="text-3xl font-bold mb-8 text-netflix-text text-glow capitalize">
{category}
</h2>
<Carousel
title={category}
items={categorizedContent[category]}
className="glass-panel p-6 rounded-xl"
/>
</section>
))}
</div>
)}
</div>
</main>
</div>
</div>
);
};
export default Explore;