diff --git a/packages/uikit-react-native/package.json b/packages/uikit-react-native/package.json index f942d988..38c5ff48 100644 --- a/packages/uikit-react-native/package.json +++ b/packages/uikit-react-native/package.json @@ -83,7 +83,7 @@ "expo-file-system": "^15.2.2", "expo-image-manipulator": "^11.1.1", "expo-image-picker": "^14.1.1", - "expo-media-library": "^15.2.3", + "expo-media-library": "^16.0.0", "expo-notifications": "^0.18.1", "expo-video-thumbnails": "^7.2.1", "glob": "^7.2.0", @@ -121,6 +121,7 @@ "expo-image-manipulator": ">=11.0.0", "expo-image-picker": ">=12.0.2", "expo-notifications": ">=0.14.1", + "expo-media-library": ">=16.0.0", "expo-video-thumbnails": ">=6.4.0", "react": ">=17.0.2", "react-native": ">=0.65.0", @@ -177,6 +178,9 @@ "expo-notifications": { "optional": true }, + "expo-media-library": { + "optional": true + }, "expo-video-thumbnails": { "optional": true }, diff --git a/packages/uikit-react-native/src/platform/createFileService.expo.ts b/packages/uikit-react-native/src/platform/createFileService.expo.ts index 8e2db54e..0b1fd3ec 100644 --- a/packages/uikit-react-native/src/platform/createFileService.expo.ts +++ b/packages/uikit-react-native/src/platform/createFileService.expo.ts @@ -34,23 +34,36 @@ const createExpoFileService = ({ const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse; return expoPermissionGranted([res]); } + async requestCameraPermission(): Promise { const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse; return expoPermissionGranted([res]); } - async hasMediaLibraryPermission(type: 'write' | 'read'): Promise { + + async hasMediaLibraryReadPermission(): Promise { const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync( - type === 'write', + false, )) as ExpoMediaLibraryPermissionResponse; return expoPermissionGranted([perms]); } - async requestMediaLibraryPermission(type: 'write' | 'read'): Promise { + + async requestMediaLibraryReadPermission(): Promise { const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync( - type === 'write', + false, )) as ExpoMediaLibraryPermissionResponse; return expoPermissionGranted([perms]); } + async hasMediaLibraryWritePermission(): Promise { + const perms = (await mediaLibraryModule.getPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse; + return expoPermissionGranted([perms]); + } + + async requestMediaLibraryWritePermission(): Promise { + const perms = (await mediaLibraryModule.requestPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse; + return expoPermissionGranted([perms]); + } + async openCamera(options?: OpenCameraOptions): Promise { const hasPermission = await this.hasCameraPermission(); if (!hasPermission) { @@ -81,10 +94,11 @@ const createExpoFileService = ({ const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule); return file; } + async openMediaLibrary(options: OpenMediaLibraryOptions) { - const hasPermission = await this.hasMediaLibraryPermission('read'); + const hasPermission = await this.hasMediaLibraryReadPermission(); if (!hasPermission) { - const granted = await this.requestMediaLibraryPermission('read'); + const granted = await this.requestMediaLibraryReadPermission(); if (!granted) { options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED); return null; @@ -125,9 +139,9 @@ const createExpoFileService = ({ } async save(options: SaveOptions): Promise { - const hasPermission = await this.hasMediaLibraryPermission('write'); + const hasPermission = await this.hasMediaLibraryWritePermission(); if (!hasPermission) { - const granted = await this.requestMediaLibraryPermission('write'); + const granted = await this.requestMediaLibraryWritePermission(); if (!granted) throw new Error('Permission not granted'); } @@ -142,6 +156,7 @@ const createExpoFileService = ({ } return response.uri; } + createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } { const basePath = fsModule.cacheDirectory; if (!basePath) throw new Error('Cannot determine directory'); diff --git a/yarn.lock b/yarn.lock index bffe6729..b7df2c01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1237,7 +1237,7 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3": +"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3", "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.20.0", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.9", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== @@ -1266,19 +1266,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.20.0", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.9", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" - debug "^4.3.1" - globals "^11.1.0" - "@babel/types@7.17.0": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" @@ -3293,7 +3280,7 @@ resolved "https://registry.yarnpkg.com/@react-native-community/slider/-/slider-4.5.5.tgz#d70fc5870477760033769bbd6625d57e7d7678b2" integrity sha512-x2N415pg4ZxIltArOKczPwn7JEYh+1OxQ4+hTnafomnMsqs65HZuEWcX+Ch8c5r8V83DiunuQUf5hWGWlw8hQQ== -"@react-native-documents/picker@^10.0.0": +"@react-native-documents/picker@^10.0.0", "@react-native-documents/picker@^10.1.0": version "10.1.2" resolved "https://registry.yarnpkg.com/@react-native-documents/picker/-/picker-10.1.2.tgz#2ebbf1eccc7e9efa3690e35ab5f0a811411a57b8" integrity sha512-JzbFmFp0SmG0FEKt4Q62trewHMFpas2zAX0n5EANwrU9kondnzAEF7/xxz2EA2tfZNwnkHelqG8A7iedGleMRw== @@ -8091,10 +8078,10 @@ expo-image-picker@^14.1.1: dependencies: expo-image-loader "~4.6.0" -expo-media-library@^15.2.3: - version "15.9.2" - resolved "https://registry.yarnpkg.com/expo-media-library/-/expo-media-library-15.9.2.tgz#cf7183db639a3065862ed0696a315e946d5812a0" - integrity sha512-ExRcCxNO768aWPQr9axuBDQLcFnRTSiqvWZ1XvnopCfZEic04wJ/CPAE1hLqTp7AyYrd6jHpqxa/aNKBAAFVeA== +expo-media-library@^16.0.0: + version "16.0.5" + resolved "https://registry.yarnpkg.com/expo-media-library/-/expo-media-library-16.0.5.tgz#5827f237f4425088bdb15f1f0949916613d0ae3d" + integrity sha512-O9RUqBWgJVRF0mO6EiLSBFyfb5wR1/ZqovbT43V0TAo5sgcjrHRs+0NID/U6BWDRuiFeX2AU516JgNDutNUFSw== expo-notifications@^0.18.1: version "0.18.1" @@ -15080,16 +15067,7 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15195,7 +15173,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -15209,13 +15187,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -16408,7 +16379,7 @@ worker-farm@^1.7.0: dependencies: errno "~0.1.7" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -16426,15 +16397,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"