UNPKG

@gathertown/uikit-react-native

Version:

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

272 lines (270 loc) 15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.SendbirdUIKit = void 0; var _uikitReactNativeFoundation = require("@gathertown/uikit-react-native-foundation"); var _uikitUtils = require("@gathertown/uikit-utils"); var _react = _interopRequireWildcard(require("react")); var _reactNative = require("react-native"); var _reactNativeSafeAreaContext = require("react-native-safe-area-context"); var _chat = _interopRequireWildcard(require("@sendbird/chat")); var _groupChannel = require("@sendbird/chat/groupChannel"); var _openChannel = require("@sendbird/chat/openChannel"); var _uikitTools = require("@sendbird/uikit-tools"); var _LocalizationCtx = require("../contexts/LocalizationCtx"); var _PlatformServiceCtx = require("../contexts/PlatformServiceCtx"); var _ReactionCtx = require("../contexts/ReactionCtx"); var _SendbirdChatCtx = require("../contexts/SendbirdChatCtx"); var _UserProfileCtx = require("../contexts/UserProfileCtx"); var _EmojiManager = _interopRequireDefault(require("../libs/EmojiManager")); var _ImageCompressionConfig = _interopRequireDefault(require("../libs/ImageCompressionConfig")); var _InternalLocalCacheStorage = _interopRequireDefault(require("../libs/InternalLocalCacheStorage")); var _MentionConfig = _interopRequireDefault(require("../libs/MentionConfig")); var _MentionManager = _interopRequireDefault(require("../libs/MentionManager")); var _StringSet = _interopRequireDefault(require("../localization/StringSet.en")); var _dynamicModule = _interopRequireDefault(require("../platform/dynamicModule")); var _version = _interopRequireDefault(require("../version")); var _InternalErrorBoundaryContainer = _interopRequireDefault(require("./InternalErrorBoundaryContainer")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const NetInfo = _dynamicModule.default.get('@react-native-community/netinfo', 'warn'); const SendbirdUIKit = Object.freeze({ VERSION: _version.default, PLATFORM: _reactNative.Platform.OS.toLowerCase(), DEFAULT: { AUTO_PUSH_TOKEN_REGISTRATION: true, USE_USER_ID_FOR_NICKNAME: false, IMAGE_COMPRESSION: true } }); exports.SendbirdUIKit = SendbirdUIKit; const SendbirdUIKitContainer = _ref => { let { children, appId, chatOptions, uikitOptions, platformServices, localization, styles, errorBoundary, toast, userProfile, userMention, imageCompression, customRenderProps } = _ref; if (!chatOptions.localCacheStorage) { throw new Error('SendbirdUIKitContainer: chatOptions.localCacheStorage is required'); } const defaultStringSet = (localization === null || localization === void 0 ? void 0 : localization.stringSet) ?? _StringSet.default; const isFirstMount = (0, _uikitUtils.useIsFirstMount)(); const unsubscribes = (0, _react.useRef)([]); const [internalStorage] = (0, _react.useState)(() => new _InternalLocalCacheStorage.default(chatOptions.localCacheStorage)); const [sdkInstance, setSdkInstance] = (0, _react.useState)(() => { const sendbird = initializeSendbird(appId, { internalStorage, ...chatOptions }); unsubscribes.current = sendbird.unsubscribes; return sendbird.chatSDK; }); const emojiManager = (0, _react.useMemo)(() => new _EmojiManager.default(internalStorage), [internalStorage]); const mentionManager = (0, _react.useMemo)(() => { const config = new _MentionConfig.default({ mentionLimit: (userMention === null || userMention === void 0 ? void 0 : userMention.mentionLimit) || _MentionConfig.default.DEFAULT.MENTION_LIMIT, suggestionLimit: (userMention === null || userMention === void 0 ? void 0 : userMention.suggestionLimit) || _MentionConfig.default.DEFAULT.SUGGESTION_LIMIT, debounceMills: (userMention === null || userMention === void 0 ? void 0 : userMention.debounceMills) ?? _MentionConfig.default.DEFAULT.DEBOUNCE_MILLS, delimiter: _MentionConfig.default.DEFAULT.DELIMITER, trigger: _MentionConfig.default.DEFAULT.TRIGGER }); return new _MentionManager.default(config); }, [userMention === null || userMention === void 0 ? void 0 : userMention.mentionLimit, userMention === null || userMention === void 0 ? void 0 : userMention.suggestionLimit, userMention === null || userMention === void 0 ? void 0 : userMention.debounceMills]); const imageCompressionConfig = (0, _react.useMemo)(() => { return new _ImageCompressionConfig.default({ compressionRate: (imageCompression === null || imageCompression === void 0 ? void 0 : imageCompression.compressionRate) || _ImageCompressionConfig.default.DEFAULT.COMPRESSION_RATE, width: imageCompression === null || imageCompression === void 0 ? void 0 : imageCompression.width, height: imageCompression === null || imageCompression === void 0 ? void 0 : imageCompression.height }); }, [imageCompression === null || imageCompression === void 0 ? void 0 : imageCompression.compressionRate, imageCompression === null || imageCompression === void 0 ? void 0 : imageCompression.width, imageCompression === null || imageCompression === void 0 ? void 0 : imageCompression.height]); (0, _react.useLayoutEffect)(() => { if (!isFirstMount) { const sendbird = initializeSendbird(appId, { internalStorage, ...chatOptions }); setSdkInstance(sendbird.chatSDK); unsubscribes.current = sendbird.unsubscribes; } return () => { unsubscribes.current.forEach(u => { try { u(); } catch {} }); }; }, [appId, internalStorage]); const renderChildren = () => { if (errorBoundary !== null && errorBoundary !== void 0 && errorBoundary.disabled) { return children; } else { return /*#__PURE__*/_react.default.createElement(_InternalErrorBoundaryContainer.default, errorBoundary, children); } }; return /*#__PURE__*/_react.default.createElement(_reactNativeSafeAreaContext.SafeAreaProvider, null, /*#__PURE__*/_react.default.createElement(_uikitTools.UIKitConfigProvider, { storage: internalStorage, localConfigs: { common: uikitOptions === null || uikitOptions === void 0 ? void 0 : uikitOptions.common, groupChannel: { channel: uikitOptions === null || uikitOptions === void 0 ? void 0 : uikitOptions.groupChannel, channelList: uikitOptions === null || uikitOptions === void 0 ? void 0 : uikitOptions.groupChannelList, setting: uikitOptions === null || uikitOptions === void 0 ? void 0 : uikitOptions.groupChannelSettings }, openChannel: { channel: uikitOptions === null || uikitOptions === void 0 ? void 0 : uikitOptions.openChannel } } }, /*#__PURE__*/_react.default.createElement(_SendbirdChatCtx.SendbirdChatProvider, { sdkInstance: sdkInstance, emojiManager: emojiManager, mentionManager: mentionManager, imageCompressionConfig: imageCompressionConfig, enableAutoPushTokenRegistration: chatOptions.enableAutoPushTokenRegistration ?? SendbirdUIKit.DEFAULT.AUTO_PUSH_TOKEN_REGISTRATION, enableUseUserIdForNickname: chatOptions.enableUseUserIdForNickname ?? SendbirdUIKit.DEFAULT.USE_USER_ID_FOR_NICKNAME, enableImageCompression: chatOptions.enableImageCompression ?? SendbirdUIKit.DEFAULT.IMAGE_COMPRESSION }, /*#__PURE__*/_react.default.createElement(_LocalizationCtx.LocalizationProvider, { stringSet: defaultStringSet }, /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.UIKitThemeProvider, { theme: (styles === null || styles === void 0 ? void 0 : styles.theme) ?? _uikitReactNativeFoundation.LightUIKitTheme }, /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.CustomComponentProvider, customRenderProps, /*#__PURE__*/_react.default.createElement(_PlatformServiceCtx.PlatformServiceProvider, { fileService: platformServices.file, notificationService: platformServices.notification, clipboardService: platformServices.clipboard, mediaService: platformServices.media }, /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.HeaderStyleProvider, { HeaderComponent: (styles === null || styles === void 0 ? void 0 : styles.HeaderComponent) ?? _uikitReactNativeFoundation.Header, defaultTitleAlign: (styles === null || styles === void 0 ? void 0 : styles.defaultHeaderTitleAlign) ?? 'left', statusBarTranslucent: (styles === null || styles === void 0 ? void 0 : styles.statusBarTranslucent) ?? true }, /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.ToastProvider, { dismissTimeout: toast === null || toast === void 0 ? void 0 : toast.dismissTimeout }, /*#__PURE__*/_react.default.createElement(_UserProfileCtx.UserProfileProvider, { onCreateChannel: userProfile === null || userProfile === void 0 ? void 0 : userProfile.onCreateChannel, onBeforeCreateChannel: userProfile === null || userProfile === void 0 ? void 0 : userProfile.onBeforeCreateChannel, statusBarTranslucent: (styles === null || styles === void 0 ? void 0 : styles.statusBarTranslucent) ?? true }, /*#__PURE__*/_react.default.createElement(_ReactionCtx.ReactionProvider, null, /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.CustomProvidersRenderer, null, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_LocalizationCtx.LocalizationContext.Consumer, null, value => { const STRINGS = (value === null || value === void 0 ? void 0 : value.STRINGS) || defaultStringSet; return /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.DialogProvider, { defaultLabels: { alert: { ok: STRINGS.DIALOG.ALERT_DEFAULT_OK }, prompt: { ok: STRINGS.DIALOG.PROMPT_DEFAULT_OK, cancel: STRINGS.DIALOG.PROMPT_DEFAULT_CANCEL, placeholder: STRINGS.DIALOG.PROMPT_DEFAULT_PLACEHOLDER } } }, renderChildren()); }), /*#__PURE__*/_react.default.createElement(_ReactionCtx.ReactionBottomSheetsWrapper, null)))))))))))))); }; const initializeSendbird = (appId, options) => { let chatSDK; const unsubscribes = []; const { internalStorage, localCacheEncryption, onInitialized } = options; chatSDK = _chat.default.init({ appId, newInstance: true, modules: [new _groupChannel.GroupChannelModule(), new _openChannel.OpenChannelModule()], localCacheEnabled: Boolean(internalStorage), useAsyncStorageStore: internalStorage, localCacheEncryption }); if (onInitialized) { chatSDK = onInitialized(chatSDK); } const platform = getDeviceOSPlatform(); if (SendbirdUIKit.VERSION && platform) { const deviceOSInfo = { platform, version: String(_reactNative.Platform.Version) }; const customData = { platform_version: getReactNativeVersion() }; const uikitExtension = { product: _chat.SendbirdProduct.UIKIT_CHAT, version: SendbirdUIKit.VERSION, platform: _chat.SendbirdPlatform.REACT_NATIVE }; chatSDK.addSendbirdExtensions([uikitExtension], deviceOSInfo, customData); chatSDK.addExtension('sb_uikit', SendbirdUIKit.VERSION); } if (SendbirdUIKit.PLATFORM) { chatSDK.addExtension('device-os-platform', SendbirdUIKit.PLATFORM); } if (NetInfo !== null && NetInfo !== void 0 && NetInfo.addEventListener) { var _chatSDK$setOnlineLis, _chatSDK, _chatSDK$setOfflineLi, _chatSDK2; try { // NOTE: For removing buggy behavior of NetInfo.addEventListener // When you first add an event listener, it is assumed that the initialization of the internal event detector is done simultaneously. // In other words, when you call the first event listener two events are triggered immediately // - the one that is called when adding the event listener // - and the internal initialization event NetInfo.addEventListener(_uikitUtils.NOOP)(); } catch {} const listener = (callback, callbackType) => { let callCount = 0; const unsubscribe = NetInfo.addEventListener(state => { const online = Boolean(state.isConnected) || Boolean(state.isInternetReachable); // NOTE: When NetInfo.addEventListener is called // the event is immediately triggered regardless of whether the event actually occurred. // This is why it filters the first event. if (callCount === 0) { callCount++; return; } if (online && callbackType === 'online') callback(); if (!online && callbackType === 'offline') callback(); }); unsubscribes.push(unsubscribe); return unsubscribe; }; (_chatSDK$setOnlineLis = (_chatSDK = chatSDK).setOnlineListener) === null || _chatSDK$setOnlineLis === void 0 ? void 0 : _chatSDK$setOnlineLis.call(_chatSDK, onOnline => listener(onOnline, 'online')); (_chatSDK$setOfflineLi = (_chatSDK2 = chatSDK).setOfflineListener) === null || _chatSDK$setOfflineLi === void 0 ? void 0 : _chatSDK$setOfflineLi.call(_chatSDK2, onOffline => listener(onOffline, 'offline')); } return { chatSDK, unsubscribes }; }; function getDeviceOSPlatform() { switch (_reactNative.Platform.OS) { case 'android': return _chat.DeviceOsPlatform.ANDROID; case 'ios': return _chat.DeviceOsPlatform.IOS; case 'web': return _chat.DeviceOsPlatform.WEB; case 'windows': return _chat.DeviceOsPlatform.WINDOWS; default: return undefined; } } function getReactNativeVersion() { const { major, minor, patch } = _reactNative.Platform.constants.reactNativeVersion; return `${major}.${minor}.${patch}`; } var _default = SendbirdUIKitContainer; exports.default = _default; //# sourceMappingURL=SendbirdUIKitContainer.js.map