CommunitySnippetsSection.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { LOCAL_STORAGE_KEYS, useParams } from 'common'
  2. import { BookText } from 'lucide-react'
  3. import { useRouter } from 'next/router'
  4. import {
  5. InnerSideMenuCollapsible,
  6. InnerSideMenuCollapsibleContent,
  7. InnerSideMenuCollapsibleTrigger,
  8. } from 'ui-patterns'
  9. import { InnerSideMenuDataItem } from 'ui-patterns/InnerSideMenu'
  10. import { DEFAULT_SECTION_STATE, type SectionState } from './SQLEditorNav.constants'
  11. import { useLocalStorage } from '@/hooks/misc/useLocalStorage'
  12. const OPTIONS = ['templates', 'quickstarts'] as const
  13. export function CommunitySnippetsSection() {
  14. const { ref } = useParams()
  15. const router = useRouter()
  16. const [sectionVisibility, setSectionVisibility] = useLocalStorage<SectionState>(
  17. LOCAL_STORAGE_KEYS.SQL_EDITOR_SECTION_STATE(ref ?? ''),
  18. DEFAULT_SECTION_STATE
  19. )
  20. const { community: showCommunitySnippets } = sectionVisibility
  21. function isPageActive(key: string): boolean {
  22. return router.asPath === `/project/${ref}/sql/${key}`
  23. }
  24. return (
  25. <InnerSideMenuCollapsible
  26. className="px-0"
  27. open={showCommunitySnippets}
  28. onOpenChange={(value) => {
  29. setSectionVisibility({
  30. ...(sectionVisibility ?? DEFAULT_SECTION_STATE),
  31. community: value,
  32. })
  33. }}
  34. >
  35. <InnerSideMenuCollapsibleTrigger title="Community" />
  36. <InnerSideMenuCollapsibleContent className="group-data-open:pt-2">
  37. {OPTIONS.map((pageId) => {
  38. const active = isPageActive(pageId)
  39. return (
  40. <InnerSideMenuDataItem
  41. key={pageId}
  42. title={pageId === 'templates' ? 'Templates' : 'Quickstarts'}
  43. isActive={active}
  44. isOpened={false}
  45. href={`/project/${ref}/sql/${pageId}`}
  46. className="capitalize"
  47. >
  48. <BookText size={16} className="text-foreground-muted" />
  49. {pageId}
  50. </InnerSideMenuDataItem>
  51. )
  52. })}
  53. </InnerSideMenuCollapsibleContent>
  54. </InnerSideMenuCollapsible>
  55. )
  56. }