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:
parent
e011eacbe6
commit
30393c2867
|
|
@ -102,7 +102,10 @@ class HttpClient {
|
||||||
|
|
||||||
async get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {
|
async get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {
|
||||||
const response: AxiosResponse = await this.client.get(url, config);
|
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> {
|
async post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,8 @@ export const AppVersionManagementPage: React.FC = () => {
|
||||||
refetch();
|
refetch();
|
||||||
};
|
};
|
||||||
|
|
||||||
const list = versions ?? [];
|
console.log('[AppVersions] useApi versions:', versions, 'isArray:', Array.isArray(versions));
|
||||||
|
const list = Array.isArray(versions) ? versions : [];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|
@ -325,7 +326,7 @@ const UploadModal: React.FC<{
|
||||||
versionCode?: number; versionName?: string; minSdkVersion?: string;
|
versionCode?: number; versionName?: string; minSdkVersion?: string;
|
||||||
}>('/api/v1/admin/versions/parse', formData, {
|
}>('/api/v1/admin/versions/parse', formData, {
|
||||||
headers: { 'Content-Type': 'multipart/form-data' },
|
headers: { 'Content-Type': 'multipart/form-data' },
|
||||||
timeout: 120000,
|
timeout: 300000,
|
||||||
});
|
});
|
||||||
console.log('[Upload] Parse result:', info);
|
console.log('[Upload] Parse result:', info);
|
||||||
if (info?.versionName) setVersionName(info.versionName);
|
if (info?.versionName) setVersionName(info.versionName);
|
||||||
|
|
@ -386,7 +387,7 @@ const UploadModal: React.FC<{
|
||||||
{file.name} ({(file.size / 1024 / 1024).toFixed(1)} MB)
|
{file.name} ({(file.size / 1024 / 1024).toFixed(1)} MB)
|
||||||
</div>
|
</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>}
|
{parseWarning && <div style={{ font: 'var(--text-caption)', color: 'var(--color-warning, #f90)', marginTop: 4 }}>{parseWarning}</div>}
|
||||||
|
|
||||||
<label style={labelStyle}>{t('app_version_platform')}</label>
|
<label style={labelStyle}>{t('app_version_platform')}</label>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue