refactor(NpxSearch): improve type safety and error handling
- Changed import of MCPServer to type import for better clarity. - Enhanced error handling in async operations to manage unknown error types. - Updated Table component to use ellipsis for long text in description and npm link. - Adjusted column width for actions and ensured consistent styling in the component.
This commit is contained in:
parent
c9d640770a
commit
e0f1768c4f
@ -1,9 +1,9 @@
|
|||||||
import { SearchOutlined } from '@ant-design/icons'
|
import { SearchOutlined } from '@ant-design/icons'
|
||||||
import { useTheme } from '@renderer/context/ThemeProvider'
|
import { useTheme } from '@renderer/context/ThemeProvider'
|
||||||
import { MCPServer } from '@renderer/types'
|
import type { MCPServer } from '@renderer/types'
|
||||||
import { Button, Input, Space, Spin, Table, Typography } from 'antd'
|
import { Button, Input, Space, Spin, Table, Typography } from 'antd'
|
||||||
import { npxFinder } from 'npx-scope-finder'
|
import { npxFinder } from 'npx-scope-finder'
|
||||||
import { FC, useState } from 'react'
|
import { type FC, useState } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
|
|
||||||
import { SettingDivider, SettingGroup, SettingTitle } from '..'
|
import { SettingDivider, SettingGroup, SettingTitle } from '..'
|
||||||
@ -21,7 +21,7 @@ interface SearchResult {
|
|||||||
const NpxSearch: FC = () => {
|
const NpxSearch: FC = () => {
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const { Paragraph, Text } = Typography
|
const { Paragraph, Text, Link } = Typography
|
||||||
|
|
||||||
// Add new state variables for npm scope search
|
// Add new state variables for npm scope search
|
||||||
const [npmScope, setNpmScope] = useState('@modelcontextprotocol')
|
const [npmScope, setNpmScope] = useState('@modelcontextprotocol')
|
||||||
@ -59,8 +59,12 @@ const NpxSearch: FC = () => {
|
|||||||
if (formattedResults.length === 0) {
|
if (formattedResults.length === 0) {
|
||||||
window.message.info(t('settings.mcp.npx_list.no_packages'))
|
window.message.info(t('settings.mcp.npx_list.no_packages'))
|
||||||
}
|
}
|
||||||
} catch (error: any) {
|
} catch (error: unknown) {
|
||||||
window.message.error(`${t('settings.mcp.npx_list.search_error')}: ${error.message}`)
|
if (error instanceof Error) {
|
||||||
|
window.message.error(`${t('settings.mcp.npx_list.search_error')}: ${error.message}`)
|
||||||
|
} else {
|
||||||
|
window.message.error(t('settings.mcp.npx_list.search_error'))
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
setSearchLoading(false)
|
setSearchLoading(false)
|
||||||
}
|
}
|
||||||
@ -92,7 +96,7 @@ const NpxSearch: FC = () => {
|
|||||||
<Spin />
|
<Spin />
|
||||||
</div>
|
</div>
|
||||||
) : searchResults.length > 0 ? (
|
) : searchResults.length > 0 ? (
|
||||||
<Table<SearchResult>
|
<Table
|
||||||
dataSource={searchResults}
|
dataSource={searchResults}
|
||||||
columns={[
|
columns={[
|
||||||
{
|
{
|
||||||
@ -104,15 +108,18 @@ const NpxSearch: FC = () => {
|
|||||||
{
|
{
|
||||||
title: t('settings.mcp.npx_list.description'),
|
title: t('settings.mcp.npx_list.description'),
|
||||||
key: 'description',
|
key: 'description',
|
||||||
|
ellipsis: true,
|
||||||
render: (_, record: SearchResult) => (
|
render: (_, record: SearchResult) => (
|
||||||
<Space direction="vertical" size="small">
|
<Space direction="vertical" size="small" style={{ width: '100%' }}>
|
||||||
<Text>{record.description}</Text>
|
<Text ellipsis={{ tooltip: true }}>{record.description}</Text>
|
||||||
<Text type="secondary" style={{ fontSize: '12px' }}>
|
<Text ellipsis={{ tooltip: true }} type="secondary">
|
||||||
{t('settings.mcp.npx_list.usage')}: {record.usage}
|
{t('settings.mcp.npx_list.usage')}: {record.usage}
|
||||||
</Text>
|
</Text>
|
||||||
<a href={record.npmLink} target="_blank" rel="noopener noreferrer" style={{ fontSize: '12px' }}>
|
<Paragraph ellipsis={{ tooltip: true }}>
|
||||||
{record.npmLink}
|
<Link href={record.npmLink} target="_blank" rel="noopener noreferrer">
|
||||||
</a>
|
{record.npmLink}
|
||||||
|
</Link>
|
||||||
|
</Paragraph>
|
||||||
</Space>
|
</Space>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
@ -125,7 +132,7 @@ const NpxSearch: FC = () => {
|
|||||||
{
|
{
|
||||||
title: t('settings.mcp.npx_list.actions'),
|
title: t('settings.mcp.npx_list.actions'),
|
||||||
key: 'actions',
|
key: 'actions',
|
||||||
width: '100px',
|
width: '120px',
|
||||||
render: (_, record: SearchResult) => (
|
render: (_, record: SearchResult) => (
|
||||||
<Button
|
<Button
|
||||||
type="primary"
|
type="primary"
|
||||||
@ -149,7 +156,6 @@ const NpxSearch: FC = () => {
|
|||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
pagination={false}
|
pagination={false}
|
||||||
size="small"
|
|
||||||
bordered
|
bordered
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user