forked from akai/readest
9202864846
* fix(library): request storage permission when saving to a custom folder On Android a custom library folder on shared storage needs All Files Access. The import/settings/migrate paths request it, but the library-save path (updateBook/updateBooks -> saveLibraryBooks) did not, so on a device without the permission every save failed with EACCES; because callers (sync, imports) don't await/catch it, it surfaced as an unhandled-rejection crash (Sentry READEST-A). saveLibraryBooks now catches a storage-permission error, requests the permission through the existing flow, and retries once. It prompts at most once per session so background saves don't repeatedly open system settings; a still-denied save is logged rather than crashing (the user was already shown the All Files Access screen). Fixes READEST-A Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(sentry): drop only the benign hidden-tab View Transition error The View Transition API skips a transition when the tab is hidden; that unhandled rejection is expected browser behavior and pure noise, so it is dropped in before_send. A transition timeout abort (READEST-9) is NOT dropped: a slow DOM update can signal a real performance problem, so it stays visible. Fixes READEST-7 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
26 lines
941 B
TypeScript
26 lines
941 B
TypeScript
import { invoke, PermissionState } from '@tauri-apps/api/core';
|
|
|
|
interface Permissions {
|
|
manageStorage: PermissionState;
|
|
}
|
|
|
|
/**
|
|
* Whether a thrown error is an Android storage-permission denial (EACCES). A
|
|
* custom library folder on shared storage needs All Files Access; without it
|
|
* file writes fail with "Permission denied (os error 13)".
|
|
*/
|
|
export const isStoragePermissionError = (error: unknown): boolean => {
|
|
const message = error instanceof Error ? error.message : String(error);
|
|
return /os error 13|permission denied|eacces/i.test(message);
|
|
};
|
|
|
|
export const requestStoragePermission = async (): Promise<boolean> => {
|
|
let permission = await invoke<Permissions>('plugin:native-bridge|checkPermissions');
|
|
if (permission.manageStorage !== 'granted') {
|
|
permission = await invoke<Permissions>(
|
|
'plugin:native-bridge|request_manage_storage_permission',
|
|
);
|
|
}
|
|
return permission.manageStorage === 'granted';
|
|
};
|