feat: add loading state for installed plugin list in context and update PluginsPanel to display loading indicator

pull/12372/head
twwu 2 years ago
parent a7e320dc25
commit 92153328ea

@ -27,6 +27,7 @@ export type PluginPageContextValue = {
setCurrentPluginDetail: (plugin: PluginDetail) => void setCurrentPluginDetail: (plugin: PluginDetail) => void
installedPluginList: PluginDetail[] installedPluginList: PluginDetail[]
mutateInstalledPluginList: () => void mutateInstalledPluginList: () => void
isPluginListLoading: boolean
filters: FilterState filters: FilterState
setFilters: (filter: FilterState) => void setFilters: (filter: FilterState) => void
activeTab: string activeTab: string
@ -45,6 +46,7 @@ export const PluginPageContext = createContext<PluginPageContextValue>({
setCurrentPluginDetail: () => {}, setCurrentPluginDetail: () => {},
installedPluginList: [], installedPluginList: [],
mutateInstalledPluginList: () => {}, mutateInstalledPluginList: () => {},
isPluginListLoading: true,
filters: { filters: {
categories: [], categories: [],
tags: [], tags: [],
@ -78,7 +80,7 @@ export const PluginPageContextProvider = ({
tags: [], tags: [],
searchQuery: '', searchQuery: '',
}) })
const { data, mutate: mutateInstalledPluginList } = useSWR({ url: '/workspaces/current/plugin/list' }, fetchInstalledPluginList) const { data, mutate: mutateInstalledPluginList, isLoading: isPluginListLoading } = useSWR({ url: '/workspaces/current/plugin/list' }, fetchInstalledPluginList)
const [currentPluginDetail, setCurrentPluginDetail] = useState<PluginDetail | undefined>() const [currentPluginDetail, setCurrentPluginDetail] = useState<PluginDetail | undefined>()
const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures) const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures)
@ -106,6 +108,7 @@ export const PluginPageContextProvider = ({
setCurrentPluginDetail, setCurrentPluginDetail,
installedPluginList: data?.plugins || [], installedPluginList: data?.plugins || [],
mutateInstalledPluginList, mutateInstalledPluginList,
isPluginListLoading,
filters, filters,
setFilters, setFilters,
activeTab, activeTab,

@ -8,10 +8,12 @@ import PluginDetailPanel from '@/app/components/plugins/plugin-detail-panel'
import { usePluginPageContext } from './context' import { usePluginPageContext } from './context'
import { useDebounceFn } from 'ahooks' import { useDebounceFn } from 'ahooks'
import Empty from './empty' import Empty from './empty'
import Loading from '../../base/loading'
const PluginsPanel = () => { const PluginsPanel = () => {
const [filters, setFilters] = usePluginPageContext(v => [v.filters, v.setFilters]) as [FilterState, (filter: FilterState) => void] const [filters, setFilters] = usePluginPageContext(v => [v.filters, v.setFilters]) as [FilterState, (filter: FilterState) => void]
const pluginList = usePluginPageContext(v => v.installedPluginList) as PluginDetail[] const pluginList = usePluginPageContext(v => v.installedPluginList) as PluginDetail[]
const isPluginListLoading = usePluginPageContext(v => v.isPluginListLoading)
const mutateInstalledPluginList = usePluginPageContext(v => v.mutateInstalledPluginList) const mutateInstalledPluginList = usePluginPageContext(v => v.mutateInstalledPluginList)
const { run: handleFilterChange } = useDebounceFn((filters: FilterState) => { const { run: handleFilterChange } = useDebounceFn((filters: FilterState) => {
@ -38,7 +40,7 @@ const PluginsPanel = () => {
onFilterChange={handleFilterChange} onFilterChange={handleFilterChange}
/> />
</div> </div>
{filteredList.length > 0 ? ( {isPluginListLoading ? <Loading type='app' /> : filteredList.length > 0 ? (
<div className='flex px-12 items-start content-start gap-2 flex-grow self-stretch flex-wrap'> <div className='flex px-12 items-start content-start gap-2 flex-grow self-stretch flex-wrap'>
<div className='w-full'> <div className='w-full'>
<List pluginList={filteredList} /> <List pluginList={filteredList} />

Loading…
Cancel
Save