{"version":3,"sources":["../../libs/utils-scenario/src/convertScenarioMessageTimestamp.ts","../../libs/utils-scenario/src/convertMessagesToPayloadArray.ts","../../libs/utils-scenario/src/convertScenarioMessageToMessagePayload.ts","../../libs/utils-scenario/src/sendScenarioMessage.ts","../../libs/utils-scenario/src/getScenarioDataFromChannelUrl.ts","../../libs/utils-scenario/src/processScenarioMessages.ts","../../libs/utils-scenario/src/handleCarouselMessageSelection.ts","../../libs/ui-animating-circle/src/AnimatingCircleContext.ts","../../libs/ui-animating-circle/src/AnimatingCircle.tsx","../../libs/ui-animating-circle/src/index.tsx","../../libs/ui-image/src/index.tsx","../../libs/ui-button/src/index.tsx","../../libs/theme/src/index.ts","../../libs/ui-chat-common/src/BrandAvatar.tsx","../../libs/ui-chat-common/src/ImageAvatar.tsx","../../libs/ui-chat-common/src/Avatar.tsx","../../libs/ui-chat-common/src/ChannelCover.tsx","../../libs/ui-chat-common/src/ChannelSubtitle.tsx","../../libs/ui-chat-common/src/ChannelHeaderTitle.tsx","../../libs/ui-chat-common/src/ListItemWrapper.tsx","../../libs/utils-analytics/src/index.ts","../../libs/utils-data-utils/src/index.ts","../../libs/ui-circle-progress/src/index.tsx","../../libs/ui-circle-progress/src/colorizeLottie.ts","../../libs/hooks-use-scenario-utils/src/index.ts","../../libs/ui-badges/assets/ic-badge-store.svg","../../libs/ui-badges/assets/ic-badge-verified.svg","../../libs/ui-badges/src/Badge.tsx","../../libs/ui-badges/src/UserBadge.tsx","../../libs/ui-badges/src/ChannelBadge.tsx","../../libs/constants/src/index.ts","../../libs/ui-icon-button/src/index.tsx","../../libs/contexts/src/api.tsx","../../libs/contexts/src/auth.ts","../../libs/contexts/src/call.tsx","../../libs/contexts/src/scenario.tsx","../../libs/contexts/src/intl.tsx","../../libs/contexts/src/sendbird.ts","../../libs/contexts/src/theme.tsx","../../libs/contexts/src/index.tsx","../../libs/hooks-use-can-call/src/index.ts","../../libs/ui-opacity-pressable/src/index.tsx","../../libs/ui/src/alert.ts","../../libs/ui/src/KeyboardAvoidingView.tsx","../../libs/ui/src/Pressable.tsx","../../libs/ui/src/index.tsx","assets/sushi.jpg","assets/voicememo.m4a","assets/img-map-eta.png","assets/doors.jpg","../../libs/ui-chat-common/assets/avatar-notifications.png","../../libs/ui-chat-common/assets/avatar-delivery.png","../../libs/ui-chat-common/assets/avatar-support.png","../../libs/ui-chat-common/assets/avatar-promotions.png","../../libs/ui-chat-common/assets/avatar-sales.png","assets/img-thumbnail-sushi-01.webp","assets/img-thumbnail-sushi-02.webp","assets/img-thumbnail-sushi-03.webp","assets/img-thumbnail-sushi-04.webp","assets/header-image.webp","../../libs/app-v2-ondemand-constants/src/index.ts","../../libs/utils-platform-api/src/axios.ts","../../libs/utils-platform-api/src/channels.ts","../../libs/utils-platform-api/src/messages.ts","../../libs/utils-platform-api/src/users.ts","../../libs/utils-platform-api/src/index.ts","../../libs/hooks-use-app/src/resetUser.ts","../../libs/hooks-use-app/src/index.ts","../../libs/ui-loading-full-screen/src/index.tsx","../../libs/ui-status-bar/src/statusbar-icons.svg","../../libs/web-demo-constants/src/index.ts","../../libs/ui-status-bar/src/index.tsx","../../libs/utils-web-demo-message-handler/src/switchFromMainAppToSupportApp.ts","../../libs/utils-web-demo-message-handler/src/use-main-app-window-message-handler/use-main-app-window-message-handler.ts","../../libs/utils-web-demo-message-handler/src/use-support-app-window-message-handler/use-support-app-window-message-handler.ts","src/app/constants.ts","../../libs/hooks-use-new-message-notification/src/index.tsx","assets/icon-arrow-left.svg","assets/icon-chat.svg","src/app/screens/HomeScreen.tsx","../../libs/hooks-use-inbox-channel-list/src/utils.ts","../../libs/hooks-use-inbox-channel-list/src/index.ts","../../libs/hooks-use-inbox-navigation-header/src/ic-new-chat.svg","../../libs/hooks-use-inbox-navigation-header/src/icon-arrow-left.svg","../../libs/ui-auto-updating-timestamp/src/index.tsx","../../libs/ui-list-item/src/index.tsx","../../libs/ui-channel-list-item/src/ChannelListItem.tsx","../../libs/ui-channel-list-item/src/index.tsx","src/app/screens/InboxScreen.tsx","../../libs/hooks-use-pull-to-refresh/src/index.ts","../../libs/hooks-use-inbox-navigation-header/src/index.tsx","../../libs/ui-app-settings/src/index.tsx","src/app/screens/SettingScreen.tsx","src/app/screens/RootScreen.tsx","src/app/App.tsx","index.js","../../libs/utils/src/index.ts","../../libs/utils-chat-common/src/formatDuration.ts","../../libs/utils-chat-common/src/formatters.ts","../../libs/utils-chat-common/src/isChannelVerified.ts","../../libs/utils-chat-common/src/isFAQBotAnswer.ts","../../libs/utils-chat-common/src/isMessageVisible.ts","../../libs/utils-chat-common/src/useFormatDateLine.ts","../../libs/utils-chat-common/src/useGetChannelTitle.ts","../../libs/utils-chat-common/src/index.ts"],"names":["convertScenarioMessageTimestamp","timestamp","Date","now","isNaN","parse","valueOf","result","split","forEach","token","endsWith","addDays","parseInt","slice","hours","addHours","minutes","addMinutes","seconds","addSeconds","parsedDate","startOfMinute","setMinutes","setHours","getHours","getMinutes","convertMessagesToPayloadArray","messages","flatMap","message","Array","isArray","content","map","createdAt","rest","item","index","array","replaceVariables","value","context","startsWith","key","channelMetaData","replace","userMetaData","join","replaceDataVariables","data","mapValues","v","convertScenarioMessageToMessagePayload","scenarioMessage","sender","isSilent","customType","myUserId","variablesContext","commonProps","created_at","undefined","is_silent","custom_type","JSON","stringify","message_type","String","user_id","url","file_type","type","thumbnails","imageDimension","real_width","width","real_height","height","sendScenarioMessage","a","channelUrl","sendApiRequest","sendMessagePayload","params","newMessage","reactions","length","messageId","message_id","getScenarioDataFromCustomChannelType","scenario","customChannelType","channels","find","c","getScenarioDataFromChannelUrl","channel","processScenarioMessages","convertTimestamp","handleCarouselMessageSelection","selectedOption","originalData","parseMessageData","carousel","originalCarousel","updatedCarouselOptions","options","name","isSelected","updatedMessageData","getMessageData","AnimatingCircleContext","createContext","AnimatingCircle","id","style","useState","isAfterDelay","setIsAfterDelay","targetId","useContext","sx","useSx","isVisible","useEffect","timeoutId","setTimeout","clearTimeout","View","position","inset","justifyContent","alignItems","pointerEvents","backgroundColor","borderRadius","animate","scale","duration","opacity","transition","easing","Easing","linear","loop","useAnimatingCircleContext","AnimatingCircleWrapper","children","setTargetId","Provider","useMemo","Image","sourceProp","source","uriProp","uri","props","Platform","OS","transitionDuration","tint","sizeMap","small","default","large","paddingHorizontalMap","fontSizeMap","progressSizeMap","Button","title","variant","size","isLoading","rounded","disabled","textStyle","buttonStyle","animatingCircleId","colorMap","theme","useDripsyTheme","primary","background","colors","primaryButtonBackgroundDefault","backgroundHovered","primaryButtonBackgroundHover","primaryButtonContent","secondary","secondaryButtonBackgroundDefault","secondaryButtonBackgroundHover","secondaryButtonContent","disabledButtonBackground","disabledButtonContent","useColorMap","contentColor","useSharedValue","animatedStyles","useAnimatedStyle","transform","withTiming","paddingHorizontal","onHoverIn","onHoverOut","onPressIn","onPressOut","Math","min","color","textAlign","fontSize","userSelect","chatBackground","text","secondaryText","tertiaryText","badge","prmary","accent","border","announcementBarBackgroundDefault","announcementBarBackgroundHover","announcementBarIcon","announcementBarContent","brandAvatarBackground","brandAvatarIcon","activeTab","inactiveTab","suggestedReplyBackgroundDefault","suggestedReplyBackgroundHover","suggestedReplyText","adminMessageBoxBackground","csatSelectedItemBackground","csatSelectedItemText","incomingMessageBackground","incomingMessageText","outgoingMessageBackground","outgoingMessageText","messageTimestamp","notificationCardBackground","navigationHeaderBackground","navigationHeaderTextColor","navigationTintColor","listItemBackground","listItemBackgroundHover","defaultFaqItemColor","defaultFaqItemContent","online","avatarBackground","messageInputBackground","dateLine","sendFileButton","readIconColor","animatingCircle","messageInputBarBackground","carouselItemBackground","sizes","channelListAvatar","space","bubblePadding","notificationCardSpacing","suggestedReplyHorizontalSpacing","suggestedReplyVerticalSpacing","messageInputBarPaddingTop","radii","bubble","notificationCard","suggestedReply","fontSizes","xlarge","medium","smedium","xsmall","xxsmall","xxxsmall","lineHeights","xsmall2","styles","textXxxsmall","lineHeight","textXxsmall","textXsmall","textXsmall2","textSmall","textSmedium","textMedium","textLarge","buttonText","fontWeight","channelListItemTitle","channelListItemMessage","channelListTimestamp","notificationCardTimestamp","notificationCardTitle","notificationCardHeader","messageText","messageNickname","dateLineRule","csatQuestion","marginBottom","faqItem","paddingVertical","borderWidth","minWidth","maxWidth","faqItemText","messageInput","py","px","messageInputText","carouselItem","borderColor","carouselItemButton","borderTopWidth","carouselItemWrapper","carouselItemButtonText","carouselItemTitle","my","carouselItemPrice","types","reactNativeTypesOnly","defaultTheme","makeTheme","darkTheme","merge","imageMap","notifications","require","delivery","support","promotions","sales","BrandAvatar","containerStyle","tintColor","ImageAvatar","overflow","resizeMode","getRandomAvatarUrl","userId","Avatar","user","fallbackAvatarKey","defaultBrandAvatar","metaData","userMetaDataKeys","brandAvatarType","profileUrl","plainProfileUrl","ChannelCover","currentUser","useAuthContext","otherChannelMember","members","member","channelCustomTypes","flexDirection","flexWrap","coverUrl","badgeSize","userType","connectionStatus","right","bottom","renderBadge","ChannelSubtitle","canCall","useCanCall","isChannelVerified","Text","mr","ChannelHeaderTitle","renderSubtitle","renderAvatar","getChannelTitle","useGetChannelTitle","renderedBadge","flex","display","marginRight","numberOfLines","ListItemWrapper","breakpoints","useBreakpoints","alignSelf","analytics","Analytics","plugins","googleAnalytics","measurementIds","safeJSONParse","CircleProgress","LazyLottieView","setLazyLottieView","coloredAnimation","json","colorByPath","nextJson","Object","entries","path","rgbPercentages","tinycolor","toPercentageRgb","rFraction","r","gFraction","g","bFraction","b","pathParts","set","colorizeLottie","animation","then","module","autoPlay","useScenarioUtils","useSendApiRequest","useScenarioContext","runCallback","useScenarioCallbackContext","sendbird","useSendBirdContext","setAnimatingCircleTarget","currentUserId","getLatestUserMetaData","useCallback","userListQuery","createApplicationUserListQuery","userIdsFilter","next","latestUser","handleChannelStateTransition","channelState","Error","GroupChannel","getChannel","scenarioData","currentState","states","processedMessages","sendMessage","getAllMetaData","payload","some","messageParams","typingDuration","skipTyping","messageIds","addReactionsToMessage","push","onEntry","getScenarioStateContext","after","delayMs","delay","targetState","setChannelState","state","getMetaData","channelMetaDataKeys","previousState","channelScenario","onExit","updateMetaData","scenarioStateContext","setChannelMetaData","transitionState","getUpdateChannelStateRequest","targetChannelUrl","axios","isAxiosError","console","error","toJSON","updateUserMessage","members_exactly_in","encodeURIComponent","targetChannel","channel_url","handleChannelStateEvent","handler","channelContext","args","convertMessagesToPayloadArray__TMP","requestSendMessage","_defs","_path","_extends","assign","bind","target","i","arguments","prototype","hasOwnProperty","call","apply","this","viewBox","fillRule","d","clipRule","Badge","VerifiedBadge","fill","StoreBadge","UserBadge","ChannelBadge","otherUser","cdnHost","defaultMaleProfileUrl","language","initializedVersion","asyncStorageKeys","savedUser","messageCustomTypes","interactiveResponse","typingIndicator","notification","banner","marketing","splitPayment","vote","splitCost","csat","csat5","orderConfirmation","splitPaymentUpdate","couldNotRecognize","adminMessageBox","adminMessageBubble","callStarted","callEnded","bookingsBotStart","audio","nonCenteredAdminMessageCustomTypes","verifiedChannelCustomTypes","queryKeys","inbox","backgroundScales","IconButton","tintColorProp","label","backgroundScale","backgroundOpacity","buttonOpacity","animatedBackgroundStyles","animatedButtonStyles","hoverBackgroundSize","max","minHeight","top","left","marginLeft","APIContext","APIContextProvider","AuthContext","CallContext","useCallContext","CallContextProvider","callContextValue","callScreenData","setCallScreenData","isCallVisible","callEventListenerMap","Map","addCallEventListener","listener","removeCallEventListener","stopCall","onCallEnded","toggleCallScreen","useCallScreen","ScenarioContext","ScenarioCallbackContext","ScenarioContextProvider","callbackMapRef","useRef","scenarioCallbackContextValue","addCallback","callback","current","has","removeCallback","get","Intl","IntlContext","useIntlContext","IntlContextProvider","contextValue","intlTimeFormat","DateTimeFormat","defaultLanguage","hour","minute","intlDateFormat","month","day","intlDateDifferentYearFormat","year","intlDateTimeFormat","intlDateLineLastYearFormat","intlDateLineFormat","weekday","intlDateLineRelativeFormat","RelativeTimeFormat","numeric","getIntlObjects","SendBirdContext","ThemeContext","ThemeContextProvider","isDarkTheme","useIsDarkTheme","ContextsProvider","authContextValue","sendbirdContextValue","OpacityPressable","viewStyle","StyleSheet","flatten","alert","description","window","confirm","filter","Boolean","confirmOption","onPress","cancelOption","Alert","KeyboardAvoidingView","headerHeight","useHeaderHeight","behavior","keyboardVerticalOffset","isIphoneX","Pressable","RowStack","ColStack","Spacer","direction","exports","BotUserId","APP_ID","commonConstants","driverSupport","chatAxios","axiosRetryOptions","retries","retryCondition","response","status","retryDelay","retryCount","retryAfter","Number","headers","isFinite","pow","configure","appId","apiToken","baseURL","create","axiosRetry","fetchGroupChannels","limit","show_empty","getGroupChannel","show_member","updateGroupChannel","put","createGroupChannel","post","freezeGroupChannel","freeze","getGroupChannelMetaDataOfKey","code","updateGroupChannelMetaDataOfKey","upsert","getGroupChannelMetaData","updateGroupChannelMetaData","metadata","inviteUser","user_ids","leaveChannel","deleteChannel","deleteChannelIfExists","deleteAllGroupChannels","Promise","all","getChannelState","getChannelUrlByCustomType","custom_types","sendBotMessage","botUserId","messageData","markAsRead","mark_as_read","editMessage","deleteMessage","getMessage","fetchMessages","customTypes","messageType","prevLimit","nextLimit","senderId","include","message_ts","sender_id","prev_limit","next_limit","addReaction","reaction","emoji","userIds","translateMessage","targetLanguages","target_langs","sendMessageAndTranslate","translations","typeAndSendMessage","createUser","nickname","profile_url","getUser","getAccessToken","access_token","getAllUserMetaData","getUserMetaData","metadataKey","updateUserMetaData","deleteUserAllMetaData","PlatformAPI","users","resetUser","channelData","isFrozen","initialReadAt","is_distinct","cover_url","initial","initialReadAtTimestamp","reduce","cur","firstList","secondList","firstMessages","secondMessages","version","config","statusText","method","configData","getUserFromAsyncStorage","AsyncStorage","getItem","saveUserToAsyncStorage","removeItem","setItem","useApp","queryClient","apiUrl","onUserInitialized","handleUserInitializedEvent","sbInstance","SendBird","useAsyncStorageAsDatabase","connectToSendBird","username","gender","connect","updateCurrentUserInfo","info","setCurrentUser","isInitialUserLoaded","setInitialUserLoaded","isInitializingUser","setIsInitializingUser","updateCurrentUserState","obj","initializeCurrentUser","disconnect","clear","userProfile","setUpNewUser","uuidv4","userScenarioVersion","warn","prepare","appStateListener","AppState","addEventListener","newState","setForegroundState","setBackgroundState","remove","identify","demo_key","isLoadingUser","LoadingFullScreen","componentStyles","container","loadingWrapper","_path2","_path3","_path4","header","borderBottomColor","borderBottomWidth","paddingBottom","ParentMessageTypes","MainAppMessageTypes","SupportAppMessageTypes","timeFormat","timeStyle","hourCycle","StatusBar","format","time","setTime","setIntervalId","setInterval","clearInterval","isInIframe","parent","self","ml","Linking","openURL","switchFromMainAppToSupportApp","fallbackDelay","nextState","messageHandler","event","CONTINUE_CONVERSATION","removeEventListener","postMessage","SHOW_SUPPORT_APP","useMainAppWindowMessageHandler","INIT_SUPPORT_APP","scenarioKey","REMOVE_USER_FROM_LOCAL_STORAGE","localStorage","RELOAD","useSupportAppWindowMessageHandler","NotificationBot","start","orderInfo","price","product","paymentMethod","address","imageUrl","onChannelEnter","sushiOnItsWay","actions","channelCustomType","orderArrived","onCSATSelect","end","Kim","suggestedReplies","kimConfirms","askArrivalTime","kimStuckInTraffic","kimOnHerWay","eta","previewText","replyToKim","kimAsksDoor","onUserReply","kimReacts","lastMessageId","last_message","Action","NotificationComponent","navigateToChannel","transitionChannelState","SafeAreaView","shadowOffset","shadowRadius","shadowColor","shadowOpacity","marginHorizontal","marginTop","cursor","navigateToChannelOnPress","stateToTransitionToOnPress","track","action","Notifier","hideNotification","tabs","menu","imageSource","HomeScreen","navigation","useNavigation","currentRoute","useNavigationState","routes","currentRouteRef","showNewMessageNotification","targetChannelCustomType","createMyGroupChannelListQuery","listQuery","customTypesFilter","getState","goBack","navigate","onNotificationPress","showNotification","Component","componentProps","showAnimationDuration","showEasing","out","ease","hideOnPress","useNewMessageNotification","setDidStartDemo","useFocusEffect","useQuery","queryKey","channelQuery","includeEmpty","enabled","refetchOnWindowFocus","notificationChannel","refetch","channelHandler","ChannelHandler","onMessageReceived","isGroupChannel","getMessagePreviewText","notificationActions","addChannelHandler","removeChannelHandler","startDemo","barStyle","tab","ScrollView","contentInsetAdjustmentBehavior","contentContainerSx","mx","padding","paddingTop","mt","margin","getChannelTimestamp","lastMessage","sortInboxItems","items","sort","QUERY_KEY","useInboxChannelList","shouldIncludeRecentMessages","includeEmptyChannels","isConnected","getConnectionState","setConnectionStatus","connectionHandler","ConnectionHandler","updateConnectionStatus","log","onReconnectFailed","onReconnectStarted","onReconnectSucceeded","addConnectionHandler","removeConnectionHandler","useConnectionStatus","resolve","reject","getInstance","memberStateFilter","order","createChannelListQuery","createPreviousMessageListQuery","messageTypeFilter","reverse","load","originalError","cause","recentMessages","fromEntries","inboxItems","inboxItemType","dataUpdatedAt","latestDataRef","useQueryClient","removeChannel","deletedChannelUrl","setQueryData","onUserJoined","onUserLeft","onChannelChanged","changedChannel","replaceInboxItemChannel","refetchQueries","onChannelDeleted","AutoUpdatingTimestamp","formatChannelUpdatedAt","useFormatChannelUpdatedAt","setText","useLayoutEffect","isSameDay","ListItem","interpolateColor","defaultBorderRadius","useResponsiveValue","ChannelListItem","getLastMessageProp","getLastMessage","addMemberCount","_styles","inboxItem","mb","ellipsizeMode","getChannelUpdatedAt","unreadMessageCount","ResponsiveChannelListItem","isBannerChannel","InboxScreen","pullToRefreshProps","isPullToRefreshOngoing","setIsPullToRefreshOngoing","onRefresh","refreshing","usePullToRefresh","setOptions","pb","useInboxNavigationHeader","banners","ListEmptyComponent","FlatList","extraData","keyExtractor","renderItem","contentContainerStyle","flexGrow","pt","CurrentUserProfile","AppSettings","H2","SettingScreen","ChatScreen","lazy","Stack","createNativeStackNavigator","RootScreen","isSignedIn","fallback","NavigationContainer","Navigator","screenOptions","headerTintColor","headerTitleStyle","Screen","component","headerShown","_frameTimestamp","UIManager","setLayoutAnimationEnabledExperimental","QueryClient","defaultOptions","queries","retry","SplashScreen","App","isAppReady","onLayoutRootView","HIDE_LOADING","client","onLayout","registerRootComponent","e","ms","formatDuration","floor","updatedAt","formatDistanceToNowResult","formatDistanceToNow","relativeTime","isSameYear","includes","isFAQBotAnswer","results","isMessageVisible","isSystemMessage","isAssigned","SendBirdDesk","Message","DataType","TICKET_ASSIGN","isTransferred","TICKET_TRANSFER","isClosed","TICKET_CLOSE","isFirstJoinedAutoMessage","capitalizeFirstLetter","charAt","toUpperCase","useFormatDateLine","date","isToday","isYesterday","isThisYear","nicknames","m","channelNameMaxMembers","isFileMessage"],"mappings":"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","file":"static/js/app.caa64848.chunk.js","sourcesContent":["import addDays from 'date-fns/addDays';\nimport addHours from 'date-fns/addHours';\nimport addMinutes from 'date-fns/addMinutes';\nimport addSeconds from 'date-fns/addSeconds';\nimport getHours from 'date-fns/getHours';\nimport getMinutes from 'date-fns/getMinutes';\nimport parse from 'date-fns/parse';\nimport setHours from 'date-fns/setHours';\nimport setMinutes from 'date-fns/setMinutes';\nimport startOfMinute from 'date-fns/startOfMinute';\n\nexport const convertScenarioMessageTimestamp = (\n timestamp: number | string | Date = 0\n) => {\n if (!timestamp) {\n return Date.now();\n }\n if (typeof timestamp === 'number') {\n return timestamp;\n }\n\n if (typeof timestamp === 'string') {\n if (!isNaN(parse(timestamp, 'yyyy-MM-dd HH:mm:ss', new Date()).valueOf())) {\n return parse(timestamp, 'yyyy-MM-dd HH:mm:ss', new Date()).valueOf();\n }\n let result = new Date();\n timestamp.split(' ').forEach((token) => {\n if (!isNaN(parse(token, 'h:mmaa', new Date()).valueOf())) {\n const parsedDate = parse(token, 'h:mmaa', new Date());\n result = startOfMinute(\n setMinutes(\n setHours(result, getHours(parsedDate)),\n getMinutes(parsedDate)\n )\n );\n } else if (!isNaN(parse(token, 'haa', new Date()).valueOf())) {\n const parsedDate = parse(token, 'haa', new Date());\n result = startOfMinute(\n setMinutes(setHours(result, getHours(parsedDate)), 0)\n );\n } else if (token.endsWith('d')) {\n result = addDays(result, parseInt(token.slice(0, -1), 10));\n } else if (token.endsWith('h')) {\n const hours = parseInt(token.slice(0, -1), 10);\n result = addHours(result, hours);\n } else if (token.endsWith('m')) {\n const minutes = parseInt(token.slice(0, -1), 10);\n result = addMinutes(result, minutes);\n } else if (token.endsWith('s')) {\n const seconds = parseInt(token.slice(0, -1), 10);\n result = addSeconds(result, seconds);\n }\n });\n return result.valueOf();\n }\n\n return (timestamp as Date).valueOf();\n};\n","import {\n MessageContent,\n ScenarioDataChannelState,\n ScenarioMessage,\n} from '@inbox-demo-nx/types';\n\nimport { convertScenarioMessageTimestamp } from './convertScenarioMessageTimestamp';\n\nexport function convertMessagesToPayloadArray(\n messages: ScenarioDataChannelState['messages'] = []\n) {\n return messages\n .flatMap((message) => {\n const singleContentMessages = (\n Array.isArray(message.content)\n ? message.content.map((content) => ({ ...message, content }))\n : [message]\n ) as (Omit & { content: MessageContent })[];\n return singleContentMessages;\n })\n .map(({ createdAt, ...rest }) => ({\n ...rest,\n createdAt: convertScenarioMessageTimestamp(createdAt),\n }))\n .map((item, index, array) => {\n if (array[index - 1]?.createdAt === item.createdAt) {\n // If the consecutive messages have the same timestamp, we need to add a delay to the next message to keep the order.\n const { createdAt, ...rest } = item;\n return { ...rest, createdAt: createdAt + 1 };\n }\n return item;\n });\n}\n","import { SingleContentScenarioMessage } from '@inbox-demo-nx/types';\nimport { mapValues } from 'remeda';\n\nimport { convertScenarioMessageTimestamp } from './convertScenarioMessageTimestamp';\n\nfunction replaceVariables(value: string, context: StringVariablesContext) {\n const replaceTokens = (token: string) => {\n if (token.startsWith('{{') && token.endsWith('}}')) {\n const key = token.slice(2, -2);\n if (key.startsWith('channelMetaData.')) {\n return context.channelMetaData[key.replace(/^channelMetaData\\./, '')];\n }\n if (key.startsWith('userMetaData.')) {\n return context.userMetaData[key.replace(/^userMetaData\\./, '')];\n }\n }\n return token;\n };\n const tokens = value.split(/(\\{\\{[A-Za-z0-9.]+\\}\\})/g);\n return tokens.map(replaceTokens).join('');\n}\n\nfunction replaceDataVariables(\n data: Record,\n context: StringVariablesContext\n): Record {\n return mapValues(data, (value) => {\n if (typeof value === 'string') {\n return replaceVariables(value, context);\n } else if (typeof value === 'object' && value != null) {\n return Array.isArray(value)\n ? value.map((v) =>\n typeof v === 'string'\n ? replaceVariables(v, context)\n : replaceDataVariables(v, context)\n )\n : replaceDataVariables(value as Record, context);\n } else {\n return value;\n }\n });\n}\n\nexport type StringVariablesContext = {\n channelMetaData: Record;\n userMetaData: Record;\n};\n\nexport function convertScenarioMessageToMessagePayload(\n scenarioMessage: SingleContentScenarioMessage,\n context: { myUserId: string } & StringVariablesContext\n) {\n const { sender, content, createdAt, data, isSilent, customType } =\n scenarioMessage;\n const { myUserId, ...variablesContext } = context;\n\n const commonProps = {\n created_at: convertScenarioMessageTimestamp(createdAt) || undefined, // if createdAt is 0, send the message immediately\n is_silent: isSilent,\n custom_type: customType,\n data: data && JSON.stringify(replaceDataVariables(data, variablesContext)),\n };\n\n if (!sender) {\n // Send as admin message\n return {\n ...commonProps,\n message_type: 'ADMM' as const,\n message: replaceVariables(String(content), variablesContext),\n };\n }\n\n const user_id = sender === 'ME' ? myUserId : sender;\n if (typeof content === 'object') {\n return {\n ...commonProps,\n user_id,\n message_type: 'FILE' as const,\n url: content.url,\n file_type: content.type,\n thumbnails: content.imageDimension\n ? [\n {\n real_width: content.imageDimension.width,\n real_height: content.imageDimension.height,\n url: content.url,\n },\n ]\n : undefined,\n };\n } else {\n return {\n ...commonProps,\n user_id,\n message_type: 'MESG' as const,\n message: replaceVariables(content, variablesContext),\n };\n }\n}\n","import {\n SendApiRequest,\n SingleContentScenarioMessage,\n} from '@inbox-demo-nx/types';\n\nimport { convertScenarioMessageToMessagePayload } from './convertScenarioMessageToMessagePayload';\n\nexport const sendScenarioMessage = async (\n message: SingleContentScenarioMessage,\n {\n myUserId,\n channelMetaData,\n userMetaData = {},\n channelUrl,\n sendApiRequest,\n }: {\n myUserId: string;\n channelMetaData: Record;\n userMetaData?: Record;\n channelUrl: string;\n sendApiRequest: SendApiRequest;\n }\n) => {\n const sendMessagePayload = convertScenarioMessageToMessagePayload(message, {\n myUserId,\n channelMetaData,\n userMetaData,\n });\n const newMessage = await sendApiRequest({\n type: 'sendMessageAndTranslate',\n data: { channelUrl, params: sendMessagePayload },\n });\n if ((message.reactions?.length ?? 0) > 0)\n await sendApiRequest({\n type: 'addReactionsToMessage',\n data: {\n channelUrl,\n messageId: newMessage.message_id,\n reactions: message.reactions,\n },\n });\n};\n","import { ScenarioData, SendApiRequest } from '@inbox-demo-nx/types';\n\nfunction getScenarioDataFromCustomChannelType(\n scenario: ScenarioData,\n customChannelType: string\n) {\n return scenario.channels.find((c) => c.customType === customChannelType);\n}\n\nexport async function getScenarioDataFromChannelUrl(\n scenario: ScenarioData,\n channelUrl: string,\n sendApiRequest: SendApiRequest\n) {\n const channel = await sendApiRequest({\n type: 'getGroupChannel',\n data: { channelUrl },\n });\n return getScenarioDataFromCustomChannelType(scenario, channel.custom_type);\n}\n","import {\n MessageContent,\n ScenarioDataChannelState,\n ScenarioMessage,\n} from '@inbox-demo-nx/types';\nimport { convertTimestamp } from '@inbox-demo-nx/utils';\n\nexport function processScenarioMessages(\n messages: ScenarioDataChannelState['messages'] = []\n) {\n return messages\n .flatMap((message) => {\n const singleContentMessages = (\n Array.isArray(message.content)\n ? message.content.map((content) => ({ ...message, content }))\n : [message]\n ) as (Omit & {\n content: MessageContent;\n })[];\n return singleContentMessages;\n })\n .map(({ createdAt, ...rest }) => ({\n ...rest,\n createdAt: convertTimestamp(createdAt),\n }))\n .map((item, index, array) => {\n if (array[index - 1]?.createdAt === item.createdAt) {\n // If the consecutive messages have the same timestamp, we need to add a delay to the next message to keep the order.\n const { createdAt, ...rest } = item;\n return { ...rest, createdAt: createdAt + 1 };\n }\n return item;\n });\n}\n","import { CarouselItem, SendApiRequest } from '@inbox-demo-nx/types';\nimport {\n getMessageData,\n parseMessageData,\n} from '@inbox-demo-nx/utils-data-utils';\nimport SendBird from 'sendbird';\n\nexport async function handleCarouselMessageSelection({\n message,\n selectedOption,\n sendApiRequest,\n}: {\n message: SendBird.UserMessage;\n selectedOption: CarouselItem;\n sendApiRequest: SendApiRequest;\n}) {\n const { channelUrl, messageId, data } = message;\n\n const originalData = parseMessageData(data);\n if (!originalData || !originalData.carousel) {\n return;\n }\n const originalCarousel = originalData.carousel;\n const updatedCarouselOptions: CarouselItem[] = originalCarousel.options.map(\n (item) =>\n item.name === selectedOption.name ? { ...item, isSelected: true } : item\n );\n const updatedMessageData = getMessageData({\n ...originalData,\n carousel: { ...originalCarousel, options: updatedCarouselOptions },\n });\n\n await sendApiRequest({\n type: 'editMessage',\n data: {\n channelUrl,\n messageId,\n params: {\n message_type: 'MESG',\n data: updatedMessageData,\n },\n },\n });\n}\n","import { createContext } from 'react';\n\nexport type AnimatingCircleContextValue = {\n targetId: string;\n setTargetId: (id: string) => void;\n};\nexport const AnimatingCircleContext =\n createContext({} as any);\n","import { useSx, View } from 'dripsy';\nimport { MotiView } from 'moti';\nimport { useContext, useEffect, useState } from 'react';\nimport { ViewStyle } from 'react-native';\nimport { Easing } from 'react-native-reanimated';\n\nimport { AnimatingCircleContext } from './AnimatingCircleContext';\n\nexport default function AnimatingCircle({\n id,\n style,\n}: {\n id: string;\n style?: ViewStyle;\n}) {\n const [isAfterDelay, setIsAfterDelay] = useState(false);\n const { targetId } = useContext(AnimatingCircleContext);\n const sx = useSx();\n\n const isVisible = targetId === id;\n\n useEffect(() => {\n if (isVisible) {\n setIsAfterDelay(false);\n const timeoutId = setTimeout(() => {\n setIsAfterDelay(true);\n }, 2000);\n return () => {\n clearTimeout(timeoutId);\n };\n }\n return;\n }, [isVisible]);\n\n if (!isVisible || !isAfterDelay) {\n return null;\n }\n\n return (\n \n \n \n );\n}\n","import { ReactNode, useContext, useMemo, useState } from 'react';\n\nimport { AnimatingCircleContext } from './AnimatingCircleContext';\nexport { default as AnimatingCircle } from './AnimatingCircle';\nexport * from './AnimatingCircleContext';\n\nexport const useAnimatingCircleContext = () =>\n useContext(AnimatingCircleContext);\n\nexport const AnimatingCircleWrapper = ({\n children,\n}: {\n children: ReactNode;\n}) => {\n const [targetId, setTargetId] = useState('');\n return (\n ({ targetId, setTargetId }), [targetId])}\n >\n {children}\n \n );\n};\n","import { ComponentProps } from 'react';\nimport {\n Image as RNImage,\n ImageSourcePropType,\n ImageURISource,\n Platform,\n View,\n} from 'react-native';\nimport { Image as ImageWithCache } from 'react-native-expo-image-cache';\n\ntype Props = Omit, 'onError' | 'source'> & {\n source?: ImageSourcePropType;\n uri?: string;\n};\n\nexport default function Image({\n style,\n source: sourceProp,\n uri: uriProp,\n ...props\n}: Props) {\n const uri = (sourceProp as ImageURISource)?.uri || uriProp;\n const commonProps = { style, ...props };\n\n if (uri && Platform.OS !== 'web') {\n return (\n \n );\n }\n\n if (uri) {\n return ;\n }\n if (sourceProp) {\n return ;\n }\n return ;\n}\n","import { AnimatingCircle } from '@inbox-demo-nx/ui-animating-circle';\nimport CircleProgress from '@inbox-demo-nx/ui-circle-progress';\nimport { Text, useDripsyTheme } from 'dripsy';\nimport { useEffect, useMemo } from 'react';\nimport { Pressable, PressableProps, TextStyle, ViewStyle } from 'react-native';\nimport Animated, {\n useAnimatedStyle,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated';\n\nconst sizeMap = {\n small: 26,\n default: 44,\n large: 56,\n};\n\nconst paddingHorizontalMap = {\n small: 12,\n default: 12,\n large: 16,\n};\n\nconst fontSizeMap = {\n small: 12,\n default: 16,\n large: 16,\n};\n\nconst progressSizeMap = {\n small: 12,\n default: 24,\n large: 24,\n};\n\nconst useColorMap = () => {\n const { theme } = useDripsyTheme();\n\n return useMemo(() => {\n const colorMap = {\n primary: {\n background: theme.colors.primaryButtonBackgroundDefault,\n backgroundHovered: theme.colors.primaryButtonBackgroundHover,\n content: theme.colors.primaryButtonContent,\n },\n secondary: {\n background: theme.colors.secondaryButtonBackgroundDefault,\n backgroundHovered: theme.colors.secondaryButtonBackgroundHover,\n content: theme.colors.secondaryButtonContent,\n },\n disabled: {\n background: theme.colors.disabledButtonBackground,\n backgroundHovered: theme.colors.disabledButtonBackground,\n content: theme.colors.disabledButtonContent,\n },\n };\n return colorMap;\n }, [theme]);\n};\n\ntype Props = {\n title: string;\n variant?: 'primary' | 'secondary';\n size?: 'default' | 'small' | 'large';\n isLoading?: boolean;\n rounded?: boolean;\n textStyle?: TextStyle;\n buttonStyle?: ViewStyle;\n animatingCircleId?: string;\n} & PressableProps;\n\nexport default function Button({\n title,\n variant = 'primary',\n size = 'default',\n isLoading,\n rounded = false,\n disabled,\n textStyle,\n buttonStyle,\n animatingCircleId,\n style,\n ...props\n}: Props) {\n const colorMap = useColorMap();\n const {\n background,\n backgroundHovered,\n content: contentColor,\n } = colorMap[disabled ? 'disabled' : variant];\n\n const backgroundColor = useSharedValue(background);\n const scale = useSharedValue(1);\n const animatedStyles = useAnimatedStyle(() => ({\n backgroundColor: backgroundColor.value,\n transform: [{ scale: withTiming(scale.value, { duration: 100 }) }],\n }));\n\n useEffect(() => {\n const { background } = colorMap[disabled ? 'disabled' : variant];\n backgroundColor.value = background;\n }, [backgroundColor, colorMap, disabled, variant]);\n\n const paddingHorizontal =\n paddingHorizontalMap[size] || paddingHorizontalMap.default;\n const height = sizeMap[size] || sizeMap.default;\n\n function getRadius() {\n if (rounded) {\n return height / 2;\n }\n return Math.min(8, height / 5);\n }\n\n return (\n {\n backgroundColor.value = withTiming(backgroundHovered);\n }}\n onHoverOut={() => {\n backgroundColor.value = withTiming(background);\n }}\n onPressIn={() => {\n scale.value = 0.98;\n backgroundColor.value = withTiming(backgroundHovered);\n }}\n onPressOut={() => {\n scale.value = 1;\n backgroundColor.value = withTiming(background);\n }}\n style={[{ position: 'relative' }, style as any]}\n {...props}\n >\n \n {isLoading ? (\n \n ) : (\n \n {title}\n \n )}\n \n {animatingCircleId ? : null}\n \n );\n}\n","import { makeTheme } from 'dripsy';\nimport merge from 'lodash/fp/merge';\nimport { Platform } from 'react-native';\n\nconst theme = {\n colors: {\n background: 'white',\n chatBackground: 'white',\n text: '#0D0D0D',\n secondaryText: '#5E5E5E',\n tertiaryText: '#858585',\n badge: '#ED1C24',\n prmary: '#6210CC',\n accent: '#6210CC',\n border: '#D1D6DB',\n disabled: '#A6A6A6',\n announcementBarBackgroundDefault: '#C5EAD2',\n announcementBarBackgroundHover: '#79D1A2',\n announcementBarIcon: '#0D0D0D',\n announcementBarContent: '#0D0D0D',\n brandAvatarBackground: '#6210CC',\n brandAvatarIcon: '#FFF',\n activeTab: '#6210CC',\n inactiveTab: '#CCCCCC',\n primaryButtonBackgroundDefault: '#6210CC',\n primaryButtonBackgroundHover: '#4B11A1',\n primaryButtonContent: '#fff',\n secondaryButtonBackgroundDefault: '#E0E0E0',\n secondaryButtonBackgroundHover: '#CCCCCC',\n secondaryButtonContent: '#0D0D0D',\n disabledButtonBackground: '#E0E0E0',\n disabledButtonContent: '#858585',\n suggestedReplyBackgroundDefault: '#62EEAB',\n suggestedReplyBackgroundHover: '#39CF87',\n suggestedReplyText: '#0D0D0D',\n adminMessageBoxBackground: '#E1DBFF',\n csatSelectedItemBackground: '#E0E0E0',\n csatSelectedItemText: '#0D0D0D',\n incomingMessageBackground: '#F2F3F5',\n incomingMessageText: '#0D0D0D',\n outgoingMessageBackground: '#6210CC',\n outgoingMessageText: '#FFFFFF',\n messageTimestamp: '#858585',\n notificationCardBackground: '#F2F3F5',\n navigationHeaderBackground: 'white',\n navigationHeaderTextColor: '#0D0D0D',\n navigationTintColor: '#6210CC',\n listItemBackground: 'rgba(236, 236, 236, 0)',\n listItemBackgroundHover: '#F2F3F5',\n defaultFaqItemColor: '#6210CC',\n defaultFaqItemContent: '#FFF',\n online: '#259C72',\n avatarBackground: '#ECECEC',\n messageInputBackground: '#F2F3F5',\n dateLine: '#5E5E5E',\n sendFileButton: '#4E5968',\n readIconColor: '#259C72',\n animatingCircle: '#FFA756',\n messageInputBarBackground: 'white',\n carouselItemBackground: '#F2F4F6',\n },\n sizes: {\n channelListAvatar: 60,\n },\n space: {\n bubblePadding: 16,\n notificationCardSpacing: 16,\n suggestedReplyHorizontalSpacing: 16,\n suggestedReplyVerticalSpacing: 6,\n messageInputBarPaddingTop: 8,\n },\n radii: {\n bubble: 18,\n notificationCard: 8,\n suggestedReply: 16,\n },\n fontSizes: {\n xlarge: 22,\n large: 20,\n medium: 16,\n smedium: 14,\n small: 13,\n xsmall: 12,\n xxsmall: 11,\n xxxsmall: 10,\n },\n lineHeights: {\n large: (Platform.OS === 'android' ? 22 : undefined) as number,\n smedium: 20,\n medium: 20,\n small: 18,\n xsmall: 14,\n xsmall2: 16,\n xxsmall: 13,\n xxxsmall: 12,\n },\n styles: {\n textXxxsmall: {\n fontSize: 'xxxsmall',\n lineHeight: 'xxxsmall',\n },\n textXxsmall: {\n fontSize: 'xxsmall',\n lineHeight: 'xxsmall',\n },\n textXsmall: {\n fontSize: 'xsmall',\n lineHeight: 'xsmall',\n },\n textXsmall2: {\n fontSize: 'xsmall',\n lineHeight: 'xsmall2',\n },\n textSmall: {\n fontSize: 'small',\n lineHeight: 'small',\n },\n textSmedium: {\n fontSize: 'smedium',\n lineHeight: 'smedium',\n },\n textMedium: {\n fontSize: 'medium',\n lineHeight: 'medium',\n },\n textLarge: {\n fontSize: 'large',\n lineHeight: 'large',\n },\n buttonText: {\n fontWeight: '600',\n },\n channelListItemTitle: {\n variant: 'styles.textMedium',\n color: 'text',\n fontWeight: '600',\n },\n channelListItemMessage: {\n variant: 'styles.textSmall',\n color: 'tertiaryText',\n },\n channelListTimestamp: {\n color: '#7F7F7F',\n fontSize: 12,\n },\n notificationCardTimestamp: {\n color: '#A6A6A6',\n variant: 'styles.textXsmall',\n fontWeight: '500',\n },\n notificationCardTitle: {\n variant: 'styles.textMedium',\n fontWeight: '700',\n color: 'text',\n },\n notificationCardHeader: {\n variant: 'styles.textXsmall',\n fontWeight: '500',\n },\n messageText: {\n variant: 'styles.textSmedium',\n },\n messageTimestamp: {\n variant: 'styles.textXsmall',\n color: 'messageTimestamp',\n },\n messageNickname: {\n fontWeight: '700',\n color: 'secondaryText',\n fontSize: 'xsmall',\n },\n dateLine: {\n color: 'dateLine',\n variant: 'styles.textSmedium',\n },\n dateLineRule: {\n height: 1,\n backgroundColor: 'dateLine',\n opacity: 0,\n },\n suggestedReplyText: {\n fontWeight: '500',\n variant: 'styles.textSmedium',\n },\n csatQuestion: {\n fontSize: 'smedium',\n lineHeight: 'small',\n fontWeight: 'bold',\n marginBottom: 16,\n },\n faqItem: {\n borderRadius: 18,\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderWidth: 1,\n minWidth: 80,\n maxWidth: 250,\n },\n faqItemText: {\n variant: 'styles.textSmedium',\n },\n messageInput: {\n borderRadius: 20,\n py: 4,\n px: 16,\n },\n messageInputText: {\n variant: 'styles.textSmedium',\n },\n carouselItem: {\n borderRadius: 16,\n borderWidth: 1,\n borderColor: '#D9D9D9',\n },\n carouselItemButton: {\n borderTopWidth: '1',\n borderColor: 'rgba(0, 0, 0, 0.12)',\n },\n carouselItemWrapper: {},\n carouselItemButtonText: {\n fontSize: 16,\n fontWeight: '600',\n },\n carouselItemTitle: {\n fontSize: 12,\n my: 8,\n px: 10,\n },\n carouselItemPrice: {\n fontSize: 16,\n fontWeight: '600',\n px: 10,\n },\n },\n types: {\n reactNativeTypesOnly: true,\n },\n};\n\nexport const defaultTheme = makeTheme(theme);\n\nexport const darkTheme = makeTheme(\n merge(defaultTheme, {\n colors: {\n background: '#161616',\n chatBackground: '#161616',\n messageInputBarBackground: '#161616',\n navigationHeaderBackground: '#2C2C2C',\n navigationHeaderTextColor: 'rgba(255, 255, 255, 0.88)',\n text: 'rgba(255, 255, 255, 0.88)',\n secondaryText: 'rgba(255, 255, 255, 0.5)',\n tertiaryText: 'rgba(255, 255, 255, 0.38)',\n navigationTintColor: '#B49CFF',\n accent: '#B49CFF',\n brandAvatarBackground: '#B49CFF',\n primaryButtonBackgroundDefault: '#C2A9FA',\n primaryButtonBackgroundHover: '#B49CFF',\n primaryButtonContent: '#161616',\n brandAvatarIcon: '#0D0D0D',\n sendFileButton: '#C2A9FA',\n messageInputBackground: '#393939',\n outgoingMessageBackground: '#C2A9FA',\n outgoingMessageText: 'rgba(0, 0, 0, 0.88)',\n incomingMessageBackground: '#393939',\n incomingMessageText: 'rgba(255, 255, 255, 0.88)',\n suggestedReplyBackgroundDefault: '#7129E5',\n suggestedReplyBackgroundHover: '#4B11A1',\n suggestedReplyText: 'white',\n readIconColor: '#69C085',\n defaultFaqItemColor: '#B49CFF',\n defaultFaqItemContent: '#0D0D0D',\n },\n })\n);\n\nexport type InboxDemoTheme = typeof defaultTheme;\n\ndeclare module 'dripsy' {\n // eslint-disable-next-line @typescript-eslint/no-empty-interface\n interface DripsyCustomTheme extends InboxDemoTheme {}\n}\n","import { ComponentProps } from 'react';\nimport { ImageSourcePropType, View } from 'react-native';\n\nimport Image from '@inbox-demo-nx/ui-image';\nimport '@inbox-demo-nx/theme';\nimport { useDripsyTheme } from 'dripsy';\n\ntype BrandAvatarType =\n | 'notifications'\n | 'promotions'\n | 'support'\n | 'delivery'\n | 'sales';\n\nconst imageMap: Record = {\n notifications: require('../assets/avatar-notifications.png'),\n delivery: require('../assets/avatar-delivery.png'),\n support: require('../assets/avatar-support.png'),\n promotions: require('../assets/avatar-promotions.png'),\n sales: require('../assets/avatar-sales.png'),\n};\n\nexport default function BrandAvatar({\n size,\n style,\n type,\n}: {\n size: number;\n style?: ComponentProps['style'];\n type: BrandAvatarType;\n}) {\n const { theme } = useDripsyTheme();\n const backgroundColor = theme.colors.brandAvatarBackground;\n\n const containerStyle = { width: size, height: size, borderRadius: size / 2 };\n\n return (\n \n \n \n );\n}\n","import { ComponentProps } from 'react';\nimport Image from '@inbox-demo-nx/ui-image';\nimport { useDripsyTheme } from 'dripsy';\nexport default function ImageAvatar({\n size,\n style,\n ...props\n}: { size: number } & ComponentProps) {\n const { theme } = useDripsyTheme();\n return (\n \n );\n}\n","import { userMetaDataKeys } from '@inbox-demo-nx/constants';\nimport { View } from 'dripsy';\nimport { ReactElement } from 'react';\nimport { ImageProps, StyleProp, ViewStyle } from 'react-native';\n\nimport BrandAvatar from './BrandAvatar';\nimport ImageAvatar from './ImageAvatar';\n\nfunction getRandomAvatarUrl(userId: string) {\n return `https://avatars.dicebear.com/api/miniavs/${userId}.png`;\n}\n\nexport default function Avatar({\n size,\n style,\n user,\n fallbackAvatarKey,\n defaultBrandAvatar,\n ...props\n}: {\n size: number;\n style?: StyleProp;\n user?: SendBird.User;\n fallbackAvatarKey?: string;\n defaultBrandAvatar?: ReactElement;\n} & Omit) {\n if (!user) {\n if (fallbackAvatarKey) {\n return (\n \n );\n }\n if (defaultBrandAvatar) {\n return defaultBrandAvatar;\n }\n return ;\n }\n\n if (user.metaData[userMetaDataKeys.brandAvatarType] === 'notifications') {\n return ;\n }\n if (user.metaData[userMetaDataKeys.brandAvatarType] === 'support') {\n return ;\n }\n\n if (user.metaData[userMetaDataKeys.brandAvatarType] === 'promotions') {\n return ;\n }\n if (user.metaData[userMetaDataKeys.brandAvatarType] === 'delivery') {\n return ;\n }\n\n return (\n \n );\n}\n","import { channelCustomTypes, userMetaDataKeys } from '@inbox-demo-nx/constants';\nimport { useAuthContext } from '@inbox-demo-nx/contexts';\nimport { View } from 'dripsy';\nimport { ComponentProps, useMemo } from 'react';\nimport SendBird from 'sendbird';\n\nimport Avatar from './Avatar';\nimport BrandAvatar from './BrandAvatar';\nimport ImageAvatar from './ImageAvatar';\n\nexport default function ChannelCover({\n channel,\n size = 50,\n style,\n}: {\n channel: SendBird.GroupChannel;\n size?: number;\n style?: ComponentProps['style'];\n}) {\n const { currentUser } = useAuthContext();\n const otherChannelMember = useMemo(\n () =>\n channel.members.length === 2\n ? channel.members.find(\n (member) => member.userId !== currentUser?.userId\n )\n : undefined,\n [channel.members, currentUser?.userId]\n );\n\n function renderAvatar() {\n if (channel.customType === channelCustomTypes.support) {\n return ;\n }\n if (channel.customType === channelCustomTypes.notifications) {\n return ;\n }\n if (channel.customType === channelCustomTypes.promotions) {\n return ;\n }\n if (channel.customType === channelCustomTypes.delivery) {\n return ;\n }\n\n if (channel.members.length === 1) {\n return ;\n }\n if (channel.members.length === 2) {\n return ;\n }\n if (channel.members.length > 2) {\n return (\n \n {channel.members.slice(0, 4).map((user, index) => (\n \n ))}\n \n );\n }\n if (channel.coverUrl) {\n return ;\n }\n return ;\n }\n\n function renderBadge() {\n const badgeSize = size * 0.32;\n\n if (\n badgeSize < 8 ||\n otherChannelMember == null ||\n otherChannelMember.metaData[userMetaDataKeys.userType] === 'official' ||\n channel.customType === channelCustomTypes.delivery\n ) {\n return null;\n }\n\n if (otherChannelMember?.connectionStatus === 'online') {\n return (\n \n );\n }\n return null;\n }\n\n return (\n \n {renderAvatar()}\n {renderBadge()}\n \n );\n}\n","import useCanCall from '@inbox-demo-nx/hooks-use-can-call';\nimport { RowStack } from '@inbox-demo-nx/ui';\nimport { isChannelVerified } from '@inbox-demo-nx/utils-chat-common';\nimport { Text, View } from 'dripsy';\nimport SendBird from 'sendbird';\n\nconst ChannelSubtitle = ({ channel }: { channel: SendBird.GroupChannel }) => {\n const canCall = useCanCall(channel);\n\n if (isChannelVerified(channel)) {\n return null;\n }\n\n if (channel.members.length > 2) {\n return (\n \n {channel.members.length} people\n \n );\n }\n\n if (!canCall) {\n return null;\n }\n\n return (\n \n \n \n Online now\n \n \n );\n};\n\nexport default ChannelSubtitle;\n","import { RowStack, Spacer } from '@inbox-demo-nx/ui';\nimport { ChannelBadge } from '@inbox-demo-nx/ui-badges';\nimport { useGetChannelTitle } from '@inbox-demo-nx/utils-chat-common';\nimport { Text, useDripsyTheme, useSx, View } from 'dripsy';\nimport { ReactNode, useMemo } from 'react';\nimport SendBird from 'sendbird';\n\nimport ChannelCover from './ChannelCover';\nimport ChannelSubtitle from './ChannelSubtitle';\n\nexport type ChannelHeaderTitleProps = {\n channel: SendBird.GroupChannel;\n renderSubtitle?: (props: { channel: SendBird.GroupChannel }) => ReactNode;\n renderBadge?: (props: { channel: SendBird.GroupChannel }) => ReactNode;\n renderAvatar?: (props: {\n channel: SendBird.GroupChannel;\n size: number;\n }) => ReactNode;\n};\n\nexport function ChannelHeaderTitle({\n channel,\n renderSubtitle = ChannelSubtitle,\n renderBadge,\n renderAvatar = ChannelCover,\n}: ChannelHeaderTitleProps) {\n const sx = useSx();\n const { theme } = useDripsyTheme();\n const getChannelTitle = useGetChannelTitle();\n\n const renderedBadge = useMemo(() => {\n const defaultRenderBadge: ChannelHeaderTitleProps['renderBadge'] = (\n props\n ) => (\n \n );\n return (renderBadge || defaultRenderBadge)({ channel });\n }, [channel, renderBadge, theme.colors.navigationHeaderTextColor]);\n\n return (\n \n {renderAvatar({ channel, size: 36 })}\n \n \n \n <>\n \n {getChannelTitle(channel)}\n \n {renderedBadge}\n \n \n {renderSubtitle({ channel })}\n \n \n );\n}\n","import { useBreakpoints, View } from 'dripsy';\nimport { ViewProps } from 'react-native';\n\nexport default function ListItemWrapper(props: ViewProps) {\n const breakpoints = useBreakpoints();\n\n return (\n \n );\n}\n","import googleAnalytics from '@analytics/google-analytics';\nimport Analytics, { AnalyticsInstance } from 'analytics';\n\nconst analytics: AnalyticsInstance = Analytics({\n plugins: [\n googleAnalytics({\n measurementIds: ['G-ZHKW3VB29D'],\n }),\n ],\n});\n\nexport default analytics;\n","import type { MessageData } from '@inbox-demo-nx/types';\nimport { safeJSONParse } from '@inbox-demo-nx/utils';\n\nexport function getMessageData(options: MessageData) {\n return JSON.stringify(options);\n}\n\nexport function parseMessageData<\n TMessageData extends MessageData = MessageData\n>(data: string | null): TMessageData | null {\n return safeJSONParse(data || '');\n}\n","import '@inbox-demo-nx/theme';\n\nimport { useDripsyTheme } from 'dripsy';\nimport AnimatedLottieView from 'lottie-react-native';\nimport { useEffect, useMemo, useState } from 'react';\nimport { ViewProps } from 'react-native';\n\nimport colorizeLottie from './colorizeLottie';\nimport animation from './toss-loading-indicator.json';\nexport default function CircleProgress({\n size,\n color,\n ...props\n}: { size: number; color?: string } & ViewProps) {\n const { theme } = useDripsyTheme();\n const [LazyLottieView, setLazyLottieView] = useState<\n typeof AnimatedLottieView | null\n >(null);\n const coloredAnimation = useMemo(() => {\n return colorizeLottie(animation, {\n 'layers.0.shapes.0.it.2.c.k': color || theme.colors.accent,\n });\n }, [color, theme.colors.accent]);\n\n useEffect(() => {\n import('lottie-react-native').then((module) =>\n setLazyLottieView(module.default)\n );\n }, []);\n\n return (\n LazyLottieView && (\n \n )\n );\n}\n","import set from 'lodash/set';\nimport tinycolor from 'tinycolor2';\n\n// values of colorByPath can be falsy to no-op\nexport default function colorizeLottie(\n json: Record,\n colorByPath: Record\n) {\n const nextJson = JSON.parse(JSON.stringify(json));\n\n Object.entries(colorByPath).forEach(([path, color]) => {\n // incase undefined/null/falsy is passed to color\n if (!color) {\n return;\n }\n const rgbPercentages = tinycolor(color).toPercentageRgb();\n const rFraction = parseInt(rgbPercentages.r, 10) / 100;\n const gFraction = parseInt(rgbPercentages.g, 10) / 100;\n const bFraction = parseInt(rgbPercentages.b, 10) / 100;\n\n const pathParts = path.split('.');\n set(nextJson, [...pathParts, 0], rFraction);\n set(nextJson, [...pathParts, 1], gFraction);\n set(nextJson, [...pathParts, 2], bFraction);\n });\n\n return nextJson;\n}\n","import { channelMetaDataKeys } from '@inbox-demo-nx/constants';\nimport {\n useAuthContext,\n useScenarioCallbackContext,\n useScenarioContext,\n useSendApiRequest,\n useSendBirdContext,\n} from '@inbox-demo-nx/contexts';\nimport {\n MessageContent,\n Reaction,\n ScenarioDataChannelState,\n ScenarioMessage,\n ScenarioStateContext,\n SingleContentScenarioMessage,\n} from '@inbox-demo-nx/types';\nimport { useAnimatingCircleContext } from '@inbox-demo-nx/ui-animating-circle';\nimport { convertTimestamp, delay } from '@inbox-demo-nx/utils';\nimport {\n convertScenarioMessageToMessagePayload,\n processScenarioMessages,\n} from '@inbox-demo-nx/utils-scenario';\nimport axios from 'axios';\nimport { useCallback, useMemo } from 'react';\n\nexport default function useScenarioUtils() {\n const sendApiRequest = useSendApiRequest();\n const scenario = useScenarioContext();\n const { currentUser } = useAuthContext();\n const { runCallback } = useScenarioCallbackContext();\n const { sendbird } = useSendBirdContext();\n const { setTargetId: setAnimatingCircleTarget } = useAnimatingCircleContext();\n\n const currentUserId = currentUser?.userId;\n\n const getLatestUserMetaData = useCallback(async () => {\n if (!currentUserId) return {};\n\n const userListQuery = sendbird.createApplicationUserListQuery();\n userListQuery.userIdsFilter = [currentUserId];\n const [latestUser] = await userListQuery.next();\n return latestUser.metaData;\n }, [currentUserId, sendbird]);\n\n return useMemo(() => {\n async function handleChannelStateTransition(\n userId: string,\n channelUrl: string,\n channelState: string\n ) {\n if (!currentUserId) {\n throw new Error('currentUser must exist.');\n }\n\n const channel = await sendbird.GroupChannel.getChannel(channelUrl);\n\n const scenarioData = await getScenarioDataFromCustomChannelType(\n channel.customType || ''\n );\n\n if (!scenarioData) {\n return;\n }\n\n const currentState = scenarioData.states[channelState];\n if (!currentState) {\n return;\n }\n\n const processedMessages = processScenarioMessages(currentState.messages);\n\n const sendMessage = async (message: typeof processedMessages[number]) => {\n const channelMetaData = await channel.getAllMetaData();\n\n const payload = convertScenarioMessageToMessagePayload(message, {\n myUserId: userId,\n channelMetaData,\n userMetaData: await getLatestUserMetaData(),\n });\n\n if (\n !('user_id' in payload) ||\n !payload.user_id ||\n payload.user_id === userId\n ) {\n return sendApiRequest({\n type: 'sendMessageAndTranslate',\n data: { channelUrl, params: payload },\n });\n } else {\n const isChannelMember = channel.members.some(\n (user) => user.userId === payload.user_id\n );\n if (!isChannelMember) {\n await sendApiRequest({\n type: 'inviteUser',\n data: { channelUrl, userId: payload.user_id },\n });\n }\n return sendApiRequest({\n type: 'typeAndSendMessage',\n data: {\n channelUrl,\n userId: payload.user_id,\n messageParams: payload,\n typingDuration: message.skipTyping ? 0 : 1000,\n },\n });\n }\n };\n\n const messageIds: number[] = [];\n for (const message of processedMessages) {\n const { message_id: messageId } = await sendMessage(message);\n await addReactionsToMessage({\n channelUrl,\n messageId,\n reactions: message.reactions,\n });\n messageIds.push(messageId);\n }\n\n if (currentState.onEntry) {\n await currentState.onEntry(\n await getScenarioStateContext({ userId, channelUrl, messageIds })\n );\n }\n if (currentState.after) {\n const { delay: delayMs, targetState } = currentState.after;\n delayMs && (await delay(delayMs));\n setChannelState({ channelUrl, state: targetState, userId });\n }\n }\n\n async function setChannelState({\n channelUrl,\n state,\n userId,\n }: {\n channelUrl: string;\n state: string;\n userId: string;\n }) {\n const channel = await sendbird.GroupChannel.getChannel(channelUrl);\n const channelMetaData = await channel.getMetaData([\n channelMetaDataKeys.state,\n ]);\n const previousState = channelMetaData[channelMetaDataKeys.state];\n\n if (previousState === String(state)) {\n return;\n }\n\n const channelScenario = getScenarioDataFromCustomChannelType(\n channel.customType || ''\n );\n const onExit = channelScenario?.states?.[previousState]?.onExit;\n if (onExit) {\n await onExit(await getScenarioStateContext({ userId, channelUrl }));\n }\n\n await channel.updateMetaData({ [channelMetaDataKeys.state]: state });\n handleChannelStateTransition(userId, channelUrl, String(state));\n }\n\n async function getScenarioStateContext({\n userId,\n channelUrl,\n messageIds,\n }: {\n userId: string;\n channelUrl: string;\n messageIds?: number[];\n }): Promise {\n if (!currentUserId)\n throw new Error('Call getScenarioStateContext after logging in.');\n\n const channel = await sendbird.GroupChannel.getChannel(channelUrl);\n\n const scenarioStateContext: ScenarioStateContext = {\n currentUserId,\n channelUrl,\n messageIds,\n sendApiRequest,\n setChannelMetaData: (data) => channel.updateMetaData(data, true),\n runCallback,\n setAnimatingCircleTarget,\n transitionState: async (params) => {\n const getUpdateChannelStateRequest = async () => {\n if (typeof params === 'string') {\n return setChannelState({ channelUrl, state: params, userId });\n }\n\n const { channelUrl: targetChannelUrl } = await sendApiRequest({\n type: 'getChannelUrlByCustomType',\n data: {\n userId: currentUserId,\n customType: params.customChannelType,\n },\n });\n\n return setChannelState({\n channelUrl: targetChannelUrl,\n state: params.state,\n userId,\n });\n };\n\n try {\n await getUpdateChannelStateRequest();\n } catch (error) {\n if (axios.isAxiosError(error)) {\n console.error(error.toJSON());\n } else {\n console.error(error);\n }\n }\n },\n updateUserMessage: ({ channelUrl, messageId, payload }) =>\n sendApiRequest({\n type: 'editMessage',\n data: {\n channelUrl,\n messageId,\n params: { message_type: 'MESG', ...payload },\n },\n }),\n async sendMessage({ channelUrl, message }) {\n if (channelUrl) {\n const channel = await sendbird.GroupChannel.getChannel(channelUrl);\n const payload = convertScenarioMessageToMessagePayload(message, {\n myUserId: userId,\n channelMetaData: await channel.getAllMetaData(),\n userMetaData: await getLatestUserMetaData(),\n });\n await sendApiRequest({\n type: 'sendMessage',\n data: { channelUrl, params: payload },\n });\n return;\n }\n if (message.sender) {\n const [targetChannel] = await sendApiRequest({\n type: 'fetchGroupChannels',\n data: {\n userId,\n params: {\n members_exactly_in: [message.sender, userId]\n .map(encodeURIComponent)\n .join(','),\n },\n },\n });\n const payload = convertScenarioMessageToMessagePayload(message, {\n myUserId: userId,\n channelMetaData: await sendApiRequest({\n type: 'getGroupChannelMetaData',\n data: { channelUrl: targetChannel.channel_url },\n }),\n userMetaData: currentUser.metaData,\n });\n await sendApiRequest({\n type: 'sendMessage',\n data: { channelUrl: targetChannel.channel_url, params: payload },\n });\n return;\n }\n throw new Error('Channel URL or sender is required');\n },\n };\n\n return scenarioStateContext;\n }\n\n function getScenarioDataFromCustomChannelType(customChannelType: string) {\n return scenario.channels.find((c) => c.customType === customChannelType);\n }\n\n async function addReactionsToMessage(data: {\n channelUrl: string;\n messageId: number;\n reactions?: Reaction[];\n }) {\n if ((data.reactions?.length ?? 0) > 0)\n return sendApiRequest({ type: 'addReactionsToMessage', data });\n }\n\n return {\n convertScenarioMessageToMessagePayload,\n getScenarioStateContext,\n getScenarioDataFromCustomChannelType,\n addReactionsToMessage,\n setChannelState,\n async handleChannelStateEvent(\n handler:\n | ((data: HandlerData, context: ScenarioStateContext) => void)\n | ((context: ScenarioStateContext) => void)\n | undefined,\n params: HandlerData | undefined,\n channelContext: { channelUrl: string }\n ) {\n if (!handler || !currentUserId) {\n return;\n }\n const { channelUrl } = channelContext;\n const scenarioStateContext = await getScenarioStateContext({\n channelUrl,\n userId: currentUserId,\n });\n\n const args = params\n ? [params, scenarioStateContext]\n : [scenarioStateContext];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n try {\n const result = await (handler as any)(...args);\n return result;\n } catch (error) {\n if (axios.isAxiosError(error)) {\n console.error(error.toJSON());\n } else {\n console.error(error);\n }\n }\n },\n\n async getScenarioDataFromChannelUrl(channelUrl: string) {\n const channel = await sendbird.GroupChannel.getChannel(channelUrl);\n return getScenarioDataFromCustomChannelType(channel.customType || '');\n },\n\n convertMessagesToPayloadArray__TMP(\n messages: ScenarioDataChannelState['messages'] = []\n ) {\n return messages\n .flatMap((message) => {\n const singleContentMessages = (\n Array.isArray(message.content)\n ? message.content.map((content) => ({ ...message, content }))\n : [message]\n ) as (Omit & {\n content: MessageContent;\n })[];\n return singleContentMessages;\n })\n .map(({ createdAt, ...rest }) => ({\n ...rest,\n createdAt: convertTimestamp(createdAt),\n }))\n .map((item, index, array) => {\n if (array[index - 1]?.createdAt === item.createdAt) {\n // If the consecutive messages have the same timestamp, we need to add a delay to the next message to keep the order.\n const { createdAt, ...rest } = item;\n return { ...rest, createdAt: createdAt + 1 };\n }\n return item;\n });\n },\n\n async requestSendMessage(\n message: SingleContentScenarioMessage,\n {\n myUserId,\n channelMetaData,\n channelUrl,\n }: {\n myUserId: string;\n channelMetaData: Record;\n channelUrl: string;\n }\n ) {\n const userMetaData = await sendApiRequest({\n type: 'getAllUserMetaData',\n data: { userId: myUserId },\n });\n const sendMessagePayload = convertScenarioMessageToMessagePayload(\n message,\n { myUserId, channelMetaData, userMetaData }\n );\n const newMessage = await sendApiRequest({\n type: 'sendMessageAndTranslate',\n data: { channelUrl, params: sendMessagePayload },\n });\n await addReactionsToMessage({\n channelUrl,\n messageId: newMessage.message_id,\n reactions: message.reactions,\n });\n },\n };\n }, [\n currentUserId,\n sendbird.GroupChannel,\n getLatestUserMetaData,\n sendApiRequest,\n runCallback,\n setAnimatingCircleTarget,\n currentUser,\n scenario.channels,\n ]);\n}\n","var _defs, _path;\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgIcBadgeStore(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 16,\n height: 16,\n viewBox: \"0 0 16 16\"\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null)), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M14.666 5.333V5.5c0 1.38-.995 2.5-2.222 2.5-1.227 0-2.222-1.12-2.222-2.5C10.222 6.88 9.227 8 8 8 6.772 8 5.777 6.88 5.777 5.5c0 1.38-.994 2.5-2.222 2.5-1.227 0-2.222-1.12-2.222-2.5v-.167a4 4 0 014-4h5.333a4 4 0 014 4zM12.444 9c-.891 0-1.66-.375-2.222-.963a3.043 3.043 0 01-4.445 0A3.043 3.043 0 012 8.57V12a2.667 2.667 0 002.666 2.666h6.667A2.667 2.667 0 0014 12V8.57A3 3 0 0112.444 9zm-2.009 2.754a.5.5 0 01-.19.681c-.81.457-1.508.73-2.243.731-.737.002-1.436-.27-2.25-.732a.5.5 0 01.495-.869c.757.431 1.274.602 1.753.601.48 0 .996-.174 1.754-.602a.5.5 0 01.681.19z\",\n clipRule: \"evenodd\"\n })));\n}\n\nexport default SvgIcBadgeStore;","var _defs, _path;\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgIcBadgeVerified(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 17,\n height: 17,\n viewBox: \"0 0 17 17\"\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null)), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M9.124 1.24a.962.962 0 00-1.247 0l-1.525 1.3a.962.962 0 01-.547.227l-1.997.159a.962.962 0 00-.882.882l-.16 1.997a.962.962 0 01-.226.547l-1.3 1.525a.962.962 0 000 1.247l1.3 1.525c.131.154.21.346.227.547l.159 1.997c.037.471.411.845.882.882l1.997.16a.961.961 0 01.547.226l1.525 1.3a.961.961 0 001.247 0l1.525-1.3a.961.961 0 01.547-.226l1.997-.16a.961.961 0 00.882-.882l.16-1.997a.961.961 0 01.226-.547l1.3-1.525a.961.961 0 000-1.247l-1.3-1.525a.961.961 0 01-.226-.547l-.16-1.997a.961.961 0 00-.882-.882l-1.997-.16a.962.962 0 01-.547-.226l-1.525-1.3zm2.041 5.815a.56.56 0 10-.844-.738L7.85 9.139 6.253 7.861a.56.56 0 00-.7.876L7.33 10.16a.881.881 0 001.214-.108l2.621-2.996z\",\n clipRule: \"evenodd\"\n })));\n}\n\nexport default SvgIcBadgeVerified;","import { ComponentProps } from 'react';\nimport { Image } from 'react-native';\n\nimport StoreIconSvg from '../assets/ic-badge-store.svg';\nimport VerifiedIconSvg from '../assets/ic-badge-verified.svg';\n\nexport type BadgeProps = { size?: number; color: string } & ComponentProps<\n typeof Image\n>;\n\nexport const Badge = ({ size = 16, style, ...props }: BadgeProps) => (\n \n);\n\nexport const VerifiedBadge = ({\n size = 16,\n color,\n ...props\n}: Omit) => {\n return ;\n};\n\nexport const StoreBadge = ({\n size = 16,\n color,\n ...props\n}: Omit) => {\n return ;\n};\n","import { userMetaDataKeys } from '@inbox-demo-nx/constants';\nimport SendBird from 'sendbird';\n\nimport { BadgeProps, StoreBadge, VerifiedBadge } from './Badge';\n\nconst UserBadge = ({\n user,\n ...props\n}: { user: SendBird.User } & Omit) => {\n const userType = (user?.metaData as Record)[\n userMetaDataKeys.userType\n ];\n\n if (userType === 'official') {\n return ;\n }\n if (userType === 'store') {\n return ;\n }\n return null;\n};\n\nexport default UserBadge;\n","import { useAuthContext } from '@inbox-demo-nx/contexts';\nimport { isChannelVerified } from '@inbox-demo-nx/utils-chat-common';\nimport { useMemo } from 'react';\nimport SendBird from 'sendbird';\n\nimport { BadgeProps, VerifiedBadge } from './Badge';\nimport UserBadge from './UserBadge';\n\nexport default function ChannelBadge({\n channel,\n ...props\n}: { channel: SendBird.GroupChannel } & Omit) {\n const { currentUser } = useAuthContext();\n\n const otherUser = useMemo(() => {\n if (channel.members.length !== 2 || !currentUser) {\n return null;\n }\n return channel.members.find(\n (member) => member.userId !== currentUser.userId\n );\n }, [channel.members, currentUser]);\n\n if (isChannelVerified(channel)) {\n return ;\n }\n\n return otherUser ? : null;\n}\n","export const cdnHost = 'https://d20yal9ldrtfu9.cloudfront.net';\nexport const defaultMaleProfileUrl = `https://dxstmhyqfqr1o.cloudfront.net/inbox-demo/avatars/alex.png`;\n\nexport const userMetaDataKeys = {\n language: 'language',\n initializedVersion: 'initializedVersion',\n userType: 'userType',\n brandAvatarType: 'brandAvatarType',\n scenario: 'scenario',\n};\n\nexport const channelMetaDataKeys = {\n state: 'state',\n};\n\nexport const asyncStorageKeys = {\n savedUser: 'savedUser',\n};\n\nexport const messageCustomTypes = {\n interactiveResponse: 'interactiveResponse',\n typingIndicator: 'typingIndicator',\n notification: 'notification',\n banner: 'banner',\n marketing: 'marketing',\n splitPayment: 'splitPayment',\n support: 'support',\n vote: 'vote',\n splitCost: 'splitCost',\n csat: 'csat',\n csat5: 'csat5',\n orderConfirmation: 'orderConfirmation',\n map: 'map',\n splitPaymentUpdate: 'splitPaymentUpdate',\n couldNotRecognize: 'couldNotRecognize',\n adminMessageBox: 'adminMessageBox',\n adminMessageBubble: 'adminMessageBubble',\n callStarted: 'callStarted',\n callEnded: 'callEnded',\n bookingsBotStart: 'bookingsBotStart',\n audio: 'audio',\n};\n\nexport const nonCenteredAdminMessageCustomTypes = [\n messageCustomTypes.splitPayment,\n messageCustomTypes.splitCost,\n messageCustomTypes.csat,\n messageCustomTypes.couldNotRecognize,\n messageCustomTypes.adminMessageBox,\n messageCustomTypes.adminMessageBubble,\n];\n\nexport const channelCustomTypes = {\n notifications: 'notifications',\n promotions: 'promotions',\n support: 'support',\n delivery: 'delivery',\n banner: 'banner',\n};\n\nexport const verifiedChannelCustomTypes = [\n channelCustomTypes.notifications,\n channelCustomTypes.promotions,\n channelCustomTypes.support,\n];\n\nexport const queryKeys = {\n inbox: 'inbox',\n};\n","import '@inbox-demo-nx/theme';\n\nimport { Pressable, PressableProps } from '@inbox-demo-nx/ui';\nimport Image from '@inbox-demo-nx/ui-image';\nimport { Text, useDripsyTheme } from 'dripsy';\nimport { useMemo } from 'react';\nimport { ImageSourcePropType, StyleProp, ViewStyle } from 'react-native';\nimport Animated, {\n useAnimatedStyle,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated';\n\nconst backgroundScales = {\n hidden: 0.8,\n visible: 1,\n};\n\nexport default function IconButton({\n children,\n source,\n style,\n size = 24,\n tintColor: tintColorProp,\n label,\n ...props\n}: PressableProps & {\n style?: StyleProp;\n source?: ImageSourcePropType;\n size?: number;\n label?: string;\n tintColor?: true | string;\n}) {\n const { theme } = useDripsyTheme();\n const backgroundScale = useSharedValue(backgroundScales.hidden);\n const backgroundOpacity = useSharedValue(0);\n const buttonOpacity = useSharedValue(1);\n\n const animatedBackgroundStyles = useAnimatedStyle(() => ({\n transform: [{ scale: backgroundScale.value }],\n opacity: backgroundOpacity.value,\n }));\n\n const animatedButtonStyles = useAnimatedStyle(() => ({\n opacity: buttonOpacity.value,\n }));\n\n const tintColor = useMemo(() => {\n if (!tintColorProp || tintColorProp === true) {\n return theme.colors.accent;\n }\n return tintColorProp;\n }, [theme.colors.accent, tintColorProp]);\n\n const hoverBackgroundSize = Math.max(36, size + 12);\n\n return (\n {\n backgroundScale.value = withTiming(backgroundScales.visible);\n backgroundOpacity.value = withTiming(1);\n }}\n onHoverOut={() => {\n backgroundScale.value = withTiming(backgroundScales.hidden);\n backgroundOpacity.value = withTiming(0);\n }}\n onPressIn={() => {\n buttonOpacity.value = withTiming(0.3, { duration: 0 });\n backgroundOpacity.value = withTiming(0, { duration: 0 });\n }}\n onPressOut={() => {\n buttonOpacity.value = withTiming(1);\n backgroundOpacity.value = withTiming(0);\n }}\n style={[\n {\n position: 'relative',\n paddingVertical: label ? 10 : 6,\n paddingHorizontal: label ? 8 : 6,\n minWidth: 36,\n minHeight: 36,\n alignItems: 'center',\n justifyContent: 'center',\n },\n !label && { width: hoverBackgroundSize, height: hoverBackgroundSize },\n style,\n ]}\n {...props}\n >\n \n \n <>\n {children || (\n \n )}\n {label && (\n \n {label}\n \n )}\n \n \n \n );\n}\n","import { createContext, ReactNode, useContext } from 'react';\nimport { SendApiRequest } from '@inbox-demo-nx/types';\n\nexport const APIContext = createContext<{\n sendApiRequest: SendApiRequest;\n}>({} as any);\n\nexport const APIContextProvider = ({\n children,\n sendApiRequest,\n}: {\n children: ReactNode;\n sendApiRequest: SendApiRequest;\n}) => {\n return (\n \n {children}\n \n );\n};\n\nexport const useSendApiRequest = () => useContext(APIContext).sendApiRequest;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { createContext, useContext } from 'react';\nimport SendBird from 'sendbird';\n\nexport interface AuthContextValue {\n currentUser: SendBird.User | null;\n updateCurrentUserState: () => void;\n initializeCurrentUser: () => void;\n isInitializingUser: boolean;\n}\n\nexport const AuthContext = createContext({} as any);\n\nexport const useAuthContext = () => useContext(AuthContext);\n","import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from 'react';\nimport SendBird from 'sendbird';\n\ntype CallScreenData = { user: SendBird.User };\n\nfunction useCallScreen() {\n const [callScreenData, setCallScreenData] = useState(\n null\n );\n\n const isCallVisible = !!callScreenData;\n const [callEventListenerMap] = useState(new Map());\n\n const addCallEventListener = useCallback(\n (id: string, listener: { onCallEnded?: (duration: number) => void }) => {\n callEventListenerMap.set(id, listener);\n },\n [callEventListenerMap]\n );\n\n const removeCallEventListener = useCallback(\n (id: string) => {\n callEventListenerMap.delete(id);\n },\n [callEventListenerMap]\n );\n\n const stopCall = useCallback(\n (duration: number) => {\n callEventListenerMap.forEach((listener) => {\n listener.onCallEnded?.(duration);\n });\n setCallScreenData(null);\n },\n [callEventListenerMap]\n );\n\n return useMemo(\n () => ({\n callScreenData,\n toggleCallScreen: setCallScreenData,\n isCallVisible,\n addCallEventListener,\n removeCallEventListener,\n stopCall,\n }),\n [\n addCallEventListener,\n callScreenData,\n isCallVisible,\n removeCallEventListener,\n stopCall,\n ]\n );\n}\n\nexport const CallContext = createContext<{\n isCallVisible: boolean;\n callScreenData: CallScreenData | null;\n toggleCallScreen: (data: CallScreenData | null) => void;\n addCallEventListener: (\n id: string,\n listener: { onCallEnded?: (duration: number) => void }\n ) => void;\n removeCallEventListener: (id: string) => void;\n stopCall: (duration: number) => void;\n}>({} as any);\n\nexport const useCallContext = () => useContext(CallContext);\n\nexport const CallContextProvider = ({ children }: { children: ReactNode }) => {\n const callContextValue = useCallScreen();\n return (\n \n {children}\n \n );\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { ScenarioData } from '@inbox-demo-nx/types';\nimport { createContext, ReactNode, useContext, useMemo, useRef } from 'react';\n\nexport const ScenarioContext = createContext({} as any);\n\ntype Callback = (...args: any[]) => void;\nexport const ScenarioCallbackContext = createContext<{\n addCallback: (key: string, callback: Callback) => void;\n removeCallback: (key: string) => void;\n runCallback: (key: string) => void;\n}>({} as any);\n\nexport function ScenarioContextProvider({\n children,\n scenario,\n}: {\n children: ReactNode;\n scenario: ScenarioData;\n}) {\n const callbackMapRef = useRef(new Map void>());\n\n const scenarioCallbackContextValue = useMemo(() => {\n function addCallback(key: string, callback: Callback) {\n if (callbackMapRef.current.has(key)) {\n throw new Error('Duplicated key');\n }\n callbackMapRef.current.set(key, callback);\n }\n\n function removeCallback(key: string) {\n callbackMapRef.current.delete(key);\n }\n\n function runCallback(key: string, ...args: any[]) {\n return callbackMapRef.current.get(key)?.(...(args as []));\n }\n\n return { addCallback, removeCallback, runCallback };\n }, []);\n\n return (\n \n \n {children}\n \n \n );\n}\n\nexport const useScenarioContext = () => useContext(ScenarioContext);\n\nexport const useScenarioCallbackContext = () =>\n useContext(ScenarioCallbackContext);\n","import { ScenarioData } from '@inbox-demo-nx/types';\nimport { createContext, ReactNode, useContext, useMemo } from 'react';\n\nimport { useScenarioContext } from './scenario';\n\nif (typeof Intl === 'undefined') {\n require('intl');\n require('intl/locale-data/jsonp/en');\n require('@formatjs/intl-locale/polyfill');\n require('@formatjs/intl-getcanonicallocales/polyfill');\n require('@formatjs/intl-pluralrules/polyfill');\n require('@formatjs/intl-pluralrules/locale-data/en'); // locale-data for en\n require('@formatjs/intl-relativetimeformat/polyfill');\n require('@formatjs/intl-relativetimeformat/locale-data/en');\n}\n\nconst getIntlObjects = (scenario: ScenarioData) => {\n const intlTimeFormat = Intl.DateTimeFormat(scenario.defaultLanguage, {\n hour: 'numeric',\n minute: 'numeric',\n });\n\n const intlDateFormat = Intl.DateTimeFormat(scenario.defaultLanguage, {\n month: 'short',\n day: 'numeric',\n });\n\n const intlDateDifferentYearFormat = Intl.DateTimeFormat(\n scenario.defaultLanguage,\n {\n month: 'numeric',\n day: 'numeric',\n year: 'numeric',\n }\n );\n\n const intlDateTimeFormat = Intl.DateTimeFormat(scenario.defaultLanguage, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n });\n\n const intlDateLineLastYearFormat = Intl.DateTimeFormat(\n scenario.defaultLanguage,\n {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n }\n );\n\n const intlDateLineFormat = Intl.DateTimeFormat(scenario.defaultLanguage, {\n month: 'short',\n day: 'numeric',\n weekday: 'long',\n });\n\n const intlDateLineRelativeFormat = new Intl.RelativeTimeFormat(\n scenario.defaultLanguage,\n { numeric: 'auto' }\n );\n\n return {\n intlTimeFormat,\n intlDateFormat,\n intlDateDifferentYearFormat,\n intlDateTimeFormat,\n intlDateLineLastYearFormat,\n intlDateLineFormat,\n intlDateLineRelativeFormat,\n };\n};\n\nexport const IntlContext = createContext>(\n undefined as any\n);\n\nexport const useIntlContext = () => useContext(IntlContext);\n\nexport const IntlContextProvider = ({ children }: { children: ReactNode }) => {\n const scenario = useScenarioContext();\n\n const contextValue = useMemo(() => getIntlObjects(scenario), [scenario]);\n\n return (\n {children}\n );\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { createContext, useContext } from 'react';\nimport { SendBirdInstance } from 'sendbird';\n\nexport interface SendBirdContextValue {\n sendbird: SendBirdInstance;\n appId: string;\n}\n\nexport const SendBirdContext = createContext({} as any);\n\nexport const useSendBirdContext = () => useContext(SendBirdContext);\n","import { InboxDemoTheme } from '@inbox-demo-nx/theme';\nimport { DripsyProvider } from 'dripsy';\nimport { createContext, ReactNode, useContext } from 'react';\n\ntype ThemeContextValue = {\n isDarkTheme: boolean;\n theme: InboxDemoTheme;\n};\n\nconst ThemeContext = createContext({} as any);\n\nexport const ThemeContextProvider = ({\n children,\n theme,\n isDarkTheme,\n}: { children: ReactNode } & ThemeContextValue) => {\n return (\n \n {children}\n \n );\n};\n\nexport const useIsDarkTheme = () => useContext(ThemeContext).isDarkTheme;\n","import { InboxDemoTheme } from '@inbox-demo-nx/theme';\nimport { ScenarioData, SendApiRequest } from '@inbox-demo-nx/types';\nimport { AnimatingCircleWrapper } from '@inbox-demo-nx/ui-animating-circle';\nimport { View } from 'dripsy';\nimport { ReactNode } from 'react';\n\nimport { APIContextProvider } from './api';\nimport { AuthContext, AuthContextValue } from './auth';\nimport { CallContextProvider } from './call';\nimport { IntlContextProvider } from './intl';\nimport { ScenarioContextProvider } from './scenario';\nimport { SendBirdContext, SendBirdContextValue } from './sendbird';\nimport { ThemeContextProvider } from './theme';\n\nexport * from './api';\nexport * from './auth';\nexport * from './call';\nexport * from './intl';\nexport * from './scenario';\nexport * from './sendbird';\nexport * from './theme';\n\nexport const ContextsProvider = ({\n children,\n authContextValue,\n scenario,\n sendbirdContextValue,\n sendApiRequest,\n isDarkTheme,\n theme,\n}: {\n isDarkTheme: boolean;\n theme: InboxDemoTheme;\n children: ReactNode;\n authContextValue: AuthContextValue;\n scenario: ScenarioData;\n sendbirdContextValue: SendBirdContextValue;\n sendApiRequest: SendApiRequest;\n}) => {\n return (\n \n \n \n \n \n \n \n \n \n {children}\n \n \n \n \n \n \n \n \n \n );\n};\n","import { userMetaDataKeys } from '@inbox-demo-nx/constants';\nimport { useAuthContext } from '@inbox-demo-nx/contexts';\nimport { useMemo } from 'react';\nimport SendBird from 'sendbird';\n\nexport default function useCanCall(channel?: SendBird.GroupChannel | null) {\n const { currentUser } = useAuthContext();\n\n const canCall = useMemo(() => {\n if (!channel || channel.members.length !== 2 || !currentUser) {\n return false;\n }\n\n const otherUser = channel.members.find(\n (user) => user.userId !== currentUser.userId\n );\n\n const canCall =\n !!otherUser && otherUser.metaData[userMetaDataKeys.userType] === 'friend';\n return canCall;\n }, [channel, currentUser]);\n\n return canCall;\n}\n","import { ComponentProps, ReactNode } from 'react';\nimport { Pressable, StyleProp, StyleSheet, ViewStyle } from 'react-native';\nimport Animated, {\n useAnimatedStyle,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated';\n\nexport default function OpacityPressable({\n children,\n viewStyle,\n ...props\n}: ComponentProps & {\n viewStyle?: StyleProp;\n children: ReactNode;\n}) {\n const opacity = useSharedValue(1);\n const animatedStyles = useAnimatedStyle(() => {\n return {\n opacity: withTiming(opacity.value, {\n duration: opacity.value < 1 ? 0 : 200,\n }),\n };\n });\n\n return (\n {\n opacity.value = 0.3;\n }}\n onPressOut={() => {\n opacity.value = 1;\n }}\n {...props}\n >\n \n {children}\n \n \n );\n}\n","import { Alert, Platform } from 'react-native';\n\nconst alertPolyfill = (\n title: string,\n description?: string,\n options: Parameters[2] = []\n) => {\n // eslint-disable-next-line no-alert\n const result = window.confirm(\n [title, description].filter(Boolean).join('\\n')\n );\n\n if (result) {\n const confirmOption = options.find(({ style }) => style !== 'cancel');\n confirmOption?.onPress?.();\n } else {\n const cancelOption = options.find(({ style }) => style === 'cancel');\n cancelOption?.onPress?.();\n }\n};\n\nconst alert = Platform.OS === 'web' ? alertPolyfill : Alert.alert;\n\nexport default alert;\n","import { useHeaderHeight } from '@react-navigation/elements';\nimport {\n KeyboardAvoidingView as RNKeyboardAvoidingView,\n KeyboardAvoidingViewProps,\n Platform,\n} from 'react-native';\nimport { isIphoneX } from 'react-native-iphone-x-helper';\n\nexport default function KeyboardAvoidingView(props: KeyboardAvoidingViewProps) {\n const headerHeight = useHeaderHeight();\n return (\n \n );\n}\n","import { MouseEventHandler } from 'react';\nimport {\n Pressable as RNPressable,\n PressableProps as RNPressableProps,\n} from 'react-native';\n\nexport type PressableProps = RNPressableProps & {\n onHoverIn?: MouseEventHandler;\n onHoverOut?: MouseEventHandler;\n};\n\nexport function Pressable(props: PressableProps) {\n return ;\n}\n","import { View, ViewProps } from 'react-native';\n\nexport function RowStack(props: ViewProps) {\n return (\n \n );\n}\n\nexport function ColStack(props: ViewProps) {\n return (\n \n );\n}\n\nexport function Spacer({\n size,\n direction,\n}: {\n size: number | 'stretch';\n direction?: 'horizontal' | 'vertical';\n}) {\n const width = direction === 'vertical' ? 1 : size;\n const height = direction === 'horizontal' ? 1 : size;\n return ;\n}\n\nexport { default as alert } from './alert';\nexport { default as KeyboardAvoidingView } from './KeyboardAvoidingView';\nexport * from './Pressable';\n","module.exports = __webpack_public_path__ + \"static/media/sushi.3245adb1.jpg\";","module.exports = __webpack_public_path__ + \"static/media/voicememo.4f8bbb43.m4a\";","module.exports = __webpack_public_path__ + \"static/media/img-map-eta.ff75ca22.png\";","module.exports = __webpack_public_path__ + \"static/media/doors.bd1b1f58.jpg\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAC1CAMAAADBTyWlAAAAQlBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////8IX9KGAAAAFXRSTlMA358BIEC/kGAQ74Aw7s+vcKBQf08LflJ4AAAB9klEQVR42u3bC46kMAwEUJtNwq/5dW/d/6qLWqNZpmF2CL1SbKneCVAU7IoDQkRERERERERERERERERERETk1H1SYJwa8SMqPuhdnHhg4yEuPPDFLA4EvLiJfQteJDEvYKcV6xqsvO3qGju1WLdgpxLbYt1hRyvLBSQmfCNFsSkk/EMVxKC5w57tht4m/GgytthBcYKaeuqggLenDgq4e2rFaaOVIFLjW2Z7ekQWG21GkUXFgAaZLBzRFZlGKS5i5W1XL3jyVUAU2Top7IYLgpR1x8pb/ehxQS+5ir+H5U+6CRdMUtaIJ1+dvAPc1bwWJ1ib7t1wiq3pb8Qlv6WkGfDXXXrAX3eZAH/dJeEUWzcaCvjrLrhIcpXvLfmJ2kCZLttd7oC/7jLjFFu3dDWefB3IR3xwNLAJWHkLpzVWztJHq7isy1lqAxEvd6mt7Ohi/SUo3qIlNsiCT27yacQLD3PqCRtezi8dNrwcBbDh5ijQ4Qsf07EE+CsfMza8jGxa9fceikR/ZXrV4B1DI+cZSR/pJqXEakS+QevyN81EZMyvY2JY21eHaitf4x1ZLM7ufjLZSaHnRTspNEOyk0LPCwMODEFMa3DA/P99jZnk/E7KVss/ufzVKD4NvXgR6zQAw8iwT0RERERERERERERERERERPS//QHqjBrVone4uwAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAMAAAAKE/YAAAAAP1BMVEUAAAD///////////////////////////////////////////////////////////////////////////////9Du/pqAAAAFHRSTlMAgGBA3yAQ779wMG9Qz5+QoN6vAcnzqPcAAAJ+SURBVHja7drblqMgEIXhAgowHnLqev9nnTXpjHQUPMwFlr32d+2y/ybEiEIAAAAAAAAAAAAAAAAAAAAAAAAn5cyTo0zEoelaUiqYKEVsSaPulXyq7NDIqlsgVTzLBuxJkdS8jBWNdWDZqCE1brLZhZTwsl3UMq0b2eFKKrSyi47v4l12MaQBy8upLiCtyPnmRy87abjju8hOPR3PyE4a7vb+M9rJaLj2tEJf9Ib7P5XRwi0t0RktcbFaafTyF1Rt9NJtq6po83EKQwW6ook2VauMXqvWGb1SrTSazNLKRmv0eJ5noBm10eOJhnm13mgyxUc6iqPJlFZkmqPpVvpt1Bzt5VukCVXRpnAuRx90RW995HeKaEOfEI1oRCMa0YhG9F+IRjSif2H05YzRvUw0pm+9d92dt0THZ9d737ruGStGe/kpmkCjvlmL5i4dHuyjWjTFhW1Klpei47TNVIu+La1H/VCO5nZ+OFeKdsvveu6laPY057lONDWpJiMM+Wj2lONjnWg3/Uhba7o+pIxstKW3L3cxF/dFb65C9Dirmd7se2ivPn8lt9nNnmz+ZT/rvOgKnFrCdaxjR9+4HO159qrZV3gs9v7TnMYpaXNDbfPNqboRpho8X+nF5HY8hmL0PbdTqBdDVXifJsr853goRDv55N4noaqsfOLMFklbvobf6CVQVTeZ8GlSZ6KH2f94hEayH7gtRMsUVZePntMWfZeJsGsf4kBHsPsm6V3F7tkQd707mV/yDnHZtwmsUTDQ0wxHK/xDkoeng4Q0T2NPtF6toPnHuvC6LcI80or4SK4zxoY9h3dOwwZlAAAAAAAAAAAAAAAAAAAAAABQ4A9a5T1VrCATiwAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAMAAAAKE/YAAAAAQlBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////8IX9KGAAAAFXRSTlMAYCCf30AQ77+AbzBQvs+Pr5B/3q4YM8yBAAADAElEQVR42u3b6W7qMBAF4OPdWZpAW7//q16VXmraCJMFnIl0vv9RDvaMDUYGERERERERERERERERERERLeU71Z7NRdP2HcTz6jykPwbTa4jl25juiEpmbhdT0clBmmvkEqsgSY5cZntIoSeRg40XNv1lhNR2G37lje3tYtG5JsqrEX+6TXx2HlPOhJQZj53pmwqI7f04yt4MtsauXMiRHbJy7OCwI5VzKGSPYyvsJmc+e8ygzf6p1fLpVnbn1F36b9BrGrdDffn1J79qiQwa1flrZoOFzHWCPGobc+a1qUdUlZswYoXrxu5QUS5o67GCz0/XZLY1kw47FIjeuti2O6x7ZtKEK8s6ohq9faXVoWov5oFusEFTc6jzQFts4UO60KjD5C7cPtQN6rB5oLcPdUAVLi8dmzTVWjFXh35Sa5xRg31W28d69dGlixabtfXWD5UuOkkff2ZJWzxByB39YkP6csITnNKXAa/3xD2hqdKJeaHq8QSqVie6J34R7mp9qe7ThQege6WU81jIfz3Wd4tnbfuUQr+H9G1QekHi95i+WaNR5bAphx7TDfu+7gDe1Aw9NehV/3PsGzpZPevcQVboZP2MzNJCp/h4/5cXOqlHD0oMbVFkRYZOrrwpyQxtUGCEhrYosEJDJ4+7fJIaWuMufcTQjqEZmqEZmqFFh+6OGFrujuilhi7Mc0BB2C10+e0RBXHX0Gbdy9t0V4+Xc2nVIYIPhZ9pr1Se6AZFTaF/X0+HNT/G4W2hf1+mXJ5B44HuToGcUEWTptTqJb5FFdPUwWEG91HYR1+gfJgY9czHTJoYUI8acmSH2dzntK5q0upsjDkrv/CxvjHGjOq63gu5JLBouTc4kOaAA93/bKPHcd1oLI7DheMVR5sOVxz5Os+Ig/BNyHvhMdxETsPu16Hm6Noo6grXlDO//Fzzk9yD76noQ97dVcCnolFgaQA6FbxJHObigUEYhUa+ezbzYZzIwrhS5u3GpzFjK/miPhERERERERERERERERERkSj/AJn+2s/McbphAAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/avatar-promotions.0415f721.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAC1CAMAAADBTyWlAAAAQlBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////8IX9KGAAAAFXRSTlMAQCDfgL/vEGCfUDBwr48Bb89fzpDKNxxMAAAClklEQVR42u3b287aMBAE4PU5zgko7Pu/aqvSKiC8kKBf9lqa75pIo2hkwGsTAAAAAAAAAAAAAAAAAAAAAADUY8ez9+dxom6YW+R/XDbUAxP4yUV/bBv4RbakWfKRSzzpZRwL3C/S6bEZnXQkef7AJ1JmfGhGJx2ZAu9y0dORtPKTHqp9jlumTjpiAh/kLNUmN6OXjjw2o5OOTJctRi8dOfNeen6PeH4jhuz9LURlqT3Lgkl0NwRNqc8scoYeDI5FM1VlI0tC2v3jL1qqaWHJcuTDgSoaWeISvUiOJYbqCSyxVGA0vGrLkkxFmSWWapmPZjAKlr3Agov4RPt+RBbcSHBjQaRKLEsGEgzNS21YYo4/MlGZ6tDCIxVDjyQYFYeeSTArDp1JsCgOHROVRcWhpX4MrDm0S1TiVIfmlQo86w7NY2m90x46vqQwUX1oZv/yF7iD0OzM0/5kH6GZ3dkkImt8YO4m9AahERqh7xAaoVWFjtec/R95CbGL0G4dLD2Yxux0h46+mGHK7Td7jTgdTCQZnMrQcaa3Btc09MQFS6IP7NIytC1lph1Cy131+OULGxtu9VL48oVNLTfV/ZdzzKHl/NPu2aXZN5qzVE344izEabo0a4e8Uvt0/AzOSBUFLnDDSXzNQxRm0rXIA/3FCs0IGgb6NB84m5lWHUcntmVP7sjWjObTWiG11JHTFNpPmIXUUkfSquVYzX/WsdyR983g60StDGLsxZxOJrAgztSQzfyFNVFb1vFBQcMdknJHdDZjY9eOmrGxV94l6LrMtacjbiRlerwy8nH5C5Z0kjviNCxzEs8lUWUzNjZ31IyNuSr8AvzMbDu7ce0j8l/T/WKw/l4AAAAAAAAAAAAAAAAAAADAT/kNSvNItQCWr2sAAAAASUVORK5CYII=\"","module.exports = __webpack_public_path__ + \"static/media/img-thumbnail-sushi-01.f5c3b4cb.webp\";","module.exports = __webpack_public_path__ + \"static/media/img-thumbnail-sushi-02.201d20c7.webp\";","module.exports = __webpack_public_path__ + \"static/media/img-thumbnail-sushi-03.227ae3b5.webp\";","module.exports = __webpack_public_path__ + \"static/media/img-thumbnail-sushi-04.cec30334.webp\";","module.exports = __webpack_public_path__ + \"static/media/header-image.38bb9955.webp\";","import * as commonConstants from '@inbox-demo-nx/constants';\n\nexport const APP_ID = '88D7A525-2412-4162-922B-61C2B685CDD2';\n\nexport const API_URL =\n 'https://vcvtodaxoccctobsrbuijvbmfi0zyfqy.lambda-url.us-west-2.on.aws/';\n\nexport const channelCustomTypes = {\n ...commonConstants.channelCustomTypes,\n driverSupport: 'driverSupport',\n};\n\nexport enum BotUserId {\n NotificationBot = '_notification-bot',\n Kim = '_driver-kim',\n Robin = '_agent-robin',\n DriverSupport = '_driver-support-bot',\n}\n\nexport const ONDEMAND_SCENARIO_VERSION = '0.0.5';\n","import axios, { AxiosInstance } from 'axios';\nimport axiosRetry, { IAxiosRetryConfig } from 'axios-retry';\n\nconst axiosRetryOptions: IAxiosRetryConfig = {\n retries: 10,\n retryCondition: (error) => {\n return error?.response?.status === 429;\n },\n retryDelay: (retryCount, error) => {\n const retryAfter = Number(\n error?.response?.headers['x-ratelimit-retryafter']\n );\n\n if (Number.isFinite(retryAfter) && retryAfter > 0) {\n return retryAfter * 1000 * Math.pow(2, retryCount);\n } else {\n return 1000;\n }\n },\n};\n\nexport let chatAxios: AxiosInstance;\n\nexport function configure({\n appId,\n apiToken,\n}: {\n appId: string;\n apiToken: string;\n}) {\n const baseURL = `https://api-${appId}.sendbird.com`;\n\n chatAxios = axios.create({\n baseURL,\n headers: { 'Api-Token': apiToken },\n });\n\n axiosRetry(chatAxios, axiosRetryOptions);\n}\n","import { channelMetaDataKeys } from '@inbox-demo-nx/constants';\nimport { PlatformAPIChannel } from '@inbox-demo-nx/types';\nimport axios from 'axios';\n\nimport { chatAxios } from './axios';\n\nexport async function fetchGroupChannels({\n userId,\n params,\n}: {\n userId: string;\n params?: { members_exactly_in?: string; custom_types?: string };\n}): Promise {\n const { data } = await chatAxios.get(\n `/v3/users/${userId}/my_group_channels`,\n {\n params: { ...params, limit: 100, show_empty: true },\n }\n );\n return data.channels;\n}\n\nexport async function getGroupChannel({\n channelUrl,\n}: {\n channelUrl: string;\n}): Promise {\n const { data } = await chatAxios.get(`/v3/group_channels/${channelUrl}`, {\n params: { show_member: true },\n });\n return data;\n}\n\nexport async function updateGroupChannel(\n channelUrl: string,\n params: { custom_type?: string; data?: string }\n): Promise {\n const { data } = await chatAxios.put(\n `/v3/group_channels/${channelUrl}`,\n params\n );\n return data;\n}\n\nexport async function createGroupChannel(params: {\n channel_url?: string;\n cover_url: string;\n custom_type?: string;\n inviter_id?: string;\n is_distinct: boolean;\n name?: string;\n user_ids: string[];\n data?: string;\n}): Promise {\n const { data } = await chatAxios.post('/v3/group_channels', params);\n return data;\n}\n\nexport async function freezeGroupChannel({\n channelUrl,\n}: {\n channelUrl: string;\n}): Promise {\n const { data } = await chatAxios.put(\n `/v3/group_channels/${channelUrl}/freeze`,\n { freeze: true }\n );\n return data;\n}\n\nexport async function getGroupChannelMetaDataOfKey({\n channelUrl,\n key,\n}: {\n channelUrl: string;\n key: string;\n}) {\n try {\n const { data } = await chatAxios.get(\n `/v3/group_channels/${channelUrl}/metadata/${encodeURIComponent(key)}`\n );\n return { value: data[key] as string };\n } catch (error) {\n if (axios.isAxiosError(error)) {\n if ((error.response?.data as { code: number })?.code === 400201) {\n return { value: null };\n }\n }\n throw error;\n }\n}\n\nexport async function updateGroupChannelMetaDataOfKey({\n channelUrl,\n key,\n value,\n}: {\n channelUrl: string;\n key: string;\n value: string;\n}) {\n const { data } = await chatAxios.put(\n `/v3/group_channels/${channelUrl}/metadata/${encodeURIComponent(key)}`,\n { value, upsert: true }\n );\n return data;\n}\n\nexport async function getGroupChannelMetaData({\n channelUrl,\n}: {\n channelUrl: string;\n}) {\n const { data } = await chatAxios.get(\n `/v3/group_channels/${channelUrl}/metadata`\n );\n return data;\n}\n\nexport async function updateGroupChannelMetaData({\n channelUrl,\n metaData,\n}: {\n channelUrl: string;\n metaData: Record;\n}) {\n const { data } = await chatAxios.put(\n `/v3/group_channels/${channelUrl}/metadata`,\n {\n metadata: metaData,\n upsert: true,\n }\n );\n return data;\n}\n\nexport async function inviteUser({\n channelUrl,\n userId,\n}: {\n channelUrl: string;\n userId: string;\n}): Promise {\n const { data: channel } = await chatAxios.post(\n `/v3/group_channels/${channelUrl}/invite`,\n { user_ids: [userId] }\n );\n return channel;\n}\n\nexport async function leaveChannel(channelUrl: string, userId: string) {\n await chatAxios.put(`/v3/group_channels/${channelUrl}/leave`, {\n user_ids: [userId],\n });\n}\n\nexport async function deleteChannel({ channelUrl }: { channelUrl: string }) {\n return chatAxios.delete(`/v3/group_channels/${channelUrl}`);\n}\n\nexport async function deleteChannelIfExists({\n channelUrl,\n}: {\n channelUrl: string;\n}) {\n try {\n const { data } = await chatAxios.delete(`/v3/group_channels/${channelUrl}`);\n return data;\n } catch (error) {\n if (\n axios.isAxiosError(error) &&\n (error.response?.data as any)?.['code'] === 400201\n ) {\n return { message: 'Channel does not exist' };\n } else {\n throw error;\n }\n }\n}\n\nexport async function deleteAllGroupChannels({ userId }: { userId: string }) {\n const channels = await fetchGroupChannels({ userId });\n await Promise.all(\n channels.map((channel: { channel_url: string }) => {\n return deleteChannel({ channelUrl: channel.channel_url });\n })\n );\n}\n\nexport async function getChannelState({ channelUrl }: { channelUrl: string }) {\n try {\n const { value } = await getGroupChannelMetaDataOfKey({\n channelUrl,\n key: channelMetaDataKeys.state,\n });\n return { state: value };\n } catch (error) {\n return { state: null };\n }\n}\n\nexport async function getChannelUrlByCustomType({\n userId,\n customType,\n}: {\n userId: string;\n customType: string;\n}) {\n const [channel] = await fetchGroupChannels({\n userId,\n params: {\n custom_types: customType,\n },\n });\n return { channelUrl: channel.channel_url };\n}\n","import { messageCustomTypes } from '@inbox-demo-nx/constants';\nimport { Reaction } from '@inbox-demo-nx/types';\nimport { delay } from '@inbox-demo-nx/utils';\nimport type emoji from 'node-emoji/lib/emoji.json';\n\nimport { chatAxios } from './axios';\n\ntype MessageType = 'MESG' | 'FILE' | 'ADMM';\ntype Message = {\n message_id: number;\n type: MessageType;\n created_at: number;\n};\n\nexport async function sendMessage({\n channelUrl,\n params,\n}: {\n channelUrl: string;\n params: {\n message_type: MessageType;\n user_id?: string;\n message?: string;\n custom_type?: string;\n data?: string;\n url?: string;\n thumbnails?: any[];\n file_name?: string;\n file_type?: string;\n created_at?: number;\n translations?: string[];\n };\n}) {\n const { data } = await chatAxios.post(\n `/v3/group_channels/${channelUrl}/messages`,\n params\n );\n return data;\n}\n\nexport async function sendBotMessage({\n channelUrl,\n botUserId,\n message,\n customType,\n data: messageData,\n markAsRead,\n createdAt,\n}: {\n channelUrl: string;\n botUserId: string;\n message: string;\n customType?: string;\n data?: string;\n markAsRead?: boolean;\n createdAt?: number;\n}) {\n const { data } = await chatAxios.post(`/v3/bots/${botUserId}/send`, {\n channel_url: channelUrl,\n message,\n custom_type: customType,\n data: messageData,\n mark_as_read: markAsRead,\n created_at: createdAt,\n });\n return data;\n}\n\nexport async function editMessage({\n channelUrl,\n messageId,\n params,\n}: {\n channelUrl: string;\n messageId: number;\n params: {\n message_type: MessageType;\n message?: string;\n data?: string;\n created_at?: number;\n custom_type?: string;\n };\n}) {\n const { data } = await chatAxios.put(\n `/v3/group_channels/${channelUrl}/messages/${messageId}`,\n params\n );\n return data;\n}\n\nexport async function deleteMessage(channelUrl: string, messageId: number) {\n return chatAxios.delete(\n `/v3/group_channels/${channelUrl}/messages/${messageId}`\n );\n}\n\nexport async function getMessage(channelUrl: string, messageId: number) {\n const { data } = await chatAxios.get(\n `/v3/group_channels/${channelUrl}/messages/${messageId}`\n );\n return data;\n}\n\nexport async function fetchMessages({\n channelUrl,\n customTypes,\n messageType,\n prevLimit,\n nextLimit,\n messageId,\n senderId,\n include,\n}: {\n channelUrl: string;\n customTypes?: string;\n messageType?: MessageType;\n prevLimit?: number;\n nextLimit?: number;\n messageId?: number;\n senderId?: string;\n include?: boolean;\n}) {\n const { data } = await chatAxios.get(\n `/v3/group_channels/${channelUrl}/messages`,\n {\n params: {\n custom_types: customTypes,\n message_ts: messageId ? undefined : Date.now(),\n message_id: messageId,\n include,\n message_type: messageType,\n sender_id: senderId,\n prev_limit: prevLimit,\n next_limit: nextLimit,\n },\n }\n );\n return data.messages;\n}\n\nexport async function markAsRead({\n userId,\n channelUrl,\n timestamp,\n}: {\n userId: string;\n channelUrl: string;\n timestamp?: number;\n}) {\n const { data } = await chatAxios.put(\n `/v3/group_channels/${channelUrl}/messages/mark_as_read`,\n { user_id: userId, timestamp }\n );\n return data;\n}\n\nexport async function addReaction({\n channelUrl,\n messageId,\n userId,\n reaction,\n}: {\n channelUrl: string;\n messageId: number | string;\n userId: string;\n reaction: keyof typeof emoji;\n}) {\n const { data } = await chatAxios.post(\n `/v3/group_channels/${channelUrl}/messages/${messageId}/reactions`,\n {\n user_id: userId,\n reaction,\n }\n );\n return data;\n}\n\nexport const addReactionsToMessage = async ({\n channelUrl,\n messageId,\n reactions,\n}: {\n channelUrl: string;\n messageId: number;\n reactions?: Reaction[];\n}) => {\n return Promise.all(\n reactions?.map(({ emoji, userIds }) =>\n userIds.map((userId) =>\n addReaction({\n channelUrl,\n messageId,\n reaction: emoji,\n userId,\n })\n )\n ) ?? []\n );\n};\n\nexport async function translateMessage({\n channelUrl,\n messageId,\n targetLanguages,\n}: {\n channelUrl: string;\n messageId: number;\n targetLanguages: string[];\n}) {\n const { data: message } = await chatAxios.post(\n `/v3/group_channels/${channelUrl}/messages/${messageId}/translation`,\n { target_langs: targetLanguages }\n );\n return message;\n}\n\nexport async function sendMessageAndTranslate(\n ...params: Parameters\n) {\n const [{ channelUrl, params: options }] = params;\n const message = await sendMessage({\n channelUrl,\n params: {\n ...options,\n translations: ['es', 'ko', 'en'],\n },\n });\n return message;\n}\n\nexport const typeAndSendMessage = async ({\n channelUrl,\n userId,\n typingDuration = 1000,\n messageParams,\n}: {\n channelUrl: string;\n userId: string;\n typingDuration?: number;\n messageParams: Parameters[0]['params'];\n}) => {\n markAsRead({ userId, channelUrl });\n\n if (typingDuration === 0 || messageParams.message_type === 'FILE') {\n return sendMessageAndTranslate({ channelUrl, params: messageParams });\n }\n\n const { message_id: messageId } = await sendMessageAndTranslate({\n channelUrl,\n params: {\n message_type: 'MESG',\n custom_type: messageCustomTypes.typingIndicator,\n user_id: userId,\n message: 'Typing...',\n created_at: messageParams.created_at,\n },\n });\n await delay(typingDuration);\n\n return editMessage({\n channelUrl,\n messageId,\n params: {\n ...messageParams,\n custom_type: messageParams.custom_type || '',\n },\n });\n};\n","import axios from 'axios';\n\nimport { chatAxios } from './axios';\n\nexport async function createUser({\n userId,\n nickname,\n profileUrl = '',\n metadata,\n}: {\n userId: string;\n nickname: string;\n profileUrl?: string;\n metadata?: any;\n}) {\n const { data } = await chatAxios.post('/v3/users', {\n user_id: userId,\n nickname,\n profile_url: profileUrl,\n metadata,\n });\n return data;\n}\n\nexport async function getUser({ userId }: { userId: string }) {\n const { data } = await chatAxios.get(\n `/v3/users/${encodeURIComponent(userId)}`\n );\n return data;\n}\n\nexport async function getAccessToken({ userId }: { userId: string }) {\n const { data } = await chatAxios.get(\n `/v3/users/${encodeURIComponent(userId)}`\n );\n return { access_token: data.access_token };\n}\n\nexport async function getAllUserMetaData({ userId }: { userId: string }) {\n try {\n const { data } = await chatAxios.get(`/v3/users/${userId}/metadata`);\n return data as Record;\n } catch (error) {\n if (\n axios.isAxiosError(error) &&\n (error.response?.data as any)?.code === 400201\n ) {\n return {};\n }\n throw error;\n }\n}\n\nexport async function getUserMetaData(userId: string, metadataKey: string) {\n try {\n const { data } = await chatAxios.get(\n `/v3/users/${userId}/metadata/${metadataKey}`\n );\n return data[metadataKey] as string;\n } catch (error) {\n if (\n axios.isAxiosError(error) &&\n (error.response?.data as any)?.code === 400201\n ) {\n return null;\n }\n throw error;\n }\n}\n\nexport async function updateUserMetaData({\n userId,\n metadata,\n}: {\n userId: string;\n metadata: Record;\n}) {\n const { data } = await chatAxios.put(`/v3/users/${userId}/metadata`, {\n metadata,\n upsert: true,\n });\n return data;\n}\n\nexport async function deleteUserAllMetaData(userId: string) {\n await chatAxios.delete(`/v3/users/${userId}/metadata`);\n return;\n}\n","import * as axios from './axios';\nimport * as channels from './channels';\nimport * as messages from './messages';\nimport * as users from './users';\n\nconst PlatformAPI = {\n ...axios,\n ...channels,\n ...messages,\n ...users,\n};\n\nexport default PlatformAPI;\n","import {\n channelMetaDataKeys,\n userMetaDataKeys,\n} from '@inbox-demo-nx/constants';\nimport {\n ScenarioData,\n SendApiRequest,\n SingleContentScenarioMessage,\n} from '@inbox-demo-nx/types';\nimport {\n convertMessagesToPayloadArray,\n convertScenarioMessageTimestamp,\n sendScenarioMessage,\n} from '@inbox-demo-nx/utils-scenario';\nimport axios from 'axios';\n\nexport default async function resetUser({\n userId,\n scenario,\n sendApiRequest,\n}: {\n userId: string;\n scenario: ScenarioData;\n sendApiRequest: SendApiRequest;\n}) {\n try {\n await sendApiRequest({ type: 'deleteAllGroupChannels', data: { userId } });\n\n for (const channelData of scenario.channels) {\n const {\n name,\n isFrozen,\n members,\n customType,\n states,\n coverUrl = '',\n initialReadAt,\n } = channelData;\n const channel = await sendApiRequest({\n type: 'createGroupChannel',\n data: {\n name,\n is_distinct: true,\n custom_type: customType,\n cover_url: coverUrl,\n user_ids: [userId, ...members],\n },\n });\n const channelUrl = channel.channel_url;\n\n const processedMessages = convertMessagesToPayloadArray(\n states.initial.messages\n );\n\n const initialReadAtTimestamp =\n initialReadAt === 0\n ? Date.now()\n : initialReadAt == null\n ? null\n : convertScenarioMessageTimestamp(initialReadAt);\n\n const [firstMessages, secondMessages] = processedMessages.reduce(\n ([firstList, secondList], cur) => {\n if (initialReadAtTimestamp == null) {\n firstList.push(cur);\n return [firstList, secondList];\n }\n if (cur.createdAt > initialReadAtTimestamp) {\n secondList.push(cur);\n } else {\n firstList.push(cur);\n }\n return [firstList, secondList];\n },\n [\n [] as SingleContentScenarioMessage[],\n [] as SingleContentScenarioMessage[],\n ]\n );\n\n await Promise.all(\n firstMessages.map((message) =>\n sendScenarioMessage(message, {\n myUserId: userId,\n channelMetaData: {},\n channelUrl,\n sendApiRequest,\n })\n )\n );\n\n if (initialReadAtTimestamp != null) {\n await sendApiRequest({\n type: 'markAsRead',\n data: {\n userId,\n channelUrl,\n timestamp: initialReadAtTimestamp,\n },\n });\n }\n\n await Promise.all(\n secondMessages.map((message) =>\n sendScenarioMessage(message, {\n myUserId: userId,\n channelMetaData: {},\n channelUrl,\n sendApiRequest,\n })\n )\n );\n\n await sendApiRequest({\n type: 'updateGroupChannelMetaData',\n data: {\n channelUrl,\n metaData: { [channelMetaDataKeys.state]: 'initial' },\n },\n });\n if (isFrozen) {\n await sendApiRequest({\n type: 'freezeGroupChannel',\n data: { channelUrl },\n });\n }\n }\n\n await sendApiRequest({\n type: 'updateUserMetaData',\n data: {\n userId,\n metadata: {\n [userMetaDataKeys.initializedVersion]: scenario.version,\n [userMetaDataKeys.scenario]: scenario.key,\n [userMetaDataKeys.language]: scenario.defaultLanguage,\n },\n },\n });\n } catch (error) {\n if (axios.isAxiosError(error) && error.response?.config) {\n const { status, statusText, data, config } = error.response;\n const { url, method, data: configData, params } = config;\n\n // eslint-disable-next-line no-throw-literal\n throw {\n status,\n statusText,\n data,\n config: { method, url, data: configData, params },\n };\n }\n throw error;\n }\n}\n","import {\n asyncStorageKeys,\n defaultMaleProfileUrl,\n userMetaDataKeys,\n} from '@inbox-demo-nx/constants';\nimport { ScenarioData, SendApiRequest } from '@inbox-demo-nx/types';\nimport analytics from '@inbox-demo-nx/utils-analytics';\nimport PlatformAPI from '@inbox-demo-nx/utils-platform-api';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport { QueryClient } from '@tanstack/react-query';\nimport axios from 'axios';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Alert, AppState, AppStateStatus } from 'react-native';\nimport SendBird from 'sendbird';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport resetUser from './resetUser';\n\nconst DEFAULT_FEMALE_PROFILE_URL =\n 'https://file-us-3.sendbird.com/61b3540cce934d1cbf5eb1e980f63d15.jpg';\n\nasync function getUserFromAsyncStorage() {\n try {\n const user = await AsyncStorage.getItem(asyncStorageKeys.savedUser);\n return user && JSON.parse(user);\n } catch {\n return null;\n }\n}\n\nasync function saveUserToAsyncStorage(user: unknown) {\n try {\n if (user == null) {\n await AsyncStorage.removeItem(asyncStorageKeys.savedUser);\n } else {\n await AsyncStorage.setItem(\n asyncStorageKeys.savedUser,\n JSON.stringify(user)\n );\n }\n } catch {\n // ignore\n }\n}\n\nconst deepCopy = (obj: unknown) => JSON.parse(JSON.stringify(obj));\n\nconst useApp = ({\n appId,\n scenario,\n queryClient,\n apiUrl,\n onUserInitialized,\n}: {\n appId: string;\n scenario: ScenarioData;\n queryClient: QueryClient;\n apiUrl?: string;\n onUserInitialized?: (user: SendBird.User) => void;\n}) => {\n const handleUserInitializedEvent = useRef(onUserInitialized);\n\n useEffect(() => {\n handleUserInitializedEvent.current = onUserInitialized;\n }, [onUserInitialized]);\n\n const sendApiRequest = useCallback(\n async (options) => {\n if (apiUrl) {\n const { data } = await axios.post(apiUrl, options);\n return data;\n } else {\n const { type, data } = options;\n // eslint-disable-next-line @typescript-eslint/ban-types\n return (PlatformAPI[type as keyof typeof PlatformAPI] as Function)(\n data\n );\n }\n },\n [apiUrl]\n );\n\n const sendbird = useMemo(() => {\n const sbInstance = new SendBird({ appId });\n sbInstance.useAsyncStorageAsDatabase(AsyncStorage);\n return sbInstance;\n }, [appId]);\n\n const connectToSendBird = useCallback(\n async ({\n username,\n nickname,\n gender,\n }: {\n username: string;\n nickname?: string;\n gender?: 'male' | 'female';\n }) => {\n let user = await sendbird.connect(username);\n\n if (nickname) {\n user = await sendbird.updateCurrentUserInfo(\n nickname,\n gender === 'female'\n ? DEFAULT_FEMALE_PROFILE_URL\n : defaultMaleProfileUrl\n );\n return user;\n }\n\n console.info('connected to sendbird');\n return user;\n },\n [sendbird]\n );\n\n const [currentUser, setCurrentUser] = useState(null);\n const [isInitialUserLoaded, setInitialUserLoaded] = useState(false);\n const [isInitializingUser, setIsInitializingUser] = useState(false);\n\n const updateCurrentUserState = useCallback(async () => {\n const user = sendbird.currentUser;\n await saveUserToAsyncStorage(user);\n setCurrentUser(deepCopy(user));\n }, [sendbird.currentUser]);\n\n const initializeCurrentUser = useCallback(async () => {\n setIsInitializingUser(true);\n\n const userId = sendbird.currentUser.userId;\n const nickname = sendbird.currentUser.nickname;\n try {\n await sendbird.disconnect();\n queryClient.clear();\n\n await resetUser({ userId, scenario, sendApiRequest });\n const user = await connectToSendBird({\n username: userId,\n nickname: scenario.userProfile?.nickname,\n });\n await updateCurrentUserState();\n handleUserInitializedEvent.current?.(user);\n\n setIsInitializingUser(false);\n } catch (error) {\n console.error(error);\n Alert.alert('Initialization failed.');\n await sendbird.disconnect();\n await connectToSendBird({ username: userId, nickname });\n await updateCurrentUserState();\n } finally {\n setIsInitializingUser(false);\n }\n }, [\n connectToSendBird,\n queryClient,\n scenario,\n sendApiRequest,\n sendbird,\n updateCurrentUserState,\n ]);\n\n const setUpNewUser = useCallback(async () => {\n setIsInitializingUser(true);\n try {\n // create a new user and sign in\n const userId = uuidv4();\n await connectToSendBird({\n username: userId,\n nickname: scenario.userProfile?.nickname,\n gender: 'male',\n });\n\n // initialize user\n await resetUser({ userId, scenario, sendApiRequest });\n await updateCurrentUserState();\n } catch (error) {\n console.error(error);\n } finally {\n setIsInitializingUser(false);\n }\n }, [connectToSendBird, scenario, sendApiRequest, updateCurrentUserState]);\n\n const authContextValue = useMemo(() => {\n return {\n currentUser,\n isInitializingUser,\n updateCurrentUserState,\n setIsInitializingUser,\n initializeCurrentUser,\n setUpNewUser,\n };\n }, [\n currentUser,\n initializeCurrentUser,\n isInitializingUser,\n setUpNewUser,\n updateCurrentUserState,\n ]);\n\n useEffect(() => {\n async function prepare() {\n try {\n const user = await getUserFromAsyncStorage();\n\n if (user) {\n setCurrentUser(user);\n if (!sendbird.currentUser) {\n const latestUser = await connectToSendBird({\n username: user.userId,\n nickname: user.nickname,\n });\n setCurrentUser(latestUser);\n\n const userScenarioVersion =\n latestUser.metaData[userMetaDataKeys.initializedVersion];\n if (userScenarioVersion !== scenario.version) {\n console.info(\n `Scenario has been updated: ${userScenarioVersion} → ${scenario.version}`\n );\n await initializeCurrentUser();\n }\n }\n } else {\n await setUpNewUser();\n }\n } catch (e) {\n console.warn(e);\n } finally {\n setInitialUserLoaded(true);\n }\n }\n prepare();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const handleStateChange = (newState: AppStateStatus) => {\n if (newState === 'active') {\n sendbird.setForegroundState();\n } else {\n sendbird.setBackgroundState();\n }\n };\n\n const appStateListener = AppState.addEventListener(\n 'change',\n handleStateChange\n );\n\n return () => {\n appStateListener.remove();\n };\n }, [sendbird]);\n\n useEffect(() => {\n if (currentUser?.userId) {\n analytics.identify(`${scenario.key}-${currentUser?.userId}`, {\n demo_key: scenario.key,\n });\n }\n }, [currentUser?.userId, scenario.key]);\n\n const isLoadingUser = !isInitialUserLoaded || isInitializingUser;\n\n return {\n authContextValue,\n isLoadingUser,\n isInitialUserLoaded,\n sendbird,\n sendApiRequest,\n };\n};\n\nexport default useApp;\n","import CircleProgress from '@inbox-demo-nx/ui-circle-progress';\nimport { StyleSheet, View } from 'react-native';\n\nexport default function LoadingFullScreen() {\n return (\n \n \n \n \n \n );\n}\n\nconst componentStyles = StyleSheet.create({\n container: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n backgroundColor: 'white',\n },\n header: {\n height: 56,\n alignItems: 'center',\n justifyContent: 'center',\n borderBottomColor: '#CCCCCC',\n borderBottomWidth: 1,\n },\n loadingWrapper: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingBottom: 52,\n },\n});\n","var _defs, _path, _path2, _path3, _path4;\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgStatusbarIcons(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 68,\n height: 12,\n viewBox: \"0 0 68 12\"\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null)), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M60.633 1.327H47.144c-.764 0-1.277.001-1.672.034-.384.03-.567.087-.688.148a1.67 1.67 0 00-.73.73c-.061.12-.117.304-.149.688-.032.395-.033.908-.033 1.672v2.805c0 .764.001 1.277.033 1.673.032.383.088.566.15.687.16.314.415.57.729.73.12.061.304.117.688.149.395.032.908.033 1.672.033h13.489c.764 0 1.277-.001 1.672-.033.384-.032.567-.088.688-.15.314-.16.57-.415.73-.729.061-.12.117-.304.148-.687.033-.396.033-.909.033-1.673V4.599c0-.764 0-1.277-.033-1.672-.031-.384-.087-.567-.149-.688a1.67 1.67 0 00-.73-.73c-.12-.061-.303-.117-.687-.148-.395-.033-.908-.034-1.672-.034zm-17.471.457c-.291.572-.291 1.32-.291 2.815v2.805c0 1.496 0 2.244.29 2.815.257.503.666.911 1.168 1.167.571.291 1.32.291 2.815.291h13.489c1.495 0 2.243 0 2.815-.29a2.671 2.671 0 001.167-1.168c.291-.571.291-1.32.291-2.815V4.599c0-1.495 0-2.243-.291-2.815A2.671 2.671 0 0063.448.617c-.572-.291-1.32-.291-2.816-.291H47.145c-1.496 0-2.244 0-2.815.291a2.671 2.671 0 00-1.167 1.167z\",\n clipRule: \"evenodd\",\n opacity: 0.35\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M65.908 3.998v4.007a2.174 2.174 0 000-4.007\",\n opacity: 0.4\n })), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M44.874 4.466c0-.748 0-1.122.145-1.408.129-.251.333-.455.584-.583.286-.146.66-.146 1.408-.146h13.755c.748 0 1.122 0 1.408.146.25.128.455.332.583.583.146.286.146.66.146 1.408v3.071c0 .748 0 1.122-.146 1.408a1.336 1.336 0 01-.583.584c-.286.145-.66.145-1.408.145H47.011c-.748 0-1.122 0-1.408-.145a1.336 1.336 0 01-.584-.584c-.145-.286-.145-.66-.145-1.408V4.466z\"\n })), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M30.667 2.611c2.225 0 4.364.856 5.977 2.39a.31.31 0 00.435-.003l1.16-1.173a.324.324 0 00-.002-.458 10.935 10.935 0 00-15.14 0 .323.323 0 00-.003.458l1.16 1.173c.12.12.314.122.436.003a8.672 8.672 0 015.977-2.39zm0 3.814c1.222 0 2.401.455 3.307 1.276a.311.311 0 00.435-.006l1.16-1.172a.324.324 0 00-.005-.461 7.184 7.184 0 00-9.791 0 .324.324 0 00-.005.46l1.16 1.173c.119.12.312.122.434.006a4.924 4.924 0 013.305-1.276zm2.322 2.566a.315.315 0 01-.094.232l-2.005 2.025a.313.313 0 01-.445 0l-2.006-2.025a.316.316 0 01.01-.46 3.433 3.433 0 014.437 0c.064.059.102.141.103.228zM17 .66h-1a1 1 0 00-1 1.001v8.68a1 1 0 001 1.003h1a1 1 0 001-1.002v-8.68A1 1 0 0017 .66zm-5.667 2.337h1a1 1 0 011 1.001v6.344a1 1 0 01-1 1.002h-1a1 1 0 01-1-1.002V3.998a1 1 0 011-1.001zM7.667 5.334h-1a1 1 0 00-1 1.001v4.007a1 1 0 001 1.002h1a1 1 0 001-1.002V6.335a1 1 0 00-1-1.001zM3 7.337H2A1 1 0 001 8.34v2.003a1 1 0 001 1.002h1a1 1 0 001-1.002V8.339a1 1 0 00-1-1.002z\",\n clipRule: \"evenodd\"\n })));\n}\n\nexport default SvgStatusbarIcons;","export enum ParentMessageTypes {\n INIT_SUPPORT_APP = 'INIT_SUPPORT_APP',\n SHOW_SUPPORT_APP = 'SHOW_SUPPORT_APP',\n SHOW_MAIN_APP = 'SHOW_MAIN_APP',\n RELOAD = 'RELOAD',\n HIDE_LOADING = 'HIDE_LOADING',\n}\n\nexport enum MainAppMessageTypes {\n REMOVE_USER_FROM_LOCAL_STORAGE = 'REMOVE_USER_FROM_LOCAL_STORAGE',\n CONTINUE_CONVERSATION = 'CONTINUE_CONVERSATION',\n}\n\nexport enum SupportAppMessageTypes {\n START_CONVERSATION = 'START_CONVERSATION',\n RESET = 'RESET',\n}\n","import '@inbox-demo-nx/theme';\n\nimport { RowStack, Spacer } from '@inbox-demo-nx/ui';\nimport Button from '@inbox-demo-nx/ui-button';\nimport { Text, useSx } from 'dripsy';\nimport { useEffect, useState } from 'react';\nimport { Linking, ViewStyle } from 'react-native';\n\nimport StatusBarIcons from './statusbar-icons.svg';\n\nconst timeFormat = new Intl.DateTimeFormat('en', {\n timeStyle: 'short',\n hourCycle: 'h23',\n});\n\nexport default function StatusBar({\n variant,\n style,\n}: {\n variant: 'dark' | 'light';\n style?: ViewStyle;\n}) {\n const sx = useSx();\n const [time, setTime] = useState(timeFormat.format());\n useEffect(() => {\n const setIntervalId = setInterval(() => {\n setTime(timeFormat.format());\n }, 1000);\n\n return () => {\n clearInterval(setIntervalId);\n };\n }, []);\n const contentColor = variant === 'dark' ? 'black' : 'white';\n const isInIframe = window.parent !== window.self;\n\n return (\n \n \n {time}\n \n \n {isInIframe ? (\n \n ) : (\n {\n Linking.openURL('https://sendbird.com/contact-sales');\n }}\n />\n )}\n \n );\n}\n","import { ScenarioStateContext } from '@inbox-demo-nx/types';\nimport { delay } from '@inbox-demo-nx/utils';\nimport {\n MainAppMessageTypes,\n ParentMessageTypes,\n} from '@inbox-demo-nx/web-demo-constants';\nimport { Platform } from 'react-native';\n\nexport async function switchFromMainAppToSupportApp({\n context,\n fallbackDelay = 6000,\n nextState,\n}: {\n context: ScenarioStateContext;\n fallbackDelay?: number;\n nextState: string;\n}) {\n if (Platform.OS === 'web' && window.self !== window.parent) {\n // the app is in iframe\n await delay(1000);\n window.parent?.postMessage(\n { type: ParentMessageTypes.SHOW_SUPPORT_APP },\n '*'\n );\n\n function messageHandler(event: WindowEventMap['message']) {\n if (event.data === MainAppMessageTypes.CONTINUE_CONVERSATION) {\n context.transitionState(nextState);\n window.removeEventListener('message', messageHandler);\n }\n }\n window.addEventListener('message', messageHandler);\n } else {\n await delay(fallbackDelay);\n context.transitionState(nextState);\n }\n}\n","import { asyncStorageKeys } from '@inbox-demo-nx/constants';\nimport { useAuthContext, useScenarioContext } from '@inbox-demo-nx/contexts';\nimport {\n MainAppMessageTypes,\n ParentMessageTypes,\n} from '@inbox-demo-nx/web-demo-constants';\nimport { useEffect } from 'react';\nimport { Platform } from 'react-native';\n\nexport function useMainAppWindowMessageHandler() {\n const { currentUser } = useAuthContext();\n const scenario = useScenarioContext();\n\n useEffect(() => {\n if (currentUser && Platform.OS === 'web' && window.parent !== window.self) {\n window.parent.postMessage(\n {\n type: ParentMessageTypes.INIT_SUPPORT_APP,\n userId: currentUser.userId,\n scenarioKey: scenario.key,\n },\n '*'\n );\n }\n }, [currentUser, scenario.key]);\n\n useEffect(() => {\n if (Platform.OS === 'web') {\n const messageHandler = (event: WindowEventMap['message']) => {\n if (event.data === MainAppMessageTypes.REMOVE_USER_FROM_LOCAL_STORAGE) {\n window.localStorage.removeItem(asyncStorageKeys.savedUser);\n window.parent?.postMessage({ type: ParentMessageTypes.RELOAD }, '*');\n }\n };\n window.addEventListener('message', messageHandler);\n return () => {\n window.removeEventListener('message', messageHandler);\n };\n }\n return;\n }, []);\n}\n\nexport default useMainAppWindowMessageHandler;\n","import { useAuthContext } from '@inbox-demo-nx/contexts';\nimport { SupportAppMessageTypes } from '@inbox-demo-nx/web-demo-constants';\nimport { NavigationProp, useNavigation } from '@react-navigation/native';\nimport { useEffect } from 'react';\nimport { Platform } from 'react-native';\n\nexport function useSupportAppWindowMessageHandler() {\n const navigation = useNavigation>();\n const { initializeCurrentUser } = useAuthContext();\n useEffect(() => {\n if (Platform.OS === 'web') {\n const eventHandler: WindowEventHandlers['onmessage'] = (event) => {\n if (event.data === SupportAppMessageTypes.START_CONVERSATION) {\n navigation.navigate('Chat');\n }\n if (event.data === SupportAppMessageTypes.RESET) {\n initializeCurrentUser();\n }\n };\n window.addEventListener('message', eventHandler);\n return () => {\n window.removeEventListener('message', eventHandler);\n };\n }\n return;\n }, [initializeCurrentUser, navigation]);\n}\n\nexport default useSupportAppWindowMessageHandler;\n","import {\n BotUserId,\n channelCustomTypes,\n ONDEMAND_SCENARIO_VERSION,\n} from '@inbox-demo-nx/app-v2-ondemand-constants';\nimport * as commonConstants from '@inbox-demo-nx/constants';\nimport { ScenarioData } from '@inbox-demo-nx/types';\nimport { switchFromMainAppToSupportApp } from '@inbox-demo-nx/utils-web-demo-message-handler';\n\nexport const scenario: ScenarioData = {\n key: 'ondemand',\n userProfile: { nickname: 'Alex' },\n defaultLanguage: 'en',\n version: ONDEMAND_SCENARIO_VERSION,\n channels: [\n {\n name: 'Notifications',\n customType: channelCustomTypes.notifications,\n members: [BotUserId.NotificationBot],\n states: {\n initial: {},\n start: {\n messages: [\n {\n sender: BotUserId.NotificationBot,\n skipTyping: true,\n content:\n 'Hey Alex! Your order has been placed with Sushi Son. They are preparing your food.',\n data: {\n orderInfo: {\n price: '$60',\n product: 'Sushi Son Dinner set-A with coke',\n paymentMethod: 'Visa 5454',\n address: '400 1st Ave, San Mateo, CA 94401',\n imageUrl: require('../../assets/sushi.jpg'),\n title: 'Order confirmation',\n },\n },\n },\n ],\n onChannelEnter(context) {\n context.transitionState('sushiOnItsWay');\n },\n },\n sushiOnItsWay: {\n messages: [\n {\n sender: BotUserId.NotificationBot,\n skipTyping: true,\n content:\n 'Your order from Sushi Son will arrive by 6:30pm. Click to chat with your delivery driver.',\n data: {\n actions: [\n {\n label: 'Chat with driver',\n channelCustomType: channelCustomTypes.delivery,\n },\n ],\n },\n },\n ],\n },\n orderArrived: {\n messages: [\n {\n sender: BotUserId.NotificationBot,\n skipTyping: true,\n content:\n 'Thank you for using SendFood. Kim dropped off your order at the front door.',\n },\n ],\n onChannelEnter(context) {\n context.transitionState('csat');\n },\n },\n csat: {\n messages: [\n {\n sender: BotUserId.NotificationBot,\n skipTyping: true,\n customType: commonConstants.messageCustomTypes.csat5,\n content: 'Let us know how we did with your Sushi Son order.',\n data: { csat: 0 },\n },\n ],\n onCSATSelect(data, context) {\n context.transitionState('end');\n },\n },\n end: {\n messages: [\n {\n sender: BotUserId.NotificationBot,\n skipTyping: true,\n content:\n 'Thanks for your feedback. Your satisfaction is really important to us.',\n },\n ],\n },\n },\n },\n {\n name: 'Sushi Son Order #123456789',\n customType: channelCustomTypes.delivery,\n members: [BotUserId.Kim],\n states: {\n initial: {\n suggestedReplies: [\n [\n 'Can you confirm that wasabi and soy sauce is included in my order?',\n 'kimConfirms',\n ],\n ],\n onChannelEnter(context) {\n context.setAnimatingCircleTarget('suggestedReplies');\n },\n onExit(context) {\n context.setAnimatingCircleTarget('');\n },\n },\n kimConfirms: {\n messages: [{ sender: BotUserId.Kim, content: '👌' }],\n after: { targetState: 'askArrivalTime' },\n },\n askArrivalTime: {\n suggestedReplies: [\n ['Any update on arrival time?', 'kimStuckInTraffic'],\n ],\n onEntry(context) {\n context.setAnimatingCircleTarget('suggestedReplies');\n },\n onExit(context) {\n context.setAnimatingCircleTarget('');\n },\n },\n kimStuckInTraffic: {\n async onEntry(context) {\n await switchFromMainAppToSupportApp({\n context,\n nextState: 'kimOnHerWay',\n fallbackDelay: 1000,\n });\n },\n async onChannelEnter(context) {\n await switchFromMainAppToSupportApp({\n context,\n nextState: 'kimOnHerWay',\n fallbackDelay: 1000,\n });\n },\n },\n kimOnHerWay: {\n messages: [\n {\n sender: BotUserId.Kim,\n content: {\n type: 'audio/x-m4a',\n url: require('../../assets/voicememo.m4a'),\n },\n data: {\n map: {\n eta: 'ETA 20 minutes',\n imageUrl: require('../../assets/img-map-eta.png'),\n },\n previewText: 'Map shared',\n },\n },\n ],\n after: { targetState: 'replyToKim', delay: 1000 },\n },\n replyToKim: {\n suggestedReplies: [\n ['Okay. Let me know when you arrive.', 'kimAsksDoor'],\n ],\n onEntry(context) {\n context.setAnimatingCircleTarget('suggestedReplies');\n },\n onExit(context) {\n context.setAnimatingCircleTarget('');\n },\n },\n kimAsksDoor: {\n messages: [\n {\n sender: BotUserId.Kim,\n content: \"I'm here! Which door do I use?\",\n },\n {\n sender: BotUserId.Kim,\n content: {\n type: 'image/jpeg',\n url: require('../../assets/doors.jpg'),\n imageDimension: { width: 720, height: 480 },\n },\n },\n ],\n onEntry(context) {\n context.setAnimatingCircleTarget('chatInput');\n },\n onExit(context) {\n context.setAnimatingCircleTarget('');\n },\n onUserReply(data, context) {\n context.transitionState('kimReacts');\n },\n },\n kimReacts: {\n async onEntry({ channelUrl, sendApiRequest, transitionState }) {\n const lastMessageId = (\n await sendApiRequest({\n type: 'getGroupChannel',\n data: { channelUrl },\n })\n ).last_message?.message_id;\n\n if (!lastMessageId) return;\n\n await sendApiRequest({\n type: 'addReaction',\n data: {\n channelUrl,\n userId: BotUserId.Kim,\n reaction: '+1',\n messageId: lastMessageId,\n },\n });\n\n transitionState({\n customChannelType: channelCustomTypes.notifications,\n state: 'orderArrived',\n });\n transitionState('end');\n },\n },\n end: {},\n },\n },\n ],\n};\n","import {\n useAuthContext,\n useScenarioContext,\n useSendBirdContext,\n} from '@inbox-demo-nx/contexts';\nimport useScenarioUtils from '@inbox-demo-nx/hooks-use-scenario-utils';\nimport { MessageNotificationAction } from '@inbox-demo-nx/types';\nimport { RowStack, Spacer } from '@inbox-demo-nx/ui';\nimport {\n AnimatingCircle,\n useAnimatingCircleContext,\n} from '@inbox-demo-nx/ui-animating-circle';\nimport Button from '@inbox-demo-nx/ui-button';\nimport { ChannelCover } from '@inbox-demo-nx/ui-chat-common';\nimport analytics from '@inbox-demo-nx/utils-analytics';\nimport { NavigationProp, useNavigation } from '@react-navigation/native';\nimport { Text } from 'dripsy';\nimport { ComponentProps, useCallback } from 'react';\nimport { Platform, SafeAreaView, View, ViewStyle } from 'react-native';\nimport { Easing, Notifier } from 'react-native-notifier';\n\nconst Action = ({ style, ...props }: ComponentProps) => (\n [{ flex: 1 }, style(...args)]\n : [{ flex: 1 }, style]\n }\n size=\"small\"\n variant=\"secondary\"\n {...props}\n />\n);\n\nconst NotificationComponent = ({\n title,\n description,\n channel,\n actions = [],\n navigateToChannel,\n transitionChannelState,\n scenarioKey,\n}: {\n title: string;\n description: string;\n channel: SendBird.GroupChannel;\n actions?: MessageNotificationAction[];\n navigateToChannel: () => void;\n transitionChannelState: (state: string) => void;\n scenarioKey: string;\n}) => {\n return (\n \n \n \n \n \n \n {title}\n \n \n \n \n {description}\n \n {actions.length > 0 && (\n \n {actions.map(\n (\n { label, navigateToChannelOnPress, stateToTransitionToOnPress },\n index\n ) => {\n return (\n 0 ? 6 : 0 }}\n onPress={() => {\n analytics.track('click_notification', {\n demo_key: scenarioKey,\n action: label,\n });\n\n Notifier.hideNotification();\n if (navigateToChannelOnPress) {\n navigateToChannel();\n } else if (stateToTransitionToOnPress) {\n transitionChannelState(stateToTransitionToOnPress);\n }\n }}\n />\n );\n }\n )}\n \n )}\n \n \n \n );\n};\n\nexport default function useNewMessageNotification() {\n const { currentUser } = useAuthContext();\n const { sendbird } = useSendBirdContext();\n const scenario = useScenarioContext();\n const navigation = useNavigation>();\n const { setChannelState } = useScenarioUtils();\n const { setTargetId } = useAnimatingCircleContext();\n\n const showNewMessageNotification = useCallback(\n async ({\n title,\n description,\n targetChannelCustomType,\n actions,\n }: {\n title: string;\n description: string;\n targetChannelCustomType: string;\n actions?: MessageNotificationAction[];\n }) => {\n const listQuery =\n await sendbird.GroupChannel.createMyGroupChannelListQuery();\n listQuery.customTypesFilter = [targetChannelCustomType];\n listQuery.limit = 1;\n const [channel] = await listQuery.next();\n\n if (!channel || !currentUser) {\n return;\n }\n\n const { url: channelUrl } = channel;\n\n const navigateToChannel = async () => {\n const { index, routes } = navigation.getState();\n if (\n routes[index].name === 'Chat' &&\n routes[index].params?.channelUrl !== channelUrl\n ) {\n navigation.goBack();\n }\n navigation.navigate('Chat', { channelUrl });\n };\n\n const onNotificationPress = () => {\n analytics.track('click_notification', {\n demo_key: scenario.key,\n action: 'none',\n });\n navigateToChannel();\n };\n\n const transitionChannelState = (state: string) => {\n setChannelState({\n channelUrl,\n state,\n userId: currentUser.userId,\n });\n };\n\n Notifier.showNotification({\n title,\n description,\n Component: NotificationComponent,\n componentProps: {\n channel,\n actions,\n navigateToChannel,\n transitionChannelState,\n scenarioKey: scenario.key,\n },\n duration: 0,\n showAnimationDuration: 800,\n showEasing: Easing.out(Easing.ease),\n onPress: onNotificationPress,\n hideOnPress: true,\n });\n setTargetId('notification');\n },\n [\n sendbird.GroupChannel,\n currentUser,\n scenario.key,\n setTargetId,\n navigation,\n setChannelState,\n ]\n );\n\n return showNewMessageNotification;\n}\n","var _defs, _path;\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgIconArrowLeft(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 24,\n height: 24,\n fill: \"none\",\n viewBox: \"0 0 24 24\"\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null)), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#6210CC\",\n fillRule: \"evenodd\",\n d: \"M11.957 3.293a1 1 0 01.083 1.32l-.083.094L5.665 11H20.25a1 1 0 01.117 1.993L20.25 13H5.664l6.293 6.293a1 1 0 01.083 1.32l-.083.094a1 1 0 01-1.32.083l-.094-.083-8-8a1 1 0 01-.083-1.32l.083-.094 8-8a1 1 0 011.414 0z\",\n clipRule: \"evenodd\"\n })));\n}\n\nexport default SvgIconArrowLeft;","var _defs, _path;\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgIconChat(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 24,\n height: 24,\n fill: \"none\",\n viewBox: \"0 0 24 24\"\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null)), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#6210CC\",\n fillRule: \"evenodd\",\n d: \"M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11c-1.67 0-3.255-.372-4.673-1.039l-.657.218c-2.237.716-3.8.964-4.69.743-1.049-.262-1.256-.72-.62-1.374.439-.524.805-1.178 1.097-1.963.234-.625.142-1.5-.276-2.625A10.933 10.933 0 011 12C1 5.925 5.925 1 12 1zm0 2a9 9 0 00-8.187 12.742l.152.314.051.101.04.107c.569 1.532.709 2.858.275 4.02l-.143.364-.072.163.088-.019a23.166 23.166 0 001.832-.511l.646-.213.765-.26.73.343C9.363 20.708 10.66 21 12 21a9 9 0 100-18z\",\n clipRule: \"evenodd\"\n })));\n}\n\nexport default SvgIconChat;","import { channelCustomTypes } from '@inbox-demo-nx/app-v2-ondemand-constants';\nimport { channelMetaDataKeys } from '@inbox-demo-nx/constants';\nimport {\n useAuthContext,\n useScenarioContext,\n useSendBirdContext,\n} from '@inbox-demo-nx/contexts';\nimport useNewMessageNotification from '@inbox-demo-nx/hooks-use-new-message-notification';\nimport useScenarioUtils from '@inbox-demo-nx/hooks-use-scenario-utils';\nimport { ColStack, RowStack, Spacer } from '@inbox-demo-nx/ui';\nimport { useAnimatingCircleContext } from '@inbox-demo-nx/ui-animating-circle';\nimport Button from '@inbox-demo-nx/ui-button';\nimport Image from '@inbox-demo-nx/ui-image';\nimport OpacityPressable from '@inbox-demo-nx/ui-opacity-pressable';\nimport analytics from '@inbox-demo-nx/utils-analytics';\nimport {\n getMessagePreviewText,\n useGetChannelTitle,\n} from '@inbox-demo-nx/utils-chat-common';\nimport { parseMessageData } from '@inbox-demo-nx/utils-data-utils';\nimport {\n NavigationProp,\n useFocusEffect,\n useNavigation,\n useNavigationState,\n} from '@react-navigation/native';\nimport { useQuery } from '@tanstack/react-query';\nimport { ScrollView, Text, useSx, View } from 'dripsy';\nimport { useCallback, useState } from 'react';\nimport { Fragment, useEffect, useRef } from 'react';\nimport { Platform, SafeAreaView, StatusBar } from 'react-native';\n\nimport ArrowLeftIcon from '../../../assets/icon-arrow-left.svg';\nimport ChatIcon from '../../../assets/icon-chat.svg';\n\nconst tabs = ['Sushi Box', 'Nigiri', 'Sashimi', 'Donburi'];\n\nconst menu = [\n {\n name: 'Sushi Box. Sashimi Moriwase',\n description: '8 Pieces Chef choice Sashimi & California Roll with soup',\n price: '$60.00',\n imageSource: require('../../../assets/img-thumbnail-sushi-01.webp'),\n },\n {\n name: 'Sushi Box Salmon, Tuna Roll',\n description:\n 'Seared Yellowtail Nigiri 2pcs,\\nSalmon Nigiri 2 pcs & Spicy Tuna ...',\n price: '$50.00',\n imageSource: require('../../../assets/img-thumbnail-sushi-02.webp'),\n },\n {\n name: 'Sushi Box. Sushi Moriwase',\n description: '5 Pieces Chef Choice Nigiri & California Roll with miso soup',\n price: '$45.00',\n imageSource: require('../../../assets/img-thumbnail-sushi-03.webp'),\n },\n {\n name: 'Sushi Box Salmon, CA Roll',\n description:\n 'Salmon Nigiri 2pcs, Albacore Nigiri 2 pcs & California Cut Roll with soup',\n price: '$40.00',\n imageSource: require('../../../assets/img-thumbnail-sushi-04.webp'),\n },\n];\n\nconst HomeScreen = () => {\n const navigation = useNavigation>();\n const { sendbird } = useSendBirdContext();\n const { currentUser } = useAuthContext();\n const scenario = useScenarioContext();\n const currentRoute = useNavigationState((state) => state.routes[state.index]);\n const currentRouteRef = useRef(currentRoute);\n const showNewMessageNotification = useNewMessageNotification();\n const getChannelTitle = useGetChannelTitle();\n const { setChannelState } = useScenarioUtils();\n const currentUserId = currentUser?.userId;\n const [, setDidStartDemo] = useState(false);\n const sx = useSx();\n const { setTargetId } = useAnimatingCircleContext();\n\n useFocusEffect(\n useCallback(() => {\n setTargetId('startDemoButton');\n return () => {\n setTargetId('');\n };\n }, [setTargetId])\n );\n\n useEffect(() => {\n currentRouteRef.current = currentRoute;\n }, [currentRoute]);\n\n const { data: notificationChannel, refetch } = useQuery(\n ['notificationChannel', currentUserId],\n async (context) => {\n const [, userId] = context.queryKey;\n if (!userId) return { url: '', state: '' };\n\n const channelQuery =\n sendbird.GroupChannel.createMyGroupChannelListQuery();\n channelQuery.customTypesFilter = [channelCustomTypes.notifications];\n channelQuery.includeEmpty = true;\n const [channel] = await channelQuery.next();\n\n if (channel) {\n const metadata = await channel.getAllMetaData();\n const currentState = metadata[channelMetaDataKeys.state];\n return { url: channel.url, state: currentState };\n }\n\n return { url: '', state: '' };\n },\n { enabled: !!currentUserId, refetchOnWindowFocus: false }\n );\n\n useEffect(() => {\n const channelHandler = new sendbird.ChannelHandler();\n channelHandler.onMessageReceived = (channel, message) => {\n if (!channel.isGroupChannel()) return;\n\n if (currentRouteRef.current.name === 'Inbox') {\n return;\n }\n\n if (\n currentRouteRef.current.name === 'Chat' &&\n (currentRouteRef.current.params as any)?.['channelUrl'] === channel.url\n ) {\n return;\n }\n\n if (getMessagePreviewText(message) === 'Typing...') return;\n\n showNewMessageNotification({\n title: getChannelTitle(channel),\n description: getMessagePreviewText(message),\n actions: parseMessageData(message.data)?.notificationActions,\n targetChannelCustomType: channel.customType || '',\n });\n };\n sendbird.addChannelHandler('HOME', channelHandler);\n return () => {\n sendbird.removeChannelHandler('HOME');\n };\n }, [getChannelTitle, sendbird, showNewMessageNotification]);\n\n const startDemo = async () => {\n analytics.track('start_demo', { demo_key: scenario.key });\n\n setDidStartDemo(true);\n\n if (!notificationChannel || !notificationChannel.url || !currentUserId) {\n return;\n }\n\n if (notificationChannel.state !== 'initial') {\n navigation.navigate('Inbox');\n return;\n }\n\n await setChannelState({\n channelUrl: notificationChannel.url,\n state: 'start',\n userId: currentUserId,\n });\n refetch();\n };\n\n return (\n \n \n \n \n \n Sushi Son\n \n \n navigation.navigate('Inbox')}>\n \n \n \n \n {tabs.map((tab, index) => (\n \n \n {tab}\n \n {index === 0 && (\n \n )}\n \n ))}\n \n \n \n \n \n \n \n {menu.map((item, index) => (\n \n {index > 0 && (\n \n )}\n \n \n \n {item.name}\n \n \n {item.description}\n \n \n {item.price}\n \n \n \n \n \n \n ))}\n \n {Platform.OS === 'web' && window.parent === window.self && (\n {\n navigation.navigate('Settings');\n }}\n style={{ margin: 8 }}\n />\n )}\n \n \n );\n};\n\nexport default HomeScreen;\n","import SendBird from 'sendbird';\nimport type { InboxItem } from '.';\n\nconst getChannelTimestamp = (channel: SendBird.GroupChannel) => {\n const lastMessage = channel.lastMessage;\n return lastMessage ? lastMessage.createdAt : channel.createdAt;\n};\n\nexport const sortInboxItems = (items: InboxItem[]) => {\n return [...items].sort(\n (a, b) => getChannelTimestamp(b.channel) - getChannelTimestamp(a.channel)\n );\n};\n","import { queryKeys } from '@inbox-demo-nx/constants';\nimport { useSendBirdContext } from '@inbox-demo-nx/contexts';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport SendBird from 'sendbird';\n\nimport { sortInboxItems } from './utils';\n\nconst QUERY_KEY = [queryKeys.inbox];\n\nexport type Message =\n | SendBird.AdminMessage\n | SendBird.UserMessage\n | SendBird.FileMessage;\n\nexport type InboxItem = {\n channel: SendBird.GroupChannel;\n recentMessages?: Message[];\n};\n\nfunction useConnectionStatus() {\n const { sendbird } = useSendBirdContext();\n const [connectionStatus, setConnectionStatus] = useState(\n sendbird.getConnectionState()\n );\n\n useEffect(() => {\n setConnectionStatus(sendbird.getConnectionState());\n\n const connectionHandler = new sendbird.ConnectionHandler();\n const updateConnectionStatus = (log: string) => () => {\n console.info(`Connection - ${log}`);\n setConnectionStatus(sendbird.getConnectionState());\n };\n\n connectionHandler.onReconnectFailed = updateConnectionStatus('Failed');\n connectionHandler.onReconnectStarted = updateConnectionStatus('Started');\n connectionHandler.onReconnectSucceeded =\n updateConnectionStatus('Succeeded');\n\n const connectionHandlerId = 'inboxConnectionHandler';\n sendbird.addConnectionHandler(connectionHandlerId, connectionHandler);\n\n return () => {\n sendbird.removeConnectionHandler(connectionHandlerId);\n };\n }, [sendbird]);\n\n return useMemo(() => {\n return { isConnected: connectionStatus === 'OPEN', connectionStatus };\n }, [connectionStatus]);\n}\n\nfunction createChannelListQuery() {\n const listQuery =\n SendBird.getInstance().GroupChannel.createMyGroupChannelListQuery();\n listQuery.memberStateFilter = 'joined_only';\n listQuery.order = 'latest_last_message';\n listQuery.limit = 100;\n return listQuery;\n}\n\nconst replaceInboxItemChannel = (\n item: InboxItem,\n channel: SendBird.GroupChannel\n): InboxItem => {\n return { ...item, channel };\n};\n\nexport default function useInboxChannelList({\n shouldIncludeRecentMessages,\n includeEmptyChannels = false,\n}: {\n shouldIncludeRecentMessages?: (channel: SendBird.GroupChannel) => boolean;\n includeEmptyChannels?: boolean;\n} = {}) {\n const { isConnected } = useConnectionStatus();\n const {\n data = [],\n isLoading,\n refetch,\n error,\n dataUpdatedAt,\n } = useQuery(\n QUERY_KEY,\n function getInboxItems() {\n const promise = new Promise((resolve, reject) => {\n const listQuery = createChannelListQuery();\n listQuery.includeEmpty = includeEmptyChannels;\n listQuery.next(async (channels, error) => {\n if (error) {\n reject(error);\n return;\n }\n\n const recentMessages =\n shouldIncludeRecentMessages &&\n (await Promise.all(\n channels.filter(shouldIncludeRecentMessages).map(\n (channel) =>\n new Promise<\n [\n string,\n (\n | SendBird.UserMessage\n | SendBird.FileMessage\n | SendBird.AdminMessage\n )[]\n ]\n >((resolve) => {\n const listQuery = channel.createPreviousMessageListQuery();\n listQuery.limit = 3;\n listQuery.messageTypeFilter = 'MESG';\n listQuery.reverse = true;\n listQuery.load((messages, originalError) => {\n if (originalError) {\n const error = new Error(\n 'Fetching recent messages failed.',\n // @ts-ignore\n { cause: originalError }\n );\n reject(error);\n return;\n }\n resolve([channel.url, messages]);\n });\n })\n )\n ).then((recentMessages) => Object.fromEntries(recentMessages)));\n\n const inboxItems = channels.map((channel) => ({\n inboxItemType: 'channel' as const,\n channel,\n recentMessages: recentMessages?.[channel.url],\n }));\n\n resolve(sortInboxItems(inboxItems));\n });\n });\n return promise;\n },\n { enabled: false }\n );\n const latestDataRef = useRef(data);\n useEffect(() => {\n latestDataRef.current = data;\n }, [data]);\n\n const queryClient = useQueryClient();\n const { sendbird } = useSendBirdContext();\n\n useEffect(() => {\n const channelHandler = new sendbird.ChannelHandler();\n\n function removeChannel(deletedChannelUrl: string) {\n queryClient.setQueryData(QUERY_KEY, (data) => {\n if (!data) {\n return [];\n }\n return data.filter(({ channel }) => {\n return channel.url !== deletedChannelUrl;\n });\n });\n }\n\n channelHandler.onUserJoined = (channel, user) => {\n if (user.userId === sendbird.currentUser.userId) {\n refetch();\n }\n };\n\n channelHandler.onUserLeft = (channel, user) => {\n if (user.userId === sendbird.currentUser.userId) {\n removeChannel(channel.url);\n }\n };\n\n channelHandler.onChannelChanged = (changedChannel) => {\n if (!changedChannel.isGroupChannel()) {\n return;\n }\n\n const targetChannel = latestDataRef.current.find(\n (item) => item.channel.url === changedChannel.url\n );\n\n if (!targetChannel) {\n queryClient.refetchQueries(QUERY_KEY);\n return;\n }\n\n queryClient.setQueryData(QUERY_KEY, (data) => {\n if (!data) {\n return [];\n }\n return sortInboxItems(\n data.map((item) => {\n const { channel } = item;\n return channel.url === changedChannel.url\n ? replaceInboxItemChannel(item, changedChannel)\n : item;\n })\n );\n });\n };\n\n channelHandler.onChannelDeleted = (deletedChannelUrl) => {\n removeChannel(deletedChannelUrl);\n };\n\n sendbird.addChannelHandler('inboxChannelHandler', channelHandler);\n\n return () => {\n sendbird.removeChannelHandler('inboxChannelHandler');\n };\n }, [queryClient, refetch, sendbird]);\n\n return useMemo(\n () => ({\n data,\n isLoading: !isConnected || isLoading,\n refetch,\n error,\n dataUpdatedAt,\n }),\n [data, isConnected, isLoading, refetch, error, dataUpdatedAt]\n );\n}\n","var _defs, _path, _path2;\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgIcNewChat(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 36,\n height: 36,\n fill: \"none\",\n viewBox: \"0 0 36 36\"\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null)), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"white\",\n fillRule: \"evenodd\",\n d: \"M18 36c9.941 0 18-8.059 18-18S27.941 0 18 0 0 8.059 0 18s8.059 18 18 18z\",\n clipRule: \"evenodd\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#6210CC\",\n fillRule: \"evenodd\",\n d: \"M25.662 11.684a1.573 1.573 0 00-.003-2.225l-.115-.104a1.574 1.574 0 00-2.109.107l-7.621 7.645a5.385 5.385 0 00-1.406 2.475l-.315 1.238.007.047a.18.18 0 00.173.132l1.206-.276a5.404 5.404 0 002.62-1.451l7.563-7.588zm-9.012.369a.75.75 0 00-.75-.75h-3.975l-.166.004a2.921 2.921 0 00-2.76 2.914v8.98l.006.166a2.922 2.922 0 002.92 2.753h9l.166-.005a2.921 2.921 0 002.759-2.914l-.005-3.965a.75.75 0 00-.75-.75h-.745a.75.75 0 00-.75.75v3.965l-.006.092a.675.675 0 01-.67.582h-9l-.09-.006a.674.674 0 01-.584-.668v-8.98l.006-.091a.675.675 0 01.669-.582l3.976-.005a.75.75 0 00.749-.75v-.74z\",\n clipRule: \"evenodd\"\n })));\n}\n\nexport default SvgIcNewChat;","var _defs, _path;\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgIconArrowLeft(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 24,\n height: 24,\n fill: \"none\",\n viewBox: \"0 0 24 24\"\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null)), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#6210CC\",\n fillRule: \"evenodd\",\n d: \"M11.957 3.293a1 1 0 01.083 1.32l-.083.094L5.665 11H20.25a1 1 0 01.117 1.993L20.25 13H5.664l6.293 6.293a1 1 0 01.083 1.32l-.083.094a1 1 0 01-1.32.083l-.094-.083-8-8a1 1 0 01-.083-1.32l.083-.094 8-8a1 1 0 011.414 0z\",\n clipRule: \"evenodd\"\n })));\n}\n\nexport default SvgIconArrowLeft;","import { useFormatChannelUpdatedAt } from '@inbox-demo-nx/utils-chat-common';\nimport isSameDay from 'date-fns/isSameDay';\nimport { Text } from 'dripsy';\nimport { useLayoutEffect, useState } from 'react';\nimport { TextProps } from 'react-native';\n\nexport default function AutoUpdatingTimestamp({\n value,\n ...props\n}: { value: number } & TextProps) {\n const formatChannelUpdatedAt = useFormatChannelUpdatedAt();\n const [text, setText] = useState('');\n\n useLayoutEffect(() => {\n setText(formatChannelUpdatedAt(value));\n if (!isSameDay(value, Date.now())) {\n return;\n }\n\n const id = setInterval(() => {\n if (isSameDay(value, Date.now())) {\n setText(formatChannelUpdatedAt(value));\n return;\n }\n clearInterval(id);\n }, 10000);\n\n return () => {\n clearInterval(id);\n };\n }, [formatChannelUpdatedAt, value]);\n\n return {text};\n}\n","import '@inbox-demo-nx/theme';\n\nimport { useDripsyTheme, useResponsiveValue } from 'dripsy';\nimport { ReactNode, useEffect } from 'react';\nimport { Pressable, StyleProp, ViewStyle } from 'react-native';\nimport Animated, {\n interpolateColor,\n useAnimatedStyle,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated';\n\nexport default function ListItem({\n children,\n onPress,\n viewStyle,\n}: {\n children: ReactNode;\n onPress?: () => void;\n viewStyle?: StyleProp;\n}) {\n const { theme } = useDripsyTheme();\n const backgroundOpacity = useSharedValue(0);\n const scale = useSharedValue(1);\n const borderRadius = useSharedValue(0);\n const animatedStyles = useAnimatedStyle(() => ({\n backgroundColor: interpolateColor(\n backgroundOpacity.value,\n [0, 1],\n [theme.colors.listItemBackground, theme.colors.listItemBackgroundHover]\n ),\n transform: [{ scale: scale.value }],\n borderRadius: borderRadius.value,\n }));\n\n const defaultBorderRadius = useResponsiveValue([0, 8]);\n\n useEffect(() => {\n borderRadius.value = defaultBorderRadius;\n }, [borderRadius, defaultBorderRadius]);\n\n return (\n {\n backgroundOpacity.value = withTiming(1);\n }}\n onHoverOut={() => {\n backgroundOpacity.value = withTiming(0);\n }}\n onPressIn={() => {\n backgroundOpacity.value = withTiming(1);\n scale.value = withTiming(0.95);\n borderRadius.value = withTiming(12);\n }}\n onPressOut={() => {\n backgroundOpacity.value = withTiming(0);\n scale.value = withTiming(1);\n borderRadius.value = 0;\n }}\n onPress={onPress}\n >\n \n {children}\n \n \n );\n}\n","import '@inbox-demo-nx/theme';\n\nimport AutoUpdatingTimestamp from '@inbox-demo-nx/ui-auto-updating-timestamp';\nimport { ChannelBadge } from '@inbox-demo-nx/ui-badges';\nimport { ChannelCover } from '@inbox-demo-nx/ui-chat-common';\nimport ListItem from '@inbox-demo-nx/ui-list-item';\nimport {\n AnySendBirdMessage,\n getChannelUpdatedAt,\n getLastMessage,\n useGetChannelTitle,\n} from '@inbox-demo-nx/utils-chat-common';\nimport { Text, useDripsyTheme, useSx, View } from 'dripsy';\nimport { StyleSheet } from 'react-native';\nimport SendBird from 'sendbird';\n\nexport default function ChannelListItem({\n onPress,\n channel,\n getLastMessage: getLastMessageProp,\n}: {\n onPress: () => void;\n channel: SendBird.GroupChannel;\n getLastMessage?: (channel: SendBird.GroupChannel) => string;\n}) {\n const sx = useSx();\n const { theme } = useDripsyTheme();\n const getChannelTitle = useGetChannelTitle({ addMemberCount: true });\n const handlePress = () => {\n if (channel.isFrozen) {\n return;\n }\n onPress();\n };\n\n return (\n \n \n \n \n \n \n {getChannelTitle(channel)}\n \n \n \n \n \n \n \n \n {getLastMessageProp?.(channel) || getLastMessage(channel)}\n \n \n {channel.unreadMessageCount > 0 && (\n \n \n {channel.unreadMessageCount}\n \n \n )}\n \n \n \n );\n}\n\nconst _styles = StyleSheet.create({\n badge: {\n height: 20,\n minWidth: 20,\n borderRadius: 10,\n justifyContent: 'center',\n alignItems: 'center',\n marginLeft: 24,\n },\n inboxItem: {\n paddingVertical: 10,\n paddingHorizontal: 16,\n backgroundColor: 'white',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'flex-start',\n },\n});\n","import { ListItemWrapper } from '@inbox-demo-nx/ui-chat-common';\nimport { ComponentProps } from 'react';\n\nimport ChannelListItem from './ChannelListItem';\n\nexport default function ResponsiveChannelListItem(\n props: ComponentProps\n) {\n return (\n \n \n \n );\n}\n","import { channelCustomTypes } from '@inbox-demo-nx/constants';\nimport useInboxChannelList, {\n Message,\n} from '@inbox-demo-nx/hooks-use-inbox-channel-list';\nimport useInboxNavigationHeader from '@inbox-demo-nx/hooks-use-inbox-navigation-header';\nimport usePullToRefresh from '@inbox-demo-nx/hooks-use-pull-to-refresh';\nimport ChannelListItem from '@inbox-demo-nx/ui-channel-list-item';\nimport CircleProgress from '@inbox-demo-nx/ui-circle-progress';\nimport { useFocusEffect, useNavigation } from '@react-navigation/native';\nimport { NativeStackNavigationProp } from '@react-navigation/native-stack';\nimport { Text, useSx, View } from 'dripsy';\nimport { StatusBar } from 'expo-status-bar';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { FlatList } from 'react-native';\nimport SendBird from 'sendbird';\n\nconst isBannerChannel = (channel: SendBird.GroupChannel) =>\n channel.customType === channelCustomTypes.banner;\n\nexport default function InboxScreen() {\n const { data, isLoading, refetch, error, dataUpdatedAt } =\n useInboxChannelList({\n shouldIncludeRecentMessages: isBannerChannel,\n });\n const pullToRefreshProps = usePullToRefresh({ isLoading, refetch });\n const navigation = useNavigation>();\n\n useFocusEffect(\n useCallback(() => {\n refetch();\n }, [refetch])\n );\n\n useEffect(() => {\n error && console.error(error);\n }, [error]);\n\n const sx = useSx();\n useInboxNavigationHeader();\n\n const { channels } = useMemo(() => {\n if (isLoading && data.length === 0) {\n return { channels: [], banners: [] };\n }\n\n return {\n channels: data\n .filter((item) => !isBannerChannel(item.channel))\n .map((item) => item.channel),\n banners: data\n .filter((item) => isBannerChannel(item.channel))\n .flatMap((item) => item.recentMessages)\n .filter((v): v is Message => !!v),\n };\n }, [data, isLoading]);\n\n const ListEmptyComponent = (\n \n {isLoading ? (\n \n ) : (\n No channels\n )}\n \n );\n\n return (\n \n \n \n style={{ flex: 1 }}\n data={channels}\n extraData={dataUpdatedAt}\n keyExtractor={(item) => item.url}\n renderItem={({ item: channel }) => (\n {\n navigation.push('Chat', { channelUrl: channel.url });\n }}\n />\n )}\n ListEmptyComponent={ListEmptyComponent}\n contentContainerStyle={sx({ flexGrow: 1, pt: 8, pb: 48 })}\n {...pullToRefreshProps}\n />\n \n );\n}\n","import { useCallback, useState } from 'react';\n\nexport default function usePullToRefresh({\n isLoading,\n refetch,\n}: {\n isLoading: boolean;\n refetch: () => void;\n}) {\n const [isPullToRefreshOngoing, setIsPullToRefreshOngoing] = useState(false);\n\n const onRefresh = useCallback(async () => {\n if (isLoading) {\n refetch();\n return;\n }\n setIsPullToRefreshOngoing(true);\n await refetch();\n setIsPullToRefreshOngoing(false);\n }, [isLoading, refetch]);\n\n return {\n onRefresh,\n refreshing: isPullToRefreshOngoing,\n };\n}\n","import IconButton from '@inbox-demo-nx/ui-icon-button';\nimport { useNavigation } from '@react-navigation/native';\nimport { NativeStackNavigationProp } from '@react-navigation/native-stack';\nimport { Text, useSx, View } from 'dripsy';\nimport { useEffect } from 'react';\n\nimport NewChatIcon from './ic-new-chat.svg';\nimport ArrowLeftIcon from './icon-arrow-left.svg';\n\nexport default function useInboxNavigationHeader() {\n const navigation = useNavigation>();\n\n const sx = useSx();\n\n useEffect(() => {\n navigation.setOptions({\n header(props) {\n return (\n \n props.navigation.goBack()}\n >\n \n \n \n \n Inbox\n \n \n );\n },\n });\n }, [navigation, sx]);\n}\n","import { useAuthContext } from '@inbox-demo-nx/contexts';\nimport { ColStack, RowStack, Spacer } from '@inbox-demo-nx/ui';\nimport Button from '@inbox-demo-nx/ui-button';\nimport { Avatar } from '@inbox-demo-nx/ui-chat-common';\nimport { H2, Text } from 'dripsy';\nimport { ViewProps } from 'react-native';\n\nexport const CurrentUserProfile = () => {\n const { currentUser } = useAuthContext();\n\n return (\n \n \n \n \n \n {currentUser?.nickname}\n \n \n {currentUser?.userId}\n \n \n \n );\n};\n\nexport default function AppSettings(props: ViewProps) {\n const { initializeCurrentUser } = useAuthContext();\n\n return (\n \n

Profile

\n \n \n \n \n
\n );\n}\n","import { ScrollView, View } from 'dripsy';\nimport AppSettings from '@inbox-demo-nx/ui-app-settings';\n\nexport default function SettingScreen() {\n return (\n \n \n \n \n \n );\n}\n","import { useAuthContext } from '@inbox-demo-nx/contexts';\nimport { useMainAppWindowMessageHandler } from '@inbox-demo-nx/utils-web-demo-message-handler';\nimport { NavigationContainer } from '@react-navigation/native';\nimport { createNativeStackNavigator } from '@react-navigation/native-stack';\nimport { useDripsyTheme } from 'dripsy';\nimport { lazy, Suspense } from 'react';\n\nimport HomeScreen from './HomeScreen';\nimport InboxScreen from './InboxScreen';\nimport SettingScreen from './SettingScreen';\n\nconst ChatScreen = lazy(() => import('./ChatScreen'));\n\nconst Stack = createNativeStackNavigator();\n\nexport default function RootScreen() {\n const { currentUser } = useAuthContext();\n const { theme } = useDripsyTheme();\n\n const isSignedIn = !!currentUser;\n useMainAppWindowMessageHandler();\n\n if (!isSignedIn) {\n return null;\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n );\n}\n","import { API_URL, APP_ID } from '@inbox-demo-nx/app-v2-ondemand-constants';\nimport { ContextsProvider } from '@inbox-demo-nx/contexts';\nimport useApp from '@inbox-demo-nx/hooks-use-app';\nimport { defaultTheme } from '@inbox-demo-nx/theme';\nimport LoadingFullScreen from '@inbox-demo-nx/ui-loading-full-screen';\nimport FakeStatusBar from '@inbox-demo-nx/ui-status-bar';\nimport { ParentMessageTypes } from '@inbox-demo-nx/web-demo-constants';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { makeTheme, View } from 'dripsy';\nimport * as SplashScreen from 'expo-splash-screen';\nimport merge from 'lodash/fp/merge';\nimport React, { useCallback, useMemo } from 'react';\nimport { Platform, UIManager } from 'react-native';\nimport { NotifierWrapper } from 'react-native-notifier';\n\nimport { scenario } from './constants';\nimport RootScreen from './screens/RootScreen';\n\nconst theme = makeTheme(merge(defaultTheme, {}));\n\nif (typeof window !== 'undefined') {\n // @ts-ignore\n window._frameTimestamp = null;\n}\n\nif (Platform.OS === 'android') {\n if (UIManager.setLayoutAnimationEnabledExperimental) {\n UIManager.setLayoutAnimationEnabledExperimental(true);\n }\n}\n\nconst queryClient = new QueryClient({\n defaultOptions: { queries: { retry: 0 } },\n});\n\nSplashScreen.preventAutoHideAsync();\n\nconst App = () => {\n const {\n authContextValue,\n isLoadingUser,\n isInitialUserLoaded,\n sendbird,\n sendApiRequest,\n } = useApp({\n appId: APP_ID,\n scenario,\n queryClient,\n apiUrl: API_URL,\n });\n\n const isAppReady = isInitialUserLoaded;\n const sendbirdContextValue = useMemo(\n () => ({ appId: APP_ID, sendbird }),\n [sendbird]\n );\n\n const onLayoutRootView = useCallback(async () => {\n if (isAppReady) {\n await SplashScreen.hideAsync();\n if (Platform.OS === 'web' && window.self !== window.parent) {\n // the app is in iframe\n window.parent?.postMessage(\n { type: ParentMessageTypes.HIDE_LOADING },\n '*'\n );\n }\n }\n }, [isAppReady]);\n\n if (!isAppReady) {\n return null;\n }\n\n return (\n \n \n \n {Platform.OS === 'web' && }\n {isLoadingUser ? : }\n \n \n \n \n );\n};\n\nexport default App;\n","import { registerRootComponent } from 'expo';\n\nimport App from './src/app/App';\n\n// registerRootComponent calls AppRegistry.registerComponent('main', () => App);\n// It also ensures that whether you load the app in Expo Go or in a native build,\n// the environment is set up appropriately\nregisterRootComponent(App);\n","import addDays from 'date-fns/addDays';\nimport addHours from 'date-fns/addHours';\nimport addMinutes from 'date-fns/addMinutes';\nimport addSeconds from 'date-fns/addSeconds';\nimport getHours from 'date-fns/getHours';\nimport getMinutes from 'date-fns/getMinutes';\nimport parse from 'date-fns/parse';\nimport setHours from 'date-fns/setHours';\nimport setMinutes from 'date-fns/setMinutes';\nimport startOfMinute from 'date-fns/startOfMinute';\n\nexport function safeJSONParse(text: string | null | undefined) {\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text);\n } catch (e) {\n return null;\n }\n}\n\nexport const convertTimestamp = (timestamp: number | string | Date = 0) => {\n if (!timestamp) {\n return Date.now();\n }\n if (typeof timestamp === 'number') {\n return timestamp;\n }\n\n if (typeof timestamp === 'string') {\n if (!isNaN(parse(timestamp, 'yyyy-MM-dd HH:mm:ss', new Date()).valueOf())) {\n return parse(timestamp, 'yyyy-MM-dd HH:mm:ss', new Date()).valueOf();\n }\n let result = new Date();\n timestamp.split(' ').forEach((token) => {\n if (!isNaN(parse(token, 'h:mmaa', new Date()).valueOf())) {\n const parsedDate = parse(token, 'h:mmaa', new Date());\n result = startOfMinute(\n setMinutes(\n setHours(result, getHours(parsedDate)),\n getMinutes(parsedDate)\n )\n );\n } else if (!isNaN(parse(token, 'haa', new Date()).valueOf())) {\n const parsedDate = parse(token, 'haa', new Date());\n result = startOfMinute(\n setMinutes(setHours(result, getHours(parsedDate)), 0)\n );\n } else if (token.endsWith('d')) {\n result = addDays(result, parseInt(token.slice(0, -1), 10));\n } else if (token.endsWith('h')) {\n const hours = parseInt(token.slice(0, -1), 10);\n result = addHours(result, hours);\n } else if (token.endsWith('m')) {\n const minutes = parseInt(token.slice(0, -1), 10);\n result = addMinutes(result, minutes);\n } else if (token.endsWith('s')) {\n const seconds = parseInt(token.slice(0, -1), 10);\n result = addSeconds(result, seconds);\n }\n });\n return result.valueOf();\n }\n\n return (timestamp as Date).valueOf();\n};\n\nexport function delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export const formatDuration = (duration: number) => {\n const minutes = Math.floor(duration / 60);\n const seconds = duration % 60;\n return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;\n};\n","import { useIntlContext } from '@inbox-demo-nx/contexts';\nimport formatDistanceToNow from 'date-fns/formatDistanceToNow';\nimport isSameDay from 'date-fns/isSameDay';\nimport isSameYear from 'date-fns/isSameYear';\nimport { useCallback } from 'react';\n\nexport function useFormatChannelUpdatedAt() {\n const { intlDateFormat, intlDateDifferentYearFormat } = useIntlContext();\n\n return useCallback(\n (updatedAt: number) => {\n const formatDistanceToNowResult = formatDistanceToNow(updatedAt);\n const relativeTime =\n formatDistanceToNowResult === '0s ago'\n ? 'Now'\n : formatDistanceToNowResult;\n\n if (isSameDay(updatedAt, new Date())) {\n return relativeTime;\n }\n if (isSameYear(updatedAt, new Date())) {\n return intlDateFormat.format(updatedAt);\n }\n return intlDateDifferentYearFormat.format(updatedAt);\n },\n [intlDateDifferentYearFormat, intlDateFormat]\n );\n}\n","import { verifiedChannelCustomTypes } from '@inbox-demo-nx/constants';\nimport SendBird from 'sendbird';\n\nexport function isChannelVerified(channel: SendBird.GroupChannel) {\n return verifiedChannelCustomTypes.includes(channel.customType as any);\n}\n","import { AnySendBirdMessage } from '.';\n\nexport function isFAQBotAnswer(message: AnySendBirdMessage) {\n if (!message.data) {\n return false;\n }\n\n try {\n const messageData = JSON.parse(message.data);\n return (\n messageData.type === 'SENDBIRD_DESK_BOT_MESSAGE_FAQ_ANSWERS' &&\n messageData.results &&\n messageData.results.length > 0\n );\n } catch (error) {\n return false;\n }\n}\n","import { safeJSONParse } from '@inbox-demo-nx/utils';\nimport SendBirdDesk from 'sendbird-desk';\nimport { AnySendBirdMessage } from '.';\n\nexport function isMessageVisible(\n message: AnySendBirdMessage,\n currentUserId?: string\n) {\n const data = safeJSONParse(message.data);\n\n const isSystemMessage =\n message.customType === 'SENDBIRD_DESK_ADMIN_MESSAGE_CUSTOM_TYPE';\n const isAssigned = data?.type === SendBirdDesk.Message.DataType.TICKET_ASSIGN;\n const isTransferred =\n data?.type === SendBirdDesk.Message.DataType.TICKET_TRANSFER;\n const isClosed = data?.type === SendBirdDesk.Message.DataType.TICKET_CLOSE;\n const isFirstJoinedAutoMessage =\n message.customType === 'SENDBIRD:AUTO_EVENT_MESSAGE' &&\n data?.type === 'USER_JOIN' &&\n (data?.users as any[])?.some((user) => user.user_id === currentUserId);\n\n return (\n !isSystemMessage &&\n !isAssigned &&\n !isTransferred &&\n !isClosed &&\n !isFirstJoinedAutoMessage\n );\n}\n","import { useIntlContext } from '@inbox-demo-nx/contexts';\nimport isThisYear from 'date-fns/isThisYear';\nimport isToday from 'date-fns/isToday';\nimport isYesterday from 'date-fns/isYesterday';\nimport { useCallback } from 'react';\n\nfunction capitalizeFirstLetter(v: string) {\n return v.charAt(0).toUpperCase() + v.slice(1);\n}\n\nexport function useFormatDateLine() {\n const {\n intlDateLineFormat,\n intlDateLineLastYearFormat,\n intlDateLineRelativeFormat,\n } = useIntlContext();\n return useCallback(\n (date: number) => {\n if (isToday(date)) {\n return capitalizeFirstLetter(\n intlDateLineRelativeFormat.format(0, 'day')\n );\n }\n if (isYesterday(date)) {\n return capitalizeFirstLetter(\n intlDateLineRelativeFormat.format(-1, 'day')\n );\n }\n return (\n isThisYear(date) ? intlDateLineFormat : intlDateLineLastYearFormat\n ).format(date);\n },\n [intlDateLineFormat, intlDateLineLastYearFormat, intlDateLineRelativeFormat]\n );\n}\n","import { useAuthContext } from '@inbox-demo-nx/contexts';\nimport { useCallback } from 'react';\nimport SendBird from 'sendbird';\n\nimport { isChannelVerified } from './isChannelVerified';\n\nconst channelNameMaxMembers = 3;\n\nexport function useGetChannelTitle({\n addMemberCount = false,\n}: { addMemberCount?: boolean } = {}) {\n const { currentUser } = useAuthContext();\n const currentUserId = currentUser?.userId;\n return useCallback(\n (channel: SendBird.GroupChannel) => {\n if (isChannelVerified(channel)) {\n return channel.name;\n }\n\n if (channel.name && channel.name !== 'Group Channel') {\n return channel.members.length < 3\n ? channel.name\n : `${channel.name}${\n addMemberCount ? ` (${channel.members.length})` : ''\n }`;\n }\n\n const nicknames = channel.members\n .filter((m) => m.userId !== currentUserId)\n .map((m) => m.nickname);\n\n if (nicknames.length > channelNameMaxMembers) {\n return `${nicknames\n .slice(0, channelNameMaxMembers + 1)\n .join(', ')} and ${nicknames.length - channelNameMaxMembers} others`;\n }\n return `${nicknames.join(', ')}`;\n },\n [addMemberCount, currentUserId]\n );\n}\n","import { parseMessageData } from '@inbox-demo-nx/utils-data-utils';\nimport SendBird from 'sendbird';\n\nexport type AnySendBirdMessage =\n | SendBird.UserMessage\n | SendBird.AdminMessage\n | SendBird.FileMessage;\n\nexport function getChannelUpdatedAt(channel: SendBird.GroupChannel) {\n return channel.lastMessage?.createdAt ?? channel.createdAt;\n}\n\nexport function getMessagePreviewText(message: AnySendBirdMessage) {\n const messageData = parseMessageData(message.data);\n if (messageData?.previewText) {\n return messageData.previewText;\n }\n if (message.isFileMessage()) {\n if (message.type?.includes('image')) {\n return 'Sent an image';\n }\n if (message.type?.includes('audio')) {\n return 'Sent a voice memo';\n }\n return 'Sent a file';\n }\n return message.message?.split('\\n')?.join(' ') ?? '';\n}\n\nexport function getLastMessage(channel: SendBird.GroupChannel) {\n return channel.lastMessage && getMessagePreviewText(channel.lastMessage);\n}\n\nexport * from './formatDuration';\nexport * from './formatters';\nexport * from './isChannelVerified';\nexport * from './isFAQBotAnswer';\nexport * from './isMessageVisible';\nexport * from './useFormatDateLine';\nexport * from './useGetChannelTitle';\n"],"sourceRoot":""}