diff --git a/src/components/Sync.tsx b/src/components/Sync.tsx index a31653c..c3c8d3b 100644 --- a/src/components/Sync.tsx +++ b/src/components/Sync.tsx @@ -8,17 +8,29 @@ interface SyncProps { pkgName: string; } +const LogStatus = { + WAIT: 1, + ERROR: 2, + SUCCESS: 3, +} + export default function Sync({ pkgName }: SyncProps) { const [logId, setLogId] = React.useState(); + const [logState, setLogState] = React.useState(LogStatus.WAIT); + const retryCountRef = React.useRef(0); const [modal, contextHolder] = Modal.useModal(); + function genLogFileUrl(id: string) { + return `${REGISTRY}/-/package/${pkgName}/syncs/${id}/log`; + } + async function showLog(id: string) { modal.success({ title: '等待调度', content: ( <> 创建同步任务成功,正在等待调度,如遇日志 404 请稍后刷新重试,通常需要几十秒钟的时间 - + 查看日志 @@ -26,15 +38,41 @@ export default function Sync({ pkgName }: SyncProps) { }); } + async function logPolling(id:string) { + if (!id) { + return; + } + retryCountRef.current += 1; + try { + const response = await fetch(genLogFileUrl(id)); + if (response.status === 200) { + setLogState(LogStatus.SUCCESS); + return; + } + throw new Error('Not ready'); + } catch { + if (retryCountRef.current > 30) { + setLogState(LogStatus.ERROR); + return; + } + setTimeout(() => { + logPolling(id); + }, 1000); + } + } + async function doSync() { try { - const res = await fetch(`${SYNC_REGISTRY}/-/package/${pkgName}/syncs`, { + const response = await fetch(`${SYNC_REGISTRY}/-/package/${pkgName}/syncs`, { method: 'PUT', - }).then((res) => res.json()); + }) + const res = await response.json(); if (res.ok) { setLogId(res.id); + logPolling(res.id); + return; } - showLog(res.id); + throw new Error('Not ok'); } catch (e) { message.error('创建同步任务失败'); } @@ -43,9 +81,29 @@ export default function Sync({ pkgName }: SyncProps) { return ( <> {contextHolder} - ); -} +} \ No newline at end of file