refactor(web): use typed error toast

This commit is contained in:
yyh 2026-04-30 13:54:06 +08:00
parent 522451075f
commit d6641a370e
No known key found for this signature in database
2 changed files with 26 additions and 16 deletions

View File

@ -113,7 +113,9 @@ vi.mock('@/service/datasets', () => ({
}))
vi.mock('@langgenius/dify-ui/toast', () => ({
toast: (...args: unknown[]) => mockToast(...args),
toast: {
error: (...args: unknown[]) => mockToast(...args),
},
}))
vi.mock('@/app/components/datasets/rename-modal', () => ({
@ -220,7 +222,7 @@ describe('Dropdown callback coverage', () => {
await user.click(screen.getByText('datasetPipeline.operations.exportPipeline'))
await waitFor(() => {
expect(mockToast).toHaveBeenCalledWith('app.exportFailed', { type: 'error' })
expect(mockToast).toHaveBeenCalledWith('app.exportFailed')
})
})
@ -257,7 +259,7 @@ describe('Dropdown callback coverage', () => {
await user.click(screen.getByText('common.operation.delete'))
await waitFor(() => {
expect(mockToast).toHaveBeenCalledWith('check failed', { type: 'error' })
expect(mockToast).toHaveBeenCalledWith('check failed')
})
expect(screen.queryByText('dataset.deleteDatasetConfirmTitle')).not.toBeInTheDocument()
})

View File

@ -34,6 +34,25 @@ type DropDownProps = {
expand: boolean
}
type JsonErrorResponse = {
json: () => Promise<{ message?: string }>
}
const isJsonErrorResponse = (error: unknown): error is JsonErrorResponse => {
return typeof error === 'object'
&& error !== null
&& 'json' in error
&& typeof error.json === 'function'
}
const getErrorMessage = async (error: unknown) => {
if (!isJsonErrorResponse(error))
return 'Unknown error'
const res = await error.json()
return res?.message || 'Unknown error'
}
const DropDown = ({
expand,
}: DropDownProps) => {
@ -78,7 +97,7 @@ const DropDown = ({
downloadBlob({ data: file, fileName: `${name}.pipeline` })
}
catch {
toast(t('exportFailed', { ns: 'app' }), { type: 'error' })
toast.error(t('exportFailed', { ns: 'app' }))
}
}, [dataset, exportPipelineConfig, t])
@ -90,18 +109,7 @@ const DropDown = ({
setShowConfirmDelete(true)
}
catch (e: unknown) {
let message = 'Unknown error'
const errorWithJson = typeof e === 'object' && e !== null ? e as { json?: unknown } : null
if (e instanceof Response) {
const res = await e.json() as { message?: string }
message = res?.message || message
}
else if (typeof errorWithJson?.json === 'function') {
const parseErrorResponse = errorWithJson.json as () => Promise<{ message?: string }>
const res = await parseErrorResponse()
message = res?.message || message
}
toast(message, { type: 'error' })
toast.error(await getErrorMessage(e))
}
}, [dataset.id, t])