{ "version": 3, "sources": ["libs/conversation/core/src/lib/conversation-utils.ts", "libs/conversation/core/src/lib/firestore.service.ts", "libs/conversation/core/src/lib/interface/conversation.interface.ts", "libs/conversation/core/src/lib/message-utils.ts", "libs/conversation/core/src/lib/conversation.service.ts", "libs/conversation/core/src/lib/view-mode.service.ts"], "sourcesContent": ["import { NgZone, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { Conversation, ConversationChannel, PlatformLocation } from '@vendasta/conversation';\nimport { FIRESTORE_CONVERSATION_LIMIT, POSTHOG_CHANNEL_NAME } from './conversation.constants';\nimport { PlatformLocationToSKey } from './inbox-terms-of-service.service';\nimport { FOLLOWING_VIEW_ID } from './inbox.constants';\nimport { ConversationDetail } from './interface/conversation.interface';\nimport { CONVERSATION_ROUTES_TOKEN } from './tokens';\n\n/**\n * conversation was not seen if the participant isn't in the `lastSeenTimeByParticipantField` or `lastSeenTime` of the participant is less than `latestMsgSentTime`\n * @param {FirestoreConversation} conversation - the conversation\n */\nexport function conversationUnseen(conversation: Conversation, participantId: string): boolean {\n if (!conversation?.latestMsgSentTime) {\n return false;\n }\n\n if (!participantId) {\n return true;\n } else {\n const lastSeenTimeByParticipant = conversation?.lastSeenByParticipant?.find(\n (lastSeenByParticipant) => lastSeenByParticipant?.participantId === participantId,\n );\n return !lastSeenTimeByParticipant || lastSeenTimeByParticipant?.lastSeenTime < conversation?.latestMsgSentTime;\n }\n}\n\nexport function hasAccessByCountry(accountGroupCountry: string): boolean {\n // https://address-demo.apigateway.co/address.v1.Address/ListAllCountryOptions\n // Australia - AU / United Kingdom - GB\n const availableCountries = ['CA', 'US'];\n\n if (accountGroupCountry !== '' && availableCountries.includes(accountGroupCountry)) {\n return true;\n }\n\n return false;\n}\n\nexport function getConversationByContactID(contactID: string, conversations: ConversationDetail[]): ConversationDetail {\n let contactHasConversation: ConversationDetail = null;\n\n conversationsLoop: for (let i = 0; i < conversations.length; i++) {\n const conversation = conversations[i];\n for (let j = 0; j < conversation.participants.length; j++) {\n const participant = conversation.participants[j];\n if (participant?.internalParticipantId === contactID) {\n contactHasConversation = conversation;\n break conversationsLoop;\n }\n }\n }\n\n return contactHasConversation;\n}\n\nexport function getPlatformLocationToSKey(platformLocation: PlatformLocation): PlatformLocationToSKey {\n switch (platformLocation) {\n case PlatformLocation.PLATFORM_LOCATION_VENDOR_CENTER:\n case PlatformLocation.PLATFORM_LOCATION_PARTNER_CENTER:\n case PlatformLocation.PLATFORM_LOCATION_TASK_MANAGER:\n case PlatformLocation.PLATFORM_LOCATION_SALES_CENTER:\n return { partnerId: 'ALL', feature: 'inbox-platform' };\n case PlatformLocation.PLATFORM_LOCATION_BUSINESS_APP:\n return { partnerId: 'ALL', feature: 'inbox-conversation' };\n }\n}\n\n/**\n * Concat two URLs to generate an unique URL with both strings\n * @param {string} entryUrl - entry Url\n * @param {string} nextUrl - next Url\n * @return {string} - composed URL\n */\nexport function addNextUrl(entryUrl: string, nextUrl: string): string {\n if (!('URL' in window)) {\n return entryUrl + `?nextUrl=${encodeURIComponent(nextUrl)}`;\n }\n const urlObj = new URL(entryUrl);\n const params = new URLSearchParams(urlObj.search);\n params.append('nextUrl', nextUrl);\n urlObj.search = params.toString();\n return urlObj.toString();\n}\n\n/**\n * Create a following view id from a participant\n */\nexport function getFollowViewID(participantID: string): string {\n return participantID + ':' + FOLLOWING_VIEW_ID;\n}\n\nexport function extractCurrentLocation(platformLocationsEnabled: PlatformLocation[]): PlatformLocation {\n const currentLocation = platformLocationsEnabled?.length > 0 ? platformLocationsEnabled[0] : null;\n if (!currentLocation) {\n throw new Error(\n 'You need to set up the platformLocationsEnabled in the ConversationConfig. To fix see documentation in the README of @galaxy/conversation/core',\n );\n }\n return currentLocation;\n}\n\n/**\n * Format the number of unread conversations by view to display\n */\nexport function formatUnreadConversationsCount(count: number, limit = FIRESTORE_CONVERSATION_LIMIT): string {\n if (!count || count === 0) {\n return '';\n }\n return count < limit ? count.toString() : `${limit}+`;\n}\n\nconst ID_PREFIX = 'CONVERSATION-';\n\nexport function toFirestoreId(id: string): string {\n return id.replace(ID_PREFIX, '');\n}\n\nexport function fromFirestoreId(id: string): string {\n if (id && id.startsWith(ID_PREFIX)) {\n return id;\n }\n return ID_PREFIX + id;\n}\n\nexport const redirectToConversationFactory = () => {\n const zone = inject(NgZone);\n const router = inject(Router);\n const routes = toSignal(inject(CONVERSATION_ROUTES_TOKEN));\n\n return (conversationId: string) => {\n zone.run(() => {\n router.navigate([routes().root + '/inbox/channel', toFirestoreId(conversationId)]);\n });\n };\n};\n\nexport function getPosthogChannelName(channel: ConversationChannel): string {\n return POSTHOG_CHANNEL_NAME.get(channel);\n}\n", "import { Injectable, inject } from '@angular/core';\nimport {\n FirestoreInstances,\n Query,\n Timestamp,\n collection,\n collectionData,\n doc,\n docData,\n orderBy,\n query,\n where,\n} from '@angular/fire/firestore';\nimport { EnvironmentService } from '@galaxy/core';\nimport { Observable } from 'rxjs';\nimport { ConversationFilters } from './conversation-filters';\nimport { DELETED_TIMESTAMP_FIRESTORE } from './conversation.constants';\nimport { ConversationEvent, ConversationMessage, FirestoreConversation } from './interface/conversation.interface';\n\nconst validOriginAppLocations = ['business_app', 'partner_center', 'sales_center', 'vendor_center', 'task_manager'];\n\nconst getFirestore = (name: string) => {\n const fsi = inject(FirestoreInstances);\n return fsi.find((fs) => fs.app.name === name);\n};\n\n@Injectable()\nexport class FirestoreService {\n private firestore = getFirestore('inbox');\n private firestoreRootPath = `conversation/env/${this.environmentService.getEnvironmentString()}`;\n\n constructor(private readonly environmentService: EnvironmentService) {}\n\n private getFirestoreMessagesRootPath(conversationDocId: string): string {\n return `${this.firestoreRootPath}/${conversationDocId}/messages`;\n }\n\n private getFirestoreEventsRootPath(conversationDocId: string): string {\n return `${this.firestoreRootPath}/${conversationDocId}/events`;\n }\n\n conversation$(conversationDocId: string) {\n return docData(doc(this.firestore, `${this.firestoreRootPath}/${conversationDocId}`));\n }\n\n setupBaseConversationsQuery(\n organizationId: string,\n filters?: ConversationFilters | null,\n groupId?: string | null,\n skipIsOpenInQuery = false,\n skipIsAnonymousInQuery = false,\n ): Query {\n let q = query(\n collection(this.firestore, this.firestoreRootPath),\n where('deleted', '==', DELETED_TIMESTAMP_FIRESTORE),\n );\n\n if (groupId) {\n q = query(q, where('subjectParticipantIds', 'array-contains', groupId));\n } else {\n q = query(q, where('subjectParticipantKeyIds', 'array-contains', organizationId));\n }\n\n // Anonymous should show all anonymous conversations regardless of if they've been closed\n if (!skipIsOpenInQuery && !filters?.isAnonymous) {\n q = query(q, where('isOpen', '==', filters?.isOpen ?? true));\n }\n\n if (!skipIsAnonymousInQuery) {\n q = query(q, where('isAnonymous', '==', filters?.isAnonymous ?? false));\n }\n\n return query(\n q,\n where('originApp', 'in', validOriginAppLocations),\n where('hasMessage', '==', true),\n where('originAppExternalID', '==', ''),\n orderBy('latestMsgSentTime', 'desc'),\n );\n }\n\n loadOrgRelatedConversationsQuery(organizationId: string): Query {\n const q = this.setupBaseConversationsQuery(organizationId);\n return query(q, where('channel', '==', 'platform'));\n }\n\n messages$(docId: string) {\n return collectionData(\n query(\n collection(this.firestore, this.getFirestoreMessagesRootPath(docId)),\n where('deleted', '==', DELETED_TIMESTAMP_FIRESTORE),\n orderBy('created', 'desc'),\n ),\n { idField: 'id' },\n ) as Observable;\n }\n\n webchatMessages$(docId: string) {\n return collectionData(\n query(\n collection(this.firestore, this.getFirestoreMessagesRootPath(docId)),\n where('deleted', '==', DELETED_TIMESTAMP_FIRESTORE),\n where('channel', '==', 'WebChat'),\n where('type', '==', 'message'),\n orderBy('created', 'desc'),\n ),\n { idField: 'id' },\n ) as Observable;\n }\n\n events$(docId: string) {\n return collectionData(\n query(collection(this.firestore, this.getFirestoreEventsRootPath(docId)), orderBy('happenedAt', 'desc')),\n ) as Observable;\n }\n\n getViewsConversationsQuery(\n participantId: string,\n viewId: string,\n latestMsgSentTime?: Timestamp,\n ): Query {\n let q = query(\n collection(this.firestore, this.firestoreRootPath),\n where('deleted', '==', DELETED_TIMESTAMP_FIRESTORE),\n where('conversationViewIds', 'array-contains', participantId + ':' + viewId),\n where('originApp', 'in', validOriginAppLocations),\n );\n if (latestMsgSentTime) {\n q = query(q, where('latestMsgSentTime', '<=', latestMsgSentTime));\n }\n return query(\n q,\n where('hasMessage', '==', true),\n where('originAppExternalID', '==', ''),\n orderBy('latestMsgSentTime', 'desc'),\n );\n }\n\n getUnreadConversationsByView(participantId: string, viewId: string): Query {\n return query(\n collection(this.firestore, this.firestoreRootPath),\n where('deleted', '==', DELETED_TIMESTAMP_FIRESTORE),\n where('unreadConversationViewIds', 'array-contains', participantId + ':' + viewId),\n where('originApp', 'in', validOriginAppLocations),\n where('hasMessage', '==', true),\n where('originAppExternalID', '==', ''),\n );\n }\n}\n", "import {\n ConversationChannel,\n GetMultiConversationDetailsResponseDetailedConversation,\n MediaInterface,\n MessageType,\n Participant,\n ParticipantType,\n PlatformLocation,\n SendStatusInterface,\n} from '@vendasta/conversation';\nimport { BadgeColor } from '@vendasta/galaxy/badge/src/badge.component';\nimport { Timestamp } from 'firebase/firestore';\nexport { SubjectParticipant } from '@vendasta/conversation';\n\nexport interface FirestoreConversation {\n id?: string;\n conversationId?: string;\n externalConversationId?: string;\n previewContent?: string;\n channel?: ConversationChannel;\n /**\n * @deprecated This property exists for historical compatibility. Use subjectParticipantsKey instead.\n */\n accountGroupId?: string;\n /**\n * @deprecated This property exists for historical compatibility. Use subjectParticipantsKey instead.\n */\n partnerId?: string;\n /**\n * @deprecated This property exists for historical compatibility. Use subjectParticipantsKey instead.\n */\n vendorPartnerId?: string;\n latestMsgSentTime?: Timestamp;\n created?: Timestamp;\n deleted?: Timestamp;\n updated?: Timestamp;\n /**\n * @deprecated This property exists for historical compatibility\n */\n lastSeen?: Timestamp | null;\n lastSeenByParticipants?: Array;\n conversationViewIds?: Array;\n}\n\nexport interface ConversationMessage {\n id?: string;\n conversationId?: string;\n messageId?: string;\n externalMessageId?: string;\n sender?: Participant;\n type: MessageType;\n channel: ConversationChannel;\n body?: string;\n media?: Media[];\n sendStatus?: SendStatusInterface;\n created?: Date;\n deleted?: Date;\n updated?: Date;\n}\n\nexport interface ConversationEvent {\n conversationId: string;\n eventId: string;\n happenedAt: Timestamp;\n labelKey: string;\n initiator?: string;\n created: Timestamp;\n updated: Timestamp;\n deleted: Timestamp;\n}\n\nexport interface ConversationUnseen {\n conversationId?: string;\n read: boolean;\n}\n\nexport interface FirestoreLastSeenByParticipant {\n participantId?: string;\n lastSeenTime?: Timestamp;\n}\n\nexport interface ConversationBadge {\n participantType: string;\n badgeColor: BadgeColor;\n}\nexport type ConversationDetail = GetMultiConversationDetailsResponseDetailedConversation;\n\nexport interface ConversationDetailCache {\n [conversationId: string]: ConversationDetail;\n}\n\nexport interface SendMessage {\n participants?: Array;\n location: PlatformLocation;\n channel: ConversationChannel;\n}\n\nexport interface ConversationTitleInfo {\n title: string;\n subtitle?: string;\n secondarySubtitle?: string;\n}\n\nexport interface ConversationRecipientInfo {\n id: string;\n type: ParticipantType;\n}\n\nexport interface KabobDynamicButton {\n title: string;\n action: () => void;\n posthogLabel: string;\n}\n\nexport interface TermsOfServiceResult {\n termsOfServiceTextMessage: string;\n termsOfServiceAccepted: boolean;\n}\n\nexport interface Media {\n mediaUrl: string;\n mediaContentType: string;\n mediaFileName: string;\n mediaLocationPath: string;\n fileSize?: number;\n}\n\nexport function convertMediaJSONIntoMedia(media: string): Media | null {\n if (!media) {\n return null;\n }\n const data = JSON.parse(media);\n return {\n mediaUrl: data.MediaUrl,\n mediaContentType: data.MediaContentType,\n mediaFileName: data.MediaFileName,\n mediaLocationPath: data.MediaLocationPath,\n fileSize: data.FileSize,\n };\n}\n\nexport interface MessageInfo {\n text: string;\n channel: ConversationChannel;\n attachments: MediaInterface[];\n}\n\nexport interface ConversationAvailableChannels {\n availableChannels: ConversationChannel[];\n preferredChannel: ConversationChannel;\n}\n", "import { Message, MessageStatus, MessageType, Participant } from '@vendasta/conversation';\nimport { ChatMessageStatus } from '@vendasta/galaxy/chat';\nimport { ConversationMessage, Media, convertMediaJSONIntoMedia } from './interface/conversation.interface';\n\nconst ID_PREFIX = 'MESSAGE-';\n\nexport function toFirestoreId(id: string): string {\n return id.replace(ID_PREFIX, '');\n}\n\nexport function fromFirestoreId(id: string): string {\n if (id && id.startsWith(ID_PREFIX)) {\n return id;\n }\n return ID_PREFIX + id;\n}\n\n/**\n * convert API message to ConversationMessage\n * @param {Message} msg - the message coming from the API\n * @param {Participant} sender - the participant that sent msg\n * @return {ConversationMessage} - the converted ConversationMessage object\n */\nexport function convertMessageIntoConversationMessage(\n msg: Message,\n sender: Participant | undefined,\n): ConversationMessage | null {\n if (msg == null) {\n return null;\n }\n\n return {\n id: toFirestoreId(msg.messageId),\n messageId: msg.messageId,\n conversationId: msg.conversationId,\n channel: msg.channel,\n body: msg.body,\n media:\n msg.media?.map((media) => convertMediaJSONIntoMedia(media))?.filter((media): media is Media => !!media) ?? [],\n type: msg.type ?? MessageType.MESSAGE_TYPE_MESSAGE,\n created: msg.created,\n updated: msg.updated,\n deleted: msg.deleted,\n sender: msg.type !== MessageType.MESSAGE_TYPE_SYSTEM ? sender : undefined,\n sendStatus: msg.sendStatus,\n };\n}\n\nexport function mapMessageStatus(message: ConversationMessage): ChatMessageStatus {\n switch (message.sendStatus?.status) {\n case MessageStatus.MESSAGE_STATUS_DELIVERED:\n case MessageStatus.MESSAGE_STATUS_NOT_READ:\n case MessageStatus.MESSAGE_STATUS_READ:\n return 'delivered';\n case MessageStatus.MESSAGE_STATUS_FAILED:\n case MessageStatus.MESSAGE_STATUS_UNDELIVERED:\n return 'failed';\n case MessageStatus.MESSAGE_STATUS_SENT:\n return 'sent';\n case MessageStatus.MESSAGE_STATUS_SENDING:\n return 'sending';\n default:\n return undefined;\n }\n}\n", "import { HttpErrorResponse } from '@angular/common/http';\nimport { Inject, Injectable, inject } from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { Query, collectionData } from '@angular/fire/firestore';\nimport { RegistrationStage, SmsRegistrationService } from '@galaxy/sms';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n Conversation,\n ConversationApiService,\n ConversationChannel,\n CreateConversationRequest,\n CreateConversationResponse,\n EvaluateResponseRequest,\n EvaluationSentiment,\n GetAvailableChannelsForConversationResponse,\n GetMessageRequest,\n GetMultiMessagesRequest,\n GetMultiMessagesResponse,\n GlobalParticipantType,\n LookupConversationsRequestInterface,\n LookupConversationsResponse,\n MediaInterface,\n Message,\n MessageStatus,\n MessageType,\n Participant,\n PlatformLocation,\n SendMessageResponse,\n SetLastSeenRequestStatus,\n GetMultiConversationDetailsRequest,\n} from '@vendasta/conversation';\nimport { SnackbarService } from '@vendasta/galaxy/snackbar-service';\nimport { ProductAnalyticsService } from '@vendasta/product-analytics';\nimport { GetAccountInfoResponse, ParticipantType, SmsService } from '@vendasta/smsv2';\nimport {\n BehaviorSubject,\n EMPTY,\n Observable,\n asyncScheduler,\n catchError,\n combineLatest,\n defaultIfEmpty,\n distinctUntilChanged,\n filter,\n firstValueFrom,\n map,\n merge,\n observeOn,\n of,\n shareReplay,\n skip,\n skipWhile,\n startWith,\n switchMap,\n} from 'rxjs';\nimport { AlertOptions, ConversationChannelService } from './channels/conversation-channel.abstract';\nimport { conversationUnseen, fromFirestoreId, getPosthogChannelName, toFirestoreId } from './conversation-utils';\nimport { FirestoreService } from './firestore.service';\nimport { LOCAL_STORAGE_ID } from './inbox.constants';\nimport { InboxService } from './inbox.service';\nimport {\n ConversationAvailableChannels,\n ConversationDetail,\n ConversationEvent,\n ConversationMessage,\n FirestoreConversation,\n Media,\n MessageInfo,\n} from './interface/conversation.interface';\nimport { HostAppInterface } from './interface/host-app.interface';\nimport { convertMessageIntoConversationMessage, mapMessageStatus } from './message-utils';\nimport { ParticipantService } from './participant.service';\nimport {\n ACCOUNT_GROUP_ID_TOKEN,\n CONVERSATION_CHANNEL_SERVICE_TOKEN,\n CONVERSATION_CONFIG_TOKEN,\n CONVERSATION_CONVERSATION_CHANNELS_ENABLED_TOKEN,\n CONVERSATION_COUNTRY_TOKEN,\n CONVERSATION_HOST_APP_INTERFACE_TOKEN,\n MARKET_ID_TOKEN,\n PARTNER_ID_TOKEN,\n USER_ID_TOKEN,\n} from './tokens';\nimport { ChatMessageStatus } from '@vendasta/galaxy/chat';\nimport { FieldMask } from '@galaxy/marketplace-apps';\n\n@Injectable()\nexport class ConversationService {\n private currentConversationChannel = ConversationChannel.CONVERSATION_CHANNEL_UNDEFINED;\n // TODO: MEGA-791 - Remove this once SMS registration state check is implemented on backend\n private readonly smsRegistrationService = this.inboxService.isBusinessApp ? inject(SmsRegistrationService) : null;\n\n private readonly conversationSelected$$ = new BehaviorSubject(false);\n readonly conversationSelected$ = this.conversationSelected$$.asObservable();\n\n readonly currentParticipant$ = this.participantService.currentParticipant$;\n private readonly currentFirestoreConversationId$$: BehaviorSubject = new BehaviorSubject('');\n readonly currentFirestoreConversationId$ = this.currentFirestoreConversationId$$.pipe(\n map(toFirestoreId),\n distinctUntilChanged(),\n );\n\n readonly currentConversationDetail$ = this.currentFirestoreConversationId$.pipe(\n switchMap((id) => {\n if (!id) return of(null);\n return merge(\n this.getConversationDetail(fromFirestoreId(id)),\n this.firestoreService.conversation$(id).pipe(\n skip(1),\n switchMap(() => this.getConversationDetail(fromFirestoreId(id))),\n ),\n ).pipe(startWith(null));\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n skipWhile((v) => v === null),\n );\n\n private readonly sendSMSNumber$$ = new BehaviorSubject(null);\n readonly sendSMSNumber$ = this.sendSMSNumber$$.asObservable();\n\n readonly currentConvoSMSNumber$ = this.currentConversationDetail$.pipe(\n switchMap((convoDetail) => {\n if (\n !this.inboxService.isBusinessApp ||\n !convoDetail?.conversation.subjectParticipants.find(\n (p) => p.participantType === GlobalParticipantType.GLOBAL_PARTICIPANT_TYPE_CUSTOMER,\n )\n ) {\n return of({} as GetAccountInfoResponse);\n }\n const accountGroupId = convoDetail?.conversation.subjectParticipants.find(\n (p) => p.participantType === GlobalParticipantType.GLOBAL_PARTICIPANT_TYPE_ACCOUNT_GROUP,\n )?.internalParticipantId;\n if (!accountGroupId) {\n return of({} as GetAccountInfoResponse);\n }\n return this.smsService\n .getAccountInfo({\n internalId: accountGroupId,\n type: ParticipantType.PARTICIPANT_TYPE_ACCOUNT_GROUP,\n })\n .pipe(\n catchError((error: HttpErrorResponse) => {\n console.error('error to get account info:', error.message);\n return of({} as GetAccountInfoResponse);\n }),\n );\n }),\n shareReplay(1),\n );\n\n draftMessages: MessageInfo = {};\n\n readonly displayBadge$ = of(!this.inboxService.isBusinessApp);\n\n readonly showInboxViews$ = this.inboxService.showInboxViews$;\n\n private readonly accountGroupId = toSignal(this.accountGroupId$);\n private readonly partnerId = toSignal(this.partnerId$);\n\n constructor(\n private readonly conversationApiService: ConversationApiService,\n private readonly snackbarService: SnackbarService,\n private readonly analyticsService: ProductAnalyticsService,\n @Inject(USER_ID_TOKEN) readonly userId$: Observable,\n @Inject(ACCOUNT_GROUP_ID_TOKEN) private readonly accountGroupId$: Observable,\n @Inject(PARTNER_ID_TOKEN) private readonly partnerId$: Observable,\n @Inject(CONVERSATION_CONVERSATION_CHANNELS_ENABLED_TOKEN)\n private readonly conversationChannelsEnabled$: Observable,\n @Inject(MARKET_ID_TOKEN) readonly marketId$: Observable,\n private readonly participantService: ParticipantService,\n private readonly inboxService: InboxService,\n private readonly translateService: TranslateService,\n private readonly firestoreService: FirestoreService,\n @Inject(CONVERSATION_CHANNEL_SERVICE_TOKEN)\n private readonly conversationChannelService: Map,\n private readonly smsService: SmsService,\n @Inject(CONVERSATION_HOST_APP_INTERFACE_TOKEN) private readonly hostAppInterface: HostAppInterface,\n @Inject(CONVERSATION_COUNTRY_TOKEN) readonly country$: Observable,\n ) {\n this.conversationChannelsEnabled$.pipe(takeUntilDestroyed()).subscribe((conversationChannelsEnabled) => {\n if (!conversationChannelsEnabled || conversationChannelsEnabled.length === 0) {\n console.warn(\n 'You need to set up the conversationChannelsEnabled in the ConversationConfig. To fix see documentation in the README of @galaxy/conversation/core',\n );\n }\n\n if (conversationChannelsEnabled && conversationChannelsEnabled.length > 0) {\n this.setConversationChannel(conversationChannelsEnabled[0]);\n }\n });\n\n this.messages$.pipe(takeUntilDestroyed()).subscribe((messages) => {\n const multipleParticipantsHaveMessages = (messages || []).some(\n (message) => !!message.sender && message.sender.participantId !== messages[0].sender?.participantId,\n );\n if (multipleParticipantsHaveMessages) {\n this.analyticsService.trackEvent('inbox', 'biDirectionConversation', 'view');\n }\n });\n }\n\n private setConversationChannel(conversationChannel: ConversationChannel): void {\n this.currentConversationChannel = conversationChannel;\n }\n\n getConversationChannel(): ConversationChannel {\n return this.currentConversationChannel;\n }\n\n /**\n * create a conversation using the Conversation SDK/API\n * @param {Participant[]} participants - A list of participants\n * @param {ConversationChannel} conversationChannel - A conversation channel\n * @return {Observable} - An observable that contains a CreateConversationResponse\n */\n createConversation(\n participants: Participant[],\n conversationChannel: ConversationChannel,\n originLocation: PlatformLocation,\n ): Observable {\n if (participants.length === 0) {\n console.error(\n 'The participants are empty. It`s necessary send at least two participants to create a conversation',\n );\n return of({} as CreateConversationResponse);\n }\n\n if (conversationChannel === ConversationChannel.CONVERSATION_CHANNEL_UNDEFINED) {\n console.error('The conversationChannel is undefined. It`s necessary send a valid ConversationChannel');\n return of({} as CreateConversationResponse);\n }\n\n const req = {\n participants: participants,\n channel: conversationChannel,\n originLocation: originLocation,\n } as CreateConversationRequest;\n return this.conversationApiService.createConversation(req).pipe(\n catchError((err) => {\n console.warn('error to createConversation', err);\n return EMPTY;\n }),\n defaultIfEmpty({} as CreateConversationResponse),\n );\n }\n\n async sendMessage(\n conversationId: string,\n type: MessageType,\n body: string,\n channel: ConversationChannel,\n originLocation: PlatformLocation,\n media: MediaInterface[] = [],\n recipient?: Participant,\n sender?: Participant,\n ): Promise {\n if (!conversationId) {\n throw new Error('The conversationId is empty. It`s necessary send a valid conversationId');\n }\n\n if (!body && media.length === 0) {\n throw new Error('The body is empty. It`s necessary send a valid body');\n }\n\n if (channel === ConversationChannel.CONVERSATION_CHANNEL_UNDEFINED || channel === null) {\n throw new Error('The channel is invalid. It`s necessary send a valid channel');\n }\n\n if (!originLocation) {\n throw new Error('The originLocation is invalid. It`s necessary send a valid originLocation');\n }\n\n if (!sender) {\n sender = await firstValueFrom(this.participantService.currentParticipant$);\n }\n\n const trackingProps = this.buildSendMessageTrackProperties(conversationId, sender, channel, media.length);\n\n try {\n const result = await firstValueFrom(\n this.conversationApiService.sendMessage({\n sender,\n recipient,\n conversationId,\n type,\n body,\n originLocation,\n media,\n channel,\n }),\n );\n if (!result) {\n console.warn('ConversationService sendMessage value', result);\n return result;\n }\n\n this.analyticsService.trackEvent('inbox', 'conversation', 'send-message-success', 0, trackingProps);\n\n const now = new Date();\n const newMessage: ConversationMessage = {\n id: result.messageId.replace('MESSAGE-', ''),\n messageId: result.messageId,\n conversationId: conversationId,\n sender,\n type: MessageType.MESSAGE_TYPE_MESSAGE,\n channel,\n body,\n media: media as Media[],\n created: now,\n sendStatus: {\n created: now,\n status: MessageStatus.MESSAGE_STATUS_SENDING,\n },\n };\n this.addUnsavedMessage(toFirestoreId(conversationId), newMessage);\n\n return result;\n } catch (httpErrorResponse) {\n this.analyticsService.trackEvent('inbox', 'conversation', 'send-message-error', 0, trackingProps);\n\n console.error('ConversationService sendSMS error', httpErrorResponse);\n const message = (httpErrorResponse as HttpErrorResponse)?.error?.message;\n if (message) {\n this.snackbarService.openErrorSnack(message);\n }\n throw httpErrorResponse;\n }\n }\n\n getMultiConversationDetails(conversationIds: string[], getSummary = false) {\n if (conversationIds.length === 0) {\n return of([]);\n }\n\n const req = new GetMultiConversationDetailsRequest();\n req.conversationIds = conversationIds;\n if (getSummary) {\n req.options = new FieldMask({ paths: ['conversation_summary'] });\n }\n\n return this.conversationApiService.getMultiConversationDetails(req).pipe(\n map((response) => response.conversations),\n catchError((error) => {\n console.warn('error to getMultiConversationDetails collections', error);\n if (error?.status === 403) {\n this.snackbarService.openErrorSnack('INBOX.ERROR.PERMISSION_DENY');\n }\n return of([]);\n }),\n );\n }\n\n /**\n * set current firestore conversation ID\n * @param {string} conversationId - An conversation ID\n */\n setCurrentFirestoreConversationId(conversationId: string): void {\n this.currentFirestoreConversationId$$.next(conversationId ?? '');\n }\n\n getConversationDetail(conversationId: string): Observable {\n conversationId = fromFirestoreId(conversationId);\n\n return this.getMultiConversationDetails([conversationId]).pipe(\n map((conversationsDetails) => {\n return conversationsDetails[0];\n }),\n );\n }\n\n /**\n * set the current smsNumber\n * @param {string} smsNumber - The current smsNumber\n */\n setSMSNumber(smsNumber: string): void {\n this.sendSMSNumber$$.next(smsNumber);\n }\n\n /**\n * get the preview content of the conversation with message sender name\n * @param {ConversationDetail} conversationDetail - conversationDetail\n * @return {string} - the preview content with message sender name\n */\n getPreviewContent(conversationDetail: ConversationDetail): Observable {\n return combineLatest([this.userId$, this.inboxService.isConversationSummaryEnabled$]).pipe(\n map(([userId, showConversationSummary]) => {\n if (showConversationSummary) {\n return conversationDetail.summary;\n }\n const previewContent = this.getPreviewContentText(conversationDetail);\n const latestMessageParticipant = conversationDetail?.participants?.find(\n (participant) => participant?.participantId === conversationDetail.latestMessage?.participantId,\n );\n if (latestMessageParticipant?.isParticipantInternalInfoDeleted) {\n return `${this.translateService.instant('INBOX.PREVIEW_PANE.DELETED_USER')}: ${previewContent}`;\n }\n const otherUserPreviewContent = !latestMessageParticipant?.name\n ? `${previewContent}`\n : `${latestMessageParticipant?.name}: ${previewContent}`;\n return latestMessageParticipant?.internalParticipantId === userId\n ? `${this.translateService.instant('INBOX.PREVIEW_PANE.CURRENT_USER')}: ${previewContent}`\n : otherUserPreviewContent;\n }),\n );\n }\n\n /**\n * get the preview text of the conversation according to the message body text and media info\n * @param {ConversationDetail} conversationDetail - conversationDetail\n * @return {string} - the preview text without message sender name\n */\n getPreviewContentText(conversationDetail: ConversationDetail): string {\n // If message only has media without text\n if (!conversationDetail?.latestMessage?.body && conversationDetail?.latestMessage?.media.length > 0) {\n return this.translateService.instant('INBOX.PREVIEW_PANE.SHARED_A_FILE');\n }\n\n return conversationDetail?.latestMessage?.body;\n }\n\n /**\n * get multi messages from the Conversation µs\n * @param {string[]} messageIds - the message IDs\n * @param {string} conversationId - the conversation ID\n * @return {Observable}\n */\n getMultiMessages(messageIds: string[], conversationId: string): Observable {\n if (!messageIds || messageIds.length === 0) {\n console.error('the messageIds is not valid');\n return of({ messages: [] as Message[] } as GetMultiMessagesResponse);\n }\n\n const req = {\n conversationId: conversationId,\n messageIds: messageIds,\n } as GetMultiMessagesRequest;\n return this.conversationApiService.getMultiMessages(req).pipe(\n catchError((err) => {\n console.error('getMultiMessages error:', err?.message);\n return of({} as GetMultiMessagesResponse);\n }),\n );\n }\n\n /**\n * get a message from the Conversation µs\n * @param {string} messageId - the message ID\n * @return {Observable}\n */\n getMessage(messageId: string): Observable {\n if (!messageId || messageId === '') {\n console.error('the messageId is not valid');\n return of({} as Message);\n }\n\n const req = {\n messageId,\n } as GetMessageRequest;\n\n return this.conversationApiService.getMessage(req).pipe(\n catchError((err) => {\n console.error('getMessage error:', err?.message);\n return of({} as Message);\n }),\n );\n }\n\n /**\n * set conversation lastSeenTime by Participant\n * @param {string} conversationId - the conversation ID\n * @param {SetLastSeenRequestStatus} status - the timestamp\n */\n async setConversationLastSeen(conversationId: string, status: SetLastSeenRequestStatus): Promise {\n const participant = await firstValueFrom(this.currentParticipant$);\n await firstValueFrom(\n this.conversationApiService.setLastSeen({\n conversationId: conversationId,\n participant,\n status: status,\n }),\n );\n }\n\n async setConversationOpenStatus(conversationId: string, isOpen: boolean): Promise {\n const resp = await firstValueFrom(\n this.conversationApiService.updateConversation({\n conversation: {\n conversationId: conversationId,\n isOpen: isOpen,\n },\n fieldMask: {\n paths: ['is_open'],\n },\n }),\n );\n\n this.snackbarService.openSuccessSnack(\n isOpen ? 'INBOX.INFO.CONVERSATION_STATUS_OPENED' : 'INBOX.INFO.CONVERSATION_STATUS_CLOSED',\n );\n\n return resp.conversation;\n }\n\n conversationUnseen(conversation: Conversation): Observable {\n return this.currentParticipant$.pipe(\n map((participant) => {\n return conversationUnseen(conversation, participant?.participantId);\n }),\n );\n }\n\n lookupConversation(req: LookupConversationsRequestInterface): Observable {\n return this.conversationApiService.lookupConversations(req).pipe(\n catchError((err) => {\n if (err?.status === 403) {\n this.snackbarService.openErrorSnack('INBOX.ERROR.PERMISSION_DENY');\n }\n return of({} as LookupConversationsResponse);\n }),\n );\n }\n\n isUserImpersonated$ = inject(CONVERSATION_CONFIG_TOKEN)?.isImpersonating$ || of(false);\n\n private buildSendMessageTrackProperties(\n conversationId: string,\n sender: Participant,\n channel: ConversationChannel,\n numberOfFiles: number,\n ) {\n return {\n id: conversationId,\n accountGroupId: this.accountGroupId(),\n participantName: sender?.name || '',\n partnerId: this.partnerId(),\n PID_AGID: this.accountGroupId() ? this.partnerId() + '_' + this.accountGroupId() : this.partnerId(),\n location: this.inboxService.platformLocation,\n channel: getPosthogChannelName(channel) || getPosthogChannelName(this.getConversationChannel()),\n type: sender?.participantType,\n numberOfFiles: numberOfFiles,\n };\n }\n\n getConversationEvents(conversationId: string): Observable {\n return this.firestoreService.events$(conversationId);\n }\n\n getUnreadConversationsCount(viewId: string): Observable {\n return this.currentParticipant$.pipe(\n switchMap((participant) =>\n this.countUnreadConversations(\n this.firestoreService.getUnreadConversationsByView(participant?.participantId, viewId),\n ),\n ),\n );\n }\n\n countUnreadConversations(conversationsCollection: Query): Observable {\n return collectionData(conversationsCollection, { idField: 'id' }).pipe(\n map((cs) => cs.map((c) => c.conversationId).filter((id): id is string => !!id)),\n switchMap((ids) => of(ids.length)),\n );\n }\n\n setLastConversationId(id: string): void {\n localStorage.setItem(LOCAL_STORAGE_ID, id);\n }\n\n getLastConversationId(): string | undefined {\n return localStorage.getItem(LOCAL_STORAGE_ID) ?? undefined;\n }\n\n removeLastConversationId(): void {\n localStorage.removeItem(LOCAL_STORAGE_ID);\n this.currentFirestoreConversationId$$.next('');\n }\n\n conversationSelected(selected: boolean): void {\n this.conversationSelected$$.next(selected);\n }\n\n mapStatusForMessage(message: ConversationMessage): ChatMessageStatus {\n return mapMessageStatus(message);\n }\n\n // TODO: MEGA-791 - Remove this once SMS registration state check is implemented on backend\n readonly isSMSChannelAvailableForOrg$: Observable = this.inboxService.canAccessSMS$.pipe(\n switchMap((canAccessSMS) => {\n if (!canAccessSMS) {\n return of(false);\n }\n if (!this.smsRegistrationService) {\n return of(canAccessSMS);\n }\n\n return combineLatest([\n this.country$,\n this.smsRegistrationService.registrationStage$,\n this.inboxService.SMSNumber$,\n ]).pipe(\n map(([accountGroupCountry, stage, smsNumber]) => {\n const country = accountGroupCountry?.toLowerCase() || '';\n // Canadian account case\n if (country != 'us' && smsNumber) {\n return true;\n }\n // US account case\n return stage === RegistrationStage.RegistrationComplete;\n }),\n );\n }),\n );\n\n private readonly availableChannelsForConversation$: Observable =\n this.currentFirestoreConversationId$.pipe(\n filter((conversationID) => !!conversationID),\n switchMap((conversationID) => {\n return this.conversationApiService\n .getAvailableChannelsForConversation({\n conversationId: fromFirestoreId(conversationID),\n })\n .pipe(catchError(() => of(null)));\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n distinctUntilChanged(),\n );\n\n //TODO: MEGA-791 We wont need to do filtering in the frontend once we migrate the access control logic to the backend.\n private readonly filteredChannels$: Observable = this.availableChannelsForConversation$.pipe(\n switchMap((availableChannelsForConversation) => {\n if (!availableChannelsForConversation) {\n return of(\n new GetAvailableChannelsForConversationResponse({\n channels: new Array(),\n preferredChannel: ConversationChannel.CONVERSATION_CHANNEL_UNDEFINED,\n }),\n );\n }\n return of(availableChannelsForConversation);\n }),\n map((res) => res?.channels ?? new Array()),\n switchMap((channels) => {\n if (this.hostAppInterface.getAppOptions().is_multilocation) {\n return this.currentConvoSMSNumber$.pipe(\n map((convoSMSNumber) => {\n if (convoSMSNumber) {\n return channels;\n } else {\n return channels.filter((channel) => channel !== ConversationChannel.CONVERSATION_CHANNEL_SMS);\n }\n }),\n );\n }\n // TODO: MEGA-791 - Remove this once SMS registration state check is implemented on backend\n return this.isSMSChannelAvailableForOrg$.pipe(\n map((isSMSChannelAvailable) => {\n return isSMSChannelAvailable\n ? channels\n : channels.filter((channel) => channel !== ConversationChannel.CONVERSATION_CHANNEL_SMS);\n }),\n );\n }),\n catchError(() => of(new Array())),\n distinctUntilChanged((prev, curr) => {\n if (prev.length === 0 && curr.length === 0) {\n return true;\n }\n return curr === prev;\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n //TODO: MEGA-791 Remove the filteredChannels dependency once we migrate the access control logic to the backend.\n //The entire channel availability will be in the backend.\n readonly availableChannels$: Observable = combineLatest([\n this.availableChannelsForConversation$,\n this.filteredChannels$,\n ]).pipe(\n map(([availableChannelsForConversation, filteredAvailableChannels]) => {\n const availableChannels = {\n availableChannels: filteredAvailableChannels,\n } as ConversationAvailableChannels;\n\n if (\n !availableChannelsForConversation ||\n !filteredAvailableChannels?.length ||\n availableChannelsForConversation?.preferredChannel === ConversationChannel.CONVERSATION_CHANNEL_UNDEFINED\n ) {\n availableChannels.preferredChannel = ConversationChannel.CONVERSATION_CHANNEL_UNDEFINED;\n return availableChannels;\n }\n if (filteredAvailableChannels.includes(availableChannelsForConversation?.preferredChannel)) {\n availableChannels.preferredChannel = availableChannelsForConversation.preferredChannel;\n return availableChannels;\n }\n\n availableChannels.preferredChannel = filteredAvailableChannels[0];\n return availableChannels;\n }),\n startWith({\n availableChannels: new Array(),\n preferredChannel: ConversationChannel.CONVERSATION_CHANNEL_UNDEFINED,\n }),\n distinctUntilChanged(),\n );\n\n displayAlertIfExists(\n conversationDetail: ConversationDetail | null,\n conversationChannel: ConversationChannel,\n ): Observable {\n const service = this.conversationChannelService.get(conversationChannel);\n if (!service) return of(null);\n\n return combineLatest([this.partnerId$, this.accountGroupId$, this.availableChannels$]).pipe(\n switchMap(([partnerId, accountGroupId, channels]) => {\n if (channels.availableChannels.length > 0) return of(null);\n return service.getChatComposerAlert(\n partnerId,\n accountGroupId,\n conversationDetail ?? undefined,\n channels.availableChannels,\n );\n }),\n );\n }\n\n private readonly unsavedMessages$$ = new BehaviorSubject<{ [docId: string]: ConversationMessage[] }>({});\n\n private readonly messagesScrollable$: Observable<{\n messages: ConversationMessage[];\n events: ConversationEvent[];\n loading: boolean;\n }> = this.currentFirestoreConversationId$.pipe(\n observeOn(asyncScheduler),\n switchMap((docId) => {\n if (!docId) {\n return of({\n messages: [],\n events: [],\n loading: false,\n });\n }\n\n const conversationId = fromFirestoreId(docId);\n const conversationMessages$ = combineLatest([\n combineLatest([this.currentConversationDetail$, this.firestoreService.messages$(docId)]).pipe(\n switchMap(([conversationDetail, messages]) => {\n if (conversationDetail?.conversation?.conversationId !== conversationId) {\n return EMPTY;\n }\n\n const messageIds: string[] = messages.map((m) => m.messageId).filter((id): id is string => !!id);\n return this.conversationApiService.getMultiMessages({ messageIds, conversationId }).pipe(\n map((res) =>\n (res.messages || new Array())\n .map((msg) =>\n convertMessageIntoConversationMessage(\n msg,\n conversationDetail.participants.find((p) => p.participantId === msg.participantId),\n ),\n )\n .filter((msg): msg is ConversationMessage => {\n return Boolean(msg && (msg.sender || msg.type === MessageType.MESSAGE_TYPE_SYSTEM));\n }),\n ),\n );\n }),\n ),\n this.unsavedMessages$$,\n ]).pipe(\n map(([messages, unsavedMessages]) => {\n const unsavedMessagesForDocId = unsavedMessages[docId] || [];\n const filterSavedMessages = unsavedMessagesForDocId.filter(\n (msg) => !messages.find((m) => m.messageId === msg.messageId),\n );\n return [...filterSavedMessages, ...messages];\n }),\n );\n\n return combineLatest([conversationMessages$, this.getConversationEvents(docId)]).pipe(\n map(([messages, events]) => ({\n messages,\n events,\n loading: false,\n })),\n startWith({ messages: [], events: [], loading: true }),\n );\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n public readonly messages$ = this.messagesScrollable$.pipe(map((res) => res.messages));\n public readonly events$ = this.messagesScrollable$.pipe(map((res) => res.events));\n public readonly loadingMessages$ = this.messagesScrollable$.pipe(map((res) => res.loading));\n\n private addUnsavedMessage(docId: string, message: ConversationMessage) {\n const unsavedMessages = this.unsavedMessages$$.getValue();\n const unsavedMessagesForDocId = unsavedMessages[docId] || [];\n this.unsavedMessages$$.next({\n ...unsavedMessages,\n [docId]: [message, ...unsavedMessagesForDocId],\n });\n }\n\n /**\n * evaluate the helpfulness of a response\n * @param {string} messageId - the id of the message response to evaluate\n * @param {string} comment - a comment about the helpfulness of the response\n * @param {EvaluationSentiment} sentiment - the sentiment of the evaluation\n */\n async evaluateResponse(messageId: string, comment: string, sentiment: EvaluationSentiment): Promise {\n const req = {\n messageId: messageId,\n comment: comment,\n sentiment: sentiment,\n } as EvaluateResponseRequest;\n await firstValueFrom(this.conversationApiService.evaluateResponse(req));\n }\n}\n", "import { inject, Injectable, Injector } from '@angular/core';\nimport { ViewMode } from './types';\nimport {\n combineLatest,\n firstValueFrom,\n Observable,\n ReplaySubject,\n distinctUntilChanged,\n filter,\n map,\n shareReplay,\n startWith,\n tap,\n} from 'rxjs';\nimport { NavigationEnd, Router, UrlTree } from '@angular/router';\nimport { ProductAnalyticsService } from '@vendasta/product-analytics';\nimport { ConversationService } from './conversation.service';\nimport { toFirestoreId } from './conversation-utils';\n\nconst localStorageId = 'conversation-view-mode';\nconst AI_ROUTE = 'ai';\nconst INBOX_ROUTE = 'inbox';\n\n@Injectable({ providedIn: 'root' })\nexport class ViewModeService {\n private readonly router = inject(Router);\n private readonly analyticsService = inject(ProductAnalyticsService);\n private readonly injector = inject(Injector);\n\n private readonly viewMode$$ = new ReplaySubject(1);\n public readonly viewMode$ = this.viewMode$$.pipe(\n startWith(this.getUserViewMode || 'sidebar'),\n distinctUntilChanged(),\n tap((mode) => localStorage.setItem(localStorageId, mode)),\n tap((mode) =>\n this.analyticsService.trackEvent(INBOX_ROUTE, 'inbox-view-mode', 'state', 0, {\n viewMode: mode,\n }),\n ),\n shareReplay(1),\n );\n\n public readonly isOpen$ = this.router.events.pipe(\n filter((event) => event instanceof NavigationEnd),\n map((event: NavigationEnd) => this.router.parseUrl(event.url)),\n map((urlTree) => this.checkSegment(urlTree, 0, INBOX_ROUTE)),\n startWith(window.location.pathname.includes('(inbox:inbox')),\n distinctUntilChanged(),\n shareReplay(1),\n );\n\n public readonly isAIOpen$ = this.router.events.pipe(\n filter((event) => event instanceof NavigationEnd),\n map((event: NavigationEnd) => this.router.parseUrl(event.url)),\n map((urlTree) => this.checkSegment(urlTree, 1, AI_ROUTE)),\n startWith(window.location.pathname.includes('(inbox:inbox/ai')),\n distinctUntilChanged(),\n shareReplay(1),\n );\n\n public readonly isInboxOpen$: Observable = combineLatest([this.isOpen$, this.isAIOpen$]).pipe(\n map(([isOpen, isAIOpen]) => isOpen && !isAIOpen),\n distinctUntilChanged(),\n shareReplay(1),\n );\n\n public readonly isDrawerOpen$ = combineLatest([this.viewMode$, this.isOpen$]).pipe(\n map(([mode, isOpen]) => mode === 'sidebar' && isOpen),\n );\n\n public readonly isModalOpen$ = combineLatest([this.viewMode$, this.isOpen$]).pipe(\n map(([mode, isOpen]) => mode === 'modal' && isOpen),\n );\n\n public async toggleViewMode(): Promise {\n const currentMode = await firstValueFrom(this.viewMode$);\n this.viewMode$$.next(currentMode === 'modal' ? 'sidebar' : 'modal');\n }\n\n private conversationService?: ConversationService;\n\n public async toggleInboxOpen(): Promise {\n if (this.getCurrentRoute(0) === INBOX_ROUTE && this.getCurrentRoute(1) !== AI_ROUTE) {\n this.close();\n } else {\n if (!this.conversationService) {\n this.conversationService = this.injector.get(ConversationService);\n }\n const conversationId = await firstValueFrom(this.conversationService.currentFirestoreConversationId$);\n this.open(conversationId);\n }\n }\n\n public async open(conversationId?: string, prefilledMessage?: string): Promise {\n const viewMode = await firstValueFrom(this.viewMode$);\n this.router.navigate(this.routerCommands(viewMode, conversationId), {\n queryParamsHandling: 'merge',\n queryParams: { inboxPrefilledMessage: prefilledMessage || null },\n });\n }\n\n public openSettings(): void {\n this.router\n .navigate(['', { outlets: { inbox: 'inbox/settings' } }], {\n queryParamsHandling: 'merge',\n queryParams: { inboxPrefilledMessage: null },\n })\n .then(() => this.analyticsService.trackEvent('inbox', 'platform-settings', 'open'));\n }\n\n // the type any[] is the type used by router.navigate\n public routerCommands(mode: ViewMode, conversationId?: string): unknown[] {\n const path = conversationId ? `inbox/conversations/${toFirestoreId(conversationId)}` : INBOX_ROUTE;\n return [\n '',\n {\n outlets: {\n inbox: path,\n },\n },\n ];\n }\n\n close(): void {\n this.router.navigate(['', { outlets: { inbox: null } }], {\n queryParamsHandling: 'merge',\n queryParams: { inboxPrefilledMessage: null },\n });\n }\n\n private getCurrentRoute(index: number): string {\n const currentUrlTree = this.router.parseUrl(this.router.url);\n return currentUrlTree.root.children?.inbox?.segments[index]?.path;\n }\n\n private get getUserViewMode(): ViewMode {\n return localStorage.getItem(localStorageId) as ViewMode;\n }\n\n public toggleInboxAIOpen(): void {\n const currentUrlTree = this.router.parseUrl(this.router.url);\n const path = currentUrlTree.root.children?.inbox?.segments[1]?.path;\n if (path === AI_ROUTE) {\n this.closeInboxAI();\n } else {\n this.viewMode$$.next('sidebar');\n this.openInboxAI();\n }\n }\n public async openInboxAI(): Promise {\n this.router.navigate([{ outlets: { inbox: 'inbox/ai' } }]);\n }\n public async closeInboxAI(): Promise {\n this.router.navigate([{ outlets: { inbox: null } }], {\n queryParamsHandling: 'merge',\n });\n }\n\n private checkSegment(urlTree: UrlTree, segmentIndex: number, segmentPath: string): boolean {\n return urlTree.root.children?.inbox?.segments[segmentIndex]?.path === segmentPath;\n }\n}\n"], "mappings": "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", "names": ["conversationUnseen", "conversation", "participantId", "latestMsgSentTime", "lastSeenTimeByParticipant", "lastSeenByParticipant", "find", "lastSeenTime", "getPlatformLocationToSKey", "platformLocation", "PlatformLocation", "PLATFORM_LOCATION_VENDOR_CENTER", "PLATFORM_LOCATION_PARTNER_CENTER", "PLATFORM_LOCATION_TASK_MANAGER", "PLATFORM_LOCATION_SALES_CENTER", "partnerId", "feature", "PLATFORM_LOCATION_BUSINESS_APP", "addNextUrl", "entryUrl", "nextUrl", "window", "encodeURIComponent", "urlObj", "URL", "params", "URLSearchParams", "search", "append", "toString", "getFollowViewID", "participantID", "FOLLOWING_VIEW_ID", "formatUnreadConversationsCount", "count", "limit", "FIRESTORE_CONVERSATION_LIMIT", "toString", "ID_PREFIX", "toFirestoreId", "id", "replace", "fromFirestoreId", "startsWith", "redirectToConversationFactory", "zone", "inject", "NgZone", "router", "Router", "routes", "toSignal", "CONVERSATION_ROUTES_TOKEN", "conversationId", "run", "navigate", "root", "getPosthogChannelName", "channel", "POSTHOG_CHANNEL_NAME", "get", "validOriginAppLocations", "getFirestore", "name", "inject", "FirestoreInstances", "find", "fs", "app", "FirestoreService", "constructor", "environmentService", "firestore", "firestoreRootPath", "getEnvironmentString", "getFirestoreMessagesRootPath", "conversationDocId", "getFirestoreEventsRootPath", "conversation$", "docData", "doc", "setupBaseConversationsQuery", "organizationId", "filters", "groupId", "skipIsOpenInQuery", "skipIsAnonymousInQuery", "q", "query", "collection", "where", "DELETED_TIMESTAMP_FIRESTORE", "isAnonymous", "isOpen", "orderBy", "loadOrgRelatedConversationsQuery", "messages$", "docId", "collectionData", "idField", "webchatMessages$", "events$", "getViewsConversationsQuery", "participantId", "viewId", "latestMsgSentTime", "getUnreadConversationsByView", "\u0275\u0275inject", "EnvironmentService", "factory", "\u0275fac", "_FirestoreService", "convertMediaJSONIntoMedia", "media", "data", "JSON", "parse", "mediaUrl", "MediaUrl", "mediaContentType", "MediaContentType", "mediaFileName", "MediaFileName", "mediaLocationPath", "MediaLocationPath", "fileSize", "FileSize", "ID_PREFIX", "toFirestoreId", "id", "replace", "convertMessageIntoConversationMessage", "msg", "sender", "id", "toFirestoreId", "messageId", "conversationId", "channel", "body", "media", "map", "convertMediaJSONIntoMedia", "filter", "type", "MessageType", "MESSAGE_TYPE_MESSAGE", "created", "updated", "deleted", "MESSAGE_TYPE_SYSTEM", "undefined", "sendStatus", "mapMessageStatus", "message", "status", "MessageStatus", "MESSAGE_STATUS_DELIVERED", "MESSAGE_STATUS_NOT_READ", "MESSAGE_STATUS_READ", "MESSAGE_STATUS_FAILED", "MESSAGE_STATUS_UNDELIVERED", "MESSAGE_STATUS_SENT", "MESSAGE_STATUS_SENDING", "ConversationService", "constructor", "conversationApiService", "snackbarService", "analyticsService", "userId$", "accountGroupId$", "partnerId$", "conversationChannelsEnabled$", "marketId$", "participantService", "inboxService", "translateService", "firestoreService", "conversationChannelService", "smsService", "hostAppInterface", "country$", "currentConversationChannel", "ConversationChannel", "CONVERSATION_CHANNEL_UNDEFINED", "smsRegistrationService", "isBusinessApp", "inject", "SmsRegistrationService", "conversationSelected$$", "BehaviorSubject", "conversationSelected$", "asObservable", "currentParticipant$", "currentFirestoreConversationId$$", "currentFirestoreConversationId$", "pipe", "map", "toFirestoreId", "distinctUntilChanged", "currentConversationDetail$", "switchMap", "id", "merge", "getConversationDetail", "fromFirestoreId", "conversation$", "skip", "startWith", "of", "shareReplay", "bufferSize", "refCount", "skipWhile", "v", "sendSMSNumber$$", "sendSMSNumber$", "currentConvoSMSNumber$", "convoDetail", "conversation", "subjectParticipants", "find", "p", "participantType", "GlobalParticipantType", "GLOBAL_PARTICIPANT_TYPE_CUSTOMER", "accountGroupId", "GLOBAL_PARTICIPANT_TYPE_ACCOUNT_GROUP", "internalParticipantId", "getAccountInfo", "internalId", "type", "ParticipantType", "PARTICIPANT_TYPE_ACCOUNT_GROUP", "catchError", "error", "console", "message", "draftMessages", "displayBadge$", "showInboxViews$", "toSignal", "partnerId", "isUserImpersonated$", "CONVERSATION_CONFIG_TOKEN", "isImpersonating$", "isSMSChannelAvailableForOrg$", "canAccessSMS$", "canAccessSMS", "combineLatest", "registrationStage$", "SMSNumber$", "accountGroupCountry", "stage", "smsNumber", "toLowerCase", "RegistrationStage", "RegistrationComplete", "availableChannelsForConversation$", "filter", "conversationID", "getAvailableChannelsForConversation", "conversationId", "filteredChannels$", "availableChannelsForConversation", "GetAvailableChannelsForConversationResponse", "channels", "Array", "preferredChannel", "res", "getAppOptions", "is_multilocation", "convoSMSNumber", "channel", "CONVERSATION_CHANNEL_SMS", "isSMSChannelAvailable", "prev", "curr", "length", "availableChannels$", "filteredAvailableChannels", "availableChannels", "includes", "unsavedMessages$$", "messagesScrollable$", "observeOn", "asyncScheduler", "docId", "messages", "events", "loading", "conversationMessages$", "messages$", "conversationDetail", "EMPTY", "messageIds", "m", "messageId", "getMultiMessages", "msg", "convertMessageIntoConversationMessage", "participants", "participantId", "Boolean", "sender", "MessageType", "MESSAGE_TYPE_SYSTEM", "unsavedMessages", "getConversationEvents", "events$", "loadingMessages$", "takeUntilDestroyed", "subscribe", "conversationChannelsEnabled", "warn", "setConversationChannel", "some", "trackEvent", "conversationChannel", "getConversationChannel", "createConversation", "originLocation", "req", "err", "defaultIfEmpty", "sendMessage", "body", "__async", "media", "recipient", "Error", "firstValueFrom", "trackingProps", "buildSendMessageTrackProperties", "result", "now", "Date", "newMessage", "replace", "MESSAGE_TYPE_MESSAGE", "created", "sendStatus", "status", "MessageStatus", "MESSAGE_STATUS_SENDING", "addUnsavedMessage", "httpErrorResponse", "openErrorSnack", "getMultiConversationDetails", "conversationIds", "getSummary", "GetMultiConversationDetailsRequest", "options", "FieldMask", "paths", "response", "conversations", "setCurrentFirestoreConversationId", "next", "conversationsDetails", "setSMSNumber", "getPreviewContent", "isConversationSummaryEnabled$", "userId", "showConversationSummary", "summary", "previewContent", "getPreviewContentText", "latestMessageParticipant", "participant", "latestMessage", "isParticipantInternalInfoDeleted", "instant", "otherUserPreviewContent", "name", "getMessage", "setConversationLastSeen", "setLastSeen", "setConversationOpenStatus", "isOpen", "resp", "updateConversation", "fieldMask", "openSuccessSnack", "conversationUnseen", "lookupConversation", "lookupConversations", "numberOfFiles", "participantName", "PID_AGID", "location", "platformLocation", "getPosthogChannelName", "getUnreadConversationsCount", "viewId", "countUnreadConversations", "getUnreadConversationsByView", "conversationsCollection", "collectionData", "idField", "cs", "c", "ids", "setLastConversationId", "localStorage", "setItem", "LOCAL_STORAGE_ID", "getLastConversationId", "getItem", "undefined", "removeLastConversationId", "removeItem", "conversationSelected", "selected", "mapStatusForMessage", "mapMessageStatus", "displayAlertIfExists", "service", "get", "getChatComposerAlert", "getValue", "unsavedMessagesForDocId", "__spreadProps", "__spreadValues", "evaluateResponse", "comment", "sentiment", "\u0275\u0275inject", "ConversationApiService", "SnackbarService", "ProductAnalyticsService", "USER_ID_TOKEN", "ACCOUNT_GROUP_ID_TOKEN", "PARTNER_ID_TOKEN", "CONVERSATION_CONVERSATION_CHANNELS_ENABLED_TOKEN", "MARKET_ID_TOKEN", "ParticipantService", "InboxService", "TranslateService", "FirestoreService", "CONVERSATION_CHANNEL_SERVICE_TOKEN", "SmsService", "CONVERSATION_HOST_APP_INTERFACE_TOKEN", "CONVERSATION_COUNTRY_TOKEN", "factory", "\u0275fac", "_ConversationService", "localStorageId", "AI_ROUTE", "INBOX_ROUTE", "ViewModeService", "constructor", "router", "inject", "Router", "analyticsService", "ProductAnalyticsService", "injector", "Injector", "viewMode$$", "ReplaySubject", "viewMode$", "pipe", "startWith", "getUserViewMode", "distinctUntilChanged", "tap", "mode", "localStorage", "setItem", "trackEvent", "viewMode", "shareReplay", "isOpen$", "events", "filter", "event", "NavigationEnd", "map", "parseUrl", "url", "urlTree", "checkSegment", "window", "location", "pathname", "includes", "isAIOpen$", "isInboxOpen$", "combineLatest", "isOpen", "isAIOpen", "isDrawerOpen$", "isModalOpen$", "toggleViewMode", "__async", "currentMode", "firstValueFrom", "next", "toggleInboxOpen", "getCurrentRoute", "close", "conversationService", "get", "ConversationService", "conversationId", "currentFirestoreConversationId$", "open", "prefilledMessage", "navigate", "routerCommands", "queryParamsHandling", "queryParams", "inboxPrefilledMessage", "openSettings", "outlets", "inbox", "then", "toFirestoreId", "index", "root", "children", "segments", "path", "getItem", "toggleInboxAIOpen", "closeInboxAI", "openInboxAI", "segmentIndex", "segmentPath", "factory", "\u0275fac", "providedIn", "_ViewModeService"] }