ContextSearchResults.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. 'use client'
  2. import { Auth, EdgeFunctions, Storage } from 'icons'
  3. import { Database } from 'lucide-react'
  4. import dynamic from 'next/dynamic'
  5. import { EmptyState, SkeletonResults } from './ContextSearchResults.shared'
  6. import type { SearchContextValue } from './SearchContext.types'
  7. const TableSearchResults = dynamic(
  8. () => import('./TableSearchResults').then((mod) => ({ default: mod.TableSearchResults })),
  9. {
  10. loading: () => <SkeletonResults />,
  11. ssr: false,
  12. }
  13. )
  14. const PolicySearchResults = dynamic(
  15. () => import('./PolicySearchResults').then((mod) => ({ default: mod.PolicySearchResults })),
  16. {
  17. loading: () => <SkeletonResults />,
  18. ssr: false,
  19. }
  20. )
  21. const EdgeFunctionSearchResults = dynamic(
  22. () =>
  23. import('./EdgeFunctionSearchResults').then((mod) => ({
  24. default: mod.EdgeFunctionSearchResults,
  25. })),
  26. {
  27. loading: () => <SkeletonResults />,
  28. ssr: false,
  29. }
  30. )
  31. const StorageSearchResults = dynamic(
  32. () => import('./StorageSearchResults').then((mod) => ({ default: mod.StorageSearchResults })),
  33. {
  34. loading: () => <SkeletonResults />,
  35. ssr: false,
  36. }
  37. )
  38. interface ContextSearchResultsProps {
  39. context: SearchContextValue
  40. query: string
  41. }
  42. const CONTEXT_CONFIG: Record<
  43. SearchContextValue,
  44. {
  45. icon: React.ComponentType<React.SVGProps<SVGSVGElement>>
  46. label: string
  47. requiresInput?: boolean // requires user input before showing results
  48. }
  49. > = {
  50. 'database-tables': {
  51. icon: Database,
  52. label: 'Database Tables',
  53. requiresInput: false,
  54. },
  55. 'auth-policies': {
  56. icon: Auth,
  57. label: 'RLS Policies',
  58. requiresInput: false,
  59. },
  60. 'edge-functions': {
  61. icon: EdgeFunctions,
  62. label: 'Edge Functions',
  63. requiresInput: false,
  64. },
  65. storage: {
  66. icon: Storage,
  67. label: 'Storage',
  68. requiresInput: false,
  69. },
  70. }
  71. export function ContextSearchResults({ context, query }: ContextSearchResultsProps) {
  72. const config = CONTEXT_CONFIG[context]
  73. if (context === 'database-tables') {
  74. return (
  75. <div className="flex-1 min-h-0 flex flex-col">
  76. <TableSearchResults query={query} />
  77. </div>
  78. )
  79. }
  80. if (context === 'auth-policies') {
  81. return (
  82. <div className="flex-1 min-h-0 flex flex-col">
  83. <PolicySearchResults query={query} />
  84. </div>
  85. )
  86. }
  87. if (context === 'edge-functions') {
  88. return (
  89. <div className="flex-1 min-h-0 flex flex-col">
  90. <EdgeFunctionSearchResults query={query} />
  91. </div>
  92. )
  93. }
  94. if (context === 'storage') {
  95. return (
  96. <div className="flex-1 min-h-0 flex flex-col">
  97. <StorageSearchResults query={query} />
  98. </div>
  99. )
  100. }
  101. return (
  102. <div className="flex-1 min-h-0 flex flex-col">
  103. <EmptyState icon={config.icon} label={config.label} query={query} />
  104. </div>
  105. )
  106. }