fix(mobile): handle file picker cancellation

This commit is contained in:
key
2026-07-29 02:01:45 +08:00
parent fd59421574
commit cb928edafd
18 changed files with 202 additions and 26 deletions
+2 -1
View File
@@ -7,6 +7,7 @@ import type {
} from '@/types/api';
import { apiRequest, apiUrl, authHeaders, readTextPayload } from './api';
import { getAuth } from './auth';
import { fileSelectionFailure } from '../utils/file-selection';
const materialExtensions = ['.pdf', '.doc', '.docx', '.jpg', '.jpeg', '.png', '.webp'];
@@ -57,7 +58,7 @@ export const chooseCandidateFile = () =>
size: Number(file.size || 0)
});
},
fail: () => reject(new Error('未选择文件'))
fail: (error) => reject(fileSelectionFailure(error, '文件'))
});
});
+2 -1
View File
@@ -8,6 +8,7 @@ import type {
CaseUploadResponse
} from '@/types/api';
import { apiRequest, apiUrl, authHeaders, authenticatedFileUrl, readTextPayload } from './api';
import { fileSelectionFailure } from '../utils/file-selection';
const audioExtensions = ['.mp3', '.wav', '.m4a', '.webm', '.aac', '.ogg'];
@@ -31,7 +32,7 @@ export const chooseCaseAudio = () =>
size: Number(file.size || 0)
});
},
fail: () => reject(new Error('未选择音频'))
fail: (error) => reject(fileSelectionFailure(error, '音频'))
});
});
+2 -1
View File
@@ -10,6 +10,7 @@ import type {
} from '@/types/api';
import { apiRequest, apiUrl, authHeaders, readTextPayload } from './api';
import { getSelectedPosition } from './auth';
import { fileSelectionFailure } from '../utils/file-selection';
type RawKnowledgeSnippet = KnowledgeSnippet & {
title?: string;
@@ -44,7 +45,7 @@ export const chooseKnowledgeMedia = () =>
}
resolve({ path, name, size, kind });
},
fail: () => reject(new Error('未选择附件'))
fail: (error) => reject(fileSelectionFailure(error, '附件'))
});
});
@@ -17,6 +17,7 @@ import type {
PersonalSpace,
ServiceMemory
} from '@/types/api';
import { fileSelectionFailure } from '../utils/file-selection';
import type { CaptureStatusHistory } from '@/types/api';
import { apiRequest, apiUrl, authHeaders, readTextPayload } from './api';
import { personalItemApiPath, personalSessionApiPath } from './personal-assistant-id';
@@ -145,7 +146,7 @@ export const choosePersonalFile = () => new Promise<PersonalSelectedFile>((resol
const path = file?.path || result.tempFilePaths?.[0] || '';
if (!path) return reject(new Error('未获取到文件路径'));
resolve({ path, name: file?.name || path.split('/').pop() || 'personal-file', size: Number(file?.size || 0) });
}, fail: () => reject(new Error('未选择文件')) });
}, fail: (error) => reject(fileSelectionFailure(error, '文件')) });
});
export const uploadPersonalFile = (file: PersonalSelectedFile, title?: string, capturedAt?: string) =>
+2 -1
View File
@@ -5,6 +5,7 @@ import type { SpeechCapture } from './speech-capture';
import { estimateMpegAudioDuration } from './mpeg-audio-duration';
import { dataUriToBlobUrl, decodeDataAudioUri, hasNativeAudioFileSupport, isDataAudioUri, removeNativeTempAudio, writeNativeTempAudio } from './speech-audio-source';
import { applyTtsVoicePreference, getTtsDialectPreference, getTtsVoicePreference } from './tts-voice-preference';
import { fileSelectionFailure } from '../utils/file-selection';
const audioExtensions = ['.mp3', '.wav', '.m4a', '.webm', '.aac', '.ogg'];
@@ -45,7 +46,7 @@ export const chooseSpeechAudio = () =>
size: Number(file.size || 0)
});
},
fail: () => reject(new Error('未选择音频'))
fail: (error) => reject(fileSelectionFailure(error, '音频'))
});
});