diff --git a/src/contexts/settings.tsx b/src/contexts/settings.tsx index 8f740a5..6caa522 100644 --- a/src/contexts/settings.tsx +++ b/src/contexts/settings.tsx @@ -30,14 +30,15 @@ const SettingsProvider: React.FC<{ children: React.ReactNode }> = ({ const updateSettings = (newSettings: Partial) => { const updatedSettings = { ...settings, ...newSettings }; - if (settings.storageUri !== updatedSettings.storageUri) { - void getPersistedUriPermissions().then(permissions => { - if (permissions.includes(settings.storageUri)) { - void releasePersistableUriPermission(settings.storageUri); + void getPersistedUriPermissions().then(permissions => { + permissions.forEach(permission => { + if (!updatedSettings.storageUri.startsWith(permission + '/')) { + void releasePersistableUriPermission(permission); } }); - void AsyncStorage.setItem('storageUri', updatedSettings.storageUri); - } + }); + + void AsyncStorage.setItem('storageUri', updatedSettings.storageUri); setSettings(updatedSettings); }; @@ -49,12 +50,23 @@ const SettingsProvider: React.FC<{ children: React.ReactNode }> = ({ if (storageUri !== '') { const permissions = await getPersistedUriPermissions(); - if (!permissions.includes(storageUri)) { + if ( + !permissions.some(permission => storageUri.startsWith(permission + '/')) + ) { storageUri = ''; } - const exists = await FileSystem.exists(storageUri); - if (!exists) { + try { + const exists = await FileSystem.exists(storageUri); + if (!exists) { + throw new Error('Storage URI does not exist'); + } + + const isDirectory = await FileSystem.isDir(storageUri); + if (!isDirectory) { + throw new Error('Storage URI is not a directory'); + } + } catch { storageUri = ''; } } @@ -75,7 +87,7 @@ const SettingsProvider: React.FC<{ children: React.ReactNode }> = ({ settings.storageUri === '' ? ( { - void openDocumentTree().then(uri => { + void openDocumentTree(true).then(uri => { updateSettings({ storageUri: uri.uri }); }); }} diff --git a/src/screens/settings.tsx b/src/screens/settings.tsx index 0ce3136..920f3e2 100644 --- a/src/screens/settings.tsx +++ b/src/screens/settings.tsx @@ -60,7 +60,7 @@ const SettingsScreen = () => { mode="elevated" style={styles.marginBottom} onPress={() => { - void openDocumentTree().then(uri => { + void openDocumentTree(true).then(uri => { setSettings({ storageUri: uri.uri }); }); }}>