list loading

This commit is contained in:
jZonG 2025-05-09 14:38:37 +08:00
parent 5fd352c562
commit 32f87db951
3 changed files with 84 additions and 18 deletions

View File

@ -1,5 +1,5 @@
'use client' 'use client'
import React, { useCallback } from 'react' import React, { useCallback, useState } from 'react'
import type { FC } from 'react' import type { FC } from 'react'
import { useBoolean } from 'ahooks' import { useBoolean } from 'ahooks'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -7,6 +7,7 @@ import { useAppContext } from '@/context/app-context'
import { import {
RiCloseLine, RiCloseLine,
RiLoader2Line, RiLoader2Line,
RiLoopLeftLine,
} from '@remixicon/react' } from '@remixicon/react'
import type { ToolWithProvider } from '../../../workflow/types' import type { ToolWithProvider } from '../../../workflow/types'
import Icon from '@/app/components/plugins/card/base/card-icon' import Icon from '@/app/components/plugins/card/base/card-icon'
@ -16,6 +17,7 @@ import Confirm from '@/app/components/base/confirm'
import Indicator from '@/app/components/header/indicator' import Indicator from '@/app/components/header/indicator'
import MCPModal from '../modal' import MCPModal from '../modal'
import OperationDropdown from './operation-dropdown' import OperationDropdown from './operation-dropdown'
import ListLoading from './list-loading'
import { useDeleteMCP, useUpdateMCP } from '@/service/use-tools' import { useDeleteMCP, useUpdateMCP } from '@/service/use-tools'
import cn from '@/utils/classnames' import cn from '@/utils/classnames'
@ -80,6 +82,8 @@ const MCPDetailContent: FC<Props> = ({
} }
}, [detail, showDeleting, hideDeleting, hideDeleteConfirm, onUpdate]) }, [detail, showDeleting, hideDeleting, hideDeleteConfirm, onUpdate])
const [loading, setLoading] = useState(true)
if (!detail) if (!detail)
return null return null
@ -142,23 +146,48 @@ const MCPDetailContent: FC<Props> = ({
)} )}
</div> </div>
</div> </div>
<div className='grow overflow-y-auto'> <div className='grow'>
{!detail.is_team_authorization && ( <div className='flex shrink-0 justify-between gap-2 px-4 pb-1 pt-2'>
<div className='flex h-full w-full flex-col items-center justify-center'> <div className='flex h-6 items-center'>
<div className='system-md-medium mb-1 text-text-secondary'>{t('tools.mcp.authorizingRequired')}</div> <div className='system-sm-semibold-uppercase text-text-secondary'>{t('tools.mcp.gettingTools')}</div>
{deleting && <div className='system-md-medium mb-1 text-text-secondary'>{t('tools.mcp.authorizing')}</div>} {/* <div className='text-text-secondary system-sm-semibold-uppercase'>{t('tools.mcp.updateTools')}</div> */}
<div className='system-sm-regular text-text-tertiary'>{t('tools.mcp.authorizeTip')}</div> </div>
<div>
<Button size='small'>
<RiLoopLeftLine className='mr-1 h-3.5 w-3.5' />
{t('tools.mcp.update')}
</Button>
{/* <Button size='small'>
<RiLoader2Line className='h-3.5 w-3.5 mr-1 animate-spin' />
{t('tools.mcp.updating')}
</Button> */}
</div>
</div>
{loading && (
<div className='flex h-full w-full grow flex-col overflow-hidden px-4 pb-4'>
<ListLoading />
</div> </div>
)} )}
{detail.is_team_authorization && ( {!loading && (
<div className='flex h-full w-full flex-col items-center justify-center'> <div className='grow overflow-y-auto'>
<div className='system-sm-regular mb-3 text-text-tertiary'>{t('tools.mcp.toolsEmpty')}</div> {!detail.is_team_authorization && (
<Button <div className='flex h-full w-full flex-col items-center justify-center'>
variant='primary' <div className='system-md-medium mb-1 text-text-secondary'>{t('tools.mcp.authorizingRequired')}</div>
onClick={() => { {deleting && <div className='system-md-medium mb-1 text-text-secondary'>{t('tools.mcp.authorizing')}</div>}
// TODO <div className='system-sm-regular text-text-tertiary'>{t('tools.mcp.authorizeTip')}</div>
}} </div>
>{t('tools.mcp.getTools')}</Button> )}
{detail.is_team_authorization && (
<div className='flex h-full w-full flex-col items-center justify-center'>
<div className='system-sm-regular mb-3 text-text-tertiary'>{t('tools.mcp.toolsEmpty')}</div>
<Button
variant='primary'
onClick={() => {
// TODO
}}
>{t('tools.mcp.getTools')}</Button>
</div>
)}
</div> </div>
)} )}
</div> </div>

View File

@ -0,0 +1,37 @@
'use client'
import React from 'react'
import cn from '@/utils/classnames'
const ListLoading = () => {
return (
<div className={cn('space-y-2')}>
<div className='space-y-3 rounded-xl bg-components-panel-on-panel-item-bg-hover p-4'>
<div className='h-2 w-[180px] rounded-sm bg-text-quaternary opacity-20'></div>
<div className='h-2 rounded-sm bg-text-quaternary opacity-10'></div>
<div className='mr-10 h-2 rounded-sm bg-text-quaternary opacity-10'></div>
</div>
<div className='space-y-3 rounded-xl bg-components-panel-on-panel-item-bg-hover p-4'>
<div className='h-2 w-[148px] rounded-sm bg-text-quaternary opacity-20'></div>
<div className='h-2 rounded-sm bg-text-quaternary opacity-10'></div>
<div className='mr-10 h-2 rounded-sm bg-text-quaternary opacity-10'></div>
</div>
<div className='space-y-3 rounded-xl bg-components-panel-on-panel-item-bg-hover p-4'>
<div className='h-2 w-[196px] rounded-sm bg-text-quaternary opacity-20'></div>
<div className='h-2 rounded-sm bg-text-quaternary opacity-10'></div>
<div className='mr-10 h-2 rounded-sm bg-text-quaternary opacity-10'></div>
</div>
<div className='space-y-3 rounded-xl bg-components-panel-on-panel-item-bg-hover p-4'>
<div className='h-2 w-[148px] rounded-sm bg-text-quaternary opacity-20'></div>
<div className='h-2 rounded-sm bg-text-quaternary opacity-10'></div>
<div className='mr-10 h-2 rounded-sm bg-text-quaternary opacity-10'></div>
</div>
<div className='space-y-3 rounded-xl bg-components-panel-on-panel-item-bg-hover p-4'>
<div className='h-2 w-[180px] rounded-sm bg-text-quaternary opacity-20'></div>
<div className='h-2 rounded-sm bg-text-quaternary opacity-10'></div>
<div className='mr-10 h-2 rounded-sm bg-text-quaternary opacity-10'></div>
</div>
</div>
)
}
export default ListLoading

View File

@ -184,8 +184,8 @@ const translation = {
authorizeTip: 'After authorization, tools will be displayed here.', authorizeTip: 'After authorization, tools will be displayed here.',
update: 'Update', update: 'Update',
updating: 'Updating', updating: 'Updating',
gettingTools: 'Getting Tools', gettingTools: 'Getting Tools...',
updateTools: 'Updating Tools', updateTools: 'Updating Tools...',
toolsEmpty: 'Tools not loaded', toolsEmpty: 'Tools not loaded',
getTools: 'Get tools', getTools: 'Get tools',
}, },