初始化模版工程
This commit is contained in:
70
components/nova-sdk/task-panel/Preview/UrlScriptPreview.tsx
Normal file
70
components/nova-sdk/task-panel/Preview/UrlScriptPreview.tsx
Normal file
@@ -0,0 +1,70 @@
|
||||
import React from 'react'
|
||||
import { ShellExecutePreview } from './ShellExecutePreview'
|
||||
|
||||
export interface UrlScriptPreviewProps {
|
||||
url: string
|
||||
title?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 基于 URL 加载脚本内容并用 ScriptPreview 渲染
|
||||
* - 保持 nova-sdk 自包含,不依赖宿主应用的 Preview 组件
|
||||
* - 由外部控制传入的 url(通常来自后端签名地址)
|
||||
*/
|
||||
export function UrlScriptPreview({ url, title }: UrlScriptPreviewProps) {
|
||||
const [code, setCode] = React.useState('')
|
||||
const [loading, setLoading] = React.useState(true)
|
||||
const [error, setError] = React.useState(false)
|
||||
|
||||
React.useEffect(() => {
|
||||
let cancelled = false
|
||||
setLoading(true)
|
||||
setError(false)
|
||||
|
||||
fetch(url)
|
||||
.then(res => {
|
||||
if (!res.ok) {
|
||||
throw new Error(`Failed to fetch script file: ${res.status}`)
|
||||
}
|
||||
return res.text()
|
||||
})
|
||||
.then(text => {
|
||||
if (!cancelled) {
|
||||
setCode(text)
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
if (!cancelled) {
|
||||
setError(true)
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
if (!cancelled) {
|
||||
setLoading(false)
|
||||
}
|
||||
})
|
||||
|
||||
return () => {
|
||||
cancelled = true
|
||||
}
|
||||
}, [url])
|
||||
|
||||
if (error) {
|
||||
return (
|
||||
<div className="flex-1 flex flex-col items-center justify-center p-8 text-muted-foreground">
|
||||
<span className="text-sm">脚本内容加载失败</span>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<ShellExecutePreview
|
||||
output={code}
|
||||
toolLabel={title || 'script_file'}
|
||||
loading={loading}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
export default UrlScriptPreview
|
||||
|
||||
Reference in New Issue
Block a user