page.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. "use client";
  2. import { Suspense, useState, useCallback } from "react";
  3. import { LayoutConfigurationsTable } from "@/app/components/layout-configurations/LayoutConfigurationsTable";
  4. import { CreateLayoutConfigurationDialog } from "@/app/components/layout-configurations/CreateLayoutConfigurationDialog";
  5. import { Skeleton } from "@/components/ui/skeleton";
  6. import { Button } from "@/components/ui/button";
  7. import { RefreshCw } from "lucide-react";
  8. import { Card } from "@/components/ui/card";
  9. export default function LayoutConfigurationsPage() {
  10. const [refreshKey, setRefreshKey] = useState(0);
  11. const handleRefresh = useCallback(() => {
  12. setRefreshKey(prev => prev + 1);
  13. }, []);
  14. return (
  15. <div className="min-h-screen bg-gradient-to-br from-gray-50 to-gray-100 dark:from-gray-900 dark:to-gray-800">
  16. <div className="container mx-auto py-8 px-4">
  17. <div className="flex justify-between items-center mb-8">
  18. <h1 className="text-3xl font-bold text-gray-900 dark:text-white">
  19. Layout Configurations
  20. </h1>
  21. <div className="flex gap-2">
  22. <Button
  23. variant="outline"
  24. size="sm"
  25. onClick={handleRefresh}
  26. className="flex items-center gap-2 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-700"
  27. >
  28. <RefreshCw className="h-4 w-4" />
  29. Refresh
  30. </Button>
  31. <CreateLayoutConfigurationDialog />
  32. </div>
  33. </div>
  34. <Card className="dark:bg-gray-800 dark:border-gray-700">
  35. <Suspense fallback={<LayoutConfigurationsSkeleton />}>
  36. <LayoutConfigurationsTable key={refreshKey} />
  37. </Suspense>
  38. </Card>
  39. </div>
  40. </div>
  41. );
  42. }
  43. function LayoutConfigurationsSkeleton() {
  44. return (
  45. <div className="p-4 space-y-4">
  46. {[...Array(5)].map((_, i) => (
  47. <div key={i} className="flex items-center space-x-4">
  48. <Skeleton className="h-12 w-full dark:bg-gray-700" />
  49. </div>
  50. ))}
  51. </div>
  52. );
  53. }