fix(admin-web): guard versions list with Array.isArray + bump parse timeout to 300s

- Prevent TypeError if useApi returns non-array shape
- Add HttpClient.get logging to trace raw vs unwrapped response
- Parse timeout: 120s → 300s (matches upload, avoids timeout on large files)
- Show hint for large files (>30MB) during parse

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-03-06 10:48:29 -08:00
parent e011eacbe6
commit 30393c2867
2 changed files with 8 additions and 4 deletions

View File

@ -102,7 +102,10 @@ class HttpClient {
async get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {
const response: AxiosResponse = await this.client.get(url, config);
return response.data?.data ?? response.data;
const raw = response.data;
const result = raw?.data ?? raw;
console.log('[HttpClient.get]', url, '→ raw:', raw, '→ result:', result, 'isArray:', Array.isArray(result));
return result;
}
async post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {

View File

@ -150,7 +150,8 @@ export const AppVersionManagementPage: React.FC = () => {
refetch();
};
const list = versions ?? [];
console.log('[AppVersions] useApi versions:', versions, 'isArray:', Array.isArray(versions));
const list = Array.isArray(versions) ? versions : [];
return (
<div>
@ -325,7 +326,7 @@ const UploadModal: React.FC<{
versionCode?: number; versionName?: string; minSdkVersion?: string;
}>('/api/v1/admin/versions/parse', formData, {
headers: { 'Content-Type': 'multipart/form-data' },
timeout: 120000,
timeout: 300000,
});
console.log('[Upload] Parse result:', info);
if (info?.versionName) setVersionName(info.versionName);
@ -386,7 +387,7 @@ const UploadModal: React.FC<{
{file.name} ({(file.size / 1024 / 1024).toFixed(1)} MB)
</div>
)}
{parsing && <div style={{ font: 'var(--text-caption)', color: 'var(--color-info)', marginTop: 4 }}>{t('app_version_parsing')}</div>}
{parsing && <div style={{ font: 'var(--text-caption)', color: 'var(--color-info)', marginTop: 4 }}>{t('app_version_parsing')}{file && file.size > 30 * 1024 * 1024 ? '(大文件,请耐心等待...' : ''}</div>}
{parseWarning && <div style={{ font: 'var(--text-caption)', color: 'var(--color-warning, #f90)', marginTop: 4 }}>{parseWarning}</div>}
<label style={labelStyle}>{t('app_version_platform')}</label>