@sendbird/uikit-react-native 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +410 -0
- package/lib/commonjs/InternalErrorBoundary.js +84 -0
- package/lib/commonjs/InternalErrorBoundary.js.map +1 -0
- package/lib/commonjs/InternalLocalCacheStorage.js +59 -0
- package/lib/commonjs/InternalLocalCacheStorage.js.map +1 -0
- package/lib/commonjs/SendbirdUIKitContainer.js +166 -0
- package/lib/commonjs/SendbirdUIKitContainer.js.map +1 -0
- package/lib/commonjs/components/ChannelCover.js +59 -0
- package/lib/commonjs/components/ChannelCover.js.map +1 -0
- package/lib/commonjs/components/ChatFlatList.js +118 -0
- package/lib/commonjs/components/ChatFlatList.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/AdminMessage/index.js +52 -0
- package/lib/commonjs/components/MessageRenderer/AdminMessage/index.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/FileMessage/BaseFileMessage.js +76 -0
- package/lib/commonjs/components/MessageRenderer/FileMessage/BaseFileMessage.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/FileMessage/ImageFileMessage.js +61 -0
- package/lib/commonjs/components/MessageRenderer/FileMessage/ImageFileMessage.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/FileMessage/index.js +31 -0
- package/lib/commonjs/components/MessageRenderer/FileMessage/index.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/MessageContainer.js +33 -0
- package/lib/commonjs/components/MessageRenderer/MessageContainer.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/MessageDateSeparator.js +58 -0
- package/lib/commonjs/components/MessageRenderer/MessageDateSeparator.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/MessageIncomingAvatar.js +42 -0
- package/lib/commonjs/components/MessageRenderer/MessageIncomingAvatar.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/MessageIncomingSenderName.js +48 -0
- package/lib/commonjs/components/MessageRenderer/MessageIncomingSenderName.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/MessageOutgoingStatus.js +134 -0
- package/lib/commonjs/components/MessageRenderer/MessageOutgoingStatus.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/MessageTime.js +41 -0
- package/lib/commonjs/components/MessageRenderer/MessageTime.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/UnknownMessage/index.js +53 -0
- package/lib/commonjs/components/MessageRenderer/UnknownMessage/index.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/UserMessage/BaseUserMessage.js +54 -0
- package/lib/commonjs/components/MessageRenderer/UserMessage/BaseUserMessage.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js +131 -0
- package/lib/commonjs/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/UserMessage/index.js +31 -0
- package/lib/commonjs/components/MessageRenderer/UserMessage/index.js.map +1 -0
- package/lib/commonjs/components/MessageRenderer/index.js +189 -0
- package/lib/commonjs/components/MessageRenderer/index.js.map +1 -0
- package/lib/commonjs/components/NewMessagesButton.js +73 -0
- package/lib/commonjs/components/NewMessagesButton.js.map +1 -0
- package/lib/commonjs/components/ProviderLayout.js +37 -0
- package/lib/commonjs/components/ProviderLayout.js.map +1 -0
- package/lib/commonjs/components/ScrollToBottomButton.js +66 -0
- package/lib/commonjs/components/ScrollToBottomButton.js.map +1 -0
- package/lib/commonjs/components/StatusComposition.js +27 -0
- package/lib/commonjs/components/StatusComposition.js.map +1 -0
- package/lib/commonjs/components/TypedPlaceholder.js +80 -0
- package/lib/commonjs/components/TypedPlaceholder.js.map +1 -0
- package/lib/commonjs/components/UserActionBar.js +96 -0
- package/lib/commonjs/components/UserActionBar.js.map +1 -0
- package/lib/commonjs/components/UserSelectableBar.js +78 -0
- package/lib/commonjs/components/UserSelectableBar.js.map +1 -0
- package/lib/commonjs/constants.js +9 -0
- package/lib/commonjs/constants.js.map +1 -0
- package/lib/commonjs/contexts/Localization.js +29 -0
- package/lib/commonjs/contexts/Localization.js.map +1 -0
- package/lib/commonjs/contexts/PlatformService.js +33 -0
- package/lib/commonjs/contexts/PlatformService.js.map +1 -0
- package/lib/commonjs/contexts/SendbirdChat.js +87 -0
- package/lib/commonjs/contexts/SendbirdChat.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js +88 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/EditInput.js +118 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/EditInput.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/SendInput.js +148 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/SendInput.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/index.js +115 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/index.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +343 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelStatusEmpty.js +34 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelStatusEmpty.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelStatusLoading.js +34 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelStatusLoading.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/index.js +70 -0
- package/lib/commonjs/domain/groupChannel/index.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/module/createGroupChannelModule.js +45 -0
- package/lib/commonjs/domain/groupChannel/module/createGroupChannelModule.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/module/moduleContext.js +79 -0
- package/lib/commonjs/domain/groupChannel/module/moduleContext.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/types.js +6 -0
- package/lib/commonjs/domain/groupChannel/types.js.map +1 -0
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListHeader.js +38 -0
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListHeader.js.map +1 -0
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListList.js +96 -0
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListList.js.map +1 -0
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListStatusEmpty.js +34 -0
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListStatusEmpty.js.map +1 -0
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListStatusLoading.js +34 -0
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListStatusLoading.js.map +1 -0
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListTypeSelector.js +141 -0
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListTypeSelector.js.map +1 -0
- package/lib/commonjs/domain/groupChannelList/index.js +70 -0
- package/lib/commonjs/domain/groupChannelList/index.js.map +1 -0
- package/lib/commonjs/domain/groupChannelList/module/createGroupChannelListModule.js +45 -0
- package/lib/commonjs/domain/groupChannelList/module/createGroupChannelListModule.js.map +1 -0
- package/lib/commonjs/domain/groupChannelList/module/moduleContext.js +61 -0
- package/lib/commonjs/domain/groupChannelList/module/moduleContext.js.map +1 -0
- package/lib/commonjs/domain/groupChannelList/types.js +6 -0
- package/lib/commonjs/domain/groupChannelList/types.js.map +1 -0
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsHeader.js +49 -0
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsHeader.js.map +1 -0
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsInfo.js +77 -0
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsInfo.js.map +1 -0
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +94 -0
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -0
- package/lib/commonjs/domain/groupChannelSettings/index.js +54 -0
- package/lib/commonjs/domain/groupChannelSettings/index.js.map +1 -0
- package/lib/commonjs/domain/groupChannelSettings/module/createGroupChannelSettingsModule.js +37 -0
- package/lib/commonjs/domain/groupChannelSettings/module/createGroupChannelSettingsModule.js.map +1 -0
- package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js +150 -0
- package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js.map +1 -0
- package/lib/commonjs/domain/groupChannelSettings/types.js +6 -0
- package/lib/commonjs/domain/groupChannelSettings/types.js.map +1 -0
- package/lib/commonjs/domain/groupChannelUserList/types.js +6 -0
- package/lib/commonjs/domain/groupChannelUserList/types.js.map +1 -0
- package/lib/commonjs/domain/userList/component/UserListHeader.js +56 -0
- package/lib/commonjs/domain/userList/component/UserListHeader.js.map +1 -0
- package/lib/commonjs/domain/userList/component/UserListList.js +57 -0
- package/lib/commonjs/domain/userList/component/UserListList.js.map +1 -0
- package/lib/commonjs/domain/userList/component/UserListStatusEmpty.js +34 -0
- package/lib/commonjs/domain/userList/component/UserListStatusEmpty.js.map +1 -0
- package/lib/commonjs/domain/userList/component/UserListStatusError.js +38 -0
- package/lib/commonjs/domain/userList/component/UserListStatusError.js.map +1 -0
- package/lib/commonjs/domain/userList/component/UserListStatusLoading.js +34 -0
- package/lib/commonjs/domain/userList/component/UserListStatusLoading.js.map +1 -0
- package/lib/commonjs/domain/userList/index.js +70 -0
- package/lib/commonjs/domain/userList/index.js.map +1 -0
- package/lib/commonjs/domain/userList/module/createUserListModule.js +45 -0
- package/lib/commonjs/domain/userList/module/createUserListModule.js.map +1 -0
- package/lib/commonjs/domain/userList/module/moduleContext.js +54 -0
- package/lib/commonjs/domain/userList/module/moduleContext.js.map +1 -0
- package/lib/commonjs/domain/userList/types.js +6 -0
- package/lib/commonjs/domain/userList/types.js.map +1 -0
- package/lib/commonjs/fragments/createGroupChannelCreateFragment.js +145 -0
- package/lib/commonjs/fragments/createGroupChannelCreateFragment.js.map +1 -0
- package/lib/commonjs/fragments/createGroupChannelFragment.js +154 -0
- package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -0
- package/lib/commonjs/fragments/createGroupChannelInviteFragment.js +139 -0
- package/lib/commonjs/fragments/createGroupChannelInviteFragment.js.map +1 -0
- package/lib/commonjs/fragments/createGroupChannelListFragment.js +141 -0
- package/lib/commonjs/fragments/createGroupChannelListFragment.js.map +1 -0
- package/lib/commonjs/fragments/createGroupChannelMembersFragment.js +134 -0
- package/lib/commonjs/fragments/createGroupChannelMembersFragment.js.map +1 -0
- package/lib/commonjs/fragments/createGroupChannelSettingsFragment.js +67 -0
- package/lib/commonjs/fragments/createGroupChannelSettingsFragment.js.map +1 -0
- package/lib/commonjs/hooks/useConnection.js +102 -0
- package/lib/commonjs/hooks/useConnection.js.map +1 -0
- package/lib/commonjs/hooks/useContext.js +39 -0
- package/lib/commonjs/hooks/useContext.js.map +1 -0
- package/lib/commonjs/hooks/usePushTokenRegistration.js +83 -0
- package/lib/commonjs/hooks/usePushTokenRegistration.js.map +1 -0
- package/lib/commonjs/index.js +449 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/localization/StringSet.en.js +19 -0
- package/lib/commonjs/localization/StringSet.en.js.map +1 -0
- package/lib/commonjs/localization/StringSet.type.js +178 -0
- package/lib/commonjs/localization/StringSet.type.js.map +1 -0
- package/lib/commonjs/platform/createClipboardService.expo.js +23 -0
- package/lib/commonjs/platform/createClipboardService.expo.js.map +1 -0
- package/lib/commonjs/platform/createClipboardService.native.js +23 -0
- package/lib/commonjs/platform/createClipboardService.native.js.map +1 -0
- package/lib/commonjs/platform/createFileService.expo.js +176 -0
- package/lib/commonjs/platform/createFileService.expo.js.map +1 -0
- package/lib/commonjs/platform/createFileService.native.js +253 -0
- package/lib/commonjs/platform/createFileService.native.js.map +1 -0
- package/lib/commonjs/platform/createNotificationService.expo.js +50 -0
- package/lib/commonjs/platform/createNotificationService.expo.js.map +1 -0
- package/lib/commonjs/platform/createNotificationService.native.js +65 -0
- package/lib/commonjs/platform/createNotificationService.native.js.map +1 -0
- package/lib/commonjs/platform/dynamicModule.js +114 -0
- package/lib/commonjs/platform/dynamicModule.js.map +1 -0
- package/lib/commonjs/platform/types.js +2 -0
- package/lib/commonjs/platform/types.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/utils/expoPermissionGranted.js +32 -0
- package/lib/commonjs/utils/expoPermissionGranted.js.map +1 -0
- package/lib/commonjs/utils/fileTypeGuard.js +26 -0
- package/lib/commonjs/utils/fileTypeGuard.js.map +1 -0
- package/lib/commonjs/utils/nativePermissionGranted.js +23 -0
- package/lib/commonjs/utils/nativePermissionGranted.js.map +1 -0
- package/lib/commonjs/version.js +10 -0
- package/lib/commonjs/version.js.map +1 -0
- package/lib/module/InternalErrorBoundary.js +72 -0
- package/lib/module/InternalErrorBoundary.js.map +1 -0
- package/lib/module/InternalLocalCacheStorage.js +50 -0
- package/lib/module/InternalLocalCacheStorage.js.map +1 -0
- package/lib/module/SendbirdUIKitContainer.js +136 -0
- package/lib/module/SendbirdUIKitContainer.js.map +1 -0
- package/lib/module/components/ChannelCover.js +46 -0
- package/lib/module/components/ChannelCover.js.map +1 -0
- package/lib/module/components/ChatFlatList.js +102 -0
- package/lib/module/components/ChatFlatList.js.map +1 -0
- package/lib/module/components/MessageRenderer/AdminMessage/index.js +40 -0
- package/lib/module/components/MessageRenderer/AdminMessage/index.js.map +1 -0
- package/lib/module/components/MessageRenderer/FileMessage/BaseFileMessage.js +62 -0
- package/lib/module/components/MessageRenderer/FileMessage/BaseFileMessage.js.map +1 -0
- package/lib/module/components/MessageRenderer/FileMessage/ImageFileMessage.js +47 -0
- package/lib/module/components/MessageRenderer/FileMessage/ImageFileMessage.js.map +1 -0
- package/lib/module/components/MessageRenderer/FileMessage/index.js +17 -0
- package/lib/module/components/MessageRenderer/FileMessage/index.js.map +1 -0
- package/lib/module/components/MessageRenderer/MessageContainer.js +21 -0
- package/lib/module/components/MessageRenderer/MessageContainer.js.map +1 -0
- package/lib/module/components/MessageRenderer/MessageDateSeparator.js +44 -0
- package/lib/module/components/MessageRenderer/MessageDateSeparator.js.map +1 -0
- package/lib/module/components/MessageRenderer/MessageIncomingAvatar.js +30 -0
- package/lib/module/components/MessageRenderer/MessageIncomingAvatar.js.map +1 -0
- package/lib/module/components/MessageRenderer/MessageIncomingSenderName.js +35 -0
- package/lib/module/components/MessageRenderer/MessageIncomingSenderName.js.map +1 -0
- package/lib/module/components/MessageRenderer/MessageOutgoingStatus.js +116 -0
- package/lib/module/components/MessageRenderer/MessageOutgoingStatus.js.map +1 -0
- package/lib/module/components/MessageRenderer/MessageTime.js +28 -0
- package/lib/module/components/MessageRenderer/MessageTime.js.map +1 -0
- package/lib/module/components/MessageRenderer/UnknownMessage/index.js +40 -0
- package/lib/module/components/MessageRenderer/UnknownMessage/index.js.map +1 -0
- package/lib/module/components/MessageRenderer/UserMessage/BaseUserMessage.js +41 -0
- package/lib/module/components/MessageRenderer/UserMessage/BaseUserMessage.js.map +1 -0
- package/lib/module/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js +115 -0
- package/lib/module/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js.map +1 -0
- package/lib/module/components/MessageRenderer/UserMessage/index.js +18 -0
- package/lib/module/components/MessageRenderer/UserMessage/index.js.map +1 -0
- package/lib/module/components/MessageRenderer/index.js +163 -0
- package/lib/module/components/MessageRenderer/index.js.map +1 -0
- package/lib/module/components/NewMessagesButton.js +58 -0
- package/lib/module/components/NewMessagesButton.js.map +1 -0
- package/lib/module/components/ProviderLayout.js +25 -0
- package/lib/module/components/ProviderLayout.js.map +1 -0
- package/lib/module/components/ScrollToBottomButton.js +52 -0
- package/lib/module/components/ScrollToBottomButton.js.map +1 -0
- package/lib/module/components/StatusComposition.js +17 -0
- package/lib/module/components/StatusComposition.js.map +1 -0
- package/lib/module/components/TypedPlaceholder.js +68 -0
- package/lib/module/components/TypedPlaceholder.js.map +1 -0
- package/lib/module/components/UserActionBar.js +81 -0
- package/lib/module/components/UserActionBar.js.map +1 -0
- package/lib/module/components/UserSelectableBar.js +63 -0
- package/lib/module/components/UserSelectableBar.js.map +1 -0
- package/lib/module/constants.js +2 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/contexts/Localization.js +14 -0
- package/lib/module/contexts/Localization.js.map +1 -0
- package/lib/module/contexts/PlatformService.js +18 -0
- package/lib/module/contexts/PlatformService.js.map +1 -0
- package/lib/module/contexts/SendbirdChat.js +66 -0
- package/lib/module/contexts/SendbirdChat.js.map +1 -0
- package/lib/module/domain/groupChannel/component/GroupChannelHeader.js +69 -0
- package/lib/module/domain/groupChannel/component/GroupChannelHeader.js.map +1 -0
- package/lib/module/domain/groupChannel/component/GroupChannelInput/EditInput.js +102 -0
- package/lib/module/domain/groupChannel/component/GroupChannelInput/EditInput.js.map +1 -0
- package/lib/module/domain/groupChannel/component/GroupChannelInput/SendInput.js +134 -0
- package/lib/module/domain/groupChannel/component/GroupChannelInput/SendInput.js.map +1 -0
- package/lib/module/domain/groupChannel/component/GroupChannelInput/index.js +92 -0
- package/lib/module/domain/groupChannel/component/GroupChannelInput/index.js.map +1 -0
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +317 -0
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -0
- package/lib/module/domain/groupChannel/component/GroupChannelStatusEmpty.js +21 -0
- package/lib/module/domain/groupChannel/component/GroupChannelStatusEmpty.js.map +1 -0
- package/lib/module/domain/groupChannel/component/GroupChannelStatusLoading.js +21 -0
- package/lib/module/domain/groupChannel/component/GroupChannelStatusLoading.js.map +1 -0
- package/lib/module/domain/groupChannel/index.js +8 -0
- package/lib/module/domain/groupChannel/index.js.map +1 -0
- package/lib/module/domain/groupChannel/module/createGroupChannelModule.js +30 -0
- package/lib/module/domain/groupChannel/module/createGroupChannelModule.js.map +1 -0
- package/lib/module/domain/groupChannel/module/moduleContext.js +57 -0
- package/lib/module/domain/groupChannel/module/moduleContext.js.map +1 -0
- package/lib/module/domain/groupChannel/types.js +2 -0
- package/lib/module/domain/groupChannel/types.js.map +1 -0
- package/lib/module/domain/groupChannelList/component/GroupChannelListHeader.js +24 -0
- package/lib/module/domain/groupChannelList/component/GroupChannelListHeader.js.map +1 -0
- package/lib/module/domain/groupChannelList/component/GroupChannelListList.js +79 -0
- package/lib/module/domain/groupChannelList/component/GroupChannelListList.js.map +1 -0
- package/lib/module/domain/groupChannelList/component/GroupChannelListStatusEmpty.js +21 -0
- package/lib/module/domain/groupChannelList/component/GroupChannelListStatusEmpty.js.map +1 -0
- package/lib/module/domain/groupChannelList/component/GroupChannelListStatusLoading.js +21 -0
- package/lib/module/domain/groupChannelList/component/GroupChannelListStatusLoading.js.map +1 -0
- package/lib/module/domain/groupChannelList/component/GroupChannelListTypeSelector.js +124 -0
- package/lib/module/domain/groupChannelList/component/GroupChannelListTypeSelector.js.map +1 -0
- package/lib/module/domain/groupChannelList/index.js +8 -0
- package/lib/module/domain/groupChannelList/index.js.map +1 -0
- package/lib/module/domain/groupChannelList/module/createGroupChannelListModule.js +30 -0
- package/lib/module/domain/groupChannelList/module/createGroupChannelListModule.js.map +1 -0
- package/lib/module/domain/groupChannelList/module/moduleContext.js +40 -0
- package/lib/module/domain/groupChannelList/module/moduleContext.js.map +1 -0
- package/lib/module/domain/groupChannelList/types.js +2 -0
- package/lib/module/domain/groupChannelList/types.js.map +1 -0
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsHeader.js +35 -0
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsHeader.js.map +1 -0
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsInfo.js +56 -0
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsInfo.js.map +1 -0
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +78 -0
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -0
- package/lib/module/domain/groupChannelSettings/index.js +6 -0
- package/lib/module/domain/groupChannelSettings/index.js.map +1 -0
- package/lib/module/domain/groupChannelSettings/module/createGroupChannelSettingsModule.js +24 -0
- package/lib/module/domain/groupChannelSettings/module/createGroupChannelSettingsModule.js.map +1 -0
- package/lib/module/domain/groupChannelSettings/module/moduleContext.js +127 -0
- package/lib/module/domain/groupChannelSettings/module/moduleContext.js.map +1 -0
- package/lib/module/domain/groupChannelSettings/types.js +2 -0
- package/lib/module/domain/groupChannelSettings/types.js.map +1 -0
- package/lib/module/domain/groupChannelUserList/types.js +2 -0
- package/lib/module/domain/groupChannelUserList/types.js.map +1 -0
- package/lib/module/domain/userList/component/UserListHeader.js +42 -0
- package/lib/module/domain/userList/component/UserListHeader.js.map +1 -0
- package/lib/module/domain/userList/component/UserListList.js +42 -0
- package/lib/module/domain/userList/component/UserListList.js.map +1 -0
- package/lib/module/domain/userList/component/UserListStatusEmpty.js +21 -0
- package/lib/module/domain/userList/component/UserListStatusEmpty.js.map +1 -0
- package/lib/module/domain/userList/component/UserListStatusError.js +25 -0
- package/lib/module/domain/userList/component/UserListStatusError.js.map +1 -0
- package/lib/module/domain/userList/component/UserListStatusLoading.js +21 -0
- package/lib/module/domain/userList/component/UserListStatusLoading.js.map +1 -0
- package/lib/module/domain/userList/index.js +8 -0
- package/lib/module/domain/userList/index.js.map +1 -0
- package/lib/module/domain/userList/module/createUserListModule.js +30 -0
- package/lib/module/domain/userList/module/createUserListModule.js.map +1 -0
- package/lib/module/domain/userList/module/moduleContext.js +34 -0
- package/lib/module/domain/userList/module/moduleContext.js.map +1 -0
- package/lib/module/domain/userList/types.js +2 -0
- package/lib/module/domain/userList/types.js.map +1 -0
- package/lib/module/fragments/createGroupChannelCreateFragment.js +124 -0
- package/lib/module/fragments/createGroupChannelCreateFragment.js.map +1 -0
- package/lib/module/fragments/createGroupChannelFragment.js +132 -0
- package/lib/module/fragments/createGroupChannelFragment.js.map +1 -0
- package/lib/module/fragments/createGroupChannelInviteFragment.js +118 -0
- package/lib/module/fragments/createGroupChannelInviteFragment.js.map +1 -0
- package/lib/module/fragments/createGroupChannelListFragment.js +115 -0
- package/lib/module/fragments/createGroupChannelListFragment.js.map +1 -0
- package/lib/module/fragments/createGroupChannelMembersFragment.js +114 -0
- package/lib/module/fragments/createGroupChannelMembersFragment.js.map +1 -0
- package/lib/module/fragments/createGroupChannelSettingsFragment.js +52 -0
- package/lib/module/fragments/createGroupChannelSettingsFragment.js.map +1 -0
- package/lib/module/hooks/useConnection.js +79 -0
- package/lib/module/hooks/useConnection.js.map +1 -0
- package/lib/module/hooks/useContext.js +20 -0
- package/lib/module/hooks/useContext.js.map +1 -0
- package/lib/module/hooks/usePushTokenRegistration.js +69 -0
- package/lib/module/hooks/usePushTokenRegistration.js.map +1 -0
- package/lib/module/index.js +57 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/localization/StringSet.en.js +7 -0
- package/lib/module/localization/StringSet.en.js.map +1 -0
- package/lib/module/localization/StringSet.type.js +173 -0
- package/lib/module/localization/StringSet.type.js.map +1 -0
- package/lib/module/platform/createClipboardService.expo.js +15 -0
- package/lib/module/platform/createClipboardService.expo.js.map +1 -0
- package/lib/module/platform/createClipboardService.native.js +15 -0
- package/lib/module/platform/createClipboardService.native.js.map +1 -0
- package/lib/module/platform/createFileService.expo.js +164 -0
- package/lib/module/platform/createFileService.expo.js.map +1 -0
- package/lib/module/platform/createFileService.native.js +237 -0
- package/lib/module/platform/createFileService.native.js.map +1 -0
- package/lib/module/platform/createNotificationService.expo.js +42 -0
- package/lib/module/platform/createNotificationService.expo.js.map +1 -0
- package/lib/module/platform/createNotificationService.native.js +57 -0
- package/lib/module/platform/createNotificationService.native.js.map +1 -0
- package/lib/module/platform/dynamicModule.js +103 -0
- package/lib/module/platform/dynamicModule.js.map +1 -0
- package/lib/module/platform/types.js +2 -0
- package/lib/module/platform/types.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/expoPermissionGranted.js +24 -0
- package/lib/module/utils/expoPermissionGranted.js.map +1 -0
- package/lib/module/utils/fileTypeGuard.js +18 -0
- package/lib/module/utils/fileTypeGuard.js.map +1 -0
- package/lib/module/utils/nativePermissionGranted.js +15 -0
- package/lib/module/utils/nativePermissionGranted.js.map +1 -0
- package/lib/module/version.js +3 -0
- package/lib/module/version.js.map +1 -0
- package/lib/typescript/__template__/component/__domain__Header.d.ts +4 -0
- package/lib/typescript/__template__/component/__domain__StatusEmpty.d.ts +3 -0
- package/lib/typescript/__template__/component/__domain__StatusLoading.d.ts +3 -0
- package/lib/typescript/__template__/component/__domain__View.d.ts +4 -0
- package/lib/typescript/__template__/create__domain__Fragment.d.ts +2 -0
- package/lib/typescript/__template__/index.d.ts +6 -0
- package/lib/typescript/__template__/module/create__domain__Module.d.ts +3 -0
- package/lib/typescript/__template__/module/moduleContext.d.ts +4 -0
- package/lib/typescript/__template__/types.d.ts +31 -0
- package/lib/typescript/src/InternalErrorBoundary.d.ts +18 -0
- package/lib/typescript/src/InternalLocalCacheStorage.d.ts +12 -0
- package/lib/typescript/src/SendbirdUIKitContainer.d.ts +42 -0
- package/lib/typescript/src/components/ChannelCover.d.ts +10 -0
- package/lib/typescript/src/components/ChatFlatList.d.ts +14 -0
- package/lib/typescript/src/components/MessageRenderer/AdminMessage/index.d.ts +6 -0
- package/lib/typescript/src/components/MessageRenderer/FileMessage/BaseFileMessage.d.ts +6 -0
- package/lib/typescript/src/components/MessageRenderer/FileMessage/ImageFileMessage.d.ts +4 -0
- package/lib/typescript/src/components/MessageRenderer/FileMessage/index.d.ts +6 -0
- package/lib/typescript/src/components/MessageRenderer/MessageContainer.d.ts +3 -0
- package/lib/typescript/src/components/MessageRenderer/MessageDateSeparator.d.ts +8 -0
- package/lib/typescript/src/components/MessageRenderer/MessageIncomingAvatar.d.ts +8 -0
- package/lib/typescript/src/components/MessageRenderer/MessageIncomingSenderName.d.ts +8 -0
- package/lib/typescript/src/components/MessageRenderer/MessageOutgoingStatus.d.ts +8 -0
- package/lib/typescript/src/components/MessageRenderer/MessageTime.d.ts +10 -0
- package/lib/typescript/src/components/MessageRenderer/UnknownMessage/index.d.ts +5 -0
- package/lib/typescript/src/components/MessageRenderer/UserMessage/BaseUserMessage.d.ts +4 -0
- package/lib/typescript/src/components/MessageRenderer/UserMessage/OpenGraphUserMessage.d.ts +8 -0
- package/lib/typescript/src/components/MessageRenderer/UserMessage/index.d.ts +6 -0
- package/lib/typescript/src/components/MessageRenderer/index.d.ts +23 -0
- package/lib/typescript/src/components/NewMessagesButton.d.ts +9 -0
- package/lib/typescript/src/components/ProviderLayout.d.ts +3 -0
- package/lib/typescript/src/components/ScrollToBottomButton.d.ts +7 -0
- package/lib/typescript/src/components/StatusComposition.d.ts +10 -0
- package/lib/typescript/src/components/TypedPlaceholder.d.ts +7 -0
- package/lib/typescript/src/components/UserActionBar.d.ts +11 -0
- package/lib/typescript/src/components/UserSelectableBar.d.ts +9 -0
- package/lib/typescript/src/constants.d.ts +1 -0
- package/lib/typescript/src/contexts/Localization.d.ts +12 -0
- package/lib/typescript/src/contexts/PlatformService.d.ts +10 -0
- package/lib/typescript/src/contexts/SendbirdChat.d.ts +24 -0
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelHeader.d.ts +4 -0
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput/EditInput.d.ts +11 -0
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput/SendInput.d.ts +9 -0
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput/index.d.ts +9 -0
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +36 -0
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelStatusEmpty.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelStatusLoading.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannel/index.d.ts +7 -0
- package/lib/typescript/src/domain/groupChannel/module/createGroupChannelModule.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannel/module/moduleContext.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannel/types.d.ts +102 -0
- package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListHeader.d.ts +4 -0
- package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListList.d.ts +4 -0
- package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListStatusEmpty.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListStatusLoading.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListTypeSelector.d.ts +4 -0
- package/lib/typescript/src/domain/groupChannelList/index.d.ts +7 -0
- package/lib/typescript/src/domain/groupChannelList/module/createGroupChannelListModule.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannelList/module/moduleContext.d.ts +4 -0
- package/lib/typescript/src/domain/groupChannelList/types.d.ts +81 -0
- package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsHeader.d.ts +4 -0
- package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsInfo.d.ts +4 -0
- package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.d.ts +4 -0
- package/lib/typescript/src/domain/groupChannelSettings/index.d.ts +5 -0
- package/lib/typescript/src/domain/groupChannelSettings/module/createGroupChannelSettingsModule.d.ts +3 -0
- package/lib/typescript/src/domain/groupChannelSettings/module/moduleContext.d.ts +4 -0
- package/lib/typescript/src/domain/groupChannelSettings/types.d.ts +45 -0
- package/lib/typescript/src/domain/groupChannelUserList/types.d.ts +42 -0
- package/lib/typescript/src/domain/userList/component/UserListHeader.d.ts +10 -0
- package/lib/typescript/src/domain/userList/component/UserListList.d.ts +11 -0
- package/lib/typescript/src/domain/userList/component/UserListStatusEmpty.d.ts +3 -0
- package/lib/typescript/src/domain/userList/component/UserListStatusError.d.ts +3 -0
- package/lib/typescript/src/domain/userList/component/UserListStatusLoading.d.ts +3 -0
- package/lib/typescript/src/domain/userList/index.d.ts +7 -0
- package/lib/typescript/src/domain/userList/module/createUserListModule.d.ts +3 -0
- package/lib/typescript/src/domain/userList/module/moduleContext.d.ts +4 -0
- package/lib/typescript/src/domain/userList/types.d.ts +58 -0
- package/lib/typescript/src/fragments/createGroupChannelCreateFragment.d.ts +4 -0
- package/lib/typescript/src/fragments/createGroupChannelFragment.d.ts +3 -0
- package/lib/typescript/src/fragments/createGroupChannelInviteFragment.d.ts +4 -0
- package/lib/typescript/src/fragments/createGroupChannelListFragment.d.ts +3 -0
- package/lib/typescript/src/fragments/createGroupChannelMembersFragment.d.ts +5 -0
- package/lib/typescript/src/fragments/createGroupChannelSettingsFragment.d.ts +3 -0
- package/lib/typescript/src/hooks/useConnection.d.ts +11 -0
- package/lib/typescript/src/hooks/useContext.d.ts +22 -0
- package/lib/typescript/src/hooks/usePushTokenRegistration.d.ts +5 -0
- package/lib/typescript/src/index.d.ts +50 -0
- package/lib/typescript/src/localization/StringSet.en.d.ts +2 -0
- package/lib/typescript/src/localization/StringSet.type.d.ts +157 -0
- package/lib/typescript/src/platform/createClipboardService.expo.d.ts +4 -0
- package/lib/typescript/src/platform/createClipboardService.native.d.ts +4 -0
- package/lib/typescript/src/platform/createFileService.expo.d.ts +12 -0
- package/lib/typescript/src/platform/createFileService.native.d.ts +14 -0
- package/lib/typescript/src/platform/createNotificationService.expo.d.ts +4 -0
- package/lib/typescript/src/platform/createNotificationService.native.d.ts +8 -0
- package/lib/typescript/src/platform/dynamicModule.d.ts +23 -0
- package/lib/typescript/src/platform/types.d.ts +47 -0
- package/lib/typescript/src/types.d.ts +20 -0
- package/lib/typescript/src/utils/expoPermissionGranted.d.ts +13 -0
- package/lib/typescript/src/utils/fileTypeGuard.d.ts +4 -0
- package/lib/typescript/src/utils/nativePermissionGranted.d.ts +3 -0
- package/lib/typescript/src/version.d.ts +2 -0
- package/package.json +154 -0
- package/src/InternalErrorBoundary.tsx +52 -0
- package/src/InternalLocalCacheStorage.ts +45 -0
- package/src/SendbirdUIKitContainer.tsx +183 -0
- package/src/components/ChannelCover.tsx +44 -0
- package/src/components/ChatFlatList.tsx +96 -0
- package/src/components/MessageRenderer/AdminMessage/index.tsx +40 -0
- package/src/components/MessageRenderer/FileMessage/BaseFileMessage.tsx +48 -0
- package/src/components/MessageRenderer/FileMessage/ImageFileMessage.tsx +39 -0
- package/src/components/MessageRenderer/FileMessage/index.tsx +17 -0
- package/src/components/MessageRenderer/MessageContainer.tsx +17 -0
- package/src/components/MessageRenderer/MessageDateSeparator.tsx +43 -0
- package/src/components/MessageRenderer/MessageIncomingAvatar.tsx +24 -0
- package/src/components/MessageRenderer/MessageIncomingSenderName.tsx +33 -0
- package/src/components/MessageRenderer/MessageOutgoingStatus.tsx +88 -0
- package/src/components/MessageRenderer/MessageTime.tsx +24 -0
- package/src/components/MessageRenderer/UnknownMessage/index.tsx +34 -0
- package/src/components/MessageRenderer/UserMessage/BaseUserMessage.tsx +34 -0
- package/src/components/MessageRenderer/UserMessage/OpenGraphUserMessage.tsx +110 -0
- package/src/components/MessageRenderer/UserMessage/index.tsx +17 -0
- package/src/components/MessageRenderer/index.tsx +163 -0
- package/src/components/NewMessagesButton.tsx +52 -0
- package/src/components/ProviderLayout.tsx +17 -0
- package/src/components/ScrollToBottomButton.tsx +48 -0
- package/src/components/StatusComposition.tsx +16 -0
- package/src/components/TypedPlaceholder.tsx +48 -0
- package/src/components/UserActionBar.tsx +73 -0
- package/src/components/UserSelectableBar.tsx +58 -0
- package/src/constants.ts +1 -0
- package/src/contexts/Localization.tsx +17 -0
- package/src/contexts/PlatformService.tsx +23 -0
- package/src/contexts/SendbirdChat.tsx +110 -0
- package/src/domain/groupChannel/component/GroupChannelHeader.tsx +52 -0
- package/src/domain/groupChannel/component/GroupChannelInput/EditInput.tsx +92 -0
- package/src/domain/groupChannel/component/GroupChannelInput/SendInput.tsx +141 -0
- package/src/domain/groupChannel/component/GroupChannelInput/index.tsx +72 -0
- package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +308 -0
- package/src/domain/groupChannel/component/GroupChannelStatusEmpty.tsx +18 -0
- package/src/domain/groupChannel/component/GroupChannelStatusLoading.tsx +18 -0
- package/src/domain/groupChannel/index.ts +7 -0
- package/src/domain/groupChannel/module/createGroupChannelModule.tsx +21 -0
- package/src/domain/groupChannel/module/moduleContext.tsx +76 -0
- package/src/domain/groupChannel/types.ts +125 -0
- package/src/domain/groupChannelList/component/GroupChannelListHeader.tsx +20 -0
- package/src/domain/groupChannelList/component/GroupChannelListList.tsx +75 -0
- package/src/domain/groupChannelList/component/GroupChannelListStatusEmpty.tsx +18 -0
- package/src/domain/groupChannelList/component/GroupChannelListStatusLoading.tsx +18 -0
- package/src/domain/groupChannelList/component/GroupChannelListTypeSelector.tsx +114 -0
- package/src/domain/groupChannelList/index.ts +7 -0
- package/src/domain/groupChannelList/module/createGroupChannelListModule.tsx +21 -0
- package/src/domain/groupChannelList/module/moduleContext.tsx +40 -0
- package/src/domain/groupChannelList/types.ts +92 -0
- package/src/domain/groupChannelSettings/component/GroupChannelSettingsHeader.tsx +29 -0
- package/src/domain/groupChannelSettings/component/GroupChannelSettingsInfo.tsx +47 -0
- package/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.tsx +77 -0
- package/src/domain/groupChannelSettings/index.ts +5 -0
- package/src/domain/groupChannelSettings/module/createGroupChannelSettingsModule.tsx +17 -0
- package/src/domain/groupChannelSettings/module/moduleContext.tsx +146 -0
- package/src/domain/groupChannelSettings/types.ts +50 -0
- package/src/domain/groupChannelUserList/types.ts +50 -0
- package/src/domain/userList/component/UserListHeader.tsx +39 -0
- package/src/domain/userList/component/UserListList.tsx +36 -0
- package/src/domain/userList/component/UserListStatusEmpty.tsx +18 -0
- package/src/domain/userList/component/UserListStatusError.tsx +19 -0
- package/src/domain/userList/component/UserListStatusLoading.tsx +18 -0
- package/src/domain/userList/index.ts +7 -0
- package/src/domain/userList/module/createUserListModule.tsx +21 -0
- package/src/domain/userList/module/moduleContext.tsx +36 -0
- package/src/domain/userList/types.ts +65 -0
- package/src/fragments/createGroupChannelCreateFragment.tsx +136 -0
- package/src/fragments/createGroupChannelFragment.tsx +153 -0
- package/src/fragments/createGroupChannelInviteFragment.tsx +127 -0
- package/src/fragments/createGroupChannelListFragment.tsx +113 -0
- package/src/fragments/createGroupChannelMembersFragment.tsx +112 -0
- package/src/fragments/createGroupChannelSettingsFragment.tsx +56 -0
- package/src/hooks/useConnection.ts +82 -0
- package/src/hooks/useContext.ts +25 -0
- package/src/hooks/usePushTokenRegistration.ts +64 -0
- package/src/index.ts +104 -0
- package/src/localization/StringSet.en.ts +7 -0
- package/src/localization/StringSet.type.ts +334 -0
- package/src/platform/createClipboardService.expo.ts +16 -0
- package/src/platform/createClipboardService.native.ts +16 -0
- package/src/platform/createFileService.expo.ts +142 -0
- package/src/platform/createFileService.native.ts +191 -0
- package/src/platform/createNotificationService.expo.ts +36 -0
- package/src/platform/createNotificationService.native.ts +60 -0
- package/src/platform/dynamicModule.ts +110 -0
- package/src/platform/types.ts +51 -0
- package/src/types.ts +18 -0
- package/src/utils/expoPermissionGranted.ts +39 -0
- package/src/utils/fileTypeGuard.ts +10 -0
- package/src/utils/nativePermissionGranted.ts +14 -0
- package/src/version.ts +2 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type * as Clipboard from 'expo-clipboard';
|
|
2
|
+
|
|
3
|
+
import type { ClipboardServiceInterface } from './types';
|
|
4
|
+
|
|
5
|
+
const createExpoClipboardService = (clipboardModule: typeof Clipboard): ClipboardServiceInterface => {
|
|
6
|
+
return {
|
|
7
|
+
getString(): Promise<string> {
|
|
8
|
+
return clipboardModule.getStringAsync();
|
|
9
|
+
},
|
|
10
|
+
setString(text: string) {
|
|
11
|
+
return clipboardModule.setString(text);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default createExpoClipboardService;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type Clipboard from '@react-native-clipboard/clipboard';
|
|
2
|
+
|
|
3
|
+
import type { ClipboardServiceInterface } from './types';
|
|
4
|
+
|
|
5
|
+
const createNativeClipboardService = (clipboardModule: typeof Clipboard): ClipboardServiceInterface => {
|
|
6
|
+
return {
|
|
7
|
+
getString(): Promise<string> {
|
|
8
|
+
return clipboardModule.getString();
|
|
9
|
+
},
|
|
10
|
+
setString(text: string) {
|
|
11
|
+
return clipboardModule.setString(text);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default createNativeClipboardService;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import type ExpoDocumentPicker from 'expo-document-picker';
|
|
2
|
+
import type ExpoFs from 'expo-file-system';
|
|
3
|
+
import type ExpoImagePicker from 'expo-image-picker';
|
|
4
|
+
import type ExpoMediaLibrary from 'expo-media-library';
|
|
5
|
+
|
|
6
|
+
import { getFileExtension, getFileType } from '@sendbird/uikit-utils';
|
|
7
|
+
|
|
8
|
+
import type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';
|
|
9
|
+
import expoPermissionGranted from '../utils/expoPermissionGranted';
|
|
10
|
+
import fileTypeGuard from '../utils/fileTypeGuard';
|
|
11
|
+
import type {
|
|
12
|
+
FilePickerResponse,
|
|
13
|
+
FileServiceInterface,
|
|
14
|
+
OpenCameraOptions,
|
|
15
|
+
OpenDocumentOptions,
|
|
16
|
+
OpenMediaLibraryOptions,
|
|
17
|
+
SaveOptions,
|
|
18
|
+
} from './types';
|
|
19
|
+
|
|
20
|
+
const createExpoFileService = ({
|
|
21
|
+
imagePickerModule,
|
|
22
|
+
documentPickerModule,
|
|
23
|
+
mediaLibraryModule,
|
|
24
|
+
fsModule,
|
|
25
|
+
}: {
|
|
26
|
+
imagePickerModule: typeof ExpoImagePicker;
|
|
27
|
+
documentPickerModule: typeof ExpoDocumentPicker;
|
|
28
|
+
mediaLibraryModule: typeof ExpoMediaLibrary;
|
|
29
|
+
fsModule: typeof ExpoFs;
|
|
30
|
+
}): FileServiceInterface => {
|
|
31
|
+
class ExpoFileServiceInterface implements FileServiceInterface {
|
|
32
|
+
async hasCameraPermission(): Promise<boolean> {
|
|
33
|
+
const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;
|
|
34
|
+
return expoPermissionGranted([res]);
|
|
35
|
+
}
|
|
36
|
+
async requestCameraPermission(): Promise<boolean> {
|
|
37
|
+
const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;
|
|
38
|
+
return expoPermissionGranted([res]);
|
|
39
|
+
}
|
|
40
|
+
async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {
|
|
41
|
+
const perms = (await mediaLibraryModule.getPermissionsAsync(
|
|
42
|
+
type === 'write',
|
|
43
|
+
)) as ExpoMediaLibraryPermissionResponse;
|
|
44
|
+
return expoPermissionGranted([perms]);
|
|
45
|
+
}
|
|
46
|
+
async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {
|
|
47
|
+
const perms = (await mediaLibraryModule.requestPermissionsAsync(
|
|
48
|
+
type === 'write',
|
|
49
|
+
)) as ExpoMediaLibraryPermissionResponse;
|
|
50
|
+
return expoPermissionGranted([perms]);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {
|
|
54
|
+
const hasPermission = await this.hasCameraPermission();
|
|
55
|
+
if (!hasPermission) {
|
|
56
|
+
const granted = await this.requestCameraPermission();
|
|
57
|
+
if (!granted) {
|
|
58
|
+
options?.onOpenFailureWithToastMessage?.();
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const response = await imagePickerModule.launchCameraAsync({
|
|
64
|
+
mediaTypes: (() => {
|
|
65
|
+
switch (options?.mediaType) {
|
|
66
|
+
case 'photo':
|
|
67
|
+
return imagePickerModule.MediaTypeOptions.Images;
|
|
68
|
+
case 'video':
|
|
69
|
+
return imagePickerModule.MediaTypeOptions.Videos;
|
|
70
|
+
default:
|
|
71
|
+
return imagePickerModule.MediaTypeOptions.All;
|
|
72
|
+
}
|
|
73
|
+
})(),
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (response.cancelled) return null;
|
|
77
|
+
|
|
78
|
+
const { uri } = response;
|
|
79
|
+
const { size } = await fsModule.getInfoAsync(response.uri);
|
|
80
|
+
const ext = getFileExtension(uri);
|
|
81
|
+
const type = getFileType(ext);
|
|
82
|
+
|
|
83
|
+
return fileTypeGuard({ uri, size, type: `${type}/${ext.slice(1)}`, name: Date.now() + ext });
|
|
84
|
+
}
|
|
85
|
+
async openMediaLibrary(options: OpenMediaLibraryOptions) {
|
|
86
|
+
const selectionLimit = options?.selectionLimit || 1;
|
|
87
|
+
const hasPermission = await this.hasMediaLibraryPermission('read');
|
|
88
|
+
if (!hasPermission) {
|
|
89
|
+
const granted = await this.requestMediaLibraryPermission('read');
|
|
90
|
+
if (!granted) {
|
|
91
|
+
options?.onOpenFailureWithToastMessage?.();
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const response = await imagePickerModule.launchImageLibraryAsync({ allowsMultipleSelection: true });
|
|
97
|
+
if (response.cancelled) return null;
|
|
98
|
+
|
|
99
|
+
return Promise.all(
|
|
100
|
+
response.selected.slice(0, selectionLimit).map(async ({ uri }) => {
|
|
101
|
+
const { size } = await fsModule.getInfoAsync(uri);
|
|
102
|
+
const ext = getFileExtension(uri);
|
|
103
|
+
const type = getFileType(ext);
|
|
104
|
+
return fileTypeGuard({ uri, size, type: `${type}/${ext.slice(1)}`, name: Date.now() + ext });
|
|
105
|
+
}),
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {
|
|
110
|
+
try {
|
|
111
|
+
const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });
|
|
112
|
+
if (response.type === 'cancel') return null;
|
|
113
|
+
const { mimeType, uri, size, name } = response;
|
|
114
|
+
return fileTypeGuard({ uri, size, name, type: mimeType });
|
|
115
|
+
} catch {
|
|
116
|
+
options?.onOpenFailureWithToastMessage?.();
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async save(options: SaveOptions): Promise<string> {
|
|
122
|
+
const hasPermission = await this.hasMediaLibraryPermission('write');
|
|
123
|
+
if (!hasPermission) {
|
|
124
|
+
const granted = await this.requestMediaLibraryPermission('write');
|
|
125
|
+
if (!granted) throw new Error('Permission not granted');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;
|
|
129
|
+
if (!basePath) throw new Error('Cannot determine directory');
|
|
130
|
+
|
|
131
|
+
const downloadPath = `${basePath}/${options.fileName}`;
|
|
132
|
+
|
|
133
|
+
const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);
|
|
134
|
+
await mediaLibraryModule.saveToLibraryAsync(response.uri);
|
|
135
|
+
return response.uri;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return new ExpoFileServiceInterface();
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
export default createExpoFileService;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import type CameraRoll from '@react-native-community/cameraroll';
|
|
2
|
+
import { Platform } from 'react-native';
|
|
3
|
+
import type * as DocumentPicker from 'react-native-document-picker';
|
|
4
|
+
import type * as FileAccess from 'react-native-file-access';
|
|
5
|
+
import type * as ImagePicker from 'react-native-image-picker';
|
|
6
|
+
import type * as Permissions from 'react-native-permissions';
|
|
7
|
+
import type { Permission } from 'react-native-permissions';
|
|
8
|
+
|
|
9
|
+
import { getFileExtension, getFileType } from '@sendbird/uikit-utils';
|
|
10
|
+
|
|
11
|
+
import fileTypeGuard from '../utils/fileTypeGuard';
|
|
12
|
+
import nativePermissionGranted from '../utils/nativePermissionGranted';
|
|
13
|
+
import type {
|
|
14
|
+
FilePickerResponse,
|
|
15
|
+
FileServiceInterface,
|
|
16
|
+
OpenCameraOptions,
|
|
17
|
+
OpenDocumentOptions,
|
|
18
|
+
OpenMediaLibraryOptions,
|
|
19
|
+
SaveOptions,
|
|
20
|
+
} from './types';
|
|
21
|
+
|
|
22
|
+
function getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {
|
|
23
|
+
if (Platform.OS !== 'android') return [];
|
|
24
|
+
|
|
25
|
+
if (Platform.Version > 32) {
|
|
26
|
+
return [
|
|
27
|
+
permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_AUDIO,
|
|
28
|
+
permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_IMAGES,
|
|
29
|
+
permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_VIDEO,
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (Platform.Version > 28) {
|
|
34
|
+
return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return [
|
|
38
|
+
permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,
|
|
39
|
+
permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const createNativeFileService = ({
|
|
44
|
+
imagePickerModule,
|
|
45
|
+
documentPickerModule,
|
|
46
|
+
permissionModule,
|
|
47
|
+
mediaLibraryModule,
|
|
48
|
+
fsModule,
|
|
49
|
+
}: {
|
|
50
|
+
imagePickerModule: typeof ImagePicker;
|
|
51
|
+
documentPickerModule: typeof DocumentPicker;
|
|
52
|
+
permissionModule: typeof Permissions;
|
|
53
|
+
mediaLibraryModule: typeof CameraRoll;
|
|
54
|
+
fsModule: typeof FileAccess;
|
|
55
|
+
}): FileServiceInterface => {
|
|
56
|
+
const cameraPermissions: Permission[] = Platform.select({
|
|
57
|
+
ios: [permissionModule.PERMISSIONS.IOS.CAMERA],
|
|
58
|
+
android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],
|
|
59
|
+
default: [],
|
|
60
|
+
});
|
|
61
|
+
const mediaLibraryPermissions: Permission[] = Platform.select({
|
|
62
|
+
ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],
|
|
63
|
+
android: getAndroidStoragePermissionsByAPILevel(permissionModule),
|
|
64
|
+
default: [],
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
class NativeFileService implements FileServiceInterface {
|
|
68
|
+
async hasCameraPermission(): Promise<boolean> {
|
|
69
|
+
const status = await permissionModule.checkMultiple(cameraPermissions);
|
|
70
|
+
return nativePermissionGranted(status);
|
|
71
|
+
}
|
|
72
|
+
async requestCameraPermission(): Promise<boolean> {
|
|
73
|
+
const status = await permissionModule.requestMultiple(cameraPermissions);
|
|
74
|
+
return nativePermissionGranted(status);
|
|
75
|
+
}
|
|
76
|
+
async hasMediaLibraryPermission(): Promise<boolean> {
|
|
77
|
+
const status = await permissionModule.checkMultiple(mediaLibraryPermissions);
|
|
78
|
+
return nativePermissionGranted(status);
|
|
79
|
+
}
|
|
80
|
+
async requestMediaLibraryPermission(): Promise<boolean> {
|
|
81
|
+
const status = await permissionModule.requestMultiple(mediaLibraryPermissions);
|
|
82
|
+
return nativePermissionGranted(status);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {
|
|
86
|
+
const hasPermission = await this.hasCameraPermission();
|
|
87
|
+
if (!hasPermission) {
|
|
88
|
+
const granted = await this.requestCameraPermission();
|
|
89
|
+
if (!granted) {
|
|
90
|
+
options?.onOpenFailureWithToastMessage?.();
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const response = await imagePickerModule.launchCamera({
|
|
96
|
+
cameraType: options?.cameraType ?? 'back',
|
|
97
|
+
mediaType: options?.mediaType ?? 'photo',
|
|
98
|
+
});
|
|
99
|
+
if (response.didCancel) return null;
|
|
100
|
+
if (response.errorCode === 'camera_unavailable') {
|
|
101
|
+
options?.onOpenFailureWithToastMessage?.();
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};
|
|
106
|
+
return fileTypeGuard({ uri, size, name, type });
|
|
107
|
+
}
|
|
108
|
+
async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {
|
|
109
|
+
/**
|
|
110
|
+
* NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}
|
|
111
|
+
* We do not support 0 (any number of files)
|
|
112
|
+
**/
|
|
113
|
+
const selectionLimit = options?.selectionLimit || 1;
|
|
114
|
+
const hasPermission = await this.hasMediaLibraryPermission();
|
|
115
|
+
if (!hasPermission) {
|
|
116
|
+
const granted = await this.requestMediaLibraryPermission();
|
|
117
|
+
if (!granted) {
|
|
118
|
+
options?.onOpenFailureWithToastMessage?.();
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const response = await imagePickerModule.launchImageLibrary({
|
|
124
|
+
selectionLimit,
|
|
125
|
+
mediaType: (() => {
|
|
126
|
+
switch (options?.mediaType) {
|
|
127
|
+
case 'photo':
|
|
128
|
+
return 'photo';
|
|
129
|
+
case 'video':
|
|
130
|
+
return 'video';
|
|
131
|
+
default:
|
|
132
|
+
return 'mixed';
|
|
133
|
+
}
|
|
134
|
+
})(),
|
|
135
|
+
});
|
|
136
|
+
if (response.didCancel) return null;
|
|
137
|
+
if (response.errorCode === 'camera_unavailable') {
|
|
138
|
+
options?.onOpenFailureWithToastMessage?.();
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return (response.assets || [])
|
|
143
|
+
.slice(0, selectionLimit)
|
|
144
|
+
.map(({ fileName: name, fileSize: size, type, uri }) => fileTypeGuard({ uri, size, name, type }));
|
|
145
|
+
}
|
|
146
|
+
async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {
|
|
147
|
+
try {
|
|
148
|
+
const { uri, size, name, type } = await documentPickerModule.pickSingle();
|
|
149
|
+
return fileTypeGuard({ uri, size, name, type });
|
|
150
|
+
} catch (e) {
|
|
151
|
+
if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {
|
|
152
|
+
options?.onOpenFailureWithToastMessage?.();
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async save(options: SaveOptions): Promise<string> {
|
|
158
|
+
const hasPermission = await this.hasMediaLibraryPermission();
|
|
159
|
+
if (!hasPermission) {
|
|
160
|
+
const granted = await this.requestMediaLibraryPermission();
|
|
161
|
+
if (!granted) throw new Error('Permission not granted');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const basePath = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });
|
|
165
|
+
let downloadPath = `${basePath}/${options.fileName}`;
|
|
166
|
+
if (!getFileExtension(options.fileName)) {
|
|
167
|
+
const extensionFromUrl = getFileExtension(options.fileUrl);
|
|
168
|
+
if (getFileType(extensionFromUrl).match(/image|video/)) {
|
|
169
|
+
downloadPath += extensionFromUrl;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
await fsModule.FileSystem.fetch(options.fileUrl, { path: downloadPath });
|
|
174
|
+
const fileType = getFileType(getFileExtension(options.fileUrl));
|
|
175
|
+
|
|
176
|
+
if (Platform.OS === 'ios' && fileType.match(/image|video/)) {
|
|
177
|
+
await mediaLibraryModule.save(downloadPath);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (Platform.OS === 'android') {
|
|
181
|
+
const dirType = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;
|
|
182
|
+
await fsModule.FileSystem.cpExternal(downloadPath, options.fileName, dirType[fileType]);
|
|
183
|
+
}
|
|
184
|
+
return downloadPath;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return new NativeFileService();
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
export default createNativeFileService;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type ExpoNotification from 'expo-notifications';
|
|
2
|
+
|
|
3
|
+
import type { ExpoPushPermissionResponse } from '../utils/expoPermissionGranted';
|
|
4
|
+
import type { NotificationServiceInterface } from './types';
|
|
5
|
+
|
|
6
|
+
const createExpoNotificationService = (messagingModule: typeof ExpoNotification): NotificationServiceInterface => {
|
|
7
|
+
const authorizedStatus = [
|
|
8
|
+
messagingModule.IosAuthorizationStatus.AUTHORIZED,
|
|
9
|
+
messagingModule.IosAuthorizationStatus.PROVISIONAL,
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
async getAPNSToken(): Promise<string | null> {
|
|
14
|
+
const response = await messagingModule.getDevicePushTokenAsync();
|
|
15
|
+
return response.data;
|
|
16
|
+
},
|
|
17
|
+
async getFCMToken(): Promise<string | null> {
|
|
18
|
+
const response = await messagingModule.getDevicePushTokenAsync();
|
|
19
|
+
return response.data;
|
|
20
|
+
},
|
|
21
|
+
async hasPushPermission(): Promise<boolean> {
|
|
22
|
+
const status = (await messagingModule.getPermissionsAsync()) as ExpoPushPermissionResponse;
|
|
23
|
+
return Boolean(status.granted || (status.ios?.status && authorizedStatus.includes(status.ios.status)));
|
|
24
|
+
},
|
|
25
|
+
async requestPushPermission(): Promise<boolean> {
|
|
26
|
+
const status = (await messagingModule.requestPermissionsAsync()) as ExpoPushPermissionResponse;
|
|
27
|
+
return Boolean(status.granted || (status.ios?.status && authorizedStatus.includes(status.ios.status)));
|
|
28
|
+
},
|
|
29
|
+
onTokenRefresh(handler: (token: string) => void): () => void | undefined {
|
|
30
|
+
const subscription = messagingModule.addPushTokenListener(({ data }) => handler(data));
|
|
31
|
+
return () => messagingModule.removePushTokenSubscription(subscription);
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export default createExpoNotificationService;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type RNFBMessaging from '@react-native-firebase/messaging';
|
|
2
|
+
import { Platform } from 'react-native';
|
|
3
|
+
import type * as Permissions from 'react-native-permissions';
|
|
4
|
+
|
|
5
|
+
import type { NotificationServiceInterface } from './types';
|
|
6
|
+
|
|
7
|
+
const createNativeNotificationService = ({
|
|
8
|
+
messagingModule,
|
|
9
|
+
permissionModule,
|
|
10
|
+
}: {
|
|
11
|
+
messagingModule: typeof RNFBMessaging;
|
|
12
|
+
permissionModule: typeof Permissions;
|
|
13
|
+
}): NotificationServiceInterface => {
|
|
14
|
+
const module = messagingModule();
|
|
15
|
+
const authorizedStatus = [
|
|
16
|
+
messagingModule.AuthorizationStatus.AUTHORIZED,
|
|
17
|
+
messagingModule.AuthorizationStatus.PROVISIONAL,
|
|
18
|
+
];
|
|
19
|
+
return {
|
|
20
|
+
getAPNSToken(): Promise<string | null> {
|
|
21
|
+
return module.getAPNSToken();
|
|
22
|
+
},
|
|
23
|
+
getFCMToken(): Promise<string | null> {
|
|
24
|
+
return module.getToken();
|
|
25
|
+
},
|
|
26
|
+
async hasPushPermission(): Promise<boolean> {
|
|
27
|
+
if (Platform.OS === 'android') {
|
|
28
|
+
const result = await permissionModule.checkNotifications();
|
|
29
|
+
return result.status === 'granted';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (Platform.OS === 'ios') {
|
|
33
|
+
const status = await module.hasPermission();
|
|
34
|
+
return authorizedStatus.includes(status);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return false;
|
|
38
|
+
},
|
|
39
|
+
async requestPushPermission(): Promise<boolean> {
|
|
40
|
+
if (Platform.OS === 'android') {
|
|
41
|
+
const result = await permissionModule.requestNotifications([]);
|
|
42
|
+
return result.status === 'granted';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (Platform.OS === 'ios') {
|
|
46
|
+
const status = await module.requestPermission();
|
|
47
|
+
return authorizedStatus.includes(status);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return false;
|
|
51
|
+
},
|
|
52
|
+
onTokenRefresh(handler: (token: string) => void): () => void | undefined {
|
|
53
|
+
return module.onTokenRefresh((token) => {
|
|
54
|
+
if (Platform.OS === 'android') handler(token);
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export default createNativeNotificationService;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import type RNNetInfo from '@react-native-community/netinfo';
|
|
3
|
+
import { NativeModules } from 'react-native';
|
|
4
|
+
import type RNFastImage from 'react-native-fast-image';
|
|
5
|
+
import type RNFileAccess from 'react-native-file-access';
|
|
6
|
+
|
|
7
|
+
import { Logger } from '@sendbird/uikit-utils';
|
|
8
|
+
|
|
9
|
+
export interface DynamicModules {
|
|
10
|
+
'react-native-file-access': typeof RNFileAccess;
|
|
11
|
+
'react-native-fast-image': typeof RNFastImage;
|
|
12
|
+
'@react-native-community/netinfo': typeof RNNetInfo;
|
|
13
|
+
}
|
|
14
|
+
export type SBUNativeModule = keyof DynamicModules;
|
|
15
|
+
|
|
16
|
+
interface SBUDynamicModuleInfo {
|
|
17
|
+
packageName: SBUNativeModule;
|
|
18
|
+
minVersion: string;
|
|
19
|
+
moduleName: string;
|
|
20
|
+
getPackage: <T>(logLevel: 'error' | 'warn' | 'none') => T;
|
|
21
|
+
url: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function checkVersion(minVersion: string, currentVersion: string) {
|
|
25
|
+
const [minMajor, minMinor, minPatch] = minVersion.split('.');
|
|
26
|
+
const [currMajor, currMinor, currPatch] = currentVersion.split('.');
|
|
27
|
+
|
|
28
|
+
if (minMajor < currMajor) return true;
|
|
29
|
+
if (minMajor === currMajor) {
|
|
30
|
+
if (minMinor < currMinor) return true;
|
|
31
|
+
if (minMinor === currMinor) {
|
|
32
|
+
return minPatch <= currPatch;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function checkLink(dmi: SBUDynamicModuleInfo, logLevel: 'error' | 'warn' | 'none') {
|
|
40
|
+
const nativeModule = NativeModules[dmi.moduleName];
|
|
41
|
+
if (!nativeModule) {
|
|
42
|
+
const message = `[UIKit] Cannot use native module, you should install and link ${dmi.packageName} (${dmi.url})`;
|
|
43
|
+
if (logLevel === 'error') console.error(message);
|
|
44
|
+
if (logLevel === 'warn') console.warn(message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const SBUDynamicModuleRegistry: Record<SBUNativeModule, SBUDynamicModuleInfo> = {
|
|
49
|
+
'react-native-file-access': {
|
|
50
|
+
minVersion: '2.4.3',
|
|
51
|
+
packageName: 'react-native-file-access',
|
|
52
|
+
moduleName: 'RNFileAccess',
|
|
53
|
+
url: 'https://github.com/alpha0010/react-native-file-access',
|
|
54
|
+
getPackage(logLevel) {
|
|
55
|
+
checkLink(this, logLevel);
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
return require('react-native-file-access');
|
|
59
|
+
} catch (e) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
'react-native-fast-image': {
|
|
65
|
+
minVersion: '8.5.11',
|
|
66
|
+
packageName: 'react-native-fast-image',
|
|
67
|
+
moduleName: 'FastImageView',
|
|
68
|
+
url: 'https://github.com/DylanVann/react-native-fast-image',
|
|
69
|
+
getPackage(logLevel) {
|
|
70
|
+
checkLink(this, logLevel);
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
return require('react-native-fast-image');
|
|
74
|
+
} catch (e) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
'@react-native-community/netinfo': {
|
|
80
|
+
minVersion: '9.3.0',
|
|
81
|
+
packageName: '@react-native-community/netinfo',
|
|
82
|
+
moduleName: 'RNCNetInfo',
|
|
83
|
+
url: 'https://github.com/react-native-netinfo/react-native-netinfo',
|
|
84
|
+
getPackage(logLevel) {
|
|
85
|
+
checkLink(this, logLevel);
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
return require('@react-native-community/netinfo');
|
|
89
|
+
} catch (e) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const SBUDynamicModule = {
|
|
97
|
+
register(mdi: SBUDynamicModuleInfo) {
|
|
98
|
+
SBUDynamicModuleRegistry[mdi.moduleName as SBUNativeModule] = mdi;
|
|
99
|
+
},
|
|
100
|
+
getInfo(name: SBUNativeModule) {
|
|
101
|
+
return SBUDynamicModuleRegistry[name] ?? null;
|
|
102
|
+
},
|
|
103
|
+
get<K extends SBUNativeModule, T extends DynamicModules[K]>(name: K, logLevel: 'error' | 'warn' | 'none' = 'error') {
|
|
104
|
+
const dmi = this.getInfo(name);
|
|
105
|
+
if (!dmi) Logger.warn(`${name} doesn't exist in the dynamic module`);
|
|
106
|
+
return dmi?.getPackage<T>(logLevel);
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export default SBUDynamicModule;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export type Unsubscribe = () => void | undefined;
|
|
2
|
+
export type DownloadedPath = string;
|
|
3
|
+
export type FilePickerResponse = FileType | null;
|
|
4
|
+
export type FileType = { uri: string; size: number; name: string; type: string };
|
|
5
|
+
|
|
6
|
+
export interface NotificationServiceInterface {
|
|
7
|
+
hasPushPermission(): Promise<boolean>;
|
|
8
|
+
requestPushPermission(): Promise<boolean>;
|
|
9
|
+
|
|
10
|
+
getAPNSToken(): Promise<string | null>;
|
|
11
|
+
getFCMToken(): Promise<string | null>;
|
|
12
|
+
onTokenRefresh(handler: (token: string) => void): Unsubscribe;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ClipboardServiceInterface {
|
|
16
|
+
setString(text: string): void;
|
|
17
|
+
getString(): Promise<string>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface FileServiceInterface extends FilePickerServiceInterface, FileSystemServiceInterface {}
|
|
21
|
+
|
|
22
|
+
export interface OpenResultListener {
|
|
23
|
+
onOpenFailureWithToastMessage?: () => void;
|
|
24
|
+
}
|
|
25
|
+
export interface OpenMediaLibraryOptions extends OpenResultListener {
|
|
26
|
+
selectionLimit?: number;
|
|
27
|
+
mediaType?: 'photo' | 'video' | 'all';
|
|
28
|
+
}
|
|
29
|
+
export interface OpenCameraOptions extends OpenResultListener {
|
|
30
|
+
cameraType?: 'front' | 'back';
|
|
31
|
+
mediaType?: 'photo' | 'video';
|
|
32
|
+
}
|
|
33
|
+
export type OpenDocumentOptions = OpenResultListener;
|
|
34
|
+
export interface SaveOptions {
|
|
35
|
+
fileUrl: string;
|
|
36
|
+
fileName: string;
|
|
37
|
+
fileType?: string | null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface FilePickerServiceInterface {
|
|
41
|
+
openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<null | FilePickerResponse[]>;
|
|
42
|
+
openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse>;
|
|
43
|
+
openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface FileSystemServiceInterface {
|
|
47
|
+
// NOTE: On iOS, You can access the downloaded files by providing options below to info.plist
|
|
48
|
+
// - Supports opening documents in place
|
|
49
|
+
// - Application supports iTunes file sharing
|
|
50
|
+
save(options?: SaveOptions): Promise<DownloadedPath | null>;
|
|
51
|
+
}
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ErrorInfo, ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export type KeyValuePairGet = [string, string | null];
|
|
4
|
+
export type KeyValuePairSet = [string, string];
|
|
5
|
+
export interface LocalCacheStorage {
|
|
6
|
+
getAllKeys(): Promise<readonly string[] | string[]>;
|
|
7
|
+
getItem(key: string): Promise<string | null>;
|
|
8
|
+
setItem(key: string, value: string): Promise<void>;
|
|
9
|
+
removeItem(key: string): Promise<void>;
|
|
10
|
+
|
|
11
|
+
multiSet?(keyValuePairs: Array<KeyValuePairSet>): Promise<void>;
|
|
12
|
+
multiGet?(keys: string[]): Promise<readonly KeyValuePairGet[] | KeyValuePairGet[]>;
|
|
13
|
+
multiRemove?(keys: string[]): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type ErrorBoundaryProps = { error: Error; errorInfo: ErrorInfo; reset: () => void };
|
|
17
|
+
|
|
18
|
+
export type CommonComponent<P = {}> = (props: P & { children?: ReactNode }) => null | JSX.Element; //ReactNode;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { NotificationPermissionsStatus } from 'expo-notifications';
|
|
2
|
+
|
|
3
|
+
export interface ExpoPermissionResponse {
|
|
4
|
+
canAskAgain: boolean;
|
|
5
|
+
granted: boolean;
|
|
6
|
+
status: 'denied' | 'granted' | 'undetermined';
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface ExpoMediaLibraryPermissionResponse extends ExpoPermissionResponse {
|
|
10
|
+
accessPrivileges?: 'all' | 'limited' | 'none';
|
|
11
|
+
}
|
|
12
|
+
export interface ExpoPushPermissionResponse extends ExpoPermissionResponse, NotificationPermissionsStatus {}
|
|
13
|
+
|
|
14
|
+
const expoPermissionGranted = (
|
|
15
|
+
stats: Array<ExpoMediaLibraryPermissionResponse | ExpoPushPermissionResponse | ExpoPermissionResponse>,
|
|
16
|
+
limitedCallback?: () => void,
|
|
17
|
+
) => {
|
|
18
|
+
return stats.every((res) => {
|
|
19
|
+
if ('accessPrivileges' in res) {
|
|
20
|
+
if (res.accessPrivileges === 'limited') limitedCallback?.();
|
|
21
|
+
return (
|
|
22
|
+
res.granted || res.status === 'granted' || res.accessPrivileges === 'all' || res.accessPrivileges === 'limited'
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
if ('ios' in res) {
|
|
26
|
+
// NOT_DETERMINED = 0,
|
|
27
|
+
// DENIED = 1,
|
|
28
|
+
// AUTHORIZED = 2,
|
|
29
|
+
// PROVISIONAL = 3,
|
|
30
|
+
// EPHEMERAL = 4,
|
|
31
|
+
return (
|
|
32
|
+
res.granted || res.status === 'granted' || (res.ios?.status && (res.ios.status === 2 || res.ios.status === 3))
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
return res.granted || res.status === 'granted';
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export default expoPermissionGranted;
|