Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

context.tsx 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. 'use client'
  2. import type { ReactNode } from 'react'
  3. import {
  4. useMemo,
  5. useRef,
  6. useState,
  7. } from 'react'
  8. import {
  9. createContext,
  10. useContextSelector,
  11. } from 'use-context-selector'
  12. import type { FilterState } from './filter-management'
  13. import { useTabSearchParams } from '@/hooks/use-tab-searchparams'
  14. import { noop } from 'lodash-es'
  15. import { PLUGIN_PAGE_TABS_MAP, usePluginPageTabs } from '../hooks'
  16. import { useGlobalPublicStore } from '@/context/global-public-context'
  17. export type PluginPageContextValue = {
  18. containerRef: React.RefObject<HTMLDivElement>
  19. currentPluginID: string | undefined
  20. setCurrentPluginID: (pluginID?: string) => void
  21. filters: FilterState
  22. setFilters: (filter: FilterState) => void
  23. activeTab: string
  24. setActiveTab: (tab: string) => void
  25. options: Array<{ value: string, text: string }>
  26. }
  27. export const PluginPageContext = createContext<PluginPageContextValue>({
  28. containerRef: { current: null },
  29. currentPluginID: undefined,
  30. setCurrentPluginID: noop,
  31. filters: {
  32. categories: [],
  33. tags: [],
  34. searchQuery: '',
  35. },
  36. setFilters: noop,
  37. activeTab: '',
  38. setActiveTab: noop,
  39. options: [],
  40. })
  41. type PluginPageContextProviderProps = {
  42. children: ReactNode
  43. }
  44. export function usePluginPageContext(selector: (value: PluginPageContextValue) => any) {
  45. return useContextSelector(PluginPageContext, selector)
  46. }
  47. export const PluginPageContextProvider = ({
  48. children,
  49. }: PluginPageContextProviderProps) => {
  50. const containerRef = useRef<HTMLDivElement>(null)
  51. const [filters, setFilters] = useState<FilterState>({
  52. categories: [],
  53. tags: [],
  54. searchQuery: '',
  55. })
  56. const [currentPluginID, setCurrentPluginID] = useState<string | undefined>()
  57. const { enable_marketplace } = useGlobalPublicStore(s => s.systemFeatures)
  58. const tabs = usePluginPageTabs()
  59. const options = useMemo(() => {
  60. return enable_marketplace ? tabs : tabs.filter(tab => tab.value !== PLUGIN_PAGE_TABS_MAP.marketplace)
  61. }, [tabs, enable_marketplace])
  62. const [activeTab, setActiveTab] = useTabSearchParams({
  63. defaultTab: options[0].value,
  64. })
  65. return (
  66. <PluginPageContext.Provider
  67. value={{
  68. containerRef,
  69. currentPluginID,
  70. setCurrentPluginID,
  71. filters,
  72. setFilters,
  73. activeTab,
  74. setActiveTab,
  75. options,
  76. }}
  77. >
  78. {children}
  79. </PluginPageContext.Provider>
  80. )
  81. }