|
|
|
@ -12,20 +12,17 @@ import {
|
|
|
|
createContext,
|
|
|
|
createContext,
|
|
|
|
useContextSelector,
|
|
|
|
useContextSelector,
|
|
|
|
} from 'use-context-selector'
|
|
|
|
} from 'use-context-selector'
|
|
|
|
import { useDebounceFn } from 'ahooks'
|
|
|
|
|
|
|
|
import { PLUGIN_TYPE_SEARCH_MAP } from './plugin-type-switch'
|
|
|
|
import { PLUGIN_TYPE_SEARCH_MAP } from './plugin-type-switch'
|
|
|
|
import type { Plugin } from '../types'
|
|
|
|
import type { Plugin } from '../types'
|
|
|
|
import type {
|
|
|
|
import type {
|
|
|
|
CollectionsAndPluginsSearchParams,
|
|
|
|
|
|
|
|
MarketplaceCollection,
|
|
|
|
MarketplaceCollection,
|
|
|
|
PluginsSearchParams,
|
|
|
|
|
|
|
|
PluginsSort,
|
|
|
|
PluginsSort,
|
|
|
|
} from './types'
|
|
|
|
} from './types'
|
|
|
|
import {
|
|
|
|
|
|
|
|
getMarketplaceCollectionsAndPlugins,
|
|
|
|
|
|
|
|
getMarketplacePlugins,
|
|
|
|
|
|
|
|
} from './utils'
|
|
|
|
|
|
|
|
import { DEFAULT_SORT } from './constants'
|
|
|
|
import { DEFAULT_SORT } from './constants'
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
|
|
|
useMarketplaceCollectionsAndPlugins,
|
|
|
|
|
|
|
|
useMarketplacePlugins,
|
|
|
|
|
|
|
|
} from './hooks'
|
|
|
|
|
|
|
|
|
|
|
|
export type MarketplaceContextValue = {
|
|
|
|
export type MarketplaceContextValue = {
|
|
|
|
intersected: boolean
|
|
|
|
intersected: boolean
|
|
|
|
@ -83,94 +80,82 @@ export const MarketplaceContextProvider = ({
|
|
|
|
const filterPluginTagsRef = useRef(filterPluginTags)
|
|
|
|
const filterPluginTagsRef = useRef(filterPluginTags)
|
|
|
|
const [activePluginType, setActivePluginType] = useState(PLUGIN_TYPE_SEARCH_MAP.all)
|
|
|
|
const [activePluginType, setActivePluginType] = useState(PLUGIN_TYPE_SEARCH_MAP.all)
|
|
|
|
const activePluginTypeRef = useRef(activePluginType)
|
|
|
|
const activePluginTypeRef = useRef(activePluginType)
|
|
|
|
const [plugins, setPlugins] = useState<Plugin[]>()
|
|
|
|
|
|
|
|
const [sort, setSort] = useState(DEFAULT_SORT)
|
|
|
|
const [sort, setSort] = useState(DEFAULT_SORT)
|
|
|
|
const sortRef = useRef(sort)
|
|
|
|
const sortRef = useRef(sort)
|
|
|
|
const [marketplaceCollectionsFromClient, setMarketplaceCollectionsFromClient] = useState<MarketplaceCollection[] | undefined>(undefined)
|
|
|
|
const {
|
|
|
|
const [marketplaceCollectionPluginsMapFromClient, setMarketplaceCollectionPluginsMapFromClient] = useState<Record<string, Plugin[]> | undefined>(undefined)
|
|
|
|
marketplaceCollections: marketplaceCollectionsFromClient,
|
|
|
|
|
|
|
|
setMarketplaceCollections: setMarketplaceCollectionsFromClient,
|
|
|
|
const handleUpdatePlugins = useCallback(async (query: PluginsSearchParams) => {
|
|
|
|
marketplaceCollectionPluginsMap: marketplaceCollectionPluginsMapFromClient,
|
|
|
|
const { marketplacePlugins } = await getMarketplacePlugins(query)
|
|
|
|
setMarketplaceCollectionPluginsMap: setMarketplaceCollectionPluginsMapFromClient,
|
|
|
|
|
|
|
|
queryMarketplaceCollectionsAndPlugins,
|
|
|
|
setPlugins(marketplacePlugins)
|
|
|
|
} = useMarketplaceCollectionsAndPlugins()
|
|
|
|
setMarketplaceCollectionsFromClient(undefined)
|
|
|
|
const {
|
|
|
|
setMarketplaceCollectionPluginsMapFromClient(undefined)
|
|
|
|
plugins,
|
|
|
|
}, [])
|
|
|
|
setPlugins,
|
|
|
|
|
|
|
|
queryPlugins,
|
|
|
|
const handleUpdateMarketplaceCollectionsAndPlugins = useCallback(async (query?: CollectionsAndPluginsSearchParams) => {
|
|
|
|
queryPluginsWithDebounced,
|
|
|
|
const {
|
|
|
|
} = useMarketplacePlugins()
|
|
|
|
marketplaceCollections,
|
|
|
|
|
|
|
|
marketplaceCollectionPluginsMap,
|
|
|
|
|
|
|
|
} = await getMarketplaceCollectionsAndPlugins(query)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setMarketplaceCollectionsFromClient(marketplaceCollections)
|
|
|
|
|
|
|
|
setMarketplaceCollectionPluginsMapFromClient(marketplaceCollectionPluginsMap)
|
|
|
|
|
|
|
|
setPlugins(undefined)
|
|
|
|
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const { run: handleUpdatePluginsWithDebounced } = useDebounceFn(handleUpdatePlugins, {
|
|
|
|
|
|
|
|
wait: 500,
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const handleSearchPluginTextChange = useCallback((text: string) => {
|
|
|
|
const handleSearchPluginTextChange = useCallback((text: string) => {
|
|
|
|
setSearchPluginText(text)
|
|
|
|
setSearchPluginText(text)
|
|
|
|
searchPluginTextRef.current = text
|
|
|
|
searchPluginTextRef.current = text
|
|
|
|
|
|
|
|
|
|
|
|
handleUpdatePluginsWithDebounced({
|
|
|
|
queryPluginsWithDebounced({
|
|
|
|
query: text,
|
|
|
|
query: text,
|
|
|
|
category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
|
|
|
|
category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
|
|
|
|
tags: filterPluginTagsRef.current,
|
|
|
|
tags: filterPluginTagsRef.current,
|
|
|
|
sortBy: sortRef.current.sortBy,
|
|
|
|
sortBy: sortRef.current.sortBy,
|
|
|
|
sortOrder: sortRef.current.sortOrder,
|
|
|
|
sortOrder: sortRef.current.sortOrder,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}, [handleUpdatePluginsWithDebounced])
|
|
|
|
}, [queryPluginsWithDebounced])
|
|
|
|
|
|
|
|
|
|
|
|
const handleFilterPluginTagsChange = useCallback((tags: string[]) => {
|
|
|
|
const handleFilterPluginTagsChange = useCallback((tags: string[]) => {
|
|
|
|
setFilterPluginTags(tags)
|
|
|
|
setFilterPluginTags(tags)
|
|
|
|
filterPluginTagsRef.current = tags
|
|
|
|
filterPluginTagsRef.current = tags
|
|
|
|
|
|
|
|
|
|
|
|
handleUpdatePlugins({
|
|
|
|
queryPlugins({
|
|
|
|
query: searchPluginTextRef.current,
|
|
|
|
query: searchPluginTextRef.current,
|
|
|
|
category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
|
|
|
|
category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
|
|
|
|
tags,
|
|
|
|
tags,
|
|
|
|
sortBy: sortRef.current.sortBy,
|
|
|
|
sortBy: sortRef.current.sortBy,
|
|
|
|
sortOrder: sortRef.current.sortOrder,
|
|
|
|
sortOrder: sortRef.current.sortOrder,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}, [handleUpdatePlugins])
|
|
|
|
}, [queryPlugins])
|
|
|
|
|
|
|
|
|
|
|
|
const handleActivePluginTypeChange = useCallback((type: string) => {
|
|
|
|
const handleActivePluginTypeChange = useCallback((type: string) => {
|
|
|
|
setActivePluginType(type)
|
|
|
|
setActivePluginType(type)
|
|
|
|
activePluginTypeRef.current = type
|
|
|
|
activePluginTypeRef.current = type
|
|
|
|
|
|
|
|
|
|
|
|
if (!searchPluginTextRef.current && !filterPluginTagsRef.current.length) {
|
|
|
|
if (!searchPluginTextRef.current && !filterPluginTagsRef.current.length) {
|
|
|
|
handleUpdateMarketplaceCollectionsAndPlugins({
|
|
|
|
queryMarketplaceCollectionsAndPlugins({
|
|
|
|
category: type === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : type,
|
|
|
|
category: type === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : type,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
setPlugins(undefined)
|
|
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
handleUpdatePlugins({
|
|
|
|
queryPlugins({
|
|
|
|
query: searchPluginTextRef.current,
|
|
|
|
query: searchPluginTextRef.current,
|
|
|
|
category: type === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : type,
|
|
|
|
category: type === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : type,
|
|
|
|
tags: filterPluginTagsRef.current,
|
|
|
|
tags: filterPluginTagsRef.current,
|
|
|
|
sortBy: sortRef.current.sortBy,
|
|
|
|
sortBy: sortRef.current.sortBy,
|
|
|
|
sortOrder: sortRef.current.sortOrder,
|
|
|
|
sortOrder: sortRef.current.sortOrder,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}, [handleUpdatePlugins, handleUpdateMarketplaceCollectionsAndPlugins])
|
|
|
|
}, [queryPlugins, setPlugins, queryMarketplaceCollectionsAndPlugins])
|
|
|
|
|
|
|
|
|
|
|
|
const handleSortChange = useCallback((sort: PluginsSort) => {
|
|
|
|
const handleSortChange = useCallback((sort: PluginsSort) => {
|
|
|
|
setSort(sort)
|
|
|
|
setSort(sort)
|
|
|
|
sortRef.current = sort
|
|
|
|
sortRef.current = sort
|
|
|
|
|
|
|
|
|
|
|
|
handleUpdatePlugins({
|
|
|
|
queryPlugins({
|
|
|
|
query: searchPluginTextRef.current,
|
|
|
|
query: searchPluginTextRef.current,
|
|
|
|
category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
|
|
|
|
category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
|
|
|
|
tags: filterPluginTagsRef.current,
|
|
|
|
tags: filterPluginTagsRef.current,
|
|
|
|
sortBy: sortRef.current.sortBy,
|
|
|
|
sortBy: sortRef.current.sortBy,
|
|
|
|
sortOrder: sortRef.current.sortOrder,
|
|
|
|
sortOrder: sortRef.current.sortOrder,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}, [handleUpdatePlugins])
|
|
|
|
}, [queryPlugins])
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
return (
|
|
|
|
<MarketplaceContext.Provider
|
|
|
|
<MarketplaceContext.Provider
|
|
|
|
|