dify/web/app/components/plugins/marketplace/hooks.ts

146 lines
4.0 KiB
TypeScript
Raw Normal View History

2024-10-31 18:31:17 +08:00
import {
useCallback,
2024-12-03 18:02:57 +08:00
useEffect,
2024-10-31 18:31:17 +08:00
useState,
} from 'react'
2024-11-06 11:55:19 +08:00
import { useTranslation } from 'react-i18next'
2024-10-31 18:31:17 +08:00
import { useDebounceFn } from 'ahooks'
2024-11-08 18:21:39 +08:00
import type {
Plugin,
} from '../types'
2024-10-31 18:31:17 +08:00
import type {
CollectionsAndPluginsSearchParams,
MarketplaceCollection,
PluginsSearchParams,
} from './types'
import {
2024-12-03 14:34:23 +08:00
getFormattedPlugin,
2024-10-31 18:31:17 +08:00
getMarketplaceCollectionsAndPlugins,
} from './utils'
2024-11-06 14:37:20 +08:00
import i18n from '@/i18n/i18next-config'
2024-11-27 16:14:15 +08:00
import {
useMutationPluginsFromMarketplace,
} from '@/service/use-plugins'
2024-10-31 18:31:17 +08:00
export const useMarketplaceCollectionsAndPlugins = () => {
const [isLoading, setIsLoading] = useState(false)
2024-12-03 18:02:57 +08:00
const [isSuccess, setIsSuccess] = useState(false)
2024-10-31 18:31:17 +08:00
const [marketplaceCollections, setMarketplaceCollections] = useState<MarketplaceCollection[]>()
const [marketplaceCollectionPluginsMap, setMarketplaceCollectionPluginsMap] = useState<Record<string, Plugin[]>>()
const queryMarketplaceCollectionsAndPlugins = useCallback(async (query?: CollectionsAndPluginsSearchParams) => {
2024-12-03 18:02:57 +08:00
try {
setIsLoading(true)
setIsSuccess(false)
const { marketplaceCollections, marketplaceCollectionPluginsMap } = await getMarketplaceCollectionsAndPlugins(query)
setIsLoading(false)
setIsSuccess(true)
setMarketplaceCollections(marketplaceCollections)
setMarketplaceCollectionPluginsMap(marketplaceCollectionPluginsMap)
}
// eslint-disable-next-line unused-imports/no-unused-vars
catch (e) {
setIsLoading(false)
setIsSuccess(false)
}
2024-10-31 18:31:17 +08:00
}, [])
return {
marketplaceCollections,
setMarketplaceCollections,
marketplaceCollectionPluginsMap,
setMarketplaceCollectionPluginsMap,
queryMarketplaceCollectionsAndPlugins,
isLoading,
2024-12-03 18:02:57 +08:00
isSuccess,
2024-10-31 18:31:17 +08:00
}
}
export const useMarketplacePlugins = () => {
2024-11-08 18:21:39 +08:00
const {
data,
2024-12-05 14:54:04 +08:00
mutateAsync,
2024-11-08 18:21:39 +08:00
reset,
isPending,
} = useMutationPluginsFromMarketplace()
2024-10-31 18:31:17 +08:00
2024-12-05 14:54:04 +08:00
const [prevPlugins, setPrevPlugins] = useState<Plugin[] | undefined>()
const resetPlugins = useCallback(() => {
reset()
setPrevPlugins(undefined)
}, [reset])
const handleUpdatePlugins = useCallback((pluginsSearchParams: PluginsSearchParams) => {
mutateAsync(pluginsSearchParams).then((res) => {
const currentPage = pluginsSearchParams.page || 1
const resPlugins = res.data.plugins
if (currentPage > 1) {
setPrevPlugins(prevPlugins => [...(prevPlugins || []), ...resPlugins.map((plugin) => {
return getFormattedPlugin(plugin)
})])
}
else {
setPrevPlugins(resPlugins.map((plugin) => {
return getFormattedPlugin(plugin)
}))
}
})
}, [mutateAsync])
2024-11-08 18:21:39 +08:00
const queryPlugins = useCallback((pluginsSearchParams: PluginsSearchParams) => {
2024-12-05 14:54:04 +08:00
handleUpdatePlugins(pluginsSearchParams)
}, [handleUpdatePlugins])
2024-10-31 18:31:17 +08:00
2024-11-27 16:14:15 +08:00
const { run: queryPluginsWithDebounced } = useDebounceFn((pluginsSearchParams: PluginsSearchParams) => {
2024-12-05 14:54:04 +08:00
handleUpdatePlugins(pluginsSearchParams)
2024-11-08 18:21:39 +08:00
}, {
2024-10-31 18:31:17 +08:00
wait: 500,
})
return {
2024-12-05 14:54:04 +08:00
plugins: prevPlugins,
2024-12-03 18:02:57 +08:00
total: data?.data?.total,
2024-12-05 14:54:04 +08:00
resetPlugins,
2024-10-31 18:31:17 +08:00
queryPlugins,
queryPluginsWithDebounced,
2024-11-08 18:21:39 +08:00
isLoading: isPending,
2024-10-31 18:31:17 +08:00
}
}
2024-11-06 11:55:19 +08:00
export const useMixedTranslation = (localeFromOuter?: string) => {
let t = useTranslation().t
if (localeFromOuter)
t = i18n.getFixedT(localeFromOuter)
return {
t,
}
}
2024-12-03 18:02:57 +08:00
2024-12-05 14:54:04 +08:00
export const useMarketplaceContainerScroll = (
callback: () => void,
scrollContainerId = 'marketplace-container',
) => {
const container = document.getElementById(scrollContainerId)
2024-12-03 18:02:57 +08:00
const handleScroll = useCallback((e: Event) => {
const target = e.target as HTMLDivElement
const {
scrollTop,
scrollHeight,
clientHeight,
} = target
if (scrollTop + clientHeight >= scrollHeight - 5 && scrollTop > 0)
callback()
}, [callback])
useEffect(() => {
if (container)
container.addEventListener('scroll', handleScroll)
return () => {
if (container)
container.removeEventListener('scroll', handleScroll)
}
}, [container, handleScroll])
}