marketplace usemutation

pull/12372/head
StyleZhang 1 year ago
parent d4f7ebfd2e
commit 33349191e9

@ -15,20 +15,20 @@ const Layout = ({ children }: { children: ReactNode }) => {
<> <>
<GA gaType={GaType.admin} /> <GA gaType={GaType.admin} />
<SwrInitor> <SwrInitor>
<AppContextProvider> <TanstackQueryIniter>
<EventEmitterContextProvider> <AppContextProvider>
<ProviderContextProvider> <EventEmitterContextProvider>
<ModalContextProvider> <ProviderContextProvider>
<HeaderWrapper> <ModalContextProvider>
<Header /> <HeaderWrapper>
</HeaderWrapper> <Header />
<TanstackQueryIniter> </HeaderWrapper>
{children} {children}
</TanstackQueryIniter> </ModalContextProvider>
</ModalContextProvider> </ProviderContextProvider>
</ProviderContextProvider> </EventEmitterContextProvider>
</EventEmitterContextProvider> </AppContextProvider>
</AppContextProvider> </TanstackQueryIniter>
</SwrInitor> </SwrInitor>
</> </>
) )

@ -34,7 +34,7 @@ export type MarketplaceContextValue = {
activePluginType: string activePluginType: string
handleActivePluginTypeChange: (type: string) => void handleActivePluginTypeChange: (type: string) => void
plugins?: Plugin[] plugins?: Plugin[]
setPlugins: (plugins: Plugin[]) => void resetPlugins: () => void
sort: PluginsSort sort: PluginsSort
handleSortChange: (sort: PluginsSort) => void handleSortChange: (sort: PluginsSort) => void
marketplaceCollectionsFromClient?: MarketplaceCollection[] marketplaceCollectionsFromClient?: MarketplaceCollection[]
@ -53,7 +53,7 @@ export const MarketplaceContext = createContext<MarketplaceContextValue>({
activePluginType: PLUGIN_TYPE_SEARCH_MAP.all, activePluginType: PLUGIN_TYPE_SEARCH_MAP.all,
handleActivePluginTypeChange: () => {}, handleActivePluginTypeChange: () => {},
plugins: undefined, plugins: undefined,
setPlugins: () => {}, resetPlugins: () => {},
sort: DEFAULT_SORT, sort: DEFAULT_SORT,
handleSortChange: () => {}, handleSortChange: () => {},
marketplaceCollectionsFromClient: [], marketplaceCollectionsFromClient: [],
@ -91,7 +91,7 @@ export const MarketplaceContextProvider = ({
} = useMarketplaceCollectionsAndPlugins() } = useMarketplaceCollectionsAndPlugins()
const { const {
plugins, plugins,
setPlugins, resetPlugins,
queryPlugins, queryPlugins,
queryPluginsWithDebounced, queryPluginsWithDebounced,
} = useMarketplacePlugins() } = useMarketplacePlugins()
@ -104,7 +104,7 @@ export const MarketplaceContextProvider = ({
queryMarketplaceCollectionsAndPlugins({ queryMarketplaceCollectionsAndPlugins({
category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current, category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
}) })
setPlugins(undefined) resetPlugins()
return return
} }
@ -116,7 +116,7 @@ export const MarketplaceContextProvider = ({
sortBy: sortRef.current.sortBy, sortBy: sortRef.current.sortBy,
sortOrder: sortRef.current.sortOrder, sortOrder: sortRef.current.sortOrder,
}) })
}, [queryPluginsWithDebounced, queryMarketplaceCollectionsAndPlugins, setPlugins]) }, [queryPluginsWithDebounced, queryMarketplaceCollectionsAndPlugins, resetPlugins])
const handleFilterPluginTagsChange = useCallback((tags: string[]) => { const handleFilterPluginTagsChange = useCallback((tags: string[]) => {
setFilterPluginTags(tags) setFilterPluginTags(tags)
@ -126,7 +126,7 @@ export const MarketplaceContextProvider = ({
queryMarketplaceCollectionsAndPlugins({ queryMarketplaceCollectionsAndPlugins({
category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current, category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
}) })
setPlugins(undefined) resetPlugins()
return return
} }
@ -138,7 +138,7 @@ export const MarketplaceContextProvider = ({
sortBy: sortRef.current.sortBy, sortBy: sortRef.current.sortBy,
sortOrder: sortRef.current.sortOrder, sortOrder: sortRef.current.sortOrder,
}) })
}, [queryPlugins, setPlugins, queryMarketplaceCollectionsAndPlugins]) }, [queryPlugins, resetPlugins, queryMarketplaceCollectionsAndPlugins])
const handleActivePluginTypeChange = useCallback((type: string) => { const handleActivePluginTypeChange = useCallback((type: string) => {
setActivePluginType(type) setActivePluginType(type)
@ -148,7 +148,7 @@ export const MarketplaceContextProvider = ({
queryMarketplaceCollectionsAndPlugins({ queryMarketplaceCollectionsAndPlugins({
category: type === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : type, category: type === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : type,
}) })
setPlugins(undefined) resetPlugins()
return return
} }
@ -160,7 +160,7 @@ export const MarketplaceContextProvider = ({
sortBy: sortRef.current.sortBy, sortBy: sortRef.current.sortBy,
sortOrder: sortRef.current.sortOrder, sortOrder: sortRef.current.sortOrder,
}) })
}, [queryPlugins, setPlugins, queryMarketplaceCollectionsAndPlugins]) }, [queryPlugins, resetPlugins, queryMarketplaceCollectionsAndPlugins])
const handleSortChange = useCallback((sort: PluginsSort) => { const handleSortChange = useCallback((sort: PluginsSort) => {
setSort(sort) setSort(sort)
@ -187,7 +187,7 @@ export const MarketplaceContextProvider = ({
activePluginType, activePluginType,
handleActivePluginTypeChange, handleActivePluginTypeChange,
plugins, plugins,
setPlugins, resetPlugins,
sort, sort,
handleSortChange, handleSortChange,
marketplaceCollectionsFromClient, marketplaceCollectionsFromClient,

@ -4,7 +4,9 @@ import {
} from 'react' } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useDebounceFn } from 'ahooks' import { useDebounceFn } from 'ahooks'
import type { Plugin } from '../types' import type {
Plugin,
} from '../types'
import type { import type {
CollectionsAndPluginsSearchParams, CollectionsAndPluginsSearchParams,
MarketplaceCollection, MarketplaceCollection,
@ -12,9 +14,9 @@ import type {
} from './types' } from './types'
import { import {
getMarketplaceCollectionsAndPlugins, getMarketplaceCollectionsAndPlugins,
getMarketplacePlugins,
} from './utils' } from './utils'
import i18n from '@/i18n/i18next-config' import i18n from '@/i18n/i18next-config'
import { useMutationPluginsFromMarketplace } from '@/service/use-plugins'
export const useMarketplaceCollectionsAndPlugins = () => { export const useMarketplaceCollectionsAndPlugins = () => {
const [isLoading, setIsLoading] = useState(false) const [isLoading, setIsLoading] = useState(false)
@ -41,28 +43,29 @@ export const useMarketplaceCollectionsAndPlugins = () => {
} }
export const useMarketplacePlugins = () => { export const useMarketplacePlugins = () => {
const [isLoading, setIsLoading] = useState(false) const {
const [plugins, setPlugins] = useState<Plugin[]>() data,
mutate,
reset,
isPending,
} = useMutationPluginsFromMarketplace()
const queryPlugins = useCallback(async (query: PluginsSearchParams) => { const queryPlugins = useCallback((pluginsSearchParams: PluginsSearchParams) => {
setIsLoading(true) mutate(pluginsSearchParams)
const { marketplacePlugins } = await getMarketplacePlugins(query) }, [mutate])
setIsLoading(false)
setPlugins(marketplacePlugins) const { run: queryPluginsWithDebounced } = useDebounceFn((pluginsSearchParams) => {
}, []) mutate(pluginsSearchParams)
}, {
const { run: queryPluginsWithDebounced } = useDebounceFn(queryPlugins, {
wait: 500, wait: 500,
}) })
return { return {
plugins, plugins: data?.data?.plugins,
setPlugins, resetPlugins: reset,
queryPlugins, queryPlugins,
queryPluginsWithDebounced, queryPluginsWithDebounced,
isLoading, isLoading: isPending,
setIsLoading,
} }
} }

@ -5,6 +5,7 @@ import SearchBoxWrapper from './search-box/search-box-wrapper'
import PluginTypeSwitch from './plugin-type-switch' import PluginTypeSwitch from './plugin-type-switch'
import ListWrapper from './list/list-wrapper' import ListWrapper from './list/list-wrapper'
import { getMarketplaceCollectionsAndPlugins } from './utils' import { getMarketplaceCollectionsAndPlugins } from './utils'
import { TanstackQueryIniter } from '@/context/query-client'
type MarketplaceProps = { type MarketplaceProps = {
locale?: string locale?: string
@ -17,18 +18,20 @@ const Marketplace = async ({
const { marketplaceCollections, marketplaceCollectionPluginsMap } = await getMarketplaceCollectionsAndPlugins() const { marketplaceCollections, marketplaceCollectionPluginsMap } = await getMarketplaceCollectionsAndPlugins()
return ( return (
<MarketplaceContextProvider> <TanstackQueryIniter>
<Description locale={locale} /> <MarketplaceContextProvider>
<IntersectionLine /> <Description locale={locale} />
<SearchBoxWrapper locale={locale} /> <IntersectionLine />
<PluginTypeSwitch locale={locale} /> <SearchBoxWrapper locale={locale} />
<ListWrapper <PluginTypeSwitch locale={locale} />
locale={locale} <ListWrapper
marketplaceCollections={marketplaceCollections} locale={locale}
marketplaceCollectionPluginsMap={marketplaceCollectionPluginsMap} marketplaceCollections={marketplaceCollections}
showInstallButton={showInstallButton} marketplaceCollectionPluginsMap={marketplaceCollectionPluginsMap}
/> showInstallButton={showInstallButton}
</MarketplaceContextProvider> />
</MarketplaceContextProvider>
</TanstackQueryIniter>
) )
} }

@ -301,3 +301,7 @@ export type InstalledPluginListResponse = {
export type UninstallPluginResponse = { export type UninstallPluginResponse = {
success: boolean success: boolean
} }
export type PluginsFromMarketplaceResponse = {
plugins: Plugin[]
}

@ -15,7 +15,7 @@ export const useMarketplace = (searchPluginText: string, filterPluginTags: strin
} = useMarketplaceCollectionsAndPlugins() } = useMarketplaceCollectionsAndPlugins()
const { const {
plugins, plugins,
setPlugins, resetPlugins,
queryPlugins, queryPlugins,
queryPluginsWithDebounced, queryPluginsWithDebounced,
isLoading: isPluginsLoading, isLoading: isPluginsLoading,
@ -37,9 +37,9 @@ export const useMarketplace = (searchPluginText: string, filterPluginTags: strin
} }
else { else {
queryMarketplaceCollectionsAndPlugins() queryMarketplaceCollectionsAndPlugins()
setPlugins(undefined) resetPlugins()
} }
}, [searchPluginText, filterPluginTags, queryPlugins, queryMarketplaceCollectionsAndPlugins, queryPluginsWithDebounced, setPlugins]) }, [searchPluginText, filterPluginTags, queryPlugins, queryMarketplaceCollectionsAndPlugins, queryPluginsWithDebounced, resetPlugins])
return { return {
isLoading: isLoading || isPluginsLoading, isLoading: isLoading || isPluginsLoading,

@ -460,6 +460,11 @@ export const post = <T>(url: string, options = {}, otherOptions?: IOtherOptions)
return request<T>(url, Object.assign({}, options, { method: 'POST' }), otherOptions) return request<T>(url, Object.assign({}, options, { method: 'POST' }), otherOptions)
} }
// For Marketplace API
export const postMarketplace = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
return post<T>(url, options, { ...otherOptions, isMarketplaceAPI: true })
}
export const postPublic = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => { export const postPublic = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
return post<T>(url, options, { ...otherOptions, isPublicAPI: true }) return post<T>(url, options, { ...otherOptions, isPublicAPI: true })
} }

@ -1,12 +1,17 @@
import type { DebugInfo as DebugInfoTypes, InstalledPluginListResponse, Permissions } from '@/app/components/plugins/types' import type {
import { get, post } from './base' DebugInfo as DebugInfoTypes,
InstalledPluginListResponse,
Permissions,
PluginsFromMarketplaceResponse,
} from '@/app/components/plugins/types'
import type {
PluginsSearchParams,
} from '@/app/components/plugins/marketplace/types'
import { get, post, postMarketplace } from './base'
import { import {
useMutation, useMutation,
useQueryClient,
} from '@tanstack/react-query'
import {
useQuery, useQuery,
useQueryClient,
} from '@tanstack/react-query' } from '@tanstack/react-query'
const NAME_SPACE = 'plugins' const NAME_SPACE = 'plugins'
@ -66,3 +71,28 @@ export const useMutationPermissions = ({
onSuccess, onSuccess,
}) })
} }
export const useMutationPluginsFromMarketplace = () => {
return useMutation({
mutationFn: (pluginsSearchParams: PluginsSearchParams) => {
const {
query,
sortBy,
sortOrder,
category,
tags,
} = pluginsSearchParams
return postMarketplace<{ data: PluginsFromMarketplaceResponse }>('/plugins/search/basic', {
body: {
page: 1,
page_size: 10,
query,
sort_by: sortBy,
sort_order: sortOrder,
category: category !== 'all' ? category : '',
tags,
},
})
},
})
}

Loading…
Cancel
Save