feat: marketplace list

This commit is contained in:
StyleZhang 2024-10-30 15:27:38 +08:00
parent e7fb92e169
commit fd0a830816

View File

@ -1,8 +1,11 @@
'use client' 'use client'
import type { ReactNode } from 'react' import type {
ReactNode,
} from 'react'
import { import {
useCallback, useCallback,
useRef,
useState, useState,
} from 'react' } from 'react'
import { import {
@ -75,10 +78,14 @@ export const MarketplaceContextProvider = ({
}: MarketplaceContextProviderProps) => { }: MarketplaceContextProviderProps) => {
const [intersected, setIntersected] = useState(true) const [intersected, setIntersected] = useState(true)
const [searchPluginText, setSearchPluginText] = useState('') const [searchPluginText, setSearchPluginText] = useState('')
const searchPluginTextRef = useRef(searchPluginText)
const [filterPluginTags, setFilterPluginTags] = useState<string[]>([]) const [filterPluginTags, setFilterPluginTags] = useState<string[]>([])
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 [plugins, setPlugins] = useState<Plugin[]>() const [plugins, setPlugins] = useState<Plugin[]>()
const [sort, setSort] = useState(DEFAULT_SORT) const [sort, setSort] = useState(DEFAULT_SORT)
const sortRef = useRef(sort)
const [marketplaceCollectionsFromClient, setMarketplaceCollectionsFromClient] = useState<MarketplaceCollection[] | undefined>(undefined) const [marketplaceCollectionsFromClient, setMarketplaceCollectionsFromClient] = useState<MarketplaceCollection[] | undefined>(undefined)
const [marketplaceCollectionPluginsMapFromClient, setMarketplaceCollectionPluginsMapFromClient] = useState<Record<string, Plugin[]> | undefined>(undefined) const [marketplaceCollectionPluginsMapFromClient, setMarketplaceCollectionPluginsMapFromClient] = useState<Record<string, Plugin[]> | undefined>(undefined)
@ -107,32 +114,35 @@ export const MarketplaceContextProvider = ({
const handleSearchPluginTextChange = useCallback((text: string) => { const handleSearchPluginTextChange = useCallback((text: string) => {
setSearchPluginText(text) setSearchPluginText(text)
searchPluginTextRef.current = text
handleUpdatePluginsWithDebounced({ handleUpdatePluginsWithDebounced({
query: text, query: text,
category: activePluginType === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginType, category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
tags: filterPluginTags, tags: filterPluginTagsRef.current,
sortBy: sort.sortBy, sortBy: sortRef.current.sortBy,
sortOrder: sort.sortOrder, sortOrder: sortRef.current.sortOrder,
}) })
}, [handleUpdatePluginsWithDebounced, activePluginType, filterPluginTags, sort]) }, [handleUpdatePluginsWithDebounced])
const handleFilterPluginTagsChange = useCallback((tags: string[]) => { const handleFilterPluginTagsChange = useCallback((tags: string[]) => {
setFilterPluginTags(tags) setFilterPluginTags(tags)
filterPluginTagsRef.current = tags
handleUpdatePlugins({ handleUpdatePlugins({
query: searchPluginText, query: searchPluginTextRef.current,
category: activePluginType === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginType, category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
tags, tags,
sortBy: sort.sortBy, sortBy: sortRef.current.sortBy,
sortOrder: sort.sortOrder, sortOrder: sortRef.current.sortOrder,
}) })
}, [handleUpdatePlugins, searchPluginText, activePluginType, sort]) }, [handleUpdatePlugins])
const handleActivePluginTypeChange = useCallback((type: string) => { const handleActivePluginTypeChange = useCallback((type: string) => {
setActivePluginType(type) setActivePluginType(type)
activePluginTypeRef.current = type
if (!searchPluginText && !filterPluginTags.length) { if (!searchPluginTextRef.current && !filterPluginTagsRef.current.length) {
handleUpdateMarketplaceCollectionsAndPlugins({ handleUpdateMarketplaceCollectionsAndPlugins({
category: type === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : type, category: type === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : type,
}) })
@ -141,25 +151,26 @@ export const MarketplaceContextProvider = ({
} }
handleUpdatePlugins({ handleUpdatePlugins({
query: searchPluginText, query: searchPluginTextRef.current,
category: type === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : type, category: type === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : type,
tags: filterPluginTags, tags: filterPluginTagsRef.current,
sortBy: sort.sortBy, sortBy: sortRef.current.sortBy,
sortOrder: sort.sortOrder, sortOrder: sortRef.current.sortOrder,
}) })
}, [handleUpdatePlugins, searchPluginText, filterPluginTags, sort, handleUpdateMarketplaceCollectionsAndPlugins]) }, [handleUpdatePlugins, handleUpdateMarketplaceCollectionsAndPlugins])
const handleSortChange = useCallback((sort: PluginsSort) => { const handleSortChange = useCallback((sort: PluginsSort) => {
setSort(sort) setSort(sort)
sortRef.current = sort
handleUpdatePlugins({ handleUpdatePlugins({
query: searchPluginText, query: searchPluginTextRef.current,
category: activePluginType === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginType, category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
tags: filterPluginTags, tags: filterPluginTagsRef.current,
sortBy: sort.sortBy, sortBy: sortRef.current.sortBy,
sortOrder: sort.sortOrder, sortOrder: sortRef.current.sortOrder,
}) })
}, [handleUpdatePlugins, searchPluginText, activePluginType, filterPluginTags]) }, [handleUpdatePlugins])
return ( return (
<MarketplaceContext.Provider <MarketplaceContext.Provider