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.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 { useSelector as useAppContextSelector } from '@/context/app-context'
  13. import type { FilterState } from './filter-management'
  14. import { useTranslation } from 'react-i18next'
  15. import { useTabSearchParams } from '@/hooks/use-tab-searchparams'
  16. import { noop } from 'lodash-es'
  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 { t } = useTranslation()
  51. const containerRef = useRef<HTMLDivElement>(null)
  52. const [filters, setFilters] = useState<FilterState>({
  53. categories: [],
  54. tags: [],
  55. searchQuery: '',
  56. })
  57. const [currentPluginID, setCurrentPluginID] = useState<string | undefined>()
  58. const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures)
  59. const options = useMemo(() => {
  60. return [
  61. { value: 'plugins', text: t('common.menus.plugins') },
  62. ...(
  63. enable_marketplace
  64. ? [{ value: 'discover', text: t('common.menus.exploreMarketplace') }]
  65. : []
  66. ),
  67. ]
  68. }, [t, enable_marketplace])
  69. const [activeTab, setActiveTab] = useTabSearchParams({
  70. defaultTab: options[0].value,
  71. })
  72. return (
  73. <PluginPageContext.Provider
  74. value={{
  75. containerRef,
  76. currentPluginID,
  77. setCurrentPluginID,
  78. filters,
  79. setFilters,
  80. activeTab,
  81. setActiveTab,
  82. options,
  83. }}
  84. >
  85. {children}
  86. </PluginPageContext.Provider>
  87. )
  88. }