From 14216307a1672b88d1a46219f455492ee6df884d Mon Sep 17 00:00:00 2001 From: Nikolaos Karaolidis Date: Tue, 11 Jul 2023 12:25:12 +0300 Subject: [PATCH] Add permissions.ts utility file Signed-off-by: Nikolaos Karaolidis --- src/contexts/settings.tsx | 15 ++++++--------- src/utilities/index.ts | 1 + src/utilities/permissions.ts | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 src/utilities/index.ts create mode 100644 src/utilities/permissions.ts diff --git a/src/contexts/settings.tsx b/src/contexts/settings.tsx index fa03317..4c03bb3 100644 --- a/src/contexts/settings.tsx +++ b/src/contexts/settings.tsx @@ -13,10 +13,13 @@ import { AndroidScoped, FileSystem } from 'react-native-file-access'; import { getPersistedUriPermissions, openDocumentTree, - releasePersistableUriPermission, createFile, deleteFile, } from 'react-native-scoped-storage'; +import { + clearPermissions, + isPermissionForPath, +} from '../utilities/permissions'; interface SettingsContextType { settings: Settings; @@ -37,13 +40,7 @@ function SettingsProvider({ children }: { children: ReactNode }) { const updateSettings = (newSettings: Partial) => { const updatedSettings = { ...settings, ...newSettings }; - void getPersistedUriPermissions().then(permissions => { - permissions.forEach(permission => { - if (!updatedSettings.storageUri.startsWith(permission + '/')) { - void releasePersistableUriPermission(permission); - } - }); - }); + void clearPermissions([updatedSettings.storageUri]); void AsyncStorage.setItem('storageUri', updatedSettings.storageUri); @@ -78,7 +75,7 @@ function SettingsProvider({ children }: { children: ReactNode }) { const permissions = await getPersistedUriPermissions(); if ( !permissions.some(permission => - storageUri.startsWith(permission + '/'), + isPermissionForPath(permission, storageUri), ) ) { storageUri = ''; diff --git a/src/utilities/index.ts b/src/utilities/index.ts new file mode 100644 index 0000000..fd84aa2 --- /dev/null +++ b/src/utilities/index.ts @@ -0,0 +1 @@ +export { isPermissionForPath, clearPermissions } from './permissions'; diff --git a/src/utilities/permissions.ts b/src/utilities/permissions.ts new file mode 100644 index 0000000..3e30403 --- /dev/null +++ b/src/utilities/permissions.ts @@ -0,0 +1,19 @@ +import { + getPersistedUriPermissions, + releasePersistableUriPermission, +} from 'react-native-scoped-storage'; + +const isPermissionForPath = (permission: string, path: string) => { + return path.startsWith(permission + '/'); +}; + +const clearPermissions = async (excepts: string[] = []) => { + const permissions = await getPersistedUriPermissions(); + permissions.forEach(permission => { + if (!excepts.some(except => isPermissionForPath(permission, except))) { + void releasePersistableUriPermission(permission); + } + }); +}; + +export { isPermissionForPath, clearPermissions };