mirror of
https://github.com/langgenius/dify.git
synced 2026-04-29 04:26:30 +08:00
marketplace usemutation
This commit is contained in:
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…
Reference in New Issue
Block a user