| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 'use client'
- import { useMemo, useState } from 'react'
- import NewMCPCard from './create-card'
- import MCPCard from './provider-card'
- import MCPDetailPanel from './detail/provider-detail'
- import {
- useAllToolProviders,
- } from '@/service/use-tools'
- import type { ToolWithProvider } from '@/app/components/workflow/types'
- import cn from '@/utils/classnames'
-
- type Props = {
- searchText: string
- }
-
- function renderDefaultCard() {
- const defaultCards = Array.from({ length: 36 }, (_, index) => (
- <div
- key={index}
- className={cn(
- 'inline-flex h-[111px] rounded-xl bg-background-default-lighter opacity-10',
- index < 4 && 'opacity-60',
- index >= 4 && index < 8 && 'opacity-50',
- index >= 8 && index < 12 && 'opacity-40',
- index >= 12 && index < 16 && 'opacity-30',
- index >= 16 && index < 20 && 'opacity-25',
- index >= 20 && index < 24 && 'opacity-20',
- )}
- ></div>
- ))
- return defaultCards
- }
-
- const MCPList = ({
- searchText,
- }: Props) => {
- const { data: list = [] as ToolWithProvider[], refetch } = useAllToolProviders()
- const [isTriggerAuthorize, setIsTriggerAuthorize] = useState<boolean>(false)
-
- const filteredList = useMemo(() => {
- return list.filter((collection) => {
- if (searchText)
- return Object.values(collection.name).some(value => (value as string).toLowerCase().includes(searchText.toLowerCase()))
- return collection.type === 'mcp'
- }) as ToolWithProvider[]
- }, [list, searchText])
-
- const [currentProviderID, setCurrentProviderID] = useState<string>()
-
- const currentProvider = useMemo(() => {
- return list.find(provider => provider.id === currentProviderID)
- }, [list, currentProviderID])
-
- const handleCreate = async (provider: ToolWithProvider) => {
- await refetch() // update list
- setCurrentProviderID(provider.id)
- setIsTriggerAuthorize(true)
- }
-
- const handleUpdate = async (providerID: string) => {
- await refetch() // update list
- setCurrentProviderID(providerID)
- setIsTriggerAuthorize(true)
- }
- return (
- <>
- <div
- className={cn(
- 'relative grid shrink-0 grid-cols-1 content-start gap-4 px-12 pb-4 pt-2 sm:grid-cols-1 md:grid-cols-2 xl:grid-cols-4 2xl:grid-cols-5 2k:grid-cols-6',
- !list.length && 'h-[calc(100vh_-_136px)] overflow-hidden',
- )}
- >
- <NewMCPCard handleCreate={handleCreate} />
- {filteredList.map(provider => (
- <MCPCard
- key={provider.id}
- data={provider}
- currentProvider={currentProvider as ToolWithProvider}
- handleSelect={setCurrentProviderID}
- onUpdate={handleUpdate}
- onDeleted={refetch}
- />
- ))}
- {!list.length && renderDefaultCard()}
- </div>
- {currentProvider && (
- <MCPDetailPanel
- detail={currentProvider as ToolWithProvider}
- onHide={() => setCurrentProviderID(undefined)}
- onUpdate={refetch}
- isTriggerAuthorize={isTriggerAuthorize}
- onFirstCreate={() => setIsTriggerAuthorize(false)}
- />
- )}
- </>
- )
- }
- export default MCPList
|