diff options
author | Samuel Newman <mozzius@protonmail.com> | 2025-05-21 21:51:57 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-21 21:51:57 +0300 |
commit | a0ea634349fd7eac40d72dbd57339f1d6c53a117 (patch) | |
tree | 8dc54d395e12159b8f202d71da88f9b011b71ef1 /src/lib | |
parent | c16cd36b6447bc769a502cfc0e368a0f0bfaf2e0 (diff) | |
download | voidsky-a0ea634349fd7eac40d72dbd57339f1d6c53a117.tar.zst |
Speculative fix to Android camera roll issue (#8397)
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/media/save-image.ts | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/lib/media/save-image.ts b/src/lib/media/save-image.ts new file mode 100644 index 000000000..47955b15c --- /dev/null +++ b/src/lib/media/save-image.ts @@ -0,0 +1,59 @@ +import {useCallback} from 'react' +import * as MediaLibrary from 'expo-media-library' +import {t} from '@lingui/macro' + +import {isNative} from '#/platform/detection' +import * as Toast from '#/view/com/util/Toast' +import {saveImageToMediaLibrary} from './manip' + +/** + * Same as `saveImageToMediaLibrary`, but also handles permissions and toasts + */ +export function useSaveImageToMediaLibrary() { + const [permissionResponse, requestPermission, getPermission] = + MediaLibrary.usePermissions({ + granularPermissions: ['photo'], + }) + return useCallback( + async (uri: string) => { + if (!isNative) { + throw new Error('useSaveImageToMediaLibrary is native only') + } + + async function save() { + try { + await saveImageToMediaLibrary({uri}) + Toast.show(t`Image saved`) + } catch (e: any) { + Toast.show(t`Failed to save image: ${String(e)}`, 'xmark') + } + } + + const permission = permissionResponse ?? (await getPermission()) + + if (permission.granted) { + await save() + } else { + if (permission.canAskAgain) { + // request again once + const askAgain = await requestPermission() + if (askAgain.granted) { + await save() + } else { + // since we've been explicitly denied, show a toast. + Toast.show( + t`Images cannot be saved unless permission is granted to access your photo library.`, + 'xmark', + ) + } + } else { + Toast.show( + t`Permission to access your photo library was denied. Please enable it in your system settings.`, + 'xmark', + ) + } + } + }, + [permissionResponse, requestPermission, getPermission], + ) +} |