This commit is contained in:
谦君
2026-01-23 01:28:57 +08:00
parent bd6c474913
commit 1fc807915f
21 changed files with 295 additions and 128 deletions

View File

@@ -179,8 +179,8 @@
areMainSwitchesOff
? t('settings.notificationsDisabled')
: isTypesExpanded
? t('settings.collapseTypes')
: t('settings.expandTypes')
? t('settings.collapseTypes')
: t('settings.expandTypes')
}}
</p>
</div>
@@ -591,31 +591,92 @@
const fileName = `${pkg.name}-${new Date().toISOString().slice(0, 10)}-${Date.now()}.json`
const jsonString = JSON.stringify(exportData, null, 2)
// Android 保存到公共 Downloads 目录
// Android/原生平台
if (Capacitor.isNativePlatform()) {
// 检查并请求存储权限
const permStatus = await Filesystem.checkPermissions()
if (permStatus.publicStorage !== 'granted') {
// 尝试保存到公共 Downloads 目录
try {
const permStatus = await Filesystem.checkPermissions()
if (permStatus.publicStorage === 'granted') {
const result = await Filesystem.writeFile({
path: `Download/${fileName}`,
data: jsonString,
directory: Directory.ExternalStorage,
encoding: Encoding.UTF8
})
toast.success(t('settings.exportSuccessWithPath', { path: result.uri }))
return
}
// 尝试请求权限
const reqResult = await Filesystem.requestPermissions()
if (reqResult.publicStorage !== 'granted') {
toast.error(t('settings.storagePermissionDenied'))
if (reqResult.publicStorage === 'granted') {
const result = await Filesystem.writeFile({
path: `Download/${fileName}`,
data: jsonString,
directory: Directory.ExternalStorage,
encoding: Encoding.UTF8
})
toast.success(t('settings.exportSuccessWithPath', { path: result.uri }))
return
}
} catch (extError) {
console.warn('ExternalStorage failed, trying Documents:', extError)
}
// 备选方案:保存到应用文档目录 (TapPlay 等沙盒环境)
try {
const result = await Filesystem.writeFile({
path: fileName,
data: jsonString,
directory: Directory.Documents,
encoding: Encoding.UTF8
})
toast.success(t('settings.exportSuccessWithPath', { path: result.uri }))
return
} catch (docError) {
console.warn('Documents failed, trying Data:', docError)
}
// 最后备选:保存到应用数据目录
try {
const result = await Filesystem.writeFile({
path: fileName,
data: jsonString,
directory: Directory.Data,
encoding: Encoding.UTF8
})
toast.success(t('settings.exportSuccessWithPath', { path: result.uri }))
return
} catch (dataError) {
console.warn('Data directory failed:', dataError)
}
// 所有文件系统方式都失败,尝试 Web Share API
if (navigator.share && navigator.canShare) {
const file = new File([jsonString], fileName, { type: 'application/json' })
if (navigator.canShare({ files: [file] })) {
await navigator.share({
files: [file],
title: t('settings.exportData')
})
toast.success(t('settings.exportSuccess'))
return
}
}
const result = await Filesystem.writeFile({
path: `Download/${fileName}`,
data: jsonString,
directory: Directory.ExternalStorage,
encoding: Encoding.UTF8
})
toast.success(t('settings.exportSuccessWithPath', { path: result.uri }))
return
// 最后的备选:复制到剪贴板
try {
await navigator.clipboard.writeText(jsonString)
toast.success(t('settings.exportCopiedToClipboard'))
return
} catch {
toast.error(t('settings.exportFailed'))
}
} else {
// Web 使用 file-saver
saveAs(new Blob([jsonString], { type: 'application/json' }), fileName)
toast.success(t('settings.exportSuccess'))
}
toast.success(t('settings.exportSuccess'))
} catch (error) {
console.error('Export failed:', error)
toast.error(t('settings.exportFailed'))