EmptyStates.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { BoxPlus } from 'icons'
  2. import { Plus } from 'lucide-react'
  3. import Link from 'next/link'
  4. import {
  5. Button,
  6. Card,
  7. Skeleton,
  8. Table,
  9. TableBody,
  10. TableCell,
  11. TableHead,
  12. TableHeader,
  13. TableRow,
  14. } from 'ui'
  15. import { EmptyStatePresentational } from 'ui-patterns'
  16. import { ShimmeringCard } from './ShimmeringCard'
  17. import { HomeIcon } from '@/components/layouts/Navigation/LayoutHeader/HomeIcon'
  18. import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
  19. export const Header = () => {
  20. return (
  21. <div className="flex items-center border-default border-b px-4 py-3.5">
  22. <HomeIcon />
  23. </div>
  24. )
  25. }
  26. export const LoadingTableView = () => {
  27. return (
  28. <Card>
  29. <Table>
  30. <TableHeader>
  31. <TableRow>
  32. <TableHead>Project</TableHead>
  33. <TableHead>Status</TableHead>
  34. <TableHead>Compute</TableHead>
  35. <TableHead>Region</TableHead>
  36. <TableHead>Created</TableHead>
  37. </TableRow>
  38. </TableHeader>
  39. <TableBody>
  40. {[...Array(3)].map((_, i) => (
  41. <TableRow key={i}>
  42. <TableCell>
  43. <Skeleton className="bg-surface-400 h-4 w-32"></Skeleton>
  44. </TableCell>
  45. <TableCell>
  46. <Skeleton className="bg-surface-400 h-4 w-16"></Skeleton>
  47. </TableCell>
  48. <TableCell>
  49. <Skeleton className="bg-surface-400 h-4 w-20"></Skeleton>
  50. </TableCell>
  51. <TableCell>
  52. <Skeleton className="bg-surface-400 h-4 w-20"></Skeleton>
  53. </TableCell>
  54. <TableCell>
  55. <Skeleton className="bg-surface-400 h-4 w-24"></Skeleton>
  56. </TableCell>
  57. </TableRow>
  58. ))}
  59. </TableBody>
  60. </Table>
  61. </Card>
  62. )
  63. }
  64. export const LoadingCardView = () => {
  65. return (
  66. <ul className="w-full mx-auto grid grid-cols-1 gap-4 sm:grid-cols-1 md:grid-cols-1 lg:grid-cols-2 xl:grid-cols-3">
  67. <ShimmeringCard />
  68. <ShimmeringCard />
  69. </ul>
  70. )
  71. }
  72. export const NoProjectsState = ({ slug }: { slug: string }) => {
  73. const projectCreationEnabled = useIsFeatureEnabled('projects:create')
  74. return (
  75. <EmptyStatePresentational
  76. icon={BoxPlus}
  77. title="Create a project"
  78. description="Launch a complete backend built on Postgres."
  79. >
  80. {projectCreationEnabled && (
  81. <Button size="tiny" type="default" asChild icon={<Plus />}>
  82. <Link href={`/new/${slug}`}>New project</Link>
  83. </Button>
  84. )}
  85. </EmptyStatePresentational>
  86. )
  87. }
  88. export const NoOrganizationsState = () => {
  89. return (
  90. <EmptyStatePresentational
  91. title="Create an organization"
  92. description="Manage your team and projects in one place."
  93. >
  94. <Button size="tiny" type="primary" asChild icon={<Plus />}>
  95. <Link href="/new">New organization</Link>
  96. </Button>
  97. </EmptyStatePresentational>
  98. )
  99. }