UNPKG

@sendbird/uikit-react-native

Version:

Sendbird UIKit for React Native: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.

60 lines (52 loc) 2.18 kB
import type * as NewDocumentsPicker from '@react-native-documents/picker'; import type * as OldDocumentPicker from 'react-native-document-picker'; import { Logger } from '@sendbird/uikit-utils'; import SBUError from '../libs/SBUError'; import normalizeFile from '../utils/normalizeFile'; import type { FilePickerResponse, OpenDocumentOptions } from './types'; export type DocumentPicker = typeof OldDocumentPicker | typeof NewDocumentsPicker; async function openDocumentByOldDocumentPicker( documentPickerModule: typeof OldDocumentPicker, options?: OpenDocumentOptions, ): Promise<FilePickerResponse> { Logger.warn('please update to @react-native-documents/picker'); try { const { uri, size, name, type } = await documentPickerModule.pickSingle(); return normalizeFile({ uri, size, name, type }); } catch (e) { if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) { options?.onOpenFailure?.(SBUError.UNKNOWN, e); } return null; } } async function openDocumentByNewDocumentsPicker( documentPickerModule: typeof NewDocumentsPicker, options?: OpenDocumentOptions, ): Promise<FilePickerResponse> { try { const results = await documentPickerModule.pick(); const { uri, size, name, type } = results[0]; return normalizeFile({ uri, size, name, type }); } catch (e) { if ( !documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.OPERATION_CANCELED) && documentPickerModule.isErrorWithCode(documentPickerModule.errorCodes.IN_PROGRESS) ) { options?.onOpenFailure?.(SBUError.UNKNOWN, e); } return null; } } function isOldModule(documentPicker: DocumentPicker): documentPicker is typeof OldDocumentPicker { return 'pickSingle' in documentPicker && typeof documentPicker.pickSingle === 'function'; } export async function openDocument( documentPickerModule: DocumentPicker, options?: OpenDocumentOptions, ): Promise<FilePickerResponse> { if (isOldModule(documentPickerModule)) { return await openDocumentByOldDocumentPicker(documentPickerModule, options); } return await openDocumentByNewDocumentsPicker(documentPickerModule, options); }