Skip to content

Commit 7176a88

Browse files
authored
Merge pull request #232 from sendbird/feat/migrate-document-picker
[CLNP-6587] feat: support for RN 0.77+
2 parents 6c19b24 + 1514812 commit 7176a88

File tree

12 files changed

+135
-28
lines changed

12 files changed

+135
-28
lines changed

docs-validation/1_introduction/NativeModules.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import Clipboard from '@react-native-clipboard/clipboard';
2121
import { CameraRoll } from '@react-native-camera-roll/camera-roll';
2222
import RNFBMessaging from '@react-native-firebase/messaging';
2323
import Video from 'react-native-video';
24-
import * as DocumentPicker from 'react-native-document-picker';
24+
import * as DocumentPicker from '@react-native-documents/picker';
2525
import * as FileAccess from 'react-native-file-access';
2626
import * as ImagePicker from 'react-native-image-picker';
2727
import * as Permissions from 'react-native-permissions';

docs-validation/1_introduction/SendYourFirstMessage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import Clipboard from '@react-native-clipboard/clipboard';
1818
import { CameraRoll } from '@react-native-camera-roll/camera-roll';
1919
import RNFBMessaging from '@react-native-firebase/messaging';
2020
import Video from 'react-native-video';
21-
import * as DocumentPicker from 'react-native-document-picker';
21+
import * as DocumentPicker from '@react-native-documents/picker';
2222
import * as FileAccess from 'react-native-file-access';
2323
import * as ImagePicker from 'react-native-image-picker';
2424
import * as Permissions from 'react-native-permissions';

docs-validation/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"@bam.tech/react-native-image-resizer": "^3.0.10",
1212
"@react-native-camera-roll/camera-roll": "^7.8.1",
1313
"@react-native-clipboard/clipboard": "^1.14.1",
14+
"@react-native-documents/picker": "^10.1.0",
1415
"@react-native-firebase/messaging": "^14.7.0",
1516
"@react-navigation/native": "^6.1.17",
1617
"@react-navigation/native-stack": "^6.10.0",
@@ -20,7 +21,6 @@
2021
"react-native": "0.74.3",
2122
"react-native-audio-recorder-player": "^3.6.10",
2223
"react-native-create-thumbnail": "^2.0.0",
23-
"react-native-document-picker": "^9.3.0",
2424
"react-native-file-access": "^3.1.0",
2525
"react-native-image-picker": "^7.1.2",
2626
"react-native-mmkv": "^2.12.2",

packages/uikit-react-native/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ import Clipboard from '@react-native-clipboard/clipboard';
165165
import { CameraRoll } from '@react-native-camera-roll/camera-roll';
166166
import RNFBMessaging from '@react-native-firebase/messaging';
167167
import Video from 'react-native-video';
168-
import * as DocumentPicker from 'react-native-document-picker';
168+
import * as DocumentPicker from '@react-native-documents/picker';
169169
import * as FileAccess from 'react-native-file-access';
170170
import * as ImagePicker from 'react-native-image-picker';
171171
import * as Permissions from 'react-native-permissions';

packages/uikit-react-native/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
"@react-native-camera-roll/camera-roll": "^7.8.1",
7272
"@react-native-clipboard/clipboard": "^1.14.1",
7373
"@react-native-community/netinfo": "^11.3.2",
74+
"@react-native-documents/picker": "^10.0.0",
7475
"@react-native-firebase/app": "^14.4.0",
7576
"@react-native-firebase/messaging": "^14.4.0",
7677
"@types/react": "*",
@@ -108,6 +109,7 @@
108109
"@react-native-camera-roll/camera-roll": ">=5.0.0",
109110
"@react-native-clipboard/clipboard": ">=1.8.5",
110111
"@react-native-community/netinfo": ">=9.3.0",
112+
"@react-native-documents/picker": ">=10.0.0",
111113
"@react-native-firebase/messaging": ">=14.4.0",
112114
"@sendbird/chat": "^4.16.0",
113115
"@sendbird/react-native-scrollview-enhancer": "*",
@@ -145,6 +147,9 @@
145147
"@react-native-clipboard/clipboard": {
146148
"optional": true
147149
},
150+
"@react-native-documents/picker": {
151+
"optional": true
152+
},
148153
"@react-native-firebase/messaging": {
149154
"optional": true
150155
},

packages/uikit-react-native/src/platform/createFileService.native.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { CameraRoll } from '@react-native-camera-roll/camera-roll';
22
import { Platform } from 'react-native';
3-
import type * as DocumentPicker from 'react-native-document-picker';
43
import type * as FileAccess from 'react-native-file-access';
54
import type * as ImagePicker from 'react-native-image-picker';
65
import type * as Permissions from 'react-native-permissions';
@@ -18,6 +17,7 @@ import {
1817
import SBUError from '../libs/SBUError';
1918
import nativePermissionGranted from '../utils/nativePermissionGranted';
2019
import normalizeFile from '../utils/normalizeFile';
20+
import { DocumentPicker, openDocument } from './openDocument.native';
2121
import type {
2222
FilePickerResponse,
2323
FileServiceInterface,
@@ -52,7 +52,7 @@ const createNativeFileService = ({
5252
fsModule,
5353
}: {
5454
imagePickerModule: typeof ImagePicker;
55-
documentPickerModule: typeof DocumentPicker;
55+
documentPickerModule: DocumentPicker;
5656
permissionModule: typeof Permissions;
5757
mediaLibraryModule: typeof CameraRoll;
5858
fsModule: typeof FileAccess;
@@ -78,17 +78,20 @@ const createNativeFileService = ({
7878
const status = await permissionModule.checkMultiple(requiredPermissions);
7979
return nativePermissionGranted(status);
8080
}
81+
8182
async requestCameraPermission(): Promise<boolean> {
8283
const requiredPermissionsStatus = await permissionModule.requestMultiple(requiredPermissions);
8384
if (!nativePermissionGranted(requiredPermissionsStatus)) return false;
8485

8586
await permissionModule.requestMultiple(optionalPermissions);
8687
return true;
8788
}
89+
8890
async hasMediaLibraryPermission(): Promise<boolean> {
8991
const status = await permissionModule.checkMultiple(mediaLibraryPermissions);
9092
return nativePermissionGranted(status);
9193
}
94+
9295
async requestMediaLibraryPermission(): Promise<boolean> {
9396
const status = await permissionModule.requestMultiple(mediaLibraryPermissions);
9497
return nativePermissionGranted(status);
@@ -129,6 +132,7 @@ const createNativeFileService = ({
129132
const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};
130133
return normalizeFile({ uri, size, name, type });
131134
}
135+
132136
async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {
133137
/**
134138
* NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}
@@ -172,17 +176,11 @@ const createNativeFileService = ({
172176
.map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),
173177
);
174178
}
179+
175180
async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {
176-
try {
177-
const { uri, size, name, type } = await documentPickerModule.pickSingle();
178-
return normalizeFile({ uri, size, name, type });
179-
} catch (e) {
180-
if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {
181-
options?.onOpenFailure?.(SBUError.UNKNOWN, e);
182-
}
183-
return null;
184-
}
181+
return await openDocument(documentPickerModule, options);
185182
}
183+
186184
async save(options: SaveOptions): Promise<string> {
187185
const hasPermission = await this.hasMediaLibraryPermission();
188186
if (!hasPermission) {
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import type * as NewDocumentsPicker from '@react-native-documents/picker';
2+
import type * as OldDocumentPicker from 'react-native-document-picker';
3+
4+
import { Logger } from '@sendbird/uikit-utils';
5+
6+
import SBUError from '../libs/SBUError';
7+
import normalizeFile from '../utils/normalizeFile';
8+
import type { FilePickerResponse, OpenDocumentOptions } from './types';
9+
10+
export type DocumentPicker = typeof OldDocumentPicker | typeof NewDocumentsPicker;
11+
12+
async function openDocumentByOldDocumentPicker(
13+
documentPickerModule: typeof OldDocumentPicker,
14+
options?: OpenDocumentOptions,
15+
): Promise<FilePickerResponse> {
16+
Logger.warn('please update to @react-native-documents/picker');
17+
try {
18+
const { uri, size, name, type } = await documentPickerModule.pickSingle();
19+
return normalizeFile({ uri, size, name, type });
20+
} catch (e) {
21+
if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {
22+
options?.onOpenFailure?.(SBUError.UNKNOWN, e);
23+
}
24+
return null;
25+
}
26+
}
27+
28+
async function openDocumentByNewDocumentsPicker(
29+
documentPickerModule: typeof NewDocumentsPicker,
30+
options?: OpenDocumentOptions,
31+
): Promise<FilePickerResponse> {
32+
try {
33+
const results = await documentPickerModule.pick();
34+
const { uri, size, name, type } = results[0];
35+
return normalizeFile({ uri, size, name, type });
36+
} catch (e) {
37+
if (
38+
!documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.OPERATION_CANCELED) &&
39+
documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.IN_PROGRESS)
40+
) {
41+
options?.onOpenFailure?.(SBUError.UNKNOWN, e);
42+
}
43+
return null;
44+
}
45+
}
46+
47+
function isOldModule(documentPicker: DocumentPicker): documentPicker is typeof OldDocumentPicker {
48+
return 'pickSingle' in documentPicker && typeof documentPicker.pickSingle === 'function';
49+
}
50+
51+
export async function openDocument(
52+
documentPickerModule: DocumentPicker,
53+
options?: OpenDocumentOptions,
54+
): Promise<FilePickerResponse> {
55+
if (isOldModule(documentPickerModule)) {
56+
return await openDocumentByOldDocumentPicker(documentPickerModule, options);
57+
}
58+
return await openDocumentByNewDocumentsPicker(documentPickerModule, options);
59+
}

sample/ios/Podfile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ require Pod::Executable.execute_command('node', ['-p',
66
{paths: [process.argv[1]]},
77
)', __dir__]).strip
88

9-
platform :ios, min_ios_version_supported
9+
# Since the minimum supported version of @react-native-documents/picker is iOS 14.
10+
platform :ios, 14
11+
# platform :ios, min_ios_version_supported
1012
prepare_react_native_project!
1113

1214
linkage = ENV['USE_FRAMEWORKS']

sample/ios/Podfile.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ PODS:
10441044
- Yoga
10451045
- react-native-create-thumbnail (2.0.0):
10461046
- React-Core
1047-
- react-native-document-picker (9.3.1):
1047+
- react-native-document-picker (10.1.2):
10481048
- DoubleConversion
10491049
- glog
10501050
- hermes-engine
@@ -1510,7 +1510,7 @@ DEPENDENCIES:
15101510
- React-Mapbuffer (from `../../node_modules/react-native/ReactCommon`)
15111511
- "react-native-cameraroll (from `../../node_modules/@react-native-camera-roll/camera-roll`)"
15121512
- react-native-create-thumbnail (from `../../node_modules/react-native-create-thumbnail`)
1513-
- react-native-document-picker (from `../../node_modules/react-native-document-picker`)
1513+
- "react-native-document-picker (from `../../node_modules/@react-native-documents/picker`)"
15141514
- react-native-image-picker (from `../../node_modules/react-native-image-picker`)
15151515
- "react-native-image-resizer (from `../../node_modules/@bam.tech/react-native-image-resizer`)"
15161516
- react-native-mmkv (from `../../node_modules/react-native-mmkv`)
@@ -1650,7 +1650,7 @@ EXTERNAL SOURCES:
16501650
react-native-create-thumbnail:
16511651
:path: "../../node_modules/react-native-create-thumbnail"
16521652
react-native-document-picker:
1653-
:path: "../../node_modules/react-native-document-picker"
1653+
:path: "../../node_modules/@react-native-documents/picker"
16541654
react-native-image-picker:
16551655
:path: "../../node_modules/react-native-image-picker"
16561656
react-native-image-resizer:
@@ -1763,7 +1763,7 @@ SPEC CHECKSUMS:
17631763
Permission-PhotoLibrary: 03c52ed95dadfb0f2ba4c7663786cce0c4e0c978
17641764
Permission-PhotoLibraryAddOnly: c4fbf91806bbdc3ed877049bc09fbe58ad9a7c97
17651765
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
1766-
RCT-Folly: 5dc73daec3476616d19e8a53f0156176f7b55461
1766+
RCT-Folly: 02617c592a293bd6d418e0a88ff4ee1f88329b47
17671767
RCTDeprecation: 4c7eeb42be0b2e95195563c49be08d0b839d22b4
17681768
RCTRequired: d530a0f489699c8500e944fde963102c42dcd0c2
17691769
RCTTypeSafety: b20878506b094fa3d9007d7b9e4be0faa3562499
@@ -1789,7 +1789,7 @@ SPEC CHECKSUMS:
17891789
React-Mapbuffer: 9f68550e7c6839d01411ac8896aea5c868eff63a
17901790
react-native-cameraroll: 4f313ab09aeaf42ac5f72dec840641da7656f104
17911791
react-native-create-thumbnail: ab55d24aea01723cf386f18b0b542aabb1982f27
1792-
react-native-document-picker: c4f197741c327270453aa9840932098e0064fd52
1792+
react-native-document-picker: 570a73e1d3a71d2b34e1c7d7d46c7f2e3c14b0cd
17931793
react-native-image-picker: c3afe5472ef870d98a4b28415fc0b928161ee5f7
17941794
react-native-image-resizer: fd0c333eca55147bd55c5e054cac95dcd0da6814
17951795
react-native-mmkv: 8c9a677e64a1ac89b0c6cf240feea528318b3074
@@ -1839,6 +1839,6 @@ SPEC CHECKSUMS:
18391839
Yoga: 04f1db30bb810187397fa4c37dd1868a27af229c
18401840
ZIPFoundation: b8c29ea7ae353b309bc810586181fd073cb3312c
18411841

1842-
PODFILE CHECKSUM: 854e85b2bbfd7d0e442b6dea393d8c15cb83909e
1842+
PODFILE CHECKSUM: a7dd46320c0e4bc28bcdaa9f6fbf4caf6e4131d4
18431843

18441844
COCOAPODS: 1.15.2

sample/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"@react-native-community/netinfo": "^11.3.2",
2424
"@react-native-community/push-notification-ios": "^1.11.0",
2525
"@react-native-community/slider": "^4.2.0",
26+
"@react-native-documents/picker": "^10.1.0",
2627
"@react-native-firebase/app": "^14.7.0",
2728
"@react-native-firebase/messaging": "^14.7.0",
2829
"@react-navigation/bottom-tabs": "^6.6.0",
@@ -41,7 +42,6 @@
4142
"react-native": "0.74.3",
4243
"react-native-audio-recorder-player": "^3.6.10",
4344
"react-native-create-thumbnail": "^2.0.0",
44-
"react-native-document-picker": "^9.3.0",
4545
"react-native-fast-image": "^8.6.3",
4646
"react-native-file-access": "^3.1.0",
4747
"react-native-image-picker": "^7.1.2",

sample/src/factory/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import * as ImageResizer from '@bam.tech/react-native-image-resizer';
22
import { CameraRoll } from '@react-native-camera-roll/camera-roll';
33
import Clipboard from '@react-native-clipboard/clipboard';
4+
import * as DocumentPicker from '@react-native-documents/picker';
45
import RNFBMessaging from '@react-native-firebase/messaging';
56
import { createNativeStackNavigator } from '@react-navigation/native-stack';
67
import { Platform, StatusBar } from 'react-native';
78
import * as AudioRecorderPlayer from 'react-native-audio-recorder-player';
89
import * as CreateThumbnail from 'react-native-create-thumbnail';
9-
import * as DocumentPicker from 'react-native-document-picker';
1010
import * as FileAccess from 'react-native-file-access';
1111
import * as ImagePicker from 'react-native-image-picker';
1212
import * as Permissions from 'react-native-permissions';

0 commit comments

Comments
 (0)