@snugdesk/whatsapp-widget 0.1.8 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @snugdesk/whatsapp-widget might be problematic. Click here for more details.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snugdesk-whatsapp-widget.mjs","sources":["../../../projects/whatsapp-widget/src/lib/config/appsync.config.ts","../../../projects/whatsapp-widget/src/lib/services/appsync-graphql.service.ts","../../../projects/whatsapp-widget/src/lib/graphql/common.model.ts","../../../projects/whatsapp-widget/src/lib/services/entity.service.ts","../../../projects/whatsapp-widget/src/app.config.ts","../../../projects/whatsapp-widget/src/lib/shared/form-controls/phone-input/phone-input.component.ts","../../../projects/whatsapp-widget/src/lib/shared/form-controls/phone-input/phone-input.component.html","../../../projects/whatsapp-widget/src/lib/components/whatsapp-contact-create/whatsapp-contact-create.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-contact-create/whatsapp-contact-create.component.html","../../../projects/whatsapp-widget/src/lib/components/whatsapp-contact-list/whatsapp-contact-list.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-contact-list/whatsapp-contact-list.component.html","../../../projects/whatsapp-widget/src/lib/services/entity-conversation.service.ts","../../../projects/whatsapp-widget/src/lib/services/interaction.service.ts","../../../projects/whatsapp-widget/src/lib/services/interaction-widget.service.ts","../../../projects/whatsapp-widget/src/lib/services/whatsapp-account.service.ts","../../../projects/whatsapp-widget/src/lib/services/whatsapp-helper.service.ts","../../../projects/whatsapp-widget/src/lib/shared/pipes/whatsapp-text-formatter.pipe.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-conversations/whatsapp-conversations.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-conversations/whatsapp-conversations.component.html","../../../projects/whatsapp-widget/src/lib/services/user.service.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-message-item/whatsapp-message-item.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-message-item/whatsapp-message-item.component.html","../../../projects/whatsapp-widget/src/lib/services/whatsapp-template-file.service.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-template-preview/whatsapp-template-preview.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-template-preview/whatsapp-template-preview.component.html","../../../projects/whatsapp-widget/src/lib/shared/form-controls/location-input/location-input.component.ts","../../../projects/whatsapp-widget/src/lib/shared/form-controls/location-input/location-input.component.html","../../../projects/whatsapp-widget/src/lib/components/whatsapp-templates/whatsapp-templates.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-templates/whatsapp-templates.component.html","../../../projects/whatsapp-widget/src/lib/components/whatsapp-messages/whatsapp-messages.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-messages/whatsapp-messages.component.html","../../../projects/whatsapp-widget/src/lib/whatsapp-widget.component.ts","../../../projects/whatsapp-widget/src/lib/whatsapp-widget.component.html","../../../projects/whatsapp-widget/src/lib/whatsapp-widget.module.ts","../../../projects/whatsapp-widget/src/public-api.ts","../../../projects/whatsapp-widget/src/snugdesk-whatsapp-widget.ts"],"sourcesContent":["import { AppSyncGraphqlConfig } from '../services/appsync-graphql.service';\n\nexport const defaultAppSyncConfig: AppSyncGraphqlConfig = {\n endpoint:\n 'https://sgbnsklbvrh67mcvh3wqkzgyou.appsync-api.ap-south-1.amazonaws.com/graphql',\n region: 'ap-south-1',\n};\n","import { Inject, Injectable, InjectionToken, Optional, ValueProvider } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\nimport { defaultAppSyncConfig } from '../config/appsync.config';\n\nimport { Amplify, API } from 'aws-amplify';\nimport { GraphQLResult } from '@aws-amplify/api-graphql';\n\nexport interface AppSyncGraphqlConfig {\n endpoint: string;\n region: string;\n}\n\nexport const APPSYNC_GRAPHQL_CONFIG = new InjectionToken<AppSyncGraphqlConfig>('APPSYNC_GRAPHQL_CONFIG');\n\nexport function provideAppSyncConfig(config: AppSyncGraphqlConfig): ValueProvider {\n return {\n provide: APPSYNC_GRAPHQL_CONFIG,\n useValue: config,\n };\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AppSyncGraphqlService {\n private configured = false;\n\n private readonly config: AppSyncGraphqlConfig;\n\n constructor(\n @Optional()\n @Inject(APPSYNC_GRAPHQL_CONFIG)\n config: AppSyncGraphqlConfig | null,\n private readonly authenticationService: SnugdeskAuthenticationService\n ) {\n this.config = config ?? defaultAppSyncConfig;\n this.ensureConfigured();\n }\n\n async query<T>(statement: string, variables?: Record<string, unknown>): Promise<GraphQLResult<T>> {\n this.ensureConfigured();\n const token = this.getToken();\n // console.debug('token: ', token);\n try {\n return (await API.graphql({\n query: statement,\n variables,\n authMode: 'AWS_LAMBDA',\n authToken: token,\n })) as GraphQLResult<T>;\n } catch (err: any) {\n const normalizedErrors =\n err?.errors?.map((e: any) => ({\n message: e?.message,\n errorType: e?.errorType,\n data: e?.data,\n path: e?.path,\n })) ??\n err?.response?.data?.errors ??\n err?.errors;\n const errorMessage = err?.message ?? normalizedErrors?.[0]?.message;\n console.error('AppSync query failed', {\n statement,\n variables,\n message: errorMessage,\n status: err?.response?.status,\n response: err?.response?.data,\n errors: normalizedErrors,\n });\n if (err) {\n console.error('AppSync query failed (raw error)', err);\n }\n throw err;\n }\n }\n\n async mutate<T>(statement: string, variables?: Record<string, unknown>): Promise<GraphQLResult<T>> {\n return this.query<T>(statement, variables);\n }\n\n subscribe<T>(statement: string, variables?: Record<string, unknown>): Observable<GraphQLResult<T>> {\n this.ensureConfigured();\n const token = this.getToken();\n try {\n return API.graphql({\n query: statement,\n variables,\n authMode: 'AWS_LAMBDA',\n authToken: token,\n }) as unknown as Observable<GraphQLResult<T>>;\n } catch (err: any) {\n const normalizedErrors =\n err?.errors?.map((e: any) => ({\n message: e?.message,\n errorType: e?.errorType,\n data: e?.data,\n path: e?.path,\n })) ??\n err?.response?.data?.errors ??\n err?.errors;\n const errorMessage = err?.message ?? normalizedErrors?.[0]?.message;\n console.error('AppSync subscription failed', {\n statement,\n variables,\n message: errorMessage,\n status: err?.response?.status,\n response: err?.response?.data,\n errors: normalizedErrors,\n });\n if (err) {\n console.error('AppSync subscription failed (raw error)', err);\n }\n throw err;\n }\n }\n\n private ensureConfigured(): void {\n if (this.configured) {\n return;\n }\n\n if (this.shouldUseHostConfig()) {\n this.configured = true;\n return;\n }\n\n if (!this.config?.endpoint || !this.config?.region) {\n throw new Error('AppSync GraphQL configuration is missing.');\n }\n\n const { endpoint, region } = this.config;\n\n Amplify.configure({\n aws_project_region: region,\n aws_appsync_graphqlEndpoint: endpoint,\n aws_appsync_region: region,\n aws_appsync_authenticationType: 'AWS_LAMBDA',\n API: {\n GraphQL: {\n endpoint,\n region,\n defaultAuthMode: 'AWS_LAMBDA',\n graphql_headers: async () => this.buildAuthHeaders(),\n functionAuthProvider: async () => ({\n token: this.getToken(),\n }),\n },\n },\n });\n\n this.configured = true;\n }\n\n private shouldUseHostConfig(): boolean {\n const existing = (Amplify as any).getConfig?.() ?? {};\n const existingEndpoint = existing?.API?.GraphQL?.endpoint ?? existing?.API?.GraphQL?.graphql_endpoint ?? existing?.aws_appsync_graphqlEndpoint;\n\n return existingEndpoint === defaultAppSyncConfig.endpoint;\n }\n\n private buildAuthHeaders(): { Authorization: string } {\n const token = this.getToken();\n\n if (!token) {\n throw new Error('Missing authentication token for AppSync request.');\n }\n\n return {\n Authorization: token,\n };\n }\n\n private getToken(): string {\n const token = this.authenticationService.getToken();\n\n if (!token) {\n throw new Error('Missing authentication token for AppSync request.');\n }\n\n return token;\n }\n}\n","import { GraphQLResult } from '@aws-amplify/api-graphql';\n\nexport enum ModelAttributeTypes {\n binary = 'binary',\n binarySet = 'binarySet',\n bool = 'bool',\n list = 'list',\n map = 'map',\n number = 'number',\n numberSet = 'numberSet',\n string = 'string',\n stringSet = 'stringSet',\n _null = '_null',\n}\n\nexport enum ModelSortDirection {\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport type ModelSizeInput = {\n ne?: number | null;\n eq?: number | null;\n le?: number | null;\n lt?: number | null;\n ge?: number | null;\n gt?: number | null;\n between?: Array<number | null> | null;\n};\n\nexport type ModelBooleanInput = {\n ne?: boolean | null;\n eq?: boolean | null;\n attributeExists?: boolean | null;\n attributeType?: ModelAttributeTypes | null;\n};\n\nexport type ModelIntInput = {\n ne?: number | null;\n eq?: number | null;\n le?: number | null;\n lt?: number | null;\n ge?: number | null;\n gt?: number | null;\n between?: Array<number | null> | null;\n attributeExists?: boolean | null;\n attributeType?: ModelAttributeTypes | null;\n};\n\nexport type ModelIDInput = {\n ne?: string | null;\n eq?: string | null;\n le?: string | null;\n lt?: string | null;\n ge?: string | null;\n gt?: string | null;\n contains?: string | null;\n notContains?: string | null;\n between?: Array<string | null> | null;\n beginsWith?: string | null;\n attributeExists?: boolean | null;\n attributeType?: ModelAttributeTypes | null;\n size?: ModelSizeInput | null;\n};\n\nexport type ModelStringInput = {\n ne?: string | null;\n eq?: string | null;\n le?: string | null;\n lt?: string | null;\n ge?: string | null;\n gt?: string | null;\n contains?: string | null;\n notContains?: string | null;\n between?: Array<string | null> | null;\n beginsWith?: string | null;\n attributeExists?: boolean | null;\n attributeType?: ModelAttributeTypes | null;\n size?: ModelSizeInput | null;\n};\n\nexport type ModelIDKeyConditionInput = {\n eq?: string | null;\n le?: string | null;\n lt?: string | null;\n ge?: string | null;\n gt?: string | null;\n between?: Array<string | null> | null;\n beginsWith?: string | null;\n};\n\nexport type ModelIntKeyConditionInput = {\n eq?: number | null;\n le?: number | null;\n lt?: number | null;\n ge?: number | null;\n gt?: number | null;\n between?: Array<number | null> | null;\n};\n\nexport type ModelStringKeyConditionInput = {\n eq?: string | null;\n le?: string | null;\n lt?: string | null;\n ge?: string | null;\n gt?: string | null;\n between?: Array<string | null> | null;\n beginsWith?: string | null;\n};\n\nexport interface SubscriptionResponse<T> {\n value: GraphQLResult<T>;\n}\n\nexport type Country = {\n code: string;\n nameEn: string;\n nameLocal?: string | null;\n currency?: CountryCurrency | null;\n officialLanguage?: CountryLanguage | null;\n callingCode?: string | null;\n region?: string | null;\n flag?: string | null;\n};\n\nexport type CountryCurrency = {\n code: string;\n nameEn: string;\n};\n\nexport type CountryLanguage = {\n code: string;\n nameEn: string;\n nameLocal?: string | null;\n};\n\nexport type Language = {\n code: string;\n nameEn: string;\n nameLocal?: string | null;\n};\n\nexport type LanguageInput = {\n code: string;\n nameEn: string;\n nameLocal?: string | null;\n};\n\nexport type PhoneNumber = {\n countryCode?: string | null;\n dialCode?: string | null;\n e164Number?: string | null;\n internationalNumber?: string | null;\n nationalNumber?: string | null;\n number?: string | null;\n};\n\nexport type PhoneNumberInput = {\n countryCode?: string | null;\n dialCode?: string | null;\n e164Number?: string | null;\n internationalNumber?: string | null;\n nationalNumber?: string | null;\n number?: string | null;\n};\n\nexport type S3Object = {\n key: string;\n bucket: string;\n location: string;\n};\n\nexport type S3ObjectInput = {\n key: string;\n bucket: string;\n location: string;\n};\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nimport { Language, ModelBooleanInput, ModelIDInput, ModelIntInput, ModelSortDirection, ModelStringInput, ModelStringKeyConditionInput, PhoneNumber, S3Object } from '@snugdesk/core';\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\n\nexport type Entity = {\n id: string;\n externalId?: string | null;\n tenantId: string;\n name: string;\n image?: S3Object | null;\n email?: string | null;\n phoneNumber?: PhoneNumber | null;\n phoneNumberE164?: string | null;\n preferences?: EntityPreferences | null;\n contactPreferences?: EntityContactPreferences | null;\n createdAt: number;\n updatedAt: number;\n blockedAt?: number | null;\n deletedAt?: number | null;\n};\n\n/* export type Entity = {\n id: string;\n externalId?: string | null;\n tenantId: string;\n entityTypeId?: string | null;\n entityType?: EntityType | null;\n parentId?: string | null;\n parent?: Entity | null;\n name: string;\n image?: S3Object | null;\n email?: string | null;\n phoneNumber?: PhoneNumber | null;\n phoneNumberE164?: string | null;\n isOrganization: boolean;\n notes?: string | null;\n customFields?: Array<string | null> | null;\n preferences?: EntityPreferences | null;\n contactPreferences?: EntityContactPreferences | null;\n createdAt: number;\n updatedAt: number;\n blockedAt?: number | null;\n deletedAt?: number | null;\n updatedByUserId: string;\n updatedByUserSessionId?: string | null;\n};\n\nexport type EntityType = {\n id: string;\n externalId?: string | null;\n tenantId: string;\n name: string;\n description?: string | null;\n image?: S3Object | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n entityFields?: Array<string | null> | null;\n organizationFields?: Array<string | null> | null;\n};\n*/\n\nexport type EntityPreferences = {\n timezoneName?: string | null;\n language?: Language | null;\n};\n\nexport type EntityContactPreferences = {\n allowCall?: boolean | null;\n allowEmail?: boolean | null;\n allowSMS?: boolean | null;\n allowWhatsApp?: boolean | null;\n};\n\nexport type CreateEntityInput = {\n id?: string | null;\n externalId?: string | null;\n tenantId: string;\n // entityTypeId?: string | null;\n // parentId?: string | null;\n name: string;\n image?: S3Object | null;\n email?: string | null;\n phoneNumber?: PhoneNumber | null;\n phoneNumberE164?: string | null;\n isOrganization: boolean;\n // notes?: string | null;\n // customFields?: Array<string | null> | null;\n // preferences?: EntityPreferences | null;\n // contactPreferences?: EntityContactPreferences | null;\n createdAt: number;\n updatedAt: number;\n blockedAt?: number | null;\n deletedAt?: number | null;\n updatedByUserId: string;\n updatedByUserSessionId?: string | null;\n};\n\nexport type UpdateEntityInput = {\n id: string;\n externalId?: string | null;\n tenantId?: string | null;\n // entityTypeId?: string | null;\n // parentId?: string | null;\n name?: string | null;\n image?: S3Object | null;\n email?: string | null;\n phoneNumber?: PhoneNumber | null;\n phoneNumberE164?: string | null;\n isOrganization?: boolean | null;\n // notes?: string | null;\n // customFields?: Array<string | null> | null;\n // preferences?: EntityPreferences | null;\n // contactPreferences?: EntityContactPreferences | null;\n createdAt?: number | null;\n updatedAt: number;\n blockedAt?: number | null;\n deletedAt?: number | null;\n updatedByUserId?: string | null;\n updatedByUserSessionId?: string | null;\n};\n\n/* export type EntityPreferencesInput = {\n timezoneName?: string | null;\n language?: LanguageInput | null;\n};\n\nexport type EntityContactPreferencesInput = {\n allowCall?: boolean | null;\n allowEmail?: boolean | null;\n allowSMS?: boolean | null;\n allowWhatsApp?: boolean | null;\n}; */\n\nexport type ModelEntityConditionInput = {\n externalId?: ModelStringInput | null;\n tenantId?: ModelIDInput | null;\n entityTypeId?: ModelIDInput | null;\n parentId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n email?: ModelStringInput | null;\n phoneNumberE164?: ModelStringInput | null;\n isOrganization?: ModelBooleanInput | null;\n // notes?: ModelStringInput | null;\n // customFields?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n blockedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n // updatedByUserId?: ModelIDInput | null;\n // updatedByUserSessionId?: ModelIDInput | null;\n and?: Array<ModelEntityConditionInput | null> | null;\n or?: Array<ModelEntityConditionInput | null> | null;\n not?: ModelEntityConditionInput | null;\n};\n\nexport type ModelEntityFilterInput = {\n id?: ModelIDInput | null;\n externalId?: ModelStringInput | null;\n tenantId?: ModelIDInput | null;\n entityTypeId?: ModelIDInput | null;\n parentId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n email?: ModelStringInput | null;\n phoneNumberE164?: ModelStringInput | null;\n isOrganization?: ModelBooleanInput | null;\n // notes?: ModelStringInput | null;\n // customFields?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n blockedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n // updatedByUserId?: ModelIDInput | null;\n // updatedByUserSessionId?: ModelIDInput | null;\n and?: Array<ModelEntityFilterInput | null> | null;\n or?: Array<ModelEntityFilterInput | null> | null;\n not?: ModelEntityFilterInput | null;\n};\n\nexport type ListEntities = {\n items: Array<Entity | null>;\n nextToken?: string | null;\n};\n\nconst ENTITY_SELECTION = /* GraphQL */ `\n id\n externalId\n tenantId\n entityTypeId\n entityType {\n id\n externalId\n tenantId\n name\n description\n image {\n location\n }\n createdAt\n updatedAt\n deletedAt\n }\n parentId\n parent {\n id\n externalId\n tenantId\n entityTypeId\n name\n image {\n location\n }\n isOrganization\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n createdAt\n updatedAt\n blockedAt\n deletedAt\n }\n name\n image {\n location\n }\n isOrganization\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n preferences {\n timezoneName\n language {\n code\n nameEn\n nameLocal\n }\n }\n contactPreferences {\n allowCall\n allowEmail\n allowSMS\n allowWhatsApp\n }\n createdAt\n updatedAt\n blockedAt\n deletedAt\n`;\n\nconst ENTITY_SELECTION_MINIMAL = /* GraphQL */ `\n id\n externalId\n tenantId\n name\n image {\n location\n }\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n preferences {\n timezoneName\n language {\n code\n nameEn\n nameLocal\n }\n }\n contactPreferences {\n allowCall\n allowEmail\n allowSMS\n allowWhatsApp\n }\n createdAt\n updatedAt\n blockedAt\n deletedAt\n`;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class EntityService {\n private readonly searchBaseUrl = 'https://search.snugdesk.com';\n\n constructor(private http: HttpClient, private readonly graphqlService: AppSyncGraphqlService) {}\n\n private getEntitySearchEndpoint() {\n return this.searchBaseUrl + '/entities';\n }\n\n searchEntities(queryString: string) {\n return lastValueFrom(this.http.get(this.getEntitySearchEndpoint() + '?' + queryString));\n }\n\n async GetEntity(id: string): Promise<Entity> {\n const statement = /* GraphQL */ `\n query GetEntity($id: ID!) {\n getEntity(id: $id) {\n ${ENTITY_SELECTION_MINIMAL}\n }\n }\n `;\n const response = await this.graphqlService.query<any>(statement, { id });\n return <Entity>response.data.getEntity;\n }\n\n async CreateEntity(input: CreateEntityInput, condition?: ModelEntityConditionInput): Promise<Entity> {\n const statement = /* GraphQL */ `\n mutation CreateEntity($input: CreateEntityInput!, $condition: ModelEntityConditionInput) {\n createEntity(input: $input, condition: $condition) {\n ${ENTITY_SELECTION_MINIMAL}\n }\n }\n `;\n const variables: { input: CreateEntityInput; condition?: ModelEntityConditionInput } = { input };\n if (condition) {\n variables.condition = condition;\n }\n const response = await this.graphqlService.query<any>(statement, variables);\n return <Entity>response.data.createEntity;\n }\n\n async UpdateEntity(input: UpdateEntityInput, condition?: ModelEntityConditionInput): Promise<Entity> {\n const statement = /* GraphQL */ `\n mutation UpdateEntity($input: UpdateEntityInput!, $condition: ModelEntityConditionInput) {\n updateEntity(input: $input, condition: $condition) {\n ${ENTITY_SELECTION_MINIMAL}\n }\n }\n `;\n const variables: { input: UpdateEntityInput; condition?: ModelEntityConditionInput } = { input };\n if (condition) {\n variables.condition = condition;\n }\n const response = await this.graphqlService.query<any>(statement, variables);\n return <Entity>response.data.updateEntity;\n }\n\n async ListEntitiesByTenantId(tenantId: string, name?: ModelStringKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelEntityFilterInput, limit?: number, nextToken?: string): Promise<ListEntities> {\n const statement = `query ListEntitiesByTenantId($tenantId: ID!, $name: ModelStringKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelEntityFilterInput, $limit: Int, $nextToken: String) {\n listEntitiesByTenantId(\n tenantId: $tenantId\n name: $name\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${ENTITY_SELECTION_MINIMAL}\n }\n nextToken\n }\n }`;\n const gqlAPIServiceArguments: any = {\n tenantId,\n };\n if (name) {\n gqlAPIServiceArguments.name = name;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListEntities>response.data.listEntitiesByTenantId;\n }\n\n async ListEntitiesByTenantIdAndPhoneNumberE164(tenantId: string, phoneNumberE164?: ModelStringKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelEntityFilterInput, limit?: number, nextToken?: string): Promise<ListEntities> {\n const statement = `query ListEntitiesByTenantIdAndPhoneNumberE164($tenantId: ID!, $phoneNumberE164: ModelStringKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelEntityFilterInput, $limit: Int, $nextToken: String) {\n listEntitiesByTenantIdAndPhoneNumberE164(\n tenantId: $tenantId\n phoneNumberE164: $phoneNumberE164\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${ENTITY_SELECTION_MINIMAL}\n }\n nextToken\n }\n }`;\n const gqlAPIServiceArguments: any = {\n tenantId,\n };\n if (phoneNumberE164) {\n gqlAPIServiceArguments.phoneNumberE164 = phoneNumberE164;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListEntities>response.data.listEntitiesByTenantIdAndPhoneNumberE164;\n }\n}\n","export const AppConfigData = {\n appDomain: 'snugdesk.com',\n appLogoURL: 'https://assets.snugdesk.com/logo/snugdesk.svg',\n appName: 'Snugdesk',\n appSupportEmail: 'support@snug.in',\n companyName: 'Snug Technologies Pvt. Ltd.',\n companyAddress: '403, Tower B, Global Business Park, MG Road, Gurugram, Haryana 122002, India',\n};\n\nexport const AppApiConfig = {\n endpoint: 'https://api.snugdesk.com',\n};\n\nexport const AppUtilityConfig = {\n countryEndpoint: 'https://snugdesk-assets.s3.amazonaws.com/metadata/countries.json',\n ipLookupEndpoint: 'https://ipapi.co/json/',\n};\n\nexport const GoogleMapsConfig = {\n apiKey: 'AIzaSyDOPOMzdMNj6QHFbBWzGmiaXP6yFFUMwok',\n};\n\nexport const WhatsAppConfig = {\n endpoint: 'https://graph.facebook.com/v24.0',\n};\n","import { Component, EventEmitter, Input, OnInit, Output, forwardRef } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { AbstractControl, ControlValueAccessor, FormBuilder, FormGroup, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator, Validators } from '@angular/forms';\nimport { lastValueFrom } from 'rxjs';\n\nimport { MatSelectChange } from '@angular/material/select';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { parsePhoneNumberFromString } from 'libphonenumber-js';\n\nimport { AppUtilityConfig } from '../../../../app.config';\n\nexport type PhoneNumber = {\n countryCode?: string | null;\n dialCode?: string | null;\n e164Number?: string | null;\n internationalNumber?: string | null;\n nationalNumber?: string | null;\n number?: string | null;\n};\n\n@Component({\n selector: 'app-phone-input',\n templateUrl: './phone-input.component.html',\n styleUrls: ['./phone-input.component.css'],\n standalone: false,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PhoneInputComponent),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => PhoneInputComponent),\n multi: true,\n },\n ],\n})\nexport class PhoneInputComponent implements OnInit, ControlValueAccessor, Validator {\n @Input()\n label: string = 'Phone Number';\n\n @Input()\n placeholder!: string;\n\n @Output('phoneChange')\n phoneChange = new EventEmitter<PhoneNumber>();\n\n form: FormGroup;\n\n countriesData: any[] = [];\n filteredCountries: any[] = [];\n countrySearchTerm = '';\n\n private onChangeFn: (value: PhoneNumber | null) => void = () => {};\n private onTouchedFn: () => void = () => {};\n private touched = false;\n private pendingValue: PhoneNumber | null | undefined = undefined;\n\n constructor(private fb: FormBuilder, private httpClient: HttpClient, private snackBar: MatSnackBar) {\n this.form = this.fb.group({\n country: [null, Validators.required],\n phone: ['', Validators.required],\n });\n }\n\n async ngOnInit() {\n try {\n this.countriesData = await this.getAllCountries();\n this.filteredCountries = [...this.countriesData];\n\n await this.setDefaultCountryByLocation();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not load countries`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n }\n }\n\n private async getAllCountries(): Promise<any[]> {\n return await lastValueFrom(this.httpClient.get<any[]>(AppUtilityConfig.countryEndpoint));\n }\n\n private async setDefaultCountryByLocation() {\n const countryControl = this.form.get('country');\n const alreadySet = countryControl?.value;\n\n if (alreadySet || this.countriesData.length === 0) {\n return;\n }\n\n const country = await this.resolveCountryFromIp();\n // console.debug('country: ', country);\n if (country) {\n countryControl?.setValue(country, { emitEvent: false });\n } else {\n countryControl?.setValue(this.countriesData[0], { emitEvent: false });\n }\n }\n\n private async resolveCountryFromIp() {\n try {\n const response = await lastValueFrom(this.httpClient.get<{ country_code?: string }>(AppUtilityConfig.ipLookupEndpoint));\n const countryCode = response?.country_code?.toUpperCase();\n\n if (!countryCode) {\n throw new Error('IP details not found');\n }\n\n return this.countriesData.find((country) => country.code?.toUpperCase() === countryCode) ?? null;\n } catch (err) {\n console.error(err);\n return null;\n }\n }\n\n validateNumber(emitChange = true) {\n const country = this.form.value.country;\n const rawInput = this.form.value.phone?.toString().trim();\n const shouldEmit = emitChange && !this.form.disabled;\n\n if (emitChange) {\n this.markAsTouched();\n }\n\n if (!country || !rawInput) {\n this.setPhoneError('pattern', false);\n this.emitEmpty(shouldEmit);\n return;\n }\n\n const full = `+${country.callingCode}${rawInput}`;\n const parsed = parsePhoneNumberFromString(full);\n\n if (!parsed || !parsed.isValid()) {\n this.setPhoneError('pattern', true);\n this.emitInvalidNumber(rawInput, country, shouldEmit);\n return;\n }\n\n this.setPhoneError('pattern', false);\n\n const result: PhoneNumber = {\n countryCode: country.code,\n dialCode: country.callingCode,\n e164Number: parsed.number,\n internationalNumber: parsed.formatInternational(),\n nationalNumber: parsed.formatNational(),\n number: rawInput,\n };\n\n this.emitResult(result, shouldEmit);\n }\n\n writeValue(value: PhoneNumber | null): void {\n if (this.countriesData.length === 0) {\n this.pendingValue = value ?? null;\n return;\n }\n this.applyExternalValue(value ?? null);\n }\n\n registerOnChange(fn: (value: PhoneNumber | null) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n if (isDisabled) {\n this.form.disable({ emitEvent: false });\n } else {\n this.form.enable({ emitEvent: false });\n }\n }\n\n validate(_: AbstractControl): ValidationErrors | null {\n if (this.form.disabled) {\n return null;\n }\n const errors: ValidationErrors = {};\n const phoneControl = this.form.get('phone');\n const countryControl = this.form.get('country');\n\n if (phoneControl?.hasError('required')) {\n errors['required'] = true;\n }\n\n if (phoneControl?.hasError('pattern')) {\n errors['pattern'] = true;\n }\n\n if (countryControl?.hasError('required')) {\n errors['required'] = true;\n }\n\n return Object.keys(errors).length > 0 ? errors : null;\n }\n\n onCountrySelectionChange(_: MatSelectChange): void {\n this.validateNumber();\n }\n\n onCountrySearchTermChanged(term: string) {\n this.countrySearchTerm = term;\n this.applyCountryFilter();\n }\n\n onCountrySelectOpened(opened: boolean) {\n if (!opened) {\n this.onCountrySearchTermChanged('');\n }\n }\n\n onPhoneInput(event: Event) {\n const inputEl = event.target as HTMLInputElement | null;\n const control = this.form.get('phone');\n\n if (!inputEl || !control) {\n return;\n }\n\n const sanitized = inputEl.value.replace(/\\D+/g, '');\n\n if (sanitized !== inputEl.value) {\n inputEl.value = sanitized;\n }\n\n if (control.value !== sanitized) {\n control.setValue(sanitized, { emitEvent: false });\n }\n\n this.validateNumber();\n }\n\n private applyCountryFilter() {\n const term = this.countrySearchTerm.trim();\n\n if (!term) {\n this.filteredCountries = [...this.countriesData];\n return;\n }\n\n const digitsOnly = /^\\d+$/.test(term);\n\n if (digitsOnly) {\n this.filteredCountries = this.countriesData.filter((country) => country.callingCode?.toString().startsWith(term));\n return;\n }\n\n const normalized = term.toLowerCase();\n this.filteredCountries = this.countriesData.filter((country) => country.nameEn?.toLowerCase().includes(normalized));\n }\n\n private applyExternalValue(value: PhoneNumber | null) {\n const countryControl = this.form.get('country');\n const phoneControl = this.form.get('phone');\n\n const resolvedCountry = value ? this.findCountryForValue(value) : null;\n const countryFallback = this.countriesData[0] ?? null;\n\n countryControl?.setValue(resolvedCountry ?? countryFallback, { emitEvent: false });\n const resolvedNumber = value?.number ?? value?.nationalNumber ?? '';\n const normalizedNumber = resolvedNumber ? resolvedNumber.toString() : '';\n phoneControl?.setValue(normalizedNumber, { emitEvent: false });\n\n this.countrySearchTerm = '';\n this.filteredCountries = [...this.countriesData];\n\n this.validateNumber(false);\n }\n\n private findCountryForValue(value: PhoneNumber | null) {\n if (!value) {\n return null;\n }\n\n const normalizedCode = value.countryCode?.toUpperCase();\n if (normalizedCode) {\n const byCode = this.countriesData.find((country) => country.code?.toUpperCase() === normalizedCode);\n if (byCode) {\n return byCode;\n }\n }\n\n if (value.dialCode) {\n const dial = value.dialCode.toString();\n const byDial = this.countriesData.find((country) => country.callingCode?.toString() === dial);\n if (byDial) {\n return byDial;\n }\n }\n\n return null;\n }\n\n private setPhoneError(errorKey: string, present: boolean) {\n const control = this.form.get('phone');\n if (!control) {\n return;\n }\n const errors = { ...(control.errors ?? {}) };\n\n if (present) {\n errors[errorKey] = true;\n } else {\n delete errors[errorKey];\n }\n\n const hasErrors = Object.keys(errors).length > 0;\n control.setErrors(hasErrors ? errors : null);\n }\n\n private emitResult(result: PhoneNumber, emit: boolean) {\n if (emit) {\n this.onChangeFn(result);\n this.phoneChange.emit(result);\n }\n }\n\n private emitEmpty(emit: boolean) {\n const empty = this.buildEmptyValue();\n if (emit) {\n this.onChangeFn(null);\n this.phoneChange.emit(empty);\n }\n }\n\n private emitInvalidNumber(rawInput: string, country: any, emit: boolean) {\n if (!emit) {\n return;\n }\n\n const partial: PhoneNumber = {\n countryCode: country?.code ?? null,\n dialCode: country?.callingCode ?? null,\n e164Number: null,\n internationalNumber: null,\n nationalNumber: rawInput,\n number: rawInput,\n };\n\n this.onChangeFn(partial);\n this.phoneChange.emit(partial);\n }\n\n private markAsTouched() {\n this.onTouchedFn();\n if (!this.touched) {\n this.form.markAllAsTouched();\n this.touched = true;\n }\n }\n\n private buildEmptyValue(): PhoneNumber {\n const selectedCountry = this.form.get('country')?.value;\n return {\n countryCode: selectedCountry?.code ?? null,\n dialCode: selectedCountry?.callingCode ?? null,\n e164Number: null,\n internationalNumber: null,\n nationalNumber: null,\n number: null,\n };\n }\n}\n","<div [formGroup]=\"form\" class=\"sd_waba_container_phone_input\">\n\n <!-- Country select -->\n <mat-form-field class=\"sd_waba_phone_country_field\">\n <mat-label>Country</mat-label>\n <mat-select formControlName=\"country\" panelClass=\"sd_waba_country_select\"\n (selectionChange)=\"onCountrySelectionChange($event)\" (openedChange)=\"onCountrySelectOpened($event)\">\n <mat-select-trigger>\n <span class=\"sd_waba_country_trigger\">\n <span class=\"sd_waba_country_trigger_flag\">{{ form?.value?.country?.flag }}</span>\n <span class=\"sd_waba_country_trigger_code\">+{{ form?.value?.country?.callingCode }}</span>\n </span>\n </mat-select-trigger>\n <mat-option class=\"sd_waba_country_search\" matRippleDisabled (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <input type=\"text\" class=\"sd_waba_country_search_input\" placeholder=\"Search Country\"\n [ngModel]=\"countrySearchTerm\" [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onCountrySearchTermChanged($event)\" (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" />\n </mat-option>\n @if (filteredCountries.length === 0) {\n <mat-option disabled>No matches found</mat-option>\n }\n @for (c of filteredCountries; track c.code) {\n <mat-option [value]=\"c\" class=\"sd_waba_country_option\">\n <span class=\"sd_waba_country_option_flag\">{{ c.flag }}</span>\n <span class=\"sd_waba_country_option_name\">{{ c.nameEn }}</span>\n <span class=\"sd_waba_country_option_dial\">+{{ c.callingCode }}</span>\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <!-- Phone number input -->\n <mat-form-field class=\"sd_waba_phone_number_field\">\n <mat-label>{{ label }}</mat-label>\n <input matInput type=\"tel\" formControlName=\"phone\" placeholder=\"{{ placeholder || ''}}\" (input)=\"onPhoneInput($event)\" />\n <!-- @if (form.get('phone')?.hasError('invalid')) {\n <mat-error>\n Invalid phone number\n </mat-error>\n }\n @if (form.get('phone')?.hasError('required')) {\n <mat-error>\n Phone number is required\n </mat-error>\n } -->\n </mat-form-field>\n\n</div>\n","import { ChangeDetectorRef, Component, EventEmitter, NgZone, Output } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\n\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { CleanDeep, CustomValidators, SnugdeskAuthenticationService } from '@snugdesk/core';\nimport { ModelSortDirection, PhoneNumber } from '../../graphql/common.model';\nimport { Entity, EntityService } from '../../services/entity.service';\n\nimport moment from 'moment-timezone';\n\n@Component({\n selector: 'lib-whatsapp-contact-create',\n templateUrl: './whatsapp-contact-create.component.html',\n styleUrl: './whatsapp-contact-create.component.css',\n standalone: false,\n})\nexport class WhatsAppContactCreateComponent {\n @Output('close')\n closeEv: EventEmitter<void> = new EventEmitter<void>();\n\n @Output('newContact')\n newContactEv: EventEmitter<Entity> = new EventEmitter<Entity>();\n\n createEntityForm!: FormGroup;\n isFormSubmitted: boolean = false;\n showSubmitLoader: boolean = false;\n\n showContactExistsError: boolean = false;\n\n constructor(private cdr: ChangeDetectorRef, private formBuilder: FormBuilder, private zone: NgZone, private authenticationService: SnugdeskAuthenticationService, private entityService: EntityService, private snackBar: MatSnackBar) {\n this.createEntityForm = this.formBuilder.group({\n name: [\n '',\n Validators.compose([\n Validators.required,\n // Validators.minLength(3),\n Validators.pattern(\"^[a-zA-ZÀ-ÖØ-öø-ÿ'\\\\- ]+$\"),\n CustomValidators.trimLength(3),\n CustomValidators.whitespace,\n ]),\n ],\n email: [\n '',\n Validators.compose([\n // Validators.required,\n Validators.email,\n // Validators.pattern('^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$'),\n Validators.pattern('^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,15}$'),\n // Validators.pattern('^[A-Za-z0-9._%+-]{1,64}@[A-Za-z0-9.-]{2,255}\\\\.[A-Za-z]{2,15}$'),\n CustomValidators.whitespace,\n ]),\n ],\n phoneNumber: [null, Validators.compose([Validators.required])],\n });\n }\n\n async onSubmit() {\n this.isFormSubmitted = true;\n this.createEntityForm.markAllAsTouched();\n this.cdr.markForCheck();\n\n if (this.createEntityForm.invalid) {\n // console.debug('Invalid form: ', this.createEntityForm.errors);\n return;\n }\n\n this.showSubmitLoader = true;\n this.createEntityForm.disable();\n this.cdr.detectChanges();\n\n try {\n const now = moment.utc().unix();\n const { name, email, phoneNumber } = this.createEntityForm.value;\n\n const res_ListEntitiesByTenantIdAndPhoneNumberE164 = await this.entityService.ListEntitiesByTenantIdAndPhoneNumberE164(\n this.authenticationService.getTenantId(),\n {\n eq: phoneNumber.e164Number,\n },\n ModelSortDirection.ASC,\n {\n deletedAt: { attributeExists: false },\n }\n );\n // console.debug('res_ListEntitiesByTenantIdAndPhoneNumberE164: ', res_ListEntitiesByTenantIdAndPhoneNumberE164);\n\n if (res_ListEntitiesByTenantIdAndPhoneNumberE164 && res_ListEntitiesByTenantIdAndPhoneNumberE164?.items?.length > 0) {\n this.showContactExistsError = true;\n return;\n }\n\n // create new entity\n const res_createEntity: Entity = await this.entityService.CreateEntity(\n CleanDeep.clean({\n tenantId: this.authenticationService.getTenantId(),\n name: name.trim(),\n email: email.trim().toLowerCase() || null,\n phoneNumber,\n phoneNumberE164: phoneNumber.e164Number,\n isOrganization: false,\n createdAt: now,\n updatedAt: now,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n })\n );\n // console.debug('res_createEntity: ', res_createEntity);\n\n this.newContactEv.emit(res_createEntity);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! We could not save the contact. Please try again.`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showSubmitLoader = false;\n this.createEntityForm.enable();\n this.cdr.detectChanges();\n }\n }\n\n onClose() {\n this.closeEv.emit();\n }\n\n handleEmailInput(event: Event) {\n const control = this.createEntityForm.get('email');\n const inputEl = event.target as HTMLInputElement | null;\n\n if (!control || !inputEl) {\n return;\n }\n\n const sanitized = inputEl.value.replace(/\\s+/g, '');\n\n if (sanitized !== inputEl.value) {\n inputEl.value = sanitized;\n }\n\n if (control.value !== sanitized) {\n control.setValue(sanitized, { emitEvent: false });\n }\n }\n\n handlePhoneInput(data: PhoneNumber) {\n this.showContactExistsError = false;\n this.createEntityForm.patchValue({\n phoneNumber: data,\n });\n }\n}\n","<div class=\"sd_waba_contact_header\">\n <div class=\"sd_waba_contact_header_left\">\n <button type=\"button\" class=\"sd_waba_button_back\" title=\"Back\" (click)=\"onClose()\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" fill=\"none\">\n <path\n d=\"M7.8248 13L12.7248 17.9C12.9248 18.1 13.0206 18.3333 13.0123 18.6C13.004 18.8667 12.8998 19.1 12.6998 19.3C12.4998 19.4833 12.2665 19.5792 11.9998 19.5875C11.7331 19.5958 11.4998 19.5 11.2998 19.3L4.6998 12.7C4.5998 12.6 4.52897 12.4917 4.4873 12.375C4.44564 12.2583 4.4248 12.1333 4.4248 12C4.4248 11.8667 4.44564 11.7417 4.4873 11.625C4.52897 11.5083 4.5998 11.4 4.6998 11.3L11.2998 4.69999C11.4831 4.51665 11.7123 4.42499 11.9873 4.42499C12.2623 4.42499 12.4998 4.51665 12.6998 4.69999C12.8998 4.89999 12.9998 5.13749 12.9998 5.41249C12.9998 5.68749 12.8998 5.92499 12.6998 6.12499L7.8248 11H18.9998C19.2831 11 19.5206 11.0958 19.7123 11.2875C19.904 11.4792 19.9998 11.7167 19.9998 12C19.9998 12.2833 19.904 12.5208 19.7123 12.7125C19.5206 12.9042 19.2831 13 18.9998 13H7.8248Z\"\n fill=\"currentColor\"></path>\n </svg>\n </button>\n <span class=\"sd_waba_header_title\">New contact</span>\n </div>\n</div>\n\n<div class=\"sd_waba_contact_content\">\n <div class=\"sd_waba_contact_content_inner\">\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_contact_form\">\n <div class=\"sd_waba_contact_avatar\">\n <svg width=\"40px\" viewBox=\"0 0 640 640\">\n <path fill=\"currentColor\"\n d=\"M320 312C386.3 312 440 258.3 440 192C440 125.7 386.3 72 320 72C253.7 72 200 125.7 200 192C200 258.3 253.7 312 320 312zM290.3 368C191.8 368 112 447.8 112 546.3C112 562.7 125.3 576 141.7 576L498.3 576C514.7 576 528 562.7 528 546.3C528 447.8 448.2 368 349.7 368L290.3 368z\" />\n </svg>\n </div>\n\n <form [formGroup]=\"createEntityForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"sd_waba_contact_form_inner\">\n <div class=\"sd_waba_contact_form_field\">\n <mat-form-field>\n <mat-label>Name</mat-label>\n <input matInput formControlName=\"name\" title=\"Name\" />\n <ng-container *ngTemplateOutlet=\"fieldErrors; context: {\n $implicit: createEntityForm.get('name'),\n requiredMsg: 'Name is required',\n invalidLengthMsg: 'Name must be atleast 3 characters long',\n invalidPatternMsg: 'Special characters and numbers are not allowed'\n }\"></ng-container>\n </mat-form-field>\n </div>\n\n <div class=\"sd_waba_contact_form_field\">\n <mat-form-field>\n <mat-label>Email</mat-label>\n <input matInput formControlName=\"email\" title=\"Email\" (input)=\"handleEmailInput($event)\" />\n <ng-container *ngTemplateOutlet=\"fieldErrors; context: {\n $implicit: createEntityForm.get('email'),\n requiredMsg: 'Email is required',\n invalidPatternMsg: 'Enter a valid email address'\n }\"></ng-container>\n </mat-form-field>\n </div>\n\n <div class=\"sd_waba_contact_form_field_tel\">\n <app-phone-input formControlName=\"phoneNumber\" label=\"Phone Number\"\n (phoneChange)=\"handlePhoneInput($event)\" />\n <ng-container *ngTemplateOutlet=\"fieldErrors; context: {\n $implicit: createEntityForm.get('phoneNumber'),\n requiredMsg: 'Phone number is required',\n invalidPatternMsg: 'Enter a valid phone number'\n }\"></ng-container>\n @if (showContactExistsError && (createEntityForm.controls['phoneNumber']?.touched || isFormSubmitted) &&\n !createEntityForm.controls['phoneNumber']?.invalid) {\n <mat-error>This phone number is already registered</mat-error>\n }\n </div>\n <div class=\"sd_waba_contact_form_actions\">\n <button type=\"submit\" class=\"sd_waba_button_save\" title=\"Save\" [disabled]=\"showSubmitLoader\">\n @if (showSubmitLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n }\n @else {\n <span>Save</span>\n }\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Error helper: pass AbstractControl as $implicit; optional requiredMsg / invalidLengthMsg / invalidPatternMsg -->\n<ng-template #fieldErrors let-ctrl let-requiredMsg=\"requiredMsg\" let-invalidLengthMsg=\"invalidLengthMsg\" let-invalidPatternMsg=\"invalidPatternMsg\">\n @if ((ctrl?.touched || isFormSubmitted)\n && (ctrl?.hasError('required') || ctrl?.hasError('whitespace'))) {\n <mat-error>{{ requiredMsg }}</mat-error>\n }\n\n @if ((ctrl?.touched || isFormSubmitted)\n && (ctrl?.hasError('minlength') || ctrl?.hasError('trimLength'))\n && !ctrl?.hasError('required') && !ctrl?.hasError('whitespace')\n && !ctrl?.hasError('pattern')) {\n <mat-error>{{ invalidLengthMsg }}</mat-error>\n }\n\n @if ((ctrl?.touched || isFormSubmitted)\n && ctrl?.hasError('pattern')\n && !ctrl?.hasError('required') && !ctrl?.hasError('whitespace')\n && !ctrl?.hasError('minlength') && !ctrl?.hasError('trimLength')) {\n <mat-error>{{ invalidPatternMsg }}</mat-error>\n }\n</ng-template>\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\n\nimport { ModelSortDirection } from '../../graphql/common.model';\nimport { Entity, EntityService } from '../../services/entity.service';\n\n@Component({\n selector: 'lib-whatsapp-contact-list',\n templateUrl: './whatsapp-contact-list.component.html',\n styleUrl: './whatsapp-contact-list.component.css',\n standalone: false,\n})\nexport class WhatsAppContactListComponent implements OnInit, OnChanges {\n @Input('containerDimensions')\n containerDimensions!: { width: number; height: number };\n\n @Output('close')\n closeEv = new EventEmitter<void>();\n\n @Output('selectContact')\n selectContactEv = new EventEmitter<Entity>();\n\n entities: Entity[] = [];\n nextToken_entities!: string | undefined;\n endOfList: boolean = false;\n\n showInitLoader: boolean = true;\n showRefreshLoader: boolean = false;\n showEntityScrollLoader: boolean = false;\n\n searchQuery: string = '';\n filteredEntities: Entity[] = [];\n\n showNewContact: boolean = false;\n\n constructor(private cdr: ChangeDetectorRef, private authenticationService: SnugdeskAuthenticationService, private entityService: EntityService, private snackBar: MatSnackBar) {}\n\n async ngOnInit(): Promise<void> {\n this.showInitLoader = true;\n try {\n // List entities using cloud search\n // this.entities = await this.entityService.searchEntities(this.searchQuery);\n\n // load the first page\n this.entities = await this.listEntitiesByTenantId();\n\n // load all other pages\n while (!this.endOfList) {\n await this.onScrollEntityList();\n }\n // console.debug('entities: ', this.entities);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch contacts`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showInitLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['containerDimensions']) {\n this.cdr.detectChanges();\n }\n }\n\n onClose(): void {\n this.searchQuery = '';\n this.showNewContact = false;\n this.filterEntities();\n\n this.closeEv.emit();\n this.cdr.detectChanges();\n }\n\n async listEntitiesByTenantId(): Promise<Entity[]> {\n if (this.endOfList) return [];\n\n const res_listEntitiesByTenantId = await this.entityService.ListEntitiesByTenantId(\n this.authenticationService.getTenantId(),\n undefined,\n ModelSortDirection.ASC,\n {\n and: [\n {\n phoneNumberE164: { attributeExists: true },\n },\n {\n deletedAt: { attributeExists: false },\n },\n ],\n },\n undefined,\n this.nextToken_entities\n );\n // console.debug('res_listEntitiesByTenantId: ', res_listEntitiesByTenantId);\n\n this.endOfList = !res_listEntitiesByTenantId.nextToken;\n this.nextToken_entities = res_listEntitiesByTenantId.nextToken || undefined;\n\n return res_listEntitiesByTenantId.items || [];\n }\n\n filterEntities(): void {\n if (!this.searchQuery || this.searchQuery.trim().length === 0) {\n this.filteredEntities = this.entities;\n return;\n }\n\n const cleanedSearchQuery = this.searchQuery.replace(/[\\s+\\(\\)\\[\\]\\{\\}]/g, '');\n const isSearchingByPhoneNumber = /^\\d+$/.test(cleanedSearchQuery);\n this.filteredEntities = this.entities?.filter((entity: any) => {\n if (isSearchingByPhoneNumber && entity.phoneNumber && entity.phoneNumber.e164Number) {\n const countryCode = entity.phoneNumber.e164Number.split(' ')[0] || '';\n const cleanedEntityPhoneNumber = entity.phoneNumber.e164Number.substring(countryCode.length).replace(/[\\s+\\(\\)\\[\\]\\{\\}]/g, '');\n return cleanedEntityPhoneNumber.includes(cleanedSearchQuery);\n } else {\n return entity.name?.toLowerCase().includes(this.searchQuery.trim().toLowerCase());\n }\n });\n\n if (!this.filteredEntities) {\n this.filteredEntities = [];\n }\n }\n\n async refreshEntityList(): Promise<void> {\n this.showRefreshLoader = true;\n try {\n this.entities = [];\n this.filteredEntities = [];\n\n // list all entities\n this.endOfList = false;\n this.nextToken_entities = undefined;\n this.entities = await this.listEntitiesByTenantId();\n\n // load all other pages\n while (!this.endOfList) {\n await this.onScrollEntityList();\n }\n // console.debug('Refreshed entities: ', this.entities);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch contacts`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.filterEntities();\n this.showRefreshLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async onScrollEntityList(): Promise<void> {\n if (this.endOfList) return;\n\n this.showEntityScrollLoader = true;\n try {\n const res_listEntitiesByTenantId: Entity[] = await this.listEntitiesByTenantId();\n this.entities = this.entities.concat(...res_listEntitiesByTenantId);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! We encountered an error. Please try again.`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.filterEntities();\n this.showEntityScrollLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n toggleNewContact(): void {\n this.showNewContact = !this.showNewContact;\n this.cdr.detectChanges();\n }\n\n handleNewContact(entity: Entity): void {\n this.showNewContact = false;\n this.entities.unshift(entity);\n this.entities.sort((a, b) => {\n const an = a.name?.trim().toLowerCase() ?? '';\n const bn = b.name?.trim().toLowerCase() ?? '';\n return an.localeCompare(bn);\n });\n this.filterEntities();\n\n this.selectContactEv.emit(entity);\n this.cdr.detectChanges();\n }\n\n handleSelectContact(entity: Entity): void {\n this.searchQuery = '';\n this.showNewContact = false;\n this.filterEntities();\n\n this.selectContactEv.emit(entity);\n this.cdr.detectChanges();\n }\n\n isNumeric(value: string): boolean {\n return /^\\d+$/.test(value?.trim());\n }\n\n getScrollLoaderCount(): number {\n return Math.ceil((this.containerDimensions.height - 300) / 75);\n }\n\n handleEntityImageError(entity: any): void {\n if (entity && entity.image_url) {\n entity.image_url = null;\n } else {\n entity.image = null;\n }\n }\n}\n","<div class=\"sd_waba_container_contact_list_header\">\n <div class=\"sd_waba_container_contact_list_header_inner\">\n <button type=\"button\" class=\"sd_waba_button_back\" title=\"Back\" (click)=\"onClose()\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" fill=\"none\">\n <path\n d=\"M7.8248 13L12.7248 17.9C12.9248 18.1 13.0206 18.3333 13.0123 18.6C13.004 18.8667 12.8998 19.1 12.6998 19.3C12.4998 19.4833 12.2665 19.5792 11.9998 19.5875C11.7331 19.5958 11.4998 19.5 11.2998 19.3L4.6998 12.7C4.5998 12.6 4.52897 12.4917 4.4873 12.375C4.44564 12.2583 4.4248 12.1333 4.4248 12C4.4248 11.8667 4.44564 11.7417 4.4873 11.625C4.52897 11.5083 4.5998 11.4 4.6998 11.3L11.2998 4.69999C11.4831 4.51665 11.7123 4.42499 11.9873 4.42499C12.2623 4.42499 12.4998 4.51665 12.6998 4.69999C12.8998 4.89999 12.9998 5.13749 12.9998 5.41249C12.9998 5.68749 12.8998 5.92499 12.6998 6.12499L7.8248 11H18.9998C19.2831 11 19.5206 11.0958 19.7123 11.2875C19.904 11.4792 19.9998 11.7167 19.9998 12C19.9998 12.2833 19.904 12.5208 19.7123 12.7125C19.5206 12.9042 19.2831 13 18.9998 13H7.8248Z\"\n fill=\"currentColor\"></path>\n </svg>\n </button>\n <span class=\"sd_waba_header_title\">New chat</span>\n </div>\n</div>\n\n<div class=\"sd_waba_container_contact_list_search\">\n <span class=\"sd_waba_icon_search\">\n <svg viewBox=\"0 0 20 20\" height=\"20\" width=\"20\" fill=\"none\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.36653 4.3664C5.36341 3.36953 6.57714 2.87 8.00012 2.87C9.42309 2.87 10.6368 3.36953 11.6337 4.3664C12.6306 5.36329 13.1301 6.57724 13.1301 8.00062C13.1301 8.57523 13.0412 9.11883 12.8624 9.63057C12.6972 10.1038 12.4733 10.5419 12.1909 10.9444L16.5712 15.3247C16.7454 15.4989 16.8385 15.7046 16.8385 15.9375C16.8385 16.1704 16.7454 16.3761 16.5712 16.5503C16.396 16.7254 16.1866 16.8175 15.948 16.8175C15.7095 16.8175 15.5001 16.7254 15.3249 16.5503L10.9448 12.1906C10.5421 12.4731 10.104 12.697 9.63069 12.8623C9.11895 13.041 8.57535 13.13 8.00074 13.13C6.57736 13.13 5.36341 12.6305 4.36653 11.6336C3.36965 10.6367 2.87012 9.42297 2.87012 8C2.87012 6.57702 3.36965 5.36328 4.36653 4.3664ZM8.00012 4.63C7.06198 4.63 6.26877 4.95685 5.61287 5.61275C4.95698 6.26865 4.63012 7.06186 4.63012 8C4.63012 8.93813 4.95698 9.73134 5.61287 10.3872C6.26877 11.0431 7.06198 11.37 8.00012 11.37C8.93826 11.37 9.73146 11.0431 10.3874 10.3872C11.0433 9.73134 11.3701 8.93813 11.3701 8C11.3701 7.06186 11.0433 6.26865 10.3874 5.61275C9.73146 4.95685 8.93826 4.63 8.00012 4.63Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input type=\"search\" class=\"sd_waba_input_search\" placeholder=\"Search\" [(ngModel)]=\"searchQuery\"\n (keyup)=\"filterEntities()\" [disabled]=\"showInitLoader || showRefreshLoader\">\n</div>\n\n<div class=\"sd_waba_container_contact_add\">\n <button type=\"button\" title=\"New contact\" class=\"sd_waba_button_contact_add\" (click)=\"toggleNewContact()\">\n <div class=\"sd_waba_container_icon_add\">\n <div class=\"sd_waba_container_icon_add_inner\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" fill=\"none\">\n <path\n d=\"M18 11H16C15.7167 11 15.4792 10.9042 15.2875 10.7125C15.0958 10.5208 15 10.2833 15 10C15 9.71667 15.0958 9.47917 15.2875 9.2875C15.4792 9.09583 15.7167 9 16 9H18V7C18 6.71667 18.0958 6.47917 18.2875 6.2875C18.4792 6.09583 18.7167 6 19 6C19.2833 6 19.5208 6.09583 19.7125 6.2875C19.9042 6.47917 20 6.71667 20 7V9H22C22.2833 9 22.5208 9.09583 22.7125 9.2875C22.9042 9.47917 23 9.71667 23 10C23 10.2833 22.9042 10.5208 22.7125 10.7125C22.5208 10.9042 22.2833 11 22 11H20V13C20 13.2833 19.9042 13.5208 19.7125 13.7125C19.5208 13.9042 19.2833 14 19 14C18.7167 14 18.4792 13.9042 18.2875 13.7125C18.0958 13.5208 18 13.2833 18 13V11ZM9 12C7.9 12 6.95833 11.6083 6.175 10.825C5.39167 10.0417 5 9.1 5 8C5 6.9 5.39167 5.95833 6.175 5.175C6.95833 4.39167 7.9 4 9 4C10.1 4 11.0417 4.39167 11.825 5.175C12.6083 5.95833 13 6.9 13 8C13 9.1 12.6083 10.0417 11.825 10.825C11.0417 11.6083 10.1 12 9 12ZM1 18V17.2C1 16.6333 1.14583 16.1125 1.4375 15.6375C1.72917 15.1625 2.11667 14.8 2.6 14.55C3.63333 14.0333 4.68333 13.6458 5.75 13.3875C6.81667 13.1292 7.9 13 9 13C10.1 13 11.1833 13.1292 12.25 13.3875C13.3167 13.6458 14.3667 14.0333 15.4 14.55C15.8833 14.8 16.2708 15.1625 16.5625 15.6375C16.8542 16.1125 17 16.6333 17 17.2V18C17 18.55 16.8042 19.0208 16.4125 19.4125C16.0208 19.8042 15.55 20 15 20H3C2.45 20 1.97917 19.8042 1.5875 19.4125C1.19583 19.0208 1 18.55 1 18Z\"\n fill=\"currentColor\"></path>\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_container_label_add\">\n <span>New contact</span>\n </div>\n </button>\n</div>\n\n<div class=\"sd_waba_container_contact_list_content\">\n <div class=\"sd_waba_container_contact_list_content_inner\">\n <div class=\"sd_waba_scrollbox\" id=\"sd_contacts_whatsapp_scrollbox\" infiniteScroll [scrollWindow]=\"false\"\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"500\" [infiniteScrollDisabled]=\"showEntityScrollLoader\"\n (scrolled)=\"onScrollEntityList()\" #scrollboxWhatsAppContacts>\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_container_contact_list\">\n @if (showInitLoader || showRefreshLoader) {\n <div class=\"sd_waba_container_contacts_init_loader\">\n @for (count of [].constructor(getScrollLoaderCount()); track $index) {\n <div class=\"sd_waba_container_skeleton_loader\">\n <ngx-skeleton-loader appearance=\"circle\"\n [theme]=\"{ 'width': '49px', 'height': '49px', 'background-color': '#d9d9d9' }\" animation=\"progress\">\n </ngx-skeleton-loader>\n <div class=\"sd_waba_container_skeleton_loader_messages\">\n <ngx-skeleton-loader [theme]=\"{ 'width': '30%', 'height': '16px', 'background-color': '#d9d9d9' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ 'width': '80%', 'height': '14px', 'background-color': '#e0e0e0', 'margin-bottom': '0px' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n </div>\n </div>\n }\n </div>\n }\n @else {\n @let searchResults = (searchQuery ? filteredEntities : entities) || [];\n\n @if (searchResults && searchResults.length > 0) {\n <div class=\"sd_waba_contact_list\">\n <ul>\n @for (entity of searchResults; track entity.id) {\n <li (click)=\"handleSelectContact(entity)\">\n <div class=\"sd_waba_container_contact_list_item\">\n <div class=\"sd_waba_container_contact_avatar\"\n [ngClass]=\"{ 'sd_waba_container_contact_avatar_grayscale': !!entity.blockedAt }\">\n @if (entity[\"image_url\"] || entity.image?.location) {\n <img src=\"{{ entity['image_url'] || entity?.image?.location }}\" alt=\"{{ entity.name || '' }}\"\n (error)=\"handleEntityImageError(entity)\" />\n } @else if (!entity?.blockedAt) {\n <ngx-avatars initialsSize=\"2\" [size]=\"49\" [round]=\"true\" [name]=\"entity?.name || '?'\" />\n } @else {\n <ngx-avatars initialsSize=\"2\" [size]=\"49\" [round]=\"true\" [name]=\"entity?.name || '?'\"\n [bgColor]=\"'#d3d3d3'\" />\n }\n </div>\n <div class=\"sd_waba_container_contact_details\">\n <div class=\"sd_waba_container_contact_name\">\n {{ entity.name || '' }}\n </div>\n <div class=\"sd_waba_container_contact_number\">\n {{ entity.phoneNumber?.internationalNumber || entity.phoneNumber?.e164Number || entity.phoneNumberE164 || '' }}\n </div>\n </div>\n </div>\n </li>\n }\n </ul>\n </div>\n\n @if (showEntityScrollLoader) {\n <div class=\"sd_waba_container_contacts_scroll_loader\">\n <div class=\"sd_waba_scroll_item_loader\"></div>\n </div>\n }\n }\n @else {\n <div class=\"sd_waba_container_no_results\">\n <div class=\"sd_waba_container_no_results_inner\">\n <div class=\"sd_waba_container_icon_no_results\">\n <svg version=\"1.1\" viewBox=\"0 0 60 60\" width=\"68px\" style=\"enable-background:new 0 0 60 60;\" xml:space=\"preserve\">\n<path fill=\"currentColor\" d=\"M54,2H6C2.748,2,0,4.748,0,8v33c0,3.252,2.748,6,6,6h8v10c0,0.413,0.254,0.784,0.64,0.933C14.757,57.978,14.879,58,15,58\n\tc0.276,0,0.547-0.115,0.74-0.327L25.442,47H54c3.252,0,6-2.748,6-6V8C60,4.748,57.252,2,54,2z M12,15h15c0.553,0,1,0.448,1,1\n\ts-0.447,1-1,1H12c-0.553,0-1-0.448-1-1S11.447,15,12,15z M46,33H12c-0.553,0-1-0.448-1-1s0.447-1,1-1h34c0.553,0,1,0.448,1,1\n\tS46.553,33,46,33z M46,25H12c-0.553,0-1-0.448-1-1s0.447-1,1-1h34c0.553,0,1,0.448,1,1S46.553,25,46,25z\"/>\n</svg>\n </div>\n <h2>No chats or contacts found</h2>\n @if (!entities || entities?.length === 0) {\n <p>Contacts you create will appear here.</p>\n }\n @else {\n <p>No results found for your search. Please try different keywords.</p>\n }\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n\n@if (showNewContact) {\n<div class=\"sd_waba_container_contact_create\"\n [ngClass]=\"{ 'sd_waba_slide_in_right': showNewContact, 'sd_waba_slide_out_right': !showNewContact }\">\n <lib-whatsapp-contact-create (close)=\"toggleNewContact()\" (newContact)=\"handleNewContact($event)\" />\n</div>\n}\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { ModelBooleanInput, ModelIDInput, ModelIntInput, ModelIntKeyConditionInput, ModelSortDirection, ModelStringInput, ModelStringKeyConditionInput, SubscriptionResponse } from '../graphql/common.model';\nimport { Entity } from './entity.service';\nimport { Interaction, InteractionChannel, InteractionMessage, InteractionProvider, ModelInteractionChannelInput, ModelInteractionProviderInput } from './interaction.service';\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\n\nexport type EntityConversation = {\n id: string;\n tenantId: string;\n entityId?: string | null;\n entity?: Entity | null;\n entityAddress: string;\n interactionChannel: InteractionChannel;\n interactionProvider: InteractionProvider;\n isCampaignEngaged: boolean;\n campaignId?: string | null;\n lastCampaignFlowNodeId?: string | null;\n lastInteractionMessageId?: string | null;\n metadata?: string | null;\n lastActivityAt?: number | null;\n lastMessageAt?: number | null;\n archivedAt?: number | null;\n blockedAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n interactions?: {\n items: Array<Interaction | null>;\n nextToken?: string | null;\n } | null;\n messages?: {\n items: Array<InteractionMessage | null>;\n nextToken?: string | null;\n } | null;\n};\n\nexport type ListEntityConversations = {\n items: Array<EntityConversation | null>;\n nextToken?: string | null;\n};\n\nexport type CreateEntityConversationInput = {\n id?: string | null;\n tenantId: string;\n entityId?: string | null;\n entityAddress: string;\n interactionChannel: InteractionChannel;\n interactionProvider: InteractionProvider;\n isCampaignEngaged: boolean;\n campaignId?: string | null;\n lastCampaignFlowNodeId?: string | null;\n lastInteractionMessageId?: string | null;\n metadata?: string | null;\n lastActivityAt?: number | null;\n lastMessageAt?: number | null;\n archivedAt?: number | null;\n blockedAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type UpdateEntityConversationInput = {\n id: string;\n tenantId?: string | null;\n entityId?: string | null;\n entityAddress?: string | null;\n interactionChannel?: InteractionChannel | null;\n interactionProvider?: InteractionProvider | null;\n isCampaignEngaged?: boolean | null;\n campaignId?: string | null;\n lastCampaignFlowNodeId?: string | null;\n lastInteractionMessageId?: string | null;\n metadata?: string | null;\n lastActivityAt?: number | null;\n lastMessageAt?: number | null;\n archivedAt?: number | null;\n blockedAt?: number | null;\n createdAt?: number | null;\n updatedAt?: number | null;\n deletedAt?: number | null;\n};\n\nexport type ModelEntityConversationConditionInput = {\n tenantId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n entityAddress?: ModelStringInput | null;\n interactionChannel?: ModelInteractionChannelInput | null;\n interactionProvider?: ModelInteractionProviderInput | null;\n isCampaignEngaged?: ModelBooleanInput | null;\n campaignId?: ModelIDInput | null;\n lastCampaignFlowNodeId?: ModelIDInput | null;\n lastInteractionMessageId?: ModelIDInput | null;\n metadata?: ModelStringInput | null;\n lastActivityAt?: ModelIntInput | null;\n lastMessageAt?: ModelIntInput | null;\n archivedAt?: ModelIntInput | null;\n blockedAt?: ModelIntInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelEntityConversationConditionInput | null> | null;\n or?: Array<ModelEntityConversationConditionInput | null> | null;\n not?: ModelEntityConversationConditionInput | null;\n};\n\nexport type ModelEntityConversationFilterInput = {\n id?: ModelIDInput | null;\n tenantId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n entityAddress?: ModelStringInput | null;\n interactionChannel?: ModelInteractionChannelInput | null;\n interactionProvider?: ModelInteractionProviderInput | null;\n isCampaignEngaged?: ModelBooleanInput | null;\n campaignId?: ModelIDInput | null;\n lastCampaignFlowNodeId?: ModelIDInput | null;\n lastInteractionMessageId?: ModelIDInput | null;\n metadata?: ModelStringInput | null;\n lastActivityAt?: ModelIntInput | null;\n lastMessageAt?: ModelIntInput | null;\n archivedAt?: ModelIntInput | null;\n blockedAt?: ModelIntInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelEntityConversationFilterInput | null> | null;\n or?: Array<ModelEntityConversationFilterInput | null> | null;\n not?: ModelEntityConversationFilterInput | null;\n};\n\nexport type __SubscriptionContainer = {\n OnEntityConversationByTenantId: EntityConversation;\n};\n\nexport const FIELDS_ENTITY_CONVERSATION: string = `\n id\n tenantId\n entityId\n entityAddress\n interactionChannel\n interactionProvider\n isCampaignEngaged\n campaignId\n lastCampaignFlowNodeId\n lastInteractionMessageId\n metadata\n lastActivityAt\n lastMessageAt\n archivedAt\n blockedAt\n createdAt\n updatedAt\n deletedAt\n`;\n\nexport const FIELDS_ENTITY_CONVERSATION_EXPANDED = `\n id\n tenantId\n entityId\n entity {\n id\n externalId\n tenantId\n entityTypeId\n parentId\n name\n image {\n key\n bucket\n location\n }\n isOrganization\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n notes\n customFields\n preferences {\n timezoneName\n language {\n code\n nameEn\n nameLocal\n }\n }\n contactPreferences {\n allowCall\n allowEmail\n allowSMS\n allowWhatsApp\n }\n createdAt\n updatedAt\n blockedAt\n deletedAt\n }\n entityAddress\n interactionChannel\n interactionProvider\n isCampaignEngaged\n campaignId\n lastCampaignFlowNodeId\n lastInteractionMessageId\n metadata\n lastActivityAt\n lastMessageAt\n archivedAt\n blockedAt\n createdAt\n updatedAt\n deletedAt\n interactions (limit: 1, sortDirection: ${ModelSortDirection.DESC}) {\n items {\n id\n tenantId\n entityId\n entityConversationId\n teamId\n widgetId\n metadata\n subject\n direction\n status\n last_status\n hostId\n startedAt\n completedAt\n createdAt\n updatedAt\n deletedAt\n }\n nextToken\n }\n messages (limit: 1, sortDirection: ${ModelSortDirection.DESC}) {\n items {\n id\n externalId\n endpointId\n entityConversationId\n interactionId\n interactionAttendeeId\n referenceMessageId\n body\n metadata\n createdAt\n updatedAt\n deletedAt\n messageAttachments {\n items {\n id\n externalId\n interactionId\n interactionMessageId\n interactionId\n name\n size\n type\n file {\n key\n bucket\n location\n }\n createdAt\n updatedAt\n deletedAt\n }\n nextToken\n }\n }\n nextToken\n }\n`;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class EntityConversationService {\n constructor(private readonly graphqlService: AppSyncGraphqlService) {}\n\n async GetEntityConversation(id: string): Promise<EntityConversation> {\n const statement = `query GetEntityConversation($id: ID!) {\n getEntityConversation(id: $id) {\n ${FIELDS_ENTITY_CONVERSATION_EXPANDED}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { id };\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <EntityConversation>response.data.getEntityConversation;\n }\n\n async CreateEntityConversation(input: CreateEntityConversationInput, condition?: ModelEntityConversationConditionInput): Promise<EntityConversation> {\n const statement = `mutation CreateEntityConversation($input: CreateEntityConversationInput!, $condition: ModelEntityConversationConditionInput) {\n createEntityConversation(input: $input, condition: $condition) {\n ${FIELDS_ENTITY_CONVERSATION}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <EntityConversation>response.data.createEntityConversation;\n }\n\n async UpdateEntityConversation(input: UpdateEntityConversationInput, condition?: ModelEntityConversationConditionInput): Promise<EntityConversation> {\n const statement = `mutation UpdateEntityConversation($input: UpdateEntityConversationInput!, $condition: ModelEntityConversationConditionInput) {\n updateEntityConversation(input: $input, condition: $condition) {\n ${FIELDS_ENTITY_CONVERSATION}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <EntityConversation>response.data.updateEntityConversation;\n }\n\n async ListEntityConversationsByTenantIdAndEntityAddress(tenantId: string, entityAddress?: ModelStringKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelEntityConversationFilterInput, limit?: number, nextToken?: string): Promise<ListEntityConversations> {\n const statement = `query ListEntityConversationsByTenantIdAndEntityAddress($tenantId: ID!, $entityAddress: ModelStringKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelEntityConversationFilterInput, $limit: Int, $nextToken: String) {\n listEntityConversationsByTenantIdAndEntityAddress(\n tenantId: $tenantId\n entityAddress: $entityAddress\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_ENTITY_CONVERSATION_EXPANDED}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { tenantId };\n if (entityAddress) {\n gqlAPIServiceArguments.entityAddress = entityAddress;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListEntityConversations>response.data.listEntityConversationsByTenantIdAndEntityAddress;\n }\n\n async ListEntityConversationsByTenantIdAndArchivedAt(tenantId: string, archivedAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelEntityConversationFilterInput, limit?: number, nextToken?: string): Promise<ListEntityConversations> {\n const statement = `query ListEntityConversationsByTenantIdAndArchivedAt($tenantId: ID!, $archivedAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelEntityConversationFilterInput, $limit: Int, $nextToken: String) {\n listEntityConversationsByTenantIdAndArchivedAt(\n tenantId: $tenantId\n archivedAt: $archivedAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_ENTITY_CONVERSATION_EXPANDED}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { tenantId };\n if (archivedAt) {\n gqlAPIServiceArguments.archivedAt = archivedAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListEntityConversations>response.data.listEntityConversationsByTenantIdAndArchivedAt;\n }\n\n async ListEntityConversationsByTenantIdAndLastMessageAt(tenantId: string, lastMessageAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelEntityConversationFilterInput, limit?: number, nextToken?: string): Promise<ListEntityConversations> {\n const statement = `query ListEntityConversationsByTenantIdAndLastMessageAt($tenantId: ID!, $lastMessageAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelEntityConversationFilterInput, $limit: Int, $nextToken: String) {\n listEntityConversationsByTenantIdAndLastMessageAt(\n tenantId: $tenantId\n lastMessageAt: $lastMessageAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_ENTITY_CONVERSATION_EXPANDED}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { tenantId };\n if (lastMessageAt) {\n gqlAPIServiceArguments.lastMessageAt = lastMessageAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListEntityConversations>response.data.listEntityConversationsByTenantIdAndLastMessageAt;\n }\n\n OnEntityConversationByTenantIdListener(tenantId: string): Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnEntityConversationByTenantId'>>> {\n const statement = `subscription OnEntityConversationByTenantId($tenantId: ID!) {\n OnEntityConversationByTenantId(tenantId: $tenantId) {\n ${FIELDS_ENTITY_CONVERSATION_EXPANDED}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { tenantId };\n return this.graphqlService.subscribe<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnEntityConversationByTenantId'>>>(statement, gqlAPIServiceArguments) as any;\n /* as Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnEntityConversationByTenantId'>>> */\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nimport { ModelBooleanInput, ModelIDInput, ModelIDKeyConditionInput, ModelIntInput, ModelIntKeyConditionInput, ModelSortDirection, ModelStringInput, S3Object, S3ObjectInput, SubscriptionResponse } from '../graphql/common.model';\nimport { Entity } from './entity.service';\nimport { EntityConversation } from './entity-conversation.service';\nimport { InteractionEndpoint } from './interaction-endpoint.service';\nimport { InteractionWidget } from './interaction-widget.service';\nimport { Team } from './team.service';\nimport { User } from './user.service';\nimport { UserSession } from './user-session.service';\n\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\n\nexport enum InteractionChannel {\n EMAIL = 'EMAIL',\n PHONE = 'PHONE',\n SMS = 'SMS',\n WEB_CHAT = 'WEB_CHAT',\n SOCIAL_CHAT = 'SOCIAL_CHAT',\n}\n\nexport enum InteractionContext {\n INTERNAL = 'INTERNAL',\n EXTERNAL = 'EXTERNAL',\n}\n\nexport enum InteractionDirection {\n IN = 'IN',\n OUT = 'OUT',\n}\n\nexport enum InteractionStatus {\n INITIATED = 'INITIATED',\n QUEUED = 'QUEUED',\n RINGING = 'RINGING',\n CONNECTED_TO_AGENT = 'CONNECTED_TO_AGENT',\n CONNECTED_TO_BOT = 'CONNECTED_TO_BOT',\n HELD = 'HELD',\n DISCONNECTED = 'DISCONNECTED',\n CANCELLED = 'CANCELLED',\n REJECTED = 'REJECTED',\n NO_ANSWER = 'NO_ANSWER',\n MISSED = 'MISSED',\n FAILED = 'FAILED',\n}\n\nexport enum InteractionProvider {\n AVAYA_IPO = 'AVAYA_IPO',\n TELNYX = 'TELNYX',\n WHATSAPP = 'WHATSAPP',\n TELEGRAM = 'TELEGRAM',\n SNUGDESK = 'SNUGDESK',\n}\n\nexport type InteractionRouteConfiguration = {\n teamId?: string | null;\n routingLogic?: InteractionRouteLogic | null;\n maxWaitTimeoutSeconds?: number | null;\n};\n\nexport enum InteractionRouteLogic {\n MOST_IDLE_AGENT = 'MOST_IDLE_AGENT',\n PARALLEL = 'PARALLEL',\n}\n\nexport type Interaction = {\n id: string;\n tenantId: string;\n widgetId: string;\n widget?: InteractionWidget | null;\n endpointId: string;\n endpoint?: InteractionEndpoint | null;\n entityConversationId?: string | null;\n entityConversation?: EntityConversation | null;\n entityId?: string | null;\n entity?: Entity | null;\n teamId?: string | null;\n team?: Team | null;\n hostId?: string | null;\n host?: InteractionHost | null;\n providerInteractionId?: string | null;\n channel: InteractionChannel;\n provider: InteractionProvider;\n context: InteractionContext;\n direction: InteractionDirection;\n status?: InteractionStatus | null;\n last_status?: InteractionStatus | null;\n metadata?: string | null;\n subject?: string | null;\n routeConfiguration?: InteractionRouteConfiguration | null;\n startedAt?: number | null;\n completedAt?: number | null;\n duration?: number | null;\n summary?: string | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n /*\n invitees?: ListInteractionInvitees | null;\n attendees?: ListInteractionAttendees | null;\n messages?: ListInteractionMessages | null;\n messageAttachments?: ListInteractionMessageAttachments | null;\n */\n};\n\nexport type InteractionHost = {\n id: string;\n interactionId: string;\n interaction?: Interaction | null;\n entityId?: string | null;\n entity?: Entity | null;\n teamId?: string | null;\n team?: Team | null;\n userId?: string | null;\n user?: User | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type InteractionInvitee = {\n id: string;\n interactionId: string;\n interaction?: Interaction | null;\n entityId?: string | null;\n entity?: Entity | null;\n teamId?: string | null;\n team?: Team | null;\n userId?: string | null;\n user?: User | null;\n isAdministrator: boolean;\n temp_expiringAt?: number | null;\n expiredAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type InteractionAttendee = {\n id: string;\n interactionId: string;\n interaction?: Interaction | null;\n entityId?: string | null;\n entity?: Entity | null;\n interactionWidgetSessionId?: string | null;\n teamId?: string | null;\n team?: Team | null;\n userId?: string | null;\n user?: User | null;\n userSessionId?: string | null;\n userSession?: UserSession | null;\n name: string;\n metadata?: string | null;\n customFields?: Array<string | null> | null;\n isAdministrator: boolean;\n joinedAt?: number | null;\n exitedAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type InteractionMessage = {\n id: string;\n externalId?: string | null;\n endpointId?: string | null;\n endpoint?: InteractionEndpoint | null;\n campaignId?: string | null;\n campaignFlowNodeId?: string | null;\n entityConversationId: string;\n entityConversation?: EntityConversation | null;\n interactionId: string;\n interaction?: Interaction | null;\n interactionAttendeeId?: string | null;\n interactionAttendee?: InteractionAttendee | null;\n referenceMessageId?: string | null;\n body?: string | null;\n metadata?: string | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n messageAttachments?: ListInteractionMessageAttachments | null;\n temp_isSending?: boolean | null;\n};\n\nexport type InteractionMessageAttachment = {\n id: string;\n externalId?: string | null;\n interactionId: string;\n interactionMessageId: string;\n name: string;\n size?: number | null;\n type?: string | null;\n file: S3Object;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type ListInteractionInvitees = {\n items: Array<InteractionInvitee | null>;\n nextToken?: string | null;\n};\n\nexport type ListInteractionAttendees = {\n items: Array<InteractionAttendee | null>;\n nextToken?: string | null;\n};\n\nexport type ListInteractionMessages = {\n items: Array<InteractionMessage | null>;\n nextToken?: string | null;\n};\n\nexport type ListInteractionMessageAttachments = {\n items: Array<InteractionMessageAttachment | null>;\n nextToken?: string | null;\n};\n\nexport type CreateInteractionInput = {\n id?: string | null;\n tenantId: string;\n widgetId: string;\n endpointId: string;\n entityConversationId?: string | null;\n entityId?: string | null;\n teamId?: string | null;\n hostId?: string | null;\n providerInteractionId?: string | null;\n channel: InteractionChannel;\n provider: InteractionProvider;\n context: InteractionContext;\n direction: InteractionDirection;\n status?: InteractionStatus | null;\n last_status?: InteractionStatus | null;\n metadata?: string | null;\n subject?: string | null;\n routeConfiguration?: InteractionRouteConfigurationInput | null;\n startedAt?: number | null;\n completedAt?: number | null;\n duration?: number | null;\n summary?: string | null;\n temp_isLocked?: boolean | null;\n temp_isAvailableTenantIdUnion?: string | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type UpdateInteractionInput = {\n id: string;\n tenantId?: string | null;\n widgetId?: string | null;\n endpointId?: string | null;\n entityConversationId?: string | null;\n entityId?: string | null;\n teamId?: string | null;\n hostId?: string | null;\n providerInteractionId?: string | null;\n channel?: InteractionChannel | null;\n provider?: InteractionProvider | null;\n context?: InteractionContext | null;\n direction?: InteractionDirection | null;\n status?: InteractionStatus | null;\n last_status?: InteractionStatus | null;\n metadata?: string | null;\n subject?: string | null;\n routeConfiguration?: InteractionRouteConfigurationInput | null;\n startedAt?: number | null;\n completedAt?: number | null;\n duration?: number | null;\n summary?: string | null;\n temp_isLocked?: boolean | null;\n temp_isAvailableTenantIdUnion?: string | null;\n createdAt?: number | null;\n updatedAt?: number | null;\n deletedAt?: number | null;\n};\n\nexport type CreateInteractionAttendeeInput = {\n id?: string | null;\n interactionId: string;\n entityId?: string | null;\n interactionWidgetSessionId?: string | null;\n teamId?: string | null;\n userId?: string | null;\n userSessionId?: string | null;\n name: string;\n metadata?: string | null;\n customFields?: Array<string | null> | null;\n isAdministrator: boolean;\n joinedAt?: number | null;\n exitedAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type CreateInteractionMessageInput = {\n id?: string | null;\n externalId?: string | null;\n endpointId?: string | null;\n campaignId?: string | null;\n campaignFlowNodeId?: string | null;\n entityConversationId: string;\n interactionId: string;\n interactionAttendeeId?: string | null;\n referenceMessageId?: string | null;\n body?: string | null;\n metadata?: string | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type CreateInteractionMessageAttachmentInput = {\n id?: string | null;\n externalId?: string | null;\n interactionId: string;\n interactionMessageId: string;\n name: string;\n size?: number | null;\n type?: string | null;\n file: S3ObjectInput;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type ModelInteractionConditionInput = {\n tenantId?: ModelIDInput | null;\n widgetId?: ModelIDInput | null;\n endpointId?: ModelIDInput | null;\n entityConversationId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n teamId?: ModelIDInput | null;\n hostId?: ModelIDInput | null;\n providerInteractionId?: ModelStringInput | null;\n channel?: ModelInteractionChannelInput | null;\n provider?: ModelInteractionProviderInput | null;\n context?: ModelInteractionContextInput | null;\n direction?: ModelInteractionDirectionInput | null;\n status?: ModelInteractionStatusInput | null;\n last_status?: ModelInteractionStatusInput | null;\n metadata?: ModelStringInput | null;\n subject?: ModelStringInput | null;\n startedAt?: ModelIntInput | null;\n completedAt?: ModelIntInput | null;\n duration?: ModelIntInput | null;\n summary?: ModelStringInput | null;\n temp_isLocked?: ModelBooleanInput | null;\n temp_isAvailableTenantIdUnion?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionConditionInput | null> | null;\n or?: Array<ModelInteractionConditionInput | null> | null;\n not?: ModelInteractionConditionInput | null;\n};\n\nexport type ModelInteractionInviteeFilterInput = {\n id?: ModelIDInput | null;\n interactionId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n teamId?: ModelIDInput | null;\n userId?: ModelIDInput | null;\n isAdministrator?: ModelBooleanInput | null;\n temp_expiringAt?: ModelIntInput | null;\n expiredAt?: ModelIntInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionInviteeFilterInput | null> | null;\n or?: Array<ModelInteractionInviteeFilterInput | null> | null;\n not?: ModelInteractionInviteeFilterInput | null;\n};\n\nexport type ModelInteractionAttendeeConditionInput = {\n interactionId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n interactionWidgetSessionId?: ModelIDInput | null;\n teamId?: ModelIDInput | null;\n userId?: ModelIDInput | null;\n userSessionId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n metadata?: ModelStringInput | null;\n customFields?: ModelStringInput | null;\n isAdministrator?: ModelBooleanInput | null;\n joinedAt?: ModelIntInput | null;\n exitedAt?: ModelIntInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionAttendeeConditionInput | null> | null;\n or?: Array<ModelInteractionAttendeeConditionInput | null> | null;\n not?: ModelInteractionAttendeeConditionInput | null;\n};\n\nexport type ModelInteractionAttendeeFilterInput = {\n id?: ModelIDInput | null;\n interactionId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n interactionWidgetSessionId?: ModelIDInput | null;\n teamId?: ModelIDInput | null;\n userId?: ModelIDInput | null;\n userSessionId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n metadata?: ModelStringInput | null;\n customFields?: ModelStringInput | null;\n isAdministrator?: ModelBooleanInput | null;\n joinedAt?: ModelIntInput | null;\n exitedAt?: ModelIntInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionAttendeeFilterInput | null> | null;\n or?: Array<ModelInteractionAttendeeFilterInput | null> | null;\n not?: ModelInteractionAttendeeFilterInput | null;\n};\n\nexport type ModelInteractionMessageConditionInput = {\n externalId?: ModelStringInput | null;\n endpointId?: ModelIDInput | null;\n campaignId?: ModelIDInput | null;\n campaignFlowNodeId?: ModelIDInput | null;\n entityConversationId?: ModelIDInput | null;\n interactionId?: ModelIDInput | null;\n interactionAttendeeId?: ModelIDInput | null;\n referenceMessageId?: ModelIDInput | null;\n body?: ModelStringInput | null;\n metadata?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionMessageConditionInput | null> | null;\n or?: Array<ModelInteractionMessageConditionInput | null> | null;\n not?: ModelInteractionMessageConditionInput | null;\n};\n\nexport type ModelInteractionMessageFilterInput = {\n id?: ModelIDInput | null;\n externalId?: ModelStringInput | null;\n endpointId?: ModelIDInput | null;\n campaignId?: ModelIDInput | null;\n campaignFlowNodeId?: ModelIDInput | null;\n entityConversationId?: ModelIDInput | null;\n interactionId?: ModelIDInput | null;\n interactionAttendeeId?: ModelIDInput | null;\n referenceMessageId?: ModelIDInput | null;\n body?: ModelStringInput | null;\n metadata?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionMessageFilterInput | null> | null;\n or?: Array<ModelInteractionMessageFilterInput | null> | null;\n not?: ModelInteractionMessageFilterInput | null;\n};\n\nexport type ModelInteractionMessageAttachmentConditionInput = {\n externalId?: ModelStringInput | null;\n interactionId?: ModelIDInput | null;\n interactionMessageId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n size?: ModelIntInput | null;\n type?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionMessageAttachmentConditionInput | null> | null;\n or?: Array<ModelInteractionMessageAttachmentConditionInput | null> | null;\n not?: ModelInteractionMessageAttachmentConditionInput | null;\n};\n\nexport type ModelInteractionMessageAttachmentFilterInput = {\n id?: ModelIDInput | null;\n externalId?: ModelStringInput | null;\n interactionId?: ModelIDInput | null;\n interactionMessageId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n size?: ModelIntInput | null;\n type?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionMessageAttachmentFilterInput | null> | null;\n or?: Array<ModelInteractionMessageAttachmentFilterInput | null> | null;\n not?: ModelInteractionMessageAttachmentFilterInput | null;\n};\n\nexport type ModelInteractionChannelInput = {\n eq?: InteractionChannel | null;\n ne?: InteractionChannel | null;\n};\n\nexport type ModelInteractionContextInput = {\n eq?: InteractionContext | null;\n ne?: InteractionContext | null;\n};\n\nexport type ModelInteractionDirectionInput = {\n eq?: InteractionDirection | null;\n ne?: InteractionDirection | null;\n};\n\nexport type ModelInteractionProviderInput = {\n eq?: InteractionProvider | null;\n ne?: InteractionProvider | null;\n};\n\nexport type ModelInteractionStatusInput = {\n eq?: InteractionStatus | null;\n ne?: InteractionStatus | null;\n};\n\nexport type InteractionRouteConfigurationInput = {\n teamId?: string | null;\n routingLogic?: InteractionRouteLogic | null;\n maxWaitTimeoutSeconds?: number | null;\n};\n\nexport type __SubscriptionContainer = {\n OnInteractionInviteeByUserId: InteractionInvitee;\n OnInteractionMessageByEntityConversationId: InteractionMessage;\n};\n\nconst FIELDS_INTERACTION = `\n id\n tenantId\n widgetId\n endpointId\n entityConversationId\n entityId\n teamId\n hostId\n providerInteractionId\n channel\n provider\n context\n direction\n status\n last_status\n metadata\n subject\n routeConfiguration {\n teamId\n routingLogic\n maxWaitTimeoutSeconds\n }\n startedAt\n completedAt\n duration\n summary\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_EXPANDED = `\n id\n tenantId\n widgetId\n widget {\n id\n tenantId\n channel\n provider\n providerAccountId\n name\n description\n configuration\n isRecordingEnabledByDefault\n isRecordingEnabledOnDemand\n isTranscriptionEnabledByDefault\n isTranscriptionEnabledOnDemand\n createdAt\n updatedAt\n deletedAt\n }\n endpointId\n endpoint {\n id\n externalId\n tenantId\n widgetId\n address\n configuration\n createdAt\n updatedAt\n deletedAt\n }\n entityConversationId\n entityConversation {\n id\n tenantId\n entityId\n entityAddress\n interactionChannel\n interactionProvider\n isCampaignEngaged\n campaignId\n lastCampaignFlowNodeId\n lastInteractionMessageId\n metadata\n lastActivityAt\n lastMessageAt\n archivedAt\n blockedAt\n createdAt\n updatedAt\n deletedAt\n }\n entityId\n entity {\n id\n externalId\n tenantId\n entityTypeId\n entityType {\n id\n externalId\n name\n description\n createdAt\n updatedAt\n deletedAt\n }\n parentId\n name\n image {\n key\n bucket\n location\n }\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n isOrganization\n notes\n customFields\n createdAt\n updatedAt\n blockedAt\n deletedAt\n }\n teamId\n team {\n id\n tenantId\n name\n description\n createdAt\n updatedAt\n deletedAt\n }\n hostId\n host {\n id\n interactionId\n entityId\n teamId\n userId\n createdAt\n updatedAt\n deletedAt\n }\n providerInteractionId\n channel\n provider\n context\n direction\n status\n last_status\n metadata\n subject\n routeConfiguration {\n teamId\n routingLogic\n maxWaitTimeoutSeconds\n }\n startedAt\n completedAt\n duration\n summary\n temp_isLocked\n temp_isAvailableTenantIdUnion\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_ATTENDEE = `\n id\n interactionId\n entityId\n interactionWidgetSessionId\n teamId\n userId\n userSessionId\n name\n metadata\n customFields\n isAdministrator\n joinedAt\n exitedAt\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_ATTENDEE_EXPANDED = `\n id\n interactionId\n entityId\n entity {\n id\n externalId\n tenantId\n entityTypeId\n entityType {\n id\n externalId\n name\n description\n createdAt\n updatedAt\n deletedAt\n }\n parentId\n name\n image {\n key\n bucket\n location\n }\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n isOrganization\n notes\n customFields\n createdAt\n updatedAt\n blockedAt\n deletedAt\n }\n interactionWidgetSessionId\n teamId\n team {\n id\n tenantId\n name\n description\n image {\n key\n bucket\n location\n }\n createdAt\n updatedAt\n deletedAt\n ticketFields\n }\n userId\n user {\n id\n externalId\n tenantId\n name\n image {\n key\n bucket\n location\n }\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n type\n preferences {\n timezoneName\n language {\n code\n nameEn\n nameLocal\n }\n }\n notificationSettings {\n allowPush\n allowEmail\n allowSMS\n allowWhatsApp\n }\n activatedAt\n blockedAt\n createdAt\n updatedAt\n deletedAt\n }\n userSessionId\n name\n metadata\n customFields\n isAdministrator\n joinedAt\n exitedAt\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_INVITEE = `\n id\n interactionId\n interaction {\n ${FIELDS_INTERACTION}\n }\n entityId\n entity {\n id\n externalId\n tenantId\n entityTypeId\n entityType {\n id\n externalId\n name\n description\n createdAt\n updatedAt\n deletedAt\n }\n parentId\n name\n image {\n key\n bucket\n location\n }\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n isOrganization\n notes\n customFields\n createdAt\n updatedAt\n blockedAt\n deletedAt\n }\n teamId\n userId\n isAdministrator\n temp_expiringAt\n expiredAt\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_MESSAGE_ATTACHMENT = `\n id\n externalId\n interactionId\n interactionMessageId\n name\n size\n type\n file {\n key\n bucket\n location\n }\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_MESSAGE = `\n id\n externalId\n endpointId\n endpoint {\n id\n externalId\n tenantId\n widgetId\n address\n configuration\n createdAt\n updatedAt\n deletedAt\n }\n campaignId\n campaignFlowNodeId\n entityConversationId\n interactionId\n interactionAttendeeId\n interactionAttendee {\n id\n interactionId\n entityId\n interactionWidgetSessionId\n teamId\n userId\n userSessionId\n name\n metadata\n customFields\n isAdministrator\n joinedAt\n exitedAt\n createdAt\n updatedAt\n deletedAt\n }\n body\n metadata\n referenceMessageId\n createdAt\n updatedAt\n deletedAt\n messageAttachments {\n items {\n ${FIELDS_INTERACTION_MESSAGE_ATTACHMENT}\n }\n nextToken\n }\n`;\n\nconst FIELDS_INTERACTION_MESSAGE_MINIMAL = `\n id\n externalId\n endpointId\n campaignId\n campaignFlowNodeId\n entityConversationId\n interactionId\n interactionAttendeeId\n body\n metadata\n referenceMessageId\n createdAt\n updatedAt\n deletedAt\n messageAttachments {\n items {\n ${FIELDS_INTERACTION_MESSAGE_ATTACHMENT}\n }\n nextToken\n }\n`;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class InteractionService {\n public newInteractionInviteObservable$: BehaviorSubject<any> = new BehaviorSubject<any>(undefined);\n\n constructor(private readonly graphqlService: AppSyncGraphqlService) {}\n\n async GetInteraction(id: string): Promise<Interaction> {\n const statement = `query GetInteraction($id: ID!) {\n getInteraction(id: $id) {\n ${FIELDS_INTERACTION_EXPANDED}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { id };\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <Interaction>response.data.getInteraction;\n }\n\n async GetInteractionAttendee(id: string): Promise<InteractionAttendee> {\n const statement = `query GetInteractionAttendee($id: ID!) {\n getInteractionAttendee(id: $id) {\n ${FIELDS_INTERACTION_ATTENDEE}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { id };\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionAttendee>response.data.getInteractionAttendee;\n }\n\n async GetInteractionMessage(id: string): Promise<InteractionMessage> {\n const statement = `query GetInteractionMessage($id: ID!) {\n getInteractionMessage(id: $id) {\n ${FIELDS_INTERACTION_MESSAGE}\n }\n }`;\n const gqlAPIServiceArguments: any = {\n id,\n };\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionMessage>response.data.getInteractionMessage;\n }\n\n async CreateInteraction(input: CreateInteractionInput, condition?: ModelInteractionConditionInput): Promise<Interaction> {\n const statement = `mutation CreateInteraction($input: CreateInteractionInput!, $condition: ModelInteractionConditionInput) {\n createInteraction(input: $input, condition: $condition) {\n ${FIELDS_INTERACTION}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <Interaction>response.data.createInteraction;\n }\n\n async UpdateInteraction(input: UpdateInteractionInput, condition?: ModelInteractionConditionInput): Promise<Interaction> {\n const statement = `mutation UpdateInteraction($input: UpdateInteractionInput!, $condition: ModelInteractionConditionInput) {\n updateInteraction(input: $input, condition: $condition) {\n ${FIELDS_INTERACTION}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <Interaction>response.data.updateInteraction;\n }\n\n async CreateInteractionAttendee(input: CreateInteractionAttendeeInput, condition?: ModelInteractionAttendeeConditionInput): Promise<InteractionAttendee> {\n const statement = `mutation CreateInteractionAttendee($input: CreateInteractionAttendeeInput!, $condition: ModelInteractionAttendeeConditionInput) {\n createInteractionAttendee(input: $input, condition: $condition) {\n ${FIELDS_INTERACTION_ATTENDEE}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionAttendee>response.data.createInteractionAttendee;\n }\n\n async CreateInteractionMessage(input: CreateInteractionMessageInput, condition?: ModelInteractionMessageConditionInput): Promise<InteractionMessage> {\n const statement = `mutation CreateInteractionMessage($input: CreateInteractionMessageInput!, $condition: ModelInteractionMessageConditionInput) {\n createInteractionMessage(input: $input, condition: $condition) {\n ${FIELDS_INTERACTION_MESSAGE_MINIMAL}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionMessage>response.data.createInteractionMessage;\n }\n\n async CreateInteractionMessageAttachment(input: CreateInteractionMessageAttachmentInput, condition?: ModelInteractionMessageAttachmentConditionInput): Promise<InteractionMessageAttachment> {\n const statement = `mutation CreateInteractionMessageAttachment($input: CreateInteractionMessageAttachmentInput!, $condition: ModelInteractionMessageAttachmentConditionInput) {\n createInteractionMessageAttachment(input: $input, condition: $condition) {\n ${FIELDS_INTERACTION_MESSAGE_ATTACHMENT}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionMessageAttachment>response.data.createInteractionMessageAttachment;\n }\n\n async ListInteractionInviteesByUserId(userId: string, createdAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionInviteeFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionInvitees> {\n const statement = `query ListInteractionInviteesByUserId($userId: ID!, $createdAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionInviteeFilterInput, $limit: Int, $nextToken: String) {\n listInteractionInviteesByUserId(\n userId: $userId\n createdAt: $createdAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_INVITEE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { userId };\n if (createdAt) {\n gqlAPIServiceArguments.createdAt = createdAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionInvitees>response.data.listInteractionInviteesByUserId;\n }\n\n async ListInteractionAttendeesByInteractionIdAndEntityId(interactionId: string, entityId?: ModelIDKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionAttendeeFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionAttendees> {\n const statement = `query ListInteractionAttendeesByInteractionIdAndEntityId($interactionId: ID!, $entityId: ModelIDKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionAttendeeFilterInput, $limit: Int, $nextToken: String) {\n listInteractionAttendeesByInteractionIdAndEntityId(\n interactionId: $interactionId\n entityId: $entityId\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_ATTENDEE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { interactionId };\n if (entityId) {\n gqlAPIServiceArguments.entityId = entityId;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionAttendees>response.data.listInteractionAttendeesByInteractionIdAndEntityId;\n }\n\n async ListInteractionAttendeesByInteractionIdAndUserId(interactionId: string, userId?: ModelIDKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionAttendeeFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionAttendees> {\n const statement = `query ListInteractionAttendeesByInteractionIdAndUserId($interactionId: ID!, $userId: ModelIDKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionAttendeeFilterInput, $limit: Int, $nextToken: String) {\n listInteractionAttendeesByInteractionIdAndUserId(\n interactionId: $interactionId\n userId: $userId\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_ATTENDEE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { interactionId };\n if (userId) {\n gqlAPIServiceArguments.userId = userId;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionAttendees>response.data.listInteractionAttendeesByInteractionIdAndUserId;\n }\n\n async ListInteractionMessagesByEntityConversationId(entityConversationId: string, createdAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionMessageFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionMessages> {\n const statement = `query ListInteractionMessagesByEntityConversationId($entityConversationId: ID!, $createdAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionMessageFilterInput, $limit: Int, $nextToken: String) {\n listInteractionMessagesByEntityConversationId(\n entityConversationId: $entityConversationId\n createdAt: $createdAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_MESSAGE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { entityConversationId };\n if (createdAt) {\n gqlAPIServiceArguments.createdAt = createdAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionMessages>response.data.listInteractionMessagesByEntityConversationId;\n }\n\n async ListInteractionMessagesByExternalMessageId(externalMessageId: string, createdAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionMessageFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionMessages> {\n const statement = `query ListInteractionMessagesByExternalMessageId($externalMessageId: ID!, $createdAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionMessageFilterInput, $limit: Int, $nextToken: String) {\n listInteractionMessagesByExternalMessageId(\n externalMessageId: $externalMessageId\n createdAt: $createdAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_MESSAGE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { externalMessageId };\n if (createdAt) {\n gqlAPIServiceArguments.createdAt = createdAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionMessages>response.data.listInteractionMessagesByExternalMessageId;\n }\n\n async ListInteractionMessagesByInteractionAttendeeId(interactionAttendeeId: string, createdAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionMessageFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionMessages> {\n const statement = `query ListInteractionMessagesByInteractionAttendeeId($interactionAttendeeId: ID!, $createdAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionMessageFilterInput, $limit: Int, $nextToken: String) {\n listInteractionMessagesByInteractionAttendeeId(\n interactionAttendeeId: $interactionAttendeeId\n createdAt: $createdAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_MESSAGE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { interactionAttendeeId };\n if (createdAt) {\n gqlAPIServiceArguments.createdAt = createdAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionMessages>response.data.listInteractionMessagesByInteractionAttendeeId;\n }\n\n async ListInteractionMessageAttachmentsByInteractionMessageId(\n interactionMessageId: string,\n createdAt?: ModelIntKeyConditionInput,\n sortDirection?: ModelSortDirection,\n filter?: ModelInteractionMessageAttachmentFilterInput,\n limit?: number,\n nextToken?: string\n ): Promise<ListInteractionMessageAttachments> {\n const statement = `query ListInteractionMessageAttachmentsByInteractionMessageId($interactionMessageId: ID!, $createdAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionMessageAttachmentFilterInput, $limit: Int, $nextToken: String) {\n listInteractionMessageAttachmentsByInteractionMessageId(\n interactionMessageId: $interactionMessageId\n createdAt: $createdAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_MESSAGE_ATTACHMENT}\n }\n nextToken\n }\n }`;\n const gqlAPIServiceArguments: any = {\n interactionMessageId,\n };\n if (createdAt) {\n gqlAPIServiceArguments.createdAt = createdAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionMessageAttachments>response.data.listInteractionMessageAttachmentsByInteractionMessageId;\n }\n\n OnInteractionInviteeByUserIdListener(userId: string): Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnInteractionInviteeByUserId'>>> {\n const statement = `subscription OnInteractionInviteeByUserId($userId: ID!) {\n OnInteractionInviteeByUserId(userId: $userId) {\n ${FIELDS_INTERACTION_INVITEE}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { userId };\n return this.graphqlService.subscribe<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnInteractionInviteeByUserId'>>>(statement, gqlAPIServiceArguments) as any;\n /* as Observable<SubscriptionResponse<Pick<__SubscriptionContainer, \"OnInteractionInviteeByUserId\">>>; */\n }\n\n OnInteractionMessageByEntityConversationIdListener(entityConversationId: string): Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnInteractionMessageByEntityConversationId'>>> {\n const statement = `subscription OnInteractionMessageByEntityConversationId($entityConversationId: ID!) {\n OnInteractionMessageByEntityConversationId(\n entityConversationId: $entityConversationId\n ) {\n ${FIELDS_INTERACTION_MESSAGE}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { entityConversationId };\n return this.graphqlService.subscribe<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnInteractionMessageByEntityConversationId'>>>(statement, gqlAPIServiceArguments) as any;\n /* as Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnInteractionMessageByEntityConversationId'>>>; */\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { ModelBooleanInput, ModelIDInput, ModelIntInput, ModelSortDirection, ModelStringInput, ModelStringKeyConditionInput } from '../graphql/common.model';\nimport { InteractionChannel, InteractionProvider, InteractionRouteConfiguration, InteractionRouteConfigurationInput, ModelInteractionChannelInput, ModelInteractionProviderInput } from './interaction.service';\nimport { Tenant } from './tenant.service';\n\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\n\nexport type InteractionWidget = {\n id: string;\n tenantId: string;\n tenant?: Tenant | null;\n channel: InteractionChannel;\n provider: InteractionProvider;\n providerAccountId?: string | null;\n name: string;\n description?: string | null;\n configuration?: string | null;\n isRecordingEnabledByDefault: boolean;\n isRecordingEnabledOnDemand: boolean;\n isTranscriptionEnabledByDefault: boolean;\n isTranscriptionEnabledOnDemand: boolean;\n routeConfiguration?: InteractionRouteConfiguration | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type ListInteractionWidgets = {\n items: Array<InteractionWidget | null>;\n nextToken?: string | null;\n};\n\nexport type ModelInteractionWidgetConditionInput = {\n tenantId?: ModelIDInput | null;\n channel?: ModelInteractionChannelInput | null;\n provider?: ModelInteractionProviderInput | null;\n providerAccountId?: ModelStringInput | null;\n name?: ModelStringInput | null;\n description?: ModelStringInput | null;\n configuration?: ModelStringInput | null;\n isRecordingEnabledByDefault?: ModelBooleanInput | null;\n isRecordingEnabledOnDemand?: ModelBooleanInput | null;\n isTranscriptionEnabledByDefault?: ModelBooleanInput | null;\n isTranscriptionEnabledOnDemand?: ModelBooleanInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n updatedByUserId?: ModelIDInput | null;\n updatedByUserSessionId?: ModelIDInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionWidgetConditionInput | null> | null;\n or?: Array<ModelInteractionWidgetConditionInput | null> | null;\n not?: ModelInteractionWidgetConditionInput | null;\n};\n\nexport type ModelInteractionWidgetFilterInput = {\n id?: ModelIDInput | null;\n tenantId?: ModelIDInput | null;\n channel?: ModelInteractionChannelInput | null;\n provider?: ModelInteractionProviderInput | null;\n providerAccountId?: ModelStringInput | null;\n name?: ModelStringInput | null;\n description?: ModelStringInput | null;\n configuration?: ModelStringInput | null;\n isRecordingEnabledByDefault?: ModelBooleanInput | null;\n isRecordingEnabledOnDemand?: ModelBooleanInput | null;\n isTranscriptionEnabledByDefault?: ModelBooleanInput | null;\n isTranscriptionEnabledOnDemand?: ModelBooleanInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n updatedByUserId?: ModelIDInput | null;\n updatedByUserSessionId?: ModelIDInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionWidgetFilterInput | null> | null;\n or?: Array<ModelInteractionWidgetFilterInput | null> | null;\n not?: ModelInteractionWidgetFilterInput | null;\n};\n\nexport const FIELDS_INTERACTION_WIDGET = `\n id\n tenantId\n channel\n provider\n providerAccountId\n name\n description\n configuration\n isRecordingEnabledByDefault\n isRecordingEnabledOnDemand\n isTranscriptionEnabledByDefault\n isTranscriptionEnabledOnDemand\n routeConfiguration {\n teamId\n routingLogic\n maxWaitTimeoutSeconds\n }\n createdAt\n updatedAt\n deletedAt\n`;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class InteractionWidgetService {\n constructor(private readonly graphqlService: AppSyncGraphqlService) {}\n\n async GetInteractionWidget(id: string): Promise<InteractionWidget> {\n const statement = `query GetInteractionWidget($id: ID!) {\n getInteractionWidget(id: $id) {\n ${FIELDS_INTERACTION_WIDGET}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { id };\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionWidget>response.data.getInteractionWidget;\n }\n\n async ListInteractionWidgetsByTenantId(tenantId: string, name?: ModelStringKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionWidgetFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionWidgets> {\n const statement = `query ListInteractionWidgetsByTenantId($tenantId: ID!, $name: ModelStringKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionWidgetFilterInput, $limit: Int, $nextToken: String) {\n listInteractionWidgetsByTenantId(\n tenantId: $tenantId\n name: $name\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_WIDGET}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { tenantId };\n if (name) {\n gqlAPIServiceArguments.name = name;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionWidgets>response.data.listInteractionWidgetsByTenantId;\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { ModelSortDirection } from '../graphql/common.model';\nimport { InteractionProvider } from './interaction.service';\nimport { InteractionWidgetService } from './interaction-widget.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WhatsAppAccountService {\n constructor(private interactionWidgetService: InteractionWidgetService) {}\n\n async getWhatsAppAccountByTenantId(tenantId: string): Promise<any> {\n let myWhatsAppAccounts: any[] = [];\n let nextToken_listWhatsAppAccounts!: string | undefined;\n\n do {\n const res_listWhatsAppAccounts = await this.interactionWidgetService.ListInteractionWidgetsByTenantId(\n tenantId,\n undefined,\n ModelSortDirection.ASC,\n {\n and: [{ provider: { eq: InteractionProvider.WHATSAPP } }, { deletedAt: { attributeExists: false } }],\n },\n undefined,\n nextToken_listWhatsAppAccounts\n );\n nextToken_listWhatsAppAccounts = res_listWhatsAppAccounts.nextToken || undefined;\n myWhatsAppAccounts = [...myWhatsAppAccounts, ...res_listWhatsAppAccounts.items];\n } while (nextToken_listWhatsAppAccounts);\n\n /* if (myWhatsAppAccounts.length === 0) {\n throw new Error('No WhatsApp account found');\n } else */ if (myWhatsAppAccounts.length > 1) {\n throw new Error('Multiple WhatsApp accounts found');\n }\n\n return myWhatsAppAccounts?.[0];\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\nimport { CleanDeep } from '@snugdesk/core';\nimport { WhatsAppConfig } from '../../app.config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WhatsAppHelperService {\n constructor(private httpClient: HttpClient) {}\n\n private getHeaderMediaType(template: any): 'image' | 'video' | 'document' | null {\n const header = template.components?.find((c: any) => c.type === 'HEADER');\n switch (header?.format) {\n case 'IMAGE':\n return 'image';\n case 'VIDEO':\n return 'video';\n case 'DOCUMENT':\n return 'document';\n default:\n return null;\n }\n }\n\n async listPhoneNumbers(businessAccountId: string, accessToken: string): Promise<any[]> {\n const phoneNumbers: any[] = [];\n\n const fields =\n 'id,account_mode,certificate,code_verification_status,conversational_automation,' +\n 'display_phone_number,eligibility_for_api_business_global_search,health_status,is_official_business_account,' +\n 'is_on_biz_app,is_pin_enabled,is_preverified_number,last_onboarded_time,messaging_limit_tier,' +\n 'name_status,new_certificate,new_name_status,platform_type,quality_rating,' +\n 'quality_score{date,reasons,score},search_visibility,status,throughput,verified_name';\n\n let nextUrl: string | null = `${WhatsAppConfig.endpoint}/${businessAccountId}/phone_numbers?fields=${fields}`;\n\n while (nextUrl) {\n const response: any = await lastValueFrom(\n this.httpClient.get(nextUrl, {\n headers: new HttpHeaders({\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n }),\n })\n );\n\n const data = response?.data;\n if (Array.isArray(data)) {\n phoneNumbers.push(...data);\n }\n\n // Pagination\n nextUrl = response?.paging?.next ?? null;\n }\n\n return phoneNumbers;\n }\n\n async listMessageTemplates(businessAccountId: string, accessToken: string) {\n const baseUrl = `${WhatsAppConfig.endpoint}/${businessAccountId}/message_templates`;\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n });\n\n const templates: any[] = [];\n\n let nextUrl: string | null = baseUrl;\n while (nextUrl) {\n const response: any = await lastValueFrom(this.httpClient.get(nextUrl, { headers }));\n\n const pageData = response?.data ?? [];\n templates.push(...pageData);\n\n nextUrl = response?.paging?.next || null;\n }\n\n return templates;\n }\n\n async sendWhatsAppTemplateMessage(accessToken: string, phoneNumberId: string, receiverNumber: string, template: any, values: any[] = [], referenceMessageId?: string) {\n const components: any[] = [];\n\n for (const value of values) {\n switch (value.type) {\n case 'body':\n if (value.parameters?.length) {\n components.push({\n type: 'body',\n parameters: value.parameters,\n });\n }\n break;\n\n case 'header_media':\n if (value.mediaUrl) {\n const mediaType = this.getHeaderMediaType(template);\n if (mediaType) {\n components.push({\n type: 'header',\n parameters: [\n {\n type: mediaType,\n [mediaType]: { link: value.mediaUrl },\n },\n ],\n });\n }\n }\n break;\n\n case 'coupon_code':\n if (value.couponCode) {\n components.push({\n type: 'button',\n sub_type: 'COPY_CODE',\n index: 0,\n parameters: [\n {\n type: 'text',\n text: value.couponCode,\n },\n ],\n });\n }\n break;\n\n case 'location':\n if (value.location) {\n components.push({\n type: 'header',\n parameters: [\n {\n type: 'location',\n location: value.location,\n },\n ],\n });\n }\n break;\n }\n }\n\n const params_sendWATemplatedMessage: any = {\n messaging_product: 'whatsapp',\n to: receiverNumber,\n type: 'template',\n template: {\n name: template.name,\n language: { code: template.language, policy: 'deterministic' },\n components: components ?? [],\n },\n };\n\n if (referenceMessageId?.length > 0) {\n params_sendWATemplatedMessage.context = { message_id: referenceMessageId };\n }\n // console.debug('params_sendWATemplatedMessage: ', params_sendWATemplatedMessage);\n\n const res_sendWATemplatedMessage = await lastValueFrom(\n this.httpClient.post(`${WhatsAppConfig.endpoint}/${phoneNumberId}/messages`, params_sendWATemplatedMessage, {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n }),\n })\n );\n // console.debug('res_sendWATemplatedMessage: ', res_sendWATemplatedMessage);\n return res_sendWATemplatedMessage;\n }\n\n async sendWhatsAppMessage(accessToken: string, phoneNumberId: string, receiverNumber: string, body: any, referenceMessageId?: string) {\n const params_sendWAMessage: any = {\n messaging_product: 'whatsapp',\n to: receiverNumber,\n };\n\n // Add reference message (reply feature)\n if (referenceMessageId) {\n params_sendWAMessage.context = { message_id: referenceMessageId };\n }\n\n if (body.media) {\n const media = body.media;\n const type = media.type?.toLowerCase();\n\n if (type?.startsWith('image')) {\n params_sendWAMessage.type = 'image';\n params_sendWAMessage.image = {\n link: media.mediaUrl,\n caption: media.caption,\n };\n } else if (type?.startsWith('video')) {\n params_sendWAMessage.type = 'video';\n params_sendWAMessage.video = {\n link: media.mediaUrl,\n caption: media.caption,\n };\n } else if (type?.startsWith('audio')) {\n params_sendWAMessage.type = 'audio';\n params_sendWAMessage.audio = {\n link: media.mediaUrl,\n };\n } else if (type?.startsWith('application') || type?.startsWith('document') || type?.startsWith('text')) {\n params_sendWAMessage.type = 'document';\n params_sendWAMessage.document = {\n link: media.mediaUrl,\n filename: media.fileName,\n caption: media.caption,\n };\n } else {\n // Default any unknown file type to document to avoid falling back to plain text\n params_sendWAMessage.type = 'document';\n params_sendWAMessage.document = {\n link: media.mediaUrl,\n filename: media.fileName,\n caption: media.caption,\n };\n }\n } else if (body.latitude !== undefined && body.longitude !== undefined) {\n params_sendWAMessage.type = 'location';\n params_sendWAMessage.location = {\n latitude: body.latitude,\n longitude: body.longitude,\n name: body.name,\n address: body.address,\n };\n } else if (body.text?.trim()) {\n params_sendWAMessage.type = 'text';\n params_sendWAMessage.text = {\n preview_url: true,\n body: body.text,\n };\n }\n // console.debug('params_sendWAMessage: ', params_sendWAMessage);\n\n const res_sendWAMessage = await lastValueFrom(\n this.httpClient.post(`${WhatsAppConfig.endpoint}/${phoneNumberId}/messages`, CleanDeep.clean(params_sendWAMessage), {\n headers: new HttpHeaders({\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n }),\n })\n );\n // console.debug('res_sendWAMessage: ', res_sendWAMessage);\n\n return res_sendWAMessage;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Pipe({\n name: 'WhatsAppTextFormatter',\n standalone: false,\n})\nexport class WhatsAppTextFormatterPipe implements PipeTransform {\n constructor(private sanitizer: DomSanitizer) {}\n\n transform(value: string): SafeHtml {\n if (!value) {\n return value;\n }\n\n // Helpers to escape content for HTML and attributes\n const escapeHtml = (str: string) =>\n str.replace(/[&<>\"']/g, (s) => {\n switch (s) {\n case '&':\n return '&';\n case '<':\n return '<';\n case '>':\n return '>';\n case '\"':\n return '"';\n case \"'\":\n return ''';\n default:\n return s;\n }\n });\n\n const escapeAttr = (str: string) =>\n str.replace(/[\"&<>]/g, (s) => {\n switch (s) {\n case '&':\n return '&';\n case '<':\n return '<';\n case '>':\n return '>';\n case '\"':\n return '"';\n default:\n return s;\n }\n });\n\n // Regexes\n const codeBlockSplitter = /(```[\\s\\S]*?```)/g; // preserves triple-backtick blocks\n const urlRegex = /(https?:\\/\\/[^\\s`<]+)|(www\\.[^\\s`<]+)/gi;\n\n // Process a non-code segment: split by URLs and apply formatting only to non-URL pieces\n function processNonCodeSegment(segment: string): string {\n let out = '';\n let lastIndex = 0;\n urlRegex.lastIndex = 0;\n let m: RegExpExecArray | null;\n\n while ((m = urlRegex.exec(segment)) !== null) {\n const match = m[0];\n const start = m.index;\n const end = urlRegex.lastIndex;\n\n // 1) Handle text before URL: escape, then apply formatting\n if (start > lastIndex) {\n const beforeText = segment.slice(lastIndex, start);\n out += applyFormattingToEscapedText(beforeText);\n }\n\n // 2) Handle URL: trim trailing punctuation (common punctuation that likely isn't part of URL)\n const trimmed = match.replace(/([,!?;:)\\]\\}]+)$/g, '');\n const trailing = match.slice(trimmed.length);\n\n const href = /^www\\./i.test(trimmed) ? `http://${trimmed}` : trimmed;\n\n const safeHref = escapeAttr(href);\n const safeDisplay = escapeHtml(trimmed);\n\n out += `<a href=\"${safeHref}\" target=\"_blank\" rel=\"noopener noreferrer\">${safeDisplay}</a>${escapeHtml(trailing)}`;\n\n lastIndex = end;\n }\n\n // Remaining text after last URL\n if (lastIndex < segment.length) {\n const tail = segment.slice(lastIndex);\n out += applyFormattingToEscapedText(tail);\n }\n\n return out;\n }\n\n // Escape text first, then run formatting replacements on escaped text so tags are safe to insert\n function applyFormattingToEscapedText(raw: string): string {\n const escaped = escapeHtml(raw);\n\n // Apply non-greedy replacements; don't affect inside already-existing HTML tags\n // Bold: *text*\n let formatted = escaped.replace(/\\*(.*?)\\*/g, '<b>$1</b>');\n\n // Italic: _text_\n formatted = formatted.replace(/_(.*?)_/g, '<i>$1</i>');\n\n // Strikethrough: ~text~\n formatted = formatted.replace(/~(.*?)~/g, '<s>$1</s>');\n\n return formatted;\n }\n\n // 1) Split by code blocks so that code blocks are preserved verbatim (escaped)\n const topParts = value.split(codeBlockSplitter);\n\n // 2) Process each top-level part: code blocks vs others\n const processed = topParts\n .map((part) => {\n if (/^```[\\s\\S]*```$/.test(part)) {\n // strip backticks, escape inner, then wrap in <code>\n const inner = part.replace(/^```/, '').replace(/```$/, '');\n return `<code>${escapeHtml(inner)}</code>`;\n } else {\n // Non-code: process for URLs and formatting (formatting will NOT be applied to the URL parts)\n return processNonCodeSegment(part);\n }\n })\n .join('');\n\n // 3) Final: return safe HTML\n return this.sanitizer.bypassSecurityTrustHtml(processed);\n }\n}\n","import { ChangeDetectorRef, Component, EventEmitter, Input, NgZone, OnChanges, OnDestroy, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { SnugdeskAuthenticationService, CleanDeep } from '@snugdesk/core';\n\nimport { ModelSortDirection } from '../../graphql/common.model';\nimport { Entity, EntityService } from '../../services/entity.service';\nimport { EntityConversation, EntityConversationService } from '../../services/entity-conversation.service';\nimport { InteractionChannel, InteractionProvider } from '../../services/interaction.service';\n\nimport moment from 'moment-timezone';\nimport { v4 as uuidv4 } from 'uuid';\n\n@Component({\n selector: 'lib-whatsapp-conversations',\n templateUrl: './whatsapp-conversations.component.html',\n styleUrls: ['./whatsapp-conversations.component.css'],\n standalone: false,\n})\nexport class WhatsAppConversationsComponent implements OnInit, OnChanges, OnDestroy {\n @Input('selectedConversation')\n selectedConversation!: any;\n\n @Input('containerDimensions')\n containerDimensions!: { width: number; height: number };\n\n @Output('selectConversation')\n selectConversationEv: EventEmitter<EntityConversation> = new EventEmitter<EntityConversation>();\n\n conversations: EntityConversation[] = [];\n nextToken_conversations!: string | undefined;\n endOfList: boolean = false;\n entityConversationsSubscription!: any;\n\n showInitLoader: boolean = true;\n showRefreshLoader: boolean = false;\n showEntityConversationScrollLoader: boolean = false;\n showArchivedConversations: boolean = false;\n\n searchQuery: string = '';\n filteredConversations: EntityConversation[] = [];\n\n showNewConversation: boolean = false;\n\n reConfiguringEntityId!: string | undefined;\n reConfiguringConversationId!: string | undefined;\n\n /* showMarkConversationAsArchivedLoader: boolean = false;\n showMarkConversationAsUnarchivedLoader: boolean = false;\n showMarkConversationAsBlockedLoader: boolean = false;\n showMarkConversationAsUnblockedLoader: boolean = false;\n showMarkEntityAsBlockedLoader: boolean = false;\n showMarkEntityAsUnblockedLoader: boolean = false; */\n\n constructor(private cdr: ChangeDetectorRef, private zone: NgZone, private authenticationService: SnugdeskAuthenticationService, private entityService: EntityService, private entityConversationService: EntityConversationService, private snackBar: MatSnackBar) {}\n\n async ngOnInit(): Promise<void> {\n this.showInitLoader = true;\n try {\n // load the first page\n this.conversations = await this.listRecentEntityConversationsByTenantId();\n\n // load all other pages\n while (!this.endOfList) {\n await this.onScrollEntityConversationList();\n }\n\n // console.debug('conversations: ', this.conversations);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch conversations`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.subscribeToEntityConversations();\n this.showInitLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['containerDimensions']) {\n this.cdr.detectChanges();\n }\n\n if (changes['selectedConversation']) {\n const selectedConversation = changes['selectedConversation'].currentValue;\n const selectedConversationMessage = selectedConversation?.messages?.items?.[0];\n\n if (!selectedConversation || !selectedConversationMessage) return;\n\n const existingIndex = this.conversations.findIndex((conv) => conv.id === selectedConversation.id);\n if (existingIndex === -1) {\n this.conversations.unshift(selectedConversation);\n return;\n }\n\n const existingConversationMessage = this.conversations[existingIndex]?.messages?.items?.[0];\n if (!existingConversationMessage || existingConversationMessage.id !== selectedConversationMessage.id) {\n this.conversations.splice(existingIndex, 1);\n this.conversations.unshift(this.selectedConversation);\n return;\n }\n }\n }\n\n ngOnDestroy(): void {\n this.entityConversationsSubscription?.unsubscribe();\n }\n\n async listRecentEntityConversationsByTenantId(): Promise<EntityConversation[]> {\n if (this.endOfList) return [];\n\n const res_listEntityConversationsByTenantId = await this.entityConversationService.ListEntityConversationsByTenantIdAndLastMessageAt(\n this.authenticationService.getTenantId(),\n undefined,\n ModelSortDirection.DESC,\n {\n and: [\n {\n deletedAt: { attributeExists: false },\n },\n {\n archivedAt: { attributeExists: false },\n },\n /* {\n interactionChannel: { eq: InteractionChannel.SOCIAL_CHAT },\n }, */\n {\n interactionProvider: { eq: InteractionProvider.WHATSAPP },\n },\n ],\n },\n undefined,\n this.nextToken_conversations\n );\n // console.debug('res_listEntityConversationsByTenantId: ', res_listEntityConversationsByTenantId);\n\n this.endOfList = !res_listEntityConversationsByTenantId.nextToken;\n this.nextToken_conversations = res_listEntityConversationsByTenantId.nextToken || undefined;\n\n return res_listEntityConversationsByTenantId.items || [];\n }\n\n async listArchivedEntityConversationsByTenantId(): Promise<EntityConversation[]> {\n if (this.endOfList) return [];\n\n const res_listEntityConversationsByTenantId = await this.entityConversationService.ListEntityConversationsByTenantIdAndArchivedAt(\n this.authenticationService.getTenantId(),\n undefined,\n ModelSortDirection.DESC,\n {\n and: [\n {\n deletedAt: { attributeExists: false },\n },\n /* {\n interactionChannel: { eq: InteractionChannel.SOCIAL_CHAT },\n }, */\n {\n interactionProvider: { eq: InteractionProvider.WHATSAPP },\n },\n ],\n },\n undefined,\n this.nextToken_conversations\n );\n\n // console.debug('res_listEntityConversationsByTenantId: ', res_listEntityConversationsByTenantId);\n\n this.endOfList = !res_listEntityConversationsByTenantId.nextToken;\n this.nextToken_conversations = res_listEntityConversationsByTenantId.nextToken || undefined;\n\n return res_listEntityConversationsByTenantId.items || [];\n }\n\n filterConversations(): void {\n if (!this.searchQuery || this.searchQuery.trim().length === 0) {\n this.filteredConversations = this.conversations;\n return;\n }\n\n // prettier-ignore\n const cleanedSearchQuery = this.searchQuery.replace(/[\\s+\\(\\)\\[\\]\\{\\}]/g, '');\n const isSearchingByPhoneNumber = /^\\d+$/.test(cleanedSearchQuery);\n this.filteredConversations = this.conversations?.filter((conv: any) => {\n if (isSearchingByPhoneNumber && conv.entityAddress) {\n const countryCode = conv.entityAddress.split(' ')[0] || '';\n const cleanedEntityAddress = conv.entityAddress.substring(countryCode.length).replace(/[\\s+\\(\\)\\[\\]\\{\\}]/g, '');\n return cleanedEntityAddress.includes(cleanedSearchQuery);\n } else {\n return conv.entity?.name?.toLowerCase().includes(this.searchQuery.trim().toLowerCase());\n }\n });\n\n if (!this.filteredConversations) {\n this.filteredConversations = [];\n }\n }\n\n async refreshConversationList(): Promise<void> {\n this.showRefreshLoader = true;\n try {\n this.conversations = [];\n this.filteredConversations = [];\n\n // List conversations\n this.endOfList = false;\n this.nextToken_conversations = undefined;\n if (this.showArchivedConversations) {\n this.conversations = await this.listArchivedEntityConversationsByTenantId();\n } else {\n this.conversations = await this.listRecentEntityConversationsByTenantId();\n }\n\n // load all other pages\n while (!this.endOfList) {\n await this.onScrollEntityConversationList();\n }\n // console.debug('Refreshed conversations: ', this.conversations);\n\n /*\n if (this.conversations?.length > 0 && !this.selectedConversation) {\n await this.handleSelectConversation(this.conversations[0]);\n }\n */\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch conversations`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.filterConversations();\n this.showRefreshLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async onScrollEntityConversationList(): Promise<void> {\n if (this.endOfList) return;\n\n this.showEntityConversationScrollLoader = true;\n try {\n let res_listEntitiesByTenantId: EntityConversation[];\n if (this.showArchivedConversations) {\n res_listEntitiesByTenantId = await this.listArchivedEntityConversationsByTenantId();\n } else {\n res_listEntitiesByTenantId = await this.listRecentEntityConversationsByTenantId();\n }\n // console.debug('res_listEntitiesByTenantId: ', res_listEntitiesByTenantId);\n\n this.conversations = this.conversations.concat(...res_listEntitiesByTenantId);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! We encountered an error. Please try again.`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.filterConversations();\n this.showEntityConversationScrollLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async toggleNewConversation(): Promise<void> {\n this.showNewConversation = !this.showNewConversation;\n this.cdr.detectChanges();\n }\n\n async startConversation(entity: Entity): Promise<void> {\n this.showNewConversation = false;\n\n // search loaded conversation list\n const index = this.conversations?.findIndex((convo: any) => convo.entityId === entity.id);\n if (index !== undefined && index > -1) {\n return await this.handleSelectConversation(this.conversations[index]);\n }\n\n // search conversation in database (both archived or unarchived)\n try {\n const res_searchConversation = await this.entityConversationService.ListEntityConversationsByTenantIdAndEntityAddress(\n this.authenticationService.getTenantId(),\n {\n eq: entity.phoneNumberE164,\n },\n undefined,\n {\n and: [\n {\n deletedAt: { attributeExists: false },\n },\n /* {\n interactionChannel: { eq: InteractionChannel.SOCIAL_CHAT },\n }, */\n {\n interactionProvider: { eq: InteractionProvider.WHATSAPP },\n },\n ],\n }\n );\n // console.debug('res_searchConversation: ', res_searchConversation);\n\n const conversation = res_searchConversation?.items?.[0];\n if (conversation) {\n return await this.handleSelectConversation(conversation);\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not start a new conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.cdr.detectChanges();\n }\n\n const now = moment.utc().unix();\n const entityConversationId: string = uuidv4();\n const params_createEntityConversation = {\n id: entityConversationId,\n tenantId: this.authenticationService.getTenantId(),\n entityId: entity.id,\n entityAddress: entity.phoneNumberE164,\n interactionChannel: InteractionChannel.SOCIAL_CHAT,\n interactionProvider: InteractionProvider.WHATSAPP,\n lastActivityAt: now,\n isCampaignEngaged: false,\n createdAt: now,\n updatedAt: now,\n };\n\n const conversation = {\n ...params_createEntityConversation,\n entity,\n };\n\n this.handleSelectConversation(conversation);\n this.cdr.detectChanges();\n\n // create a new entity conversation\n try {\n const res_createEntityConversation = await this.entityConversationService.CreateEntityConversation(params_createEntityConversation);\n // console.debug('res_createEntityConversation: ', res_createEntityConversation);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not start a new conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n async handleSelectConversation(conversation: EntityConversation): Promise<void> {\n this.showNewConversation = false;\n\n // update current conversation\n const now = moment.utc().unix();\n conversation.lastActivityAt = now;\n\n // update previous conversation\n const previouslySelectedConversation = this.selectedConversation;\n if (previouslySelectedConversation) {\n const index = this.conversations?.findIndex((convo: any) => convo.id === previouslySelectedConversation.id);\n if (index !== undefined && index > -1) {\n this.conversations[index].lastActivityAt = now;\n }\n }\n\n // event to update the conversations in database\n this.selectConversationEv.emit(conversation);\n this.cdr.detectChanges();\n }\n\n private subscribeToEntityConversations(): void {\n this.entityConversationsSubscription?.unsubscribe();\n this.entityConversationsSubscription = this.entityConversationService.OnEntityConversationByTenantIdListener(this.authenticationService.getTenantId()).subscribe((conversation) => {\n this.zone.run(async () => {\n try {\n let entityConversation = conversation?.value?.data?.OnEntityConversationByTenantId;\n if (!entityConversation) return;\n if (entityConversation.interactionProvider !== InteractionProvider.WHATSAPP) return;\n if (!entityConversation.lastMessageAt) return;\n\n const shouldRemoveConversation = !!entityConversation.deletedAt || (!this.showArchivedConversations && !!entityConversation.archivedAt) || (this.showArchivedConversations && !entityConversation.archivedAt);\n\n // get expanded object as it may not be received in the event\n if (!shouldRemoveConversation) {\n await new Promise((resolve) => setTimeout(resolve, 1000)); // ⏳ wait for 1 second\n entityConversation = await this.entityConversationService.GetEntityConversation(entityConversation.id);\n }\n\n const index = this.conversations?.findIndex((convo: any) => convo.id === entityConversation.id);\n if (index !== undefined && index > -1) {\n if (shouldRemoveConversation) {\n // Remove the conversation\n this.conversations.splice(index, 1);\n } else if (!!entityConversation?.messages?.items?.length && entityConversation?.messages?.items?.[0]?.id !== this.conversations[index].messages?.items?.[0]?.id) {\n // Move the updated one to the top of the list\n const temp = this.conversations.splice(index, 1);\n this.conversations.unshift({\n ...temp,\n ...CleanDeep.clean(entityConversation),\n });\n } else {\n // Update the existing conversation with the new data\n if (!entityConversation.blockedAt) delete this.conversations[index].blockedAt;\n if (!entityConversation.deletedAt) delete this.conversations[index].deletedAt;\n\n this.conversations[index] = {\n ...this.conversations[index],\n ...CleanDeep.clean(entityConversation),\n };\n }\n } else if (!shouldRemoveConversation && this.showArchivedConversations === !!entityConversation.archivedAt) {\n // Add the conversation to the list if it's not blocked or deleted and not found in the current list\n if (this.conversations) {\n this.conversations.unshift(entityConversation);\n } else {\n this.conversations = [entityConversation];\n }\n }\n\n if (this.selectedConversation?.id === entityConversation.id) {\n if (!entityConversation.blockedAt) delete this.selectedConversation.blockedAt;\n if (!entityConversation.deletedAt) delete this.selectedConversation.deletedAt;\n const conversation = {\n ...this.selectedConversation,\n ...CleanDeep.clean(entityConversation),\n };\n this.selectConversationEv.emit(conversation);\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.filterConversations();\n this.cdr.detectChanges();\n }\n });\n });\n }\n\n async onToggleArchivedConversations(): Promise<void> {\n if (this.showInitLoader || this.showRefreshLoader || this.showEntityConversationScrollLoader) return;\n\n this.showArchivedConversations = !this.showArchivedConversations;\n await this.refreshConversationList();\n }\n\n async markConversationAsArchived(conversation: any): Promise<void> {\n // this.showMarkConversationAsArchivedLoader = true;\n this.reConfiguringConversationId = conversation.id;\n\n const prvArchivedAt: number = conversation.archivedAt;\n try {\n const now = moment.utc().unix();\n conversation.archivedAt = now;\n const res_updateEntityConversationAsArchived = await this.entityConversationService.UpdateEntityConversation({\n id: conversation.id,\n archivedAt: now,\n updatedAt: conversation.updatedAt,\n });\n // console.debug('res_updateEntityConversationAsArchived: ', res_updateEntityConversationAsArchived);\n\n if (!this.showArchivedConversations) {\n this.conversations = this.conversations?.filter((convo: any) => convo.id !== conversation.id);\n\n if (this.selectedConversation?.id === conversation.id) {\n this.selectConversationEv.emit(conversation);\n }\n }\n this.snackBar.open(`Success! The conversation has been successfully archived`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n prvArchivedAt ? (conversation.archivedAt = prvArchivedAt) : delete conversation.archivedAt;\n this.snackBar.open(`Oops! Could not mark conversation as archived`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkConversationAsArchivedLoader = false;\n this.reConfiguringConversationId = undefined;\n this.filterConversations();\n this.cdr.detectChanges();\n }\n }\n\n async markConversationAsUnarchived(conversation: any): Promise<void> {\n // this.showMarkConversationAsUnarchivedLoader = true;\n this.reConfiguringConversationId = conversation.id;\n\n const prvArchivedAt: number = conversation.archivedAt;\n try {\n delete conversation.archivedAt;\n const res_updateEntityConversationAsUnarchived = await this.entityConversationService.UpdateEntityConversation({\n id: conversation.id,\n archivedAt: null,\n updatedAt: conversation.updatedAt,\n });\n // console.debug('res_updateEntityConversationAsUnarchived: ', res_updateEntityConversationAsUnarchived);\n\n if (this.showArchivedConversations) {\n this.conversations = this.conversations?.filter((convo: any) => convo.id !== conversation.id);\n\n if (this.selectedConversation?.id === conversation.id) {\n this.selectConversationEv.emit(conversation);\n }\n }\n\n this.snackBar.open(`Success! The conversation has been restored and is now active`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n prvArchivedAt ? (conversation.archivedAt = prvArchivedAt) : delete conversation.archivedAt;\n this.snackBar.open(`Oops! Could not mark conversation as unarchived`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkConversationAsUnarchivedLoader = false;\n this.reConfiguringConversationId = undefined;\n this.filterConversations();\n this.cdr.detectChanges();\n }\n }\n\n async markConversationAsBlocked(conversation: any): Promise<void> {\n // Mark conversation as blocked means blocking the phone number / source of the conversation\n // this.showMarkConversationAsBlockedLoader = true;\n this.reConfiguringConversationId = conversation.id;\n\n const prvBlockedAt: number = conversation.blockedAt;\n try {\n const now = moment.utc().unix();\n\n conversation.blockedAt = now;\n const res_updateEntityConversationAsBlocked = await this.entityConversationService.UpdateEntityConversation({\n id: conversation.id,\n blockedAt: now,\n updatedAt: conversation.updatedAt,\n });\n // console.debug('res_updateEntityConversationAsBlocked: ', res_updateEntityConversationAsBlocked);\n\n if (this.selectedConversation?.id === conversation.id) {\n this.selectConversationEv.emit(conversation);\n }\n\n this.snackBar.open(`Success! The conversation has been blocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n prvBlockedAt ? (conversation.blockedAt = prvBlockedAt) : delete conversation.blockedAt;\n this.snackBar.open(`Oops! Could not block the conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkConversationAsBlockedLoader = false;\n this.reConfiguringConversationId = undefined;\n this.cdr.detectChanges();\n }\n }\n\n async markConversationAsUnblocked(conversation: any): Promise<void> {\n // Mark conversation as unblocked means unblocking the phone number / source of the conversation\n // this.showMarkConversationAsUnblockedLoader = true;\n this.reConfiguringConversationId = conversation.id;\n\n const prvBlockedAt: number = conversation.blockedAt;\n try {\n delete conversation.blockedAt;\n const res_updateEntityConversationAsUnblocked = await this.entityConversationService.UpdateEntityConversation({\n id: conversation.id,\n blockedAt: null,\n updatedAt: conversation.updatedAt,\n });\n // console.debug('res_updateEntityConversationAsUnblocked: ', res_updateEntityConversationAsUnblocked);\n\n if (this.selectedConversation?.id === conversation.id) {\n this.selectConversationEv.emit(conversation);\n }\n this.snackBar.open(`Success! The conversation has been successfully unblocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n prvBlockedAt ? (conversation.blockedAt = prvBlockedAt) : delete conversation.blockedAt;\n this.snackBar.open(`Oops! Could not unblock the conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkConversationAsUnblockedLoader = false;\n this.reConfiguringConversationId = undefined;\n this.cdr.detectChanges();\n }\n }\n\n async markEntityAndConversationAsBlocked(conversation: any): Promise<void> {\n // this.showMarkEntityAsBlockedLoader = true;\n this.reConfiguringEntityId = conversation.entityId;\n this.reConfiguringConversationId = conversation.id;\n\n try {\n const now = moment.utc().unix();\n const res_updateEntityAsBlocked = await this.entityService.UpdateEntity({\n id: conversation.entityId,\n blockedAt: now,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n updatedAt: conversation.entity?.updatedAt || now,\n });\n // console.debug('res_updateEntityAsBlocked: ', res_updateEntityAsBlocked);\n\n await this.markConversationAsBlocked(conversation);\n this.snackBar.open(`Success! The contact has been blocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not mark the contact as blocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkEntityAsBlockedLoader = false;\n this.reConfiguringEntityId = undefined;\n this.reConfiguringConversationId = undefined;\n this.cdr.detectChanges();\n }\n }\n\n async markEntityAndConversationAsUnblocked(conversation: any): Promise<void> {\n // this.showMarkEntityAsUnblockedLoader = true;\n this.reConfiguringEntityId = conversation.entityId;\n this.reConfiguringConversationId = conversation.id;\n\n try {\n const now = moment.utc().unix();\n const res_updateEntityAsUnblocked = await this.entityService.UpdateEntity({\n id: conversation.entityId,\n blockedAt: null,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n updatedAt: conversation.entity?.updatedAt || now,\n });\n // console.debug('res_updateEntityAsUnblocked: ', res_updateEntityAsUnblocked);\n\n await this.markConversationAsUnblocked(conversation);\n\n this.snackBar.open(`Success! The contact has been successfully unblocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not mark the contact as unblocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkEntityAsUnblockedLoader = false;\n this.reConfiguringEntityId = undefined;\n this.reConfiguringConversationId = undefined;\n this.cdr.detectChanges();\n }\n }\n\n isNumeric(value: string): boolean {\n return /^\\d+$/.test(value?.trim());\n }\n\n getScrollLoaderCount(): number {\n return Math.ceil((this.containerDimensions.height - 175) / 75);\n }\n\n handleEntityImageError(entity: any): void {\n if (entity && entity.image_url) {\n entity.image_url = null;\n } else {\n entity.image = null;\n }\n }\n\n getAttachmentType(attachment: any): string {\n if (attachment.type.startsWith('image')) {\n return 'image';\n } else if (attachment.type.startsWith('video')) {\n return 'video';\n } else if (attachment.type.startsWith('audio')) {\n return 'audio';\n } else {\n return 'document';\n }\n }\n\n parseJSON(raw: any): any | null {\n if (!raw) return null;\n if (typeof raw === 'object') return raw;\n try {\n return JSON.parse(String(raw));\n } catch {\n return null;\n }\n }\n}\n","<div class=\"sd_waba_container_conversations_header\">\n <div class=\"sd_waba_container_conversations_header_left\">\n <!-- <svg viewBox=\"0 0 212 212\" height=\"40\" width=\"40\" preserveAspectRatio=\"xMidYMid meet\" version=\"1.1\" x=\"0px\" y=\"0px\" enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\" class=\"background\" d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg> -->\n </div>\n <div class=\"sd_waba_container_conversations_header_right\">\n <div class=\"sd_waba_container_button_new_conversation\">\n <button type=\"button\" class=\"sd_waba_button_new_conversation\" title=\"New Conversation\"\n [ngClass]=\"{'sd_waba_button_new_conversation_selected': showNewConversation}\" (click)=\"toggleNewConversation()\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" preserveAspectRatio=\"xMidYMid meet\" fill=\"none\">\n <path\n d=\"M9.53277 12.9911H11.5086V14.9671C11.5086 15.3999 11.7634 15.8175 12.1762 15.9488C12.8608 16.1661 13.4909 15.6613 13.4909 15.009V12.9911H15.4672C15.9005 12.9911 16.3181 12.7358 16.449 12.3226C16.6659 11.6381 16.1606 11.0089 15.5086 11.0089H13.4909V9.03332C13.4909 8.60007 13.2361 8.18252 12.8233 8.05119C12.1391 7.83391 11.5086 8.33872 11.5086 8.991V11.0089H9.49088C8.83941 11.0089 8.33411 11.6381 8.55097 12.3226C8.68144 12.7358 9.09947 12.9911 9.53277 12.9911Z\"\n fill=\"currentColor\"></path>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M0.944298 5.52617L2.99998 8.84848V17.3333C2.99998 18.8061 4.19389 20 5.66665 20H19.3333C20.8061 20 22 18.8061 22 17.3333V6.66667C22 5.19391 20.8061 4 19.3333 4H1.79468C1.01126 4 0.532088 4.85997 0.944298 5.52617ZM4.99998 8.27977V17.3333C4.99998 17.7015 5.29845 18 5.66665 18H19.3333C19.7015 18 20 17.7015 20 17.3333V6.66667C20 6.29848 19.7015 6 19.3333 6H3.58937L4.99998 8.27977Z\"\n fill=\"currentColor\"></path>\n </svg>\n </button>\n </div>\n <div class=\"sd_waba_container_button_refresh\">\n <button type=\"button\" class=\"sd_waba_button_refresh\" title=\"Refresh\" (click)=\"refreshConversationList()\"\n [disabled]=\"showInitLoader || showRefreshLoader\">\n <svg viewBox=\"0 0 512 512\" width=\"16px\"><path fill=\"currentColor\" d=\"M386.3 160L336 160c-17.7 0-32 14.3-32 32s14.3 32 32 32l128 0c17.7 0 32-14.3 32-32l0-128c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 51.2L414.4 97.6c-87.5-87.5-229.3-87.5-316.8 0s-87.5 229.3 0 316.8s229.3 87.5 316.8 0c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0c-62.5 62.5-163.8 62.5-226.3 0s-62.5-163.8 0-226.3s163.8-62.5 226.3 0L386.3 160z\"></path></svg>\n </button>\n </div>\n </div>\n</div>\n\n<div class=\"sd_waba_container_conversations_search\">\n <span class=\"sd_waba_icon_search\"><svg viewBox=\"0 0 20 20\" height=\"20\" width=\"20\" fill=\"none\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4.36653 4.3664C5.36341 3.36953 6.57714 2.87 8.00012 2.87C9.42309 2.87 10.6368 3.36953 11.6337 4.3664C12.6306 5.36329 13.1301 6.57724 13.1301 8.00062C13.1301 8.57523 13.0412 9.11883 12.8624 9.63057C12.6972 10.1038 12.4733 10.5419 12.1909 10.9444L16.5712 15.3247C16.7454 15.4989 16.8385 15.7046 16.8385 15.9375C16.8385 16.1704 16.7454 16.3761 16.5712 16.5503C16.396 16.7254 16.1866 16.8175 15.948 16.8175C15.7095 16.8175 15.5001 16.7254 15.3249 16.5503L10.9448 12.1906C10.5421 12.4731 10.104 12.697 9.63069 12.8623C9.11895 13.041 8.57535 13.13 8.00074 13.13C6.57736 13.13 5.36341 12.6305 4.36653 11.6336C3.36965 10.6367 2.87012 9.42297 2.87012 8C2.87012 6.57702 3.36965 5.36328 4.36653 4.3664ZM8.00012 4.63C7.06198 4.63 6.26877 4.95685 5.61287 5.61275C4.95698 6.26865 4.63012 7.06186 4.63012 8C4.63012 8.93813 4.95698 9.73134 5.61287 10.3872C6.26877 11.0431 7.06198 11.37 8.00012 11.37C8.93826 11.37 9.73146 11.0431 10.3874 10.3872C11.0433 9.73134 11.3701 8.93813 11.3701 8C11.3701 7.06186 11.0433 6.26865 10.3874 5.61275C9.73146 4.95685 8.93826 4.63 8.00012 4.63Z\" fill=\"currentColor\"></path></svg></span>\n <input type=\"search\" class=\"sd_waba_input_search_conversation\" placeholder=\"Search\" [(ngModel)]=\"searchQuery\"\n (keyup)=\"filterConversations()\" [disabled]=\"showInitLoader || showRefreshLoader\">\n</div>\n\n<!--\n<div class=\"sd_waba_container_conversations_filters\">\n <button type=\"button\" class=\"sd_waba_filter_selected\" title=\"All\">All</button>\n <button type=\"button\" title=\"Unread\">Unread</button>\n <button type=\"button\" title=\"Groups\">Groups</button>\n</div>\n-->\n\n@if (!showArchivedConversations) {\n<div class=\"sd_waba_container_conversations_views\" (click)=\"onToggleArchivedConversations()\">\n <div class=\"sd_waba_container_conversations_view_icon\">\n <svg viewBox=\"0 0 20 20\" height=\"20\" width=\"20\" preserveAspectRatio=\"xMidYMid meet\" fill=\"none\">\n <path\n d=\"M18.54 3.23L17.15 1.55C16.88 1.21 16.47 1 16 1H4C3.53 1 3.12 1.21 2.84 1.55L1.46 3.23C1.17 3.57 1 4.02 1 4.5V17C1 18.1 1.9 19 3 19H17C18.1 19 19 18.1 19 17V4.5C19 4.02 18.83 3.57 18.54 3.23ZM4.24 3H15.76L16.57 3.97H3.44L4.24 3ZM3 17V6H17V17H3ZM11.45 8H8.55V11H6L10 15L14 11H11.45V8Z\"\n fill=\"currentColor\"></path>\n </svg>\n </div>\n <div class=\"sd_waba_container_conversations_view_label\">\n <div class=\"sd_waba_container_conversations_view_name\">\n Archived\n </div>\n </div>\n <!-- <div class=\"sd_waba_container_conversations_view_count\">12</div> -->\n</div>\n}\n\n@if (showArchivedConversations) {\n<div class=\"sd_waba_container_conversations_views sd_waba_container_conversations_views_archived\">\n <div class=\"sd_waba_container_conversations_view_icon\" (click)=\"onToggleArchivedConversations()\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" preserveAspectRatio=\"xMidYMid meet\" class=\"\" version=\"1.1\" x=\"0px\"\n y=\"0px\" enable-background=\"new 0 0 24 24\">\n <path fill=\"currentColor\" d=\"M12,4l1.4,1.4L7.8,11H20v2H7.8l5.6,5.6L12,20l-8-8L12,4z\"></path>\n </svg>\n </div>\n <div class=\"sd_waba_container_conversations_view_label\">\n <div class=\"sd_waba_container_conversations_view_name sd_waba_container_conversations_view_name_archived\">\n Archived\n </div>\n </div>\n <!-- <div class=\"sd_waba_container_conversations_view_count\">12</div> -->\n <p></p>\n</div>\n}\n\n<div class=\"sd_waba_container_conversations_content\">\n <div class=\"sd_waba_container_conversations_content_inner\">\n <div class=\"sd_waba_scrollbox\" id=\"sd_waba_conversations_scrollbox\" infiniteScroll [scrollWindow]=\"false\"\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"500\"\n [infiniteScrollDisabled]=\"showEntityConversationScrollLoader\" (scrolled)=\"onScrollEntityConversationList()\"\n #scrollboxWhatsAppConversations>\n <div class=\"sd_waba_scrollbox_content\">\n @if (showInitLoader || showRefreshLoader) {\n <div class=\"sd_waba_container_conversations_init_loader\">\n <!-- <div class=\"container_table_loader\">\n <div class=\"table_loader\">\n <p>Loading</p>\n <span></span>\n </div>\n </div> -->\n @for (count of [].constructor(getScrollLoaderCount()); track $index) {\n <div class=\"sd_waba_container_skeleton_loader\">\n <ngx-skeleton-loader appearance=\"circle\"\n [theme]=\"{ 'width': '49px', 'height': '49px', 'background-color': '#d9d9d9' }\" animation=\"progress\">\n </ngx-skeleton-loader>\n <div class=\"sd_waba_container_skeleton_loader_messages\">\n <ngx-skeleton-loader [theme]=\"{ 'width': '30%', 'height': '16px', 'background-color': '#d9d9d9' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ 'width': '80%', 'height': '14px', 'background-color': '#e0e0e0', 'margin-bottom': '0px' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n </div>\n </div>\n }\n </div>\n }\n @else {\n @let searchResults = (searchQuery ? filteredConversations : conversations) || [];\n\n @if (showArchivedConversations) {\n <div class=\"sd_waba_archived_view_message\">\n <p>These chats stay archived when new messages are received. Tab to change</p>\n </div>\n }\n\n @if (searchResults && searchResults.length > 0) {\n <div class=\"sd_waba_container_conversations_list\">\n <ul>\n @for (conversation of searchResults; track conversation.id) {\n <li (click)=\"handleSelectConversation(conversation)\"\n [ngClass]=\"{ 'sd_waba_conversation_selected': conversation.id === selectedConversation?.id }\">\n <div class=\"sd_waba_container_conversation_item\"\n [ngClass]=\"{ 'sd_waba_conversation_blocked': !!conversation.blockedAt || !!conversation.entity?.blockedAt }\">\n <div class=\"sd_waba_container_conversation_avatar\"\n [ngClass]=\"{ 'sd_waba_container_conversation_avatar_grayscale': !!conversation.blockedAt || !!conversation.entity?.blockedAt }\">\n @let entityImage = conversation.entity?.image?.location;\n @if (entityImage) {\n <img src=\"{{ entityImage }}\" alt=\"{{ conversation.entity?.name }}\"\n (error)=\"handleEntityImageError(conversation.entity)\">\n }\n @else {\n @if (!!conversation.blockedAt || !!conversation.entity?.blockedAt) {\n <ngx-avatars initialsSize=\"2\" [size]=\"49\" [round]=\"true\" [name]=\"conversation.entity?.name\"\n [bgColor]=\"'#d3d3d3'\"></ngx-avatars>\n }\n @else {\n <ngx-avatars initialsSize=\"2\" [size]=\"49\" [round]=\"true\" [name]=\"conversation.entity?.name\">\n </ngx-avatars>\n }\n }\n </div>\n <div class=\"sd_waba_container_conversation_details\">\n @let lastMessage = conversation.messages?.items?.[0];\n <div class=\"sd_waba_container_conversation_title\">\n <div class=\"sd_waba_title_left\">\n <div class=\"sd_waba_container_conversation_address\">\n @if (!isNumeric(searchQuery)) {\n {{ conversation.entity?.name || conversation.entityAddress | titlecase }}\n }\n @else {\n {{ conversation.entityAddress }}\n }\n @if (!!conversation.blockedAt || !!conversation.entity?.blockedAt) {\n <span> (Blocked)</span>\n }\n </div>\n </div>\n <div class=\"sd_waba_title_right\"\n [ngClass]=\"{'sd_waba_container_conversation_alert': (lastMessage?.createdAt || conversation.lastMessageAt) >= conversation.lastActivityAt && conversation.id !== selectedConversation?.id}\">\n {{ lastMessage ? (lastMessage.createdAt |\n formatEpochTimestamp: 'short' ) : '--' }}\n </div>\n </div>\n <div class=\"sd_waba_container_conversation_last_message\">\n\n <div class=\"sd_waba_container_last_message_content\">\n @if (!!lastMessage) {\n @let metadata = lastMessage.metadata ? parseJSON(lastMessage.metadata) : {};\n\n <!-- 1. ERROR MESSAGE -->\n @if (metadata?.errors) {\n @let error = metadata.errors[0];\n <span class=\"sd_waba_message_content\">\n <span class=\"sd_waba_error_icon\"><svg width=\"10px\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z\"></path></svg></span>\n <span class=\"sd_waba_error_content\">{{ error?.title || error?.message || 'WhatsApp error' }}</span>\n </span>\n }\n\n <!-- 2. TEMPLATE MESSAGE -->\n @else if (metadata?.template) {\n @let components = metadata.template.components;\n\n @for (component of components ?? []; track $index) {\n @switch (component?.type) {\n @case ('HEADER') {\n @switch (component?.format) {\n @case ('TEXT') {\n <span>{{ component?.text }}</span> \n }\n @case ('IMAGE') {\n <span><i class=\"fa-regular fa-image\"></i></span> \n }\n @case ('VIDEO') {\n <span><i class=\"fa-regular fa-video\"></i></span> \n }\n @case ('DOCUMENT') {\n <span><i class=\"fa-regular fa-file\"></i></span> \n }\n @case ('LOCATION') {\n <span><i class=\"fa-solid fa-location-pin\"></i></span> \n }\n }\n }\n\n @case ('BODY') {\n @if (component?.text?.trim().length > 0) {\n <span [innerHTML]=\"component.text | WhatsAppTextFormatter\"></span>\n }\n }\n }\n }\n }\n\n <!-- 3. SHARED CONTACT -->\n @else if (metadata?.contacts) {\n @let contact = metadata.contacts[0];\n <span class=\"sd_waba_message_content\">\n <span><svg width=\"15px\" height=\"15px\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M96 0C60.7 0 32 28.7 32 64l0 384c0 35.3 28.7 64 64 64l288 0c35.3 0 64-28.7 64-64l0-384c0-35.3-28.7-64-64-64L96 0zM208 288l64 0c44.2 0 80 35.8 80 80 0 8.8-7.2 16-16 16l-192 0c-8.8 0-16-7.2-16-16 0-44.2 35.8-80 80-80zm-24-96a56 56 0 1 1 112 0 56 56 0 1 1 -112 0zM512 80c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 64c0 8.8 7.2 16 16 16s16-7.2 16-16l0-64zm0 128c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 64c0 8.8 7.2 16 16 16s16-7.2 16-16l0-64zM496 320c-8.8 0-16 7.2-16 16l0 64c0 8.8 7.2 16 16 16s16-7.2 16-16l0-64c0-8.8-7.2-16-16-16z\"/></svg></span>\n {{ contact?.name?.formatted_name || contact?.name?.first_name || 'Shared contact' }}\n </span>\n }\n\n <!-- 4. LOCATION -->\n @else if (metadata?.location) {\n @let location = metadata.location;\n <span class=\"sd_waba_message_content\">\n <span>\n <svg width=\"15px\" height=\"15px\"\n viewBox=\"-1.5 0 15 15\">\n <path fill=\"currentColor\" fill-rule=\"evenodd\"\n d=\"M574,120 C575.324428,120 580,114.054994 580,110.833333 C580,107.611672 577.313708,105 574,105 C570.686292,105 568,107.611672 568,110.833333 C568,114.054994 572.675572,120 574,120 Z M574,113.333333 C575.420161,113.333333 576.571429,112.214045 576.571429,110.833333 C576.571429,109.452621 575.420161,108.333333 574,108.333333 C572.579839,108.333333 571.428571,109.452621 571.428571,110.833333 C571.428571,112.214045 572.579839,113.333333 574,113.333333 Z\"\n transform=\"translate(-568 -105)\" />\n </svg>\n </span>{{ location.name || 'Shared location' }}\n </span>\n }\n\n <!-- 5. ATTACHMENTS -->\n @else if (lastMessage?.messageAttachments?.items?.length > 0) {\n @let attachment = lastMessage?.messageAttachments.items[0];\n @switch (getAttachmentType(attachment)) {\n @case ('image') {\n <span>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M20 14V2C20 0.9 19.1 0 18 0H6C4.9 0 4 0.9 4 2V14C4 15.1 4.9 16 6 16H18C19.1 16 20 15.1 20 14ZM9.4 10.53L11.03 12.71L13.61 9.49C13.81 9.24 14.19 9.24 14.39 9.49L17.35 13.19C17.61 13.52 17.38 14 16.96 14H7C6.59 14 6.35 13.53 6.6 13.2L8.6 10.53C8.8 10.27 9.2 10.27 9.4 10.53ZM0 18V5C0 4.45 0.45 4 1 4C1.55 4 2 4.45 2 5V17C2 17.55 2.45 18 3 18H15C15.55 18 16 18.45 16 19C16 19.55 15.55 20 15 20H2C0.9 20 0 19.1 0 18Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n }\n @case ('video') {\n <span><svg fill=\"currentColor\" width=\"16px\"\n height=\"16px\" viewBox=\"0 0 36 36\" version=\"1.1\" preserveAspectRatio=\"xMidYMid meet\">\n <path\n d=\"M32.12,10H3.88A1.88,1.88,0,0,0,2,11.88V30.12A1.88,1.88,0,0,0,3.88,32H32.12A1.88,1.88,0,0,0,34,30.12V11.88A1.88,1.88,0,0,0,32.12,10ZM24.18,21.83l-9.77,4.36A1,1,0,0,1,13,25.28V16.56a1,1,0,0,1,1.41-.91L24.18,20A1,1,0,0,1,24.18,21.83Z\"\n class=\"clr-i-solid clr-i-solid-path-1\"></path>\n <path d=\"M30.14,3h0a1,1,0,0,0-1-1h-22a1,1,0,0,0-1,1h0V4h24Z\"\n class=\"clr-i-solid clr-i-solid-path-2\"></path>\n <path d=\"M32.12,7V7a1,1,0,0,0-1-1h-26a1,1,0,0,0-1,1h0V8h28Z\"\n class=\"clr-i-solid clr-i-solid-path-3\"></path>\n <rect x=\"0\" y=\"0\" width=\"8\" height=\"8\" fill-opacity=\"0\" />\n </svg></span>\n }\n @case ('audio') {\n <span><svg viewBox=\"0 0 24 24\" height=\"16\" width=\"16\"\n class=\"\" version=\"1.1\" x=\"0px\" y=\"0px\" enable-background=\"new 0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M11.999,14.942c2.001,0,3.531-1.53,3.531-3.531V4.35c0-2.001-1.53-3.531-3.531-3.531 S8.469,2.35,8.469,4.35v7.061C8.469,13.412,9.999,14.942,11.999,14.942z M18.237,11.412c0,3.531-2.942,6.002-6.237,6.002 s-6.237-2.471-6.237-6.002H3.761c0,4.001,3.178,7.297,7.061,7.885v3.884h2.354v-3.884c3.884-0.588,7.061-3.884,7.061-7.885 L18.237,11.412z\">\n </path>\n </svg></span>\n }\n @case ('document') {\n <span><svg height=\"16\" viewBox=\"0 0 16 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M2 0C0.9 0 0.01 0.9 0.01 2L0 18C0 19.1 0.89 20 1.99 20H14C15.1 20 16 19.1 16 18V6.83C16 6.3 15.79 5.79 15.41 5.42L10.58 0.59C10.21 0.21 9.7 0 9.17 0H2ZM9 6V1.5L14.5 7H10C9.45 7 9 6.55 9 6ZM4 10C3.44772 10 3 10.4477 3 11C3 11.5523 3.44772 12 4 12H12C12.5523 12 13 11.5523 13 11C13 10.4477 12.5523 10 12 10H4ZM10 15C10 14.4477 9.55228 14 9 14H4C3.44772 14 3 14.4477 3 15C3 15.5523 3.44772 16 4 16H9C9.55228 16 10 15.5523 10 15Z\"\n fill=\"currentColor\"></path>\n </svg></span>\n }\n @default {\n <span><i class=\"fa-solid fa-paperclip-vertical\"></i></span>\n }\n }\n <span>{{ lastMessage?.body?.trim() || (getAttachmentType(attachment) === 'document' ? attachment?.name : (getAttachmentType(attachment) | titlecase)) || 'Attachment' }}</span>\n }\n\n <!-- 6. NORMAL MESSAGE -->\n @else {\n <span class=\"sd_waba_message_content\">\n {{ lastMessage?.body?.trim() || '' }}\n </span>\n }\n }\n </div>\n\n @if ((lastMessage?.createdAt || conversation.lastMessageAt) >= conversation.lastActivityAt && conversation.id !== selectedConversation?.id) {\n <div class=\"sd_waba_container_last_message_alert\"></div>\n }\n <div class=\"sd_waba_container_arrow_down\">\n @if (conversation.id === reConfiguringConversationId || conversation.entityId ===\n reConfiguringEntityId) {\n <span>...</span>\n }\n @else {\n <span mat-button class=\"sd_waba_button_conversation_options\"\n [matMenuTriggerFor]=\"menuConversationOptions\" (click)=\"$event.stopPropagation()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13px\" viewBox=\"0 0 448 512\"><path fill=\"currentColor\" d=\"M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"/></svg>\n </span>\n <mat-menu #menuConversationOptions>\n <!-- @if (!(conversation.entity || conversation.entityId || conversation.entity?.id)) {\n <button type=\"button\" mat-menu-item>Assign to contact</button>\n } -->\n @if (!conversation.archivedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markConversationAsArchived(conversation)\">\n <div class=\"sd_waba_btn_content_outer\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg viewBox=\"0 0 20 20\" height=\"20\" width=\"20\" preserveAspectRatio=\"xMidYMid meet\"\n fill=\"none\">\n <path\n d=\"M18.54 3.23L17.15 1.55C16.88 1.21 16.47 1 16 1H4C3.53 1 3.12 1.21 2.84 1.55L1.46 3.23C1.17 3.57 1 4.02 1 4.5V17C1 18.1 1.9 19 3 19H17C18.1 19 19 18.1 19 17V4.5C19 4.02 18.83 3.57 18.54 3.23ZM4.24 3H15.76L16.57 3.97H3.44L4.24 3ZM3 17V6H17V17H3ZM11.45 8H8.55V11H6L10 15L14 11H11.45V8Z\"\n fill=\"currentColor\"></path>\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Archive chat</div>\n </div>\n </button>\n }\n @if (!!conversation.archivedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markConversationAsUnarchived(conversation)\">\n <div class=\"sd_waba_btn_content_outer\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\">\n <path fill=\"currentColor\"\n d=\"M480-560 320-400l56 56 64-64v168h80v-168l64 64 56-56-160-160Zm-280-80v440h560v-440H200Zm0 520q-33 0-56.5-23.5T120-200v-499q0-14 4.5-27t13.5-24l50-61q11-14 27.5-21.5T250-840h460q18 0 34.5 7.5T772-811l50 61q9 11 13.5 24t4.5 27v499q0 33-23.5 56.5T760-120H200Zm16-600h528l-34-40H250l-34 40Zm264 300Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Unarchive chat</div>\n </div>\n </button>\n }\n @if (!conversation.blockedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markConversationAsBlocked(conversation)\">\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg width=\"28px\" viewBox=\"0 0 640 640\">\n <path fill=\"currentColor\"\n d=\"M449.1 483.1L156.9 190.9C128.8 226.4 112 271.2 112 320C112 434.9 205.1 528 320 528C368.8 528 413.7 511.2 449.1 483.1zM483 449.2C511.1 413.7 527.9 368.9 527.9 320.1C527.9 205.2 434.8 112.1 319.9 112.1C271.1 112.1 226.2 128.9 190.8 157L483.1 449.1zM64 320C64 178.6 178.6 64 320 64C461.4 64 576 178.6 576 320C576 461.4 461.4 576 320 576C178.6 576 64 461.4 64 320z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Block chat</div>\n </div>\n </button>\n }\n @if (!!conversation.blockedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markConversationAsUnblocked(conversation)\">\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd sd_waba_btn_unblock\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg width=\"28px\" viewBox=\"0 0 640 640\">\n <path fill=\"currentColor\"\n d=\"M449.1 483.1L156.9 190.9C128.8 226.4 112 271.2 112 320C112 434.9 205.1 528 320 528C368.8 528 413.7 511.2 449.1 483.1zM483 449.2C511.1 413.7 527.9 368.9 527.9 320.1C527.9 205.2 434.8 112.1 319.9 112.1C271.1 112.1 226.2 128.9 190.8 157L483.1 449.1zM64 320C64 178.6 178.6 64 320 64C461.4 64 576 178.6 576 320C576 461.4 461.4 576 320 576C178.6 576 64 461.4 64 320z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Unblock chat</div>\n </div>\n\n </button>\n }\n <!-- @if (conversation.entity && !conversation.entity.blockedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markEntityAndConversationAsBlocked(conversation)\">\n Block contact\n </button>\n }\n @if (conversation.entity && !!conversation.entity.blockedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markEntityAndConversationAsUnblocked(conversation)\">\n Unblock contact\n </button>\n } -->\n </mat-menu>\n }\n </div>\n </div>\n </div>\n </div>\n </li>\n }\n </ul>\n\n @if (showEntityConversationScrollLoader) {\n <div class=\"sd_waba_container_conversations_scroll_loader\">\n <div class=\"sd_waba_scroll_item_loader\"></div>\n </div>\n }\n\n </div>\n }\n @else {\n <div class=\"sd_waba_container_no_results\">\n <div class=\"sd_waba_container_no_results_inner\">\n <div class=\"sd_waba_container_icon_no_results\">\n <svg version=\"1.1\" viewBox=\"0 0 60 60\" width=\"68px\" style=\"enable-background:new 0 0 60 60;\" xml:space=\"preserve\">\n<path fill=\"currentColor\" d=\"M54,2H6C2.748,2,0,4.748,0,8v33c0,3.252,2.748,6,6,6h8v10c0,0.413,0.254,0.784,0.64,0.933C14.757,57.978,14.879,58,15,58\n\tc0.276,0,0.547-0.115,0.74-0.327L25.442,47H54c3.252,0,6-2.748,6-6V8C60,4.748,57.252,2,54,2z M12,15h15c0.553,0,1,0.448,1,1\n\ts-0.447,1-1,1H12c-0.553,0-1-0.448-1-1S11.447,15,12,15z M46,33H12c-0.553,0-1-0.448-1-1s0.447-1,1-1h34c0.553,0,1,0.448,1,1\n\tS46.553,33,46,33z M46,25H12c-0.553,0-1-0.448-1-1s0.447-1,1-1h34c0.553,0,1,0.448,1,1S46.553,25,46,25z\"/>\n</svg>\n </div>\n <h2>No chats or contacts found</h2>\n @if (!conversations || conversations?.length === 0) {\n <p>Messages you send or receive will appear here.</p>\n }\n @else {\n <p>No results found for your search. Please try different keywords.</p>\n }\n </div>\n </div>\n }\n\n }\n </div>\n </div>\n </div>\n</div>\n\n@if (showNewConversation) {\n<div class=\"sd_waba_container_slider\"\n [ngClass]=\"{ 'sd_waba_slide_in_left': showNewConversation, 'sd_waba_slide_out_left': !showNewConversation }\">\n <lib-whatsapp-contact-list [containerDimensions]=\"containerDimensions\" (close)=\"toggleNewConversation()\"\n (selectContact)=\"startConversation($event)\" />\n</div>\n}\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\nimport { Language, PhoneNumber, S3Object, SubscriptionResponse } from '../graphql/common.model';\n\nimport * as uuid from 'uuid';\n\nconst FIELDS_USER_EXPANDED = `\n id\n externalId\n tenantId\n email\n name\n image {\n key\n bucket\n location\n }\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n preferences {\n timezoneName\n language {\n code\n nameEn\n nameLocal\n }\n }\n notificationSettings {\n allowPush\n allowEmail\n allowSMS\n allowWhatsApp\n }\n type\n activatedAt\n blockedAt\n createdAt\n updatedAt\n deletedAt\n`;\n\nexport type UserPreferences = {\n timezoneName?: string | null;\n language?: Language | null;\n};\n\nexport type UserNotificationSettings = {\n allowPush?: boolean | null;\n allowEmail?: boolean | null;\n allowSMS?: boolean | null;\n allowWhatsApp?: boolean | null;\n};\n\nexport enum UserStatus {\n READY = 'READY',\n NOT_READY = 'NOT_READY',\n INVITED = 'INVITED',\n BUSY = 'BUSY',\n AFTER_CALL_WORK = 'AFTER_CALL_WORK',\n}\n\nexport enum UserType {\n AGENT = 'AGENT',\n SUPERVISOR = 'SUPERVISOR',\n ADMINISTRATOR = 'ADMINISTRATOR',\n}\n\nexport type User = {\n id: string;\n externalId?: string | null;\n tenantId: string;\n email: string;\n name?: string | null;\n image?: S3Object | null;\n phoneNumber?: PhoneNumber | null;\n preferences?: UserPreferences | null;\n notificationSettings?: UserNotificationSettings | null;\n type?: UserType | null;\n activatedAt?: number | null;\n blockedAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type ModelUserStatusInput = {\n eq?: UserStatus | null;\n ne?: UserStatus | null;\n};\n\nexport type __SubscriptionContainer = {\n OnUserById: User;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UserService {\n constructor(private readonly graphqlService: AppSyncGraphqlService) {}\n\n async getUserById(id: string): Promise<User> {\n if (!id || !uuid.validate(id)) {\n throw { code: 400, message: `Invalid id: ${id}` };\n }\n\n const user = await this.GetUser(id);\n if (!user || !!user.deletedAt) {\n throw { code: 400, message: `User not found` };\n }\n if (!user.activatedAt) {\n throw { code: 403, message: `User not activated.` };\n }\n if (!!user.blockedAt) {\n throw { code: 403, message: `User has been blocked.` };\n }\n\n return user;\n }\n\n async GetUser(id: string): Promise<User> {\n const statement = `query GetUser($id: ID!) {\n getUser(id: $id) {\n ${FIELDS_USER_EXPANDED}\n }\n }`;\n const gqlAPIServiceArguments: any = { id };\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <User>response.data.getUser;\n }\n\n OnUserByIdListener(id: string): Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnUserById'>>> {\n const statement = `subscription OnUserById($id: ID!) {\n OnUserById(id: $id) {\n ${FIELDS_USER_EXPANDED}\n }\n }`;\n const gqlAPIServiceArguments: any = { id };\n return this.graphqlService.subscribe<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnUserById'>>>(statement, gqlAPIServiceArguments) as any;\n /* as Observable<SubscriptionResponse<Pick<__SubscriptionContainer, \"OnUserById\">>>; */\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { GoogleMapsConfig } from '../../../app.config';\nimport { InteractionAttendee, InteractionMessage } from '../../services/interaction.service';\n\n@Component({\n selector: 'lib-whatsapp-message-item',\n templateUrl: './whatsapp-message-item.component.html',\n styleUrls: ['./whatsapp-message-item.component.css'],\n standalone: false,\n})\nexport class WhatsAppMessageItemComponent {\n /** Required inputs */\n @Input() message!: InteractionMessage;\n\n /** Maps / helpers passed from parent */\n @Input() interactionAttendeesMap!: Record<string | number, InteractionAttendee>;\n @Input() referenceMessagesMap!: Record<string | number, InteractionMessage>;\n\n /** UI flags */\n @Input() isRestrictedToTemplateReplies = false;\n\n /** Outputs (use these to bubble actions back to parent if needed) */\n @Output('reply')\n reply = new EventEmitter<InteractionMessage>();\n\n /** Derived helpers (safe lookups & parsing) */\n get inbound(): boolean {\n const a = this.attendeeRaw;\n // inbound if attendee is linked to an entityId (matches how you compute IsInboundMessage today)\n return !!a?.entityId;\n }\n\n get attendeeRaw(): InteractionAttendee | undefined {\n if (!this.message?.interactionAttendee) return this.message?.interactionAttendee as any;\n return this.interactionAttendeesMap?.[this.message.interactionAttendeeId as any] as any;\n }\n\n get attendeeName(): string | undefined {\n const a = this.attendeeRaw;\n return a?.entity?.name || a?.user?.name || a?.name;\n }\n\n get attendeeImage(): string | undefined {\n const a = this.attendeeRaw;\n return a?.entity?.image?.location || a?.user?.image?.location;\n }\n\n get meta(): any {\n return this.parseJSON(this.message?.metadata);\n }\n\n get location(): any {\n return this.meta?.location;\n }\n\n get contacts(): any[] | undefined {\n return this.meta?.contacts;\n }\n\n get messageErrors(): any[] | undefined {\n const errors = this.meta?.errors;\n return Array.isArray(errors) ? errors : undefined;\n }\n\n setAsReferenceMessage() {\n this.reply.emit(this.message);\n }\n\n getMapPreview(latitude: string, longitude: string) {\n return `https://maps.googleapis.com/maps/api/staticmap?center=${latitude},${longitude}&zoom=15&size=400x250&maptype=roadmap&markers=color:red%7Clabel:S%7C${latitude},${longitude}&key=${GoogleMapsConfig.apiKey}`;\n }\n\n getErrorDetails(error: any): string {\n if (!error) {\n return '';\n }\n\n return error?.error_data?.details || error?.message || error?.title || 'Something went wrong while delivering this message.';\n }\n\n openLocation(latitude: string, longitude: string) {\n return window.open(`https://www.google.com/maps?q=${latitude},${longitude}`, '_blank');\n }\n\n formatContactAddress(address: any): string {\n if (!address) {\n return '';\n }\n\n const parts = [address.street, address.city, address.state, address.zip || address.postal_code, address.country].map((part) => (typeof part === 'string' ? part.trim() : part)).filter((part) => !!part && String(part).length > 0);\n\n return parts.join(', ');\n }\n\n onAttendeeImageError(attendee: any) {\n attendee.image = undefined;\n }\n\n getAttachmentType(attachment: any) {\n if (attachment.type.startsWith('image')) {\n return 'image';\n } else if (attachment.type.startsWith('video')) {\n return 'video';\n } else if (attachment.type.startsWith('audio')) {\n return 'audio';\n } else {\n return 'document';\n }\n }\n\n isTemplatedMessage(): boolean {\n if (!this.message?.metadata) {\n return false;\n }\n\n try {\n return !!this.meta.template;\n } catch (err) {\n // If message.metadata is not valid JSON, return false\n return false;\n }\n }\n\n hasHeaderMediaTemplate(): boolean {\n try {\n const comps = this.parseJSON(this.message?.metadata)?.template?.components;\n return Array.isArray(comps) && comps.some((c) => c?.type === 'HEADER' && ['IMAGE', 'VIDEO', 'DOCUMENT', 'LOCATION'].includes(c?.format));\n } catch {\n return false;\n }\n }\n\n parseMessageTemplateComponents(metadata: any) {\n return this.parseJSON(metadata)?.template?.components;\n }\n\n parseJSON(raw: any) {\n if (!raw) return undefined;\n if (typeof raw === 'object') return raw;\n try {\n return JSON.parse(String(raw));\n } catch {\n return undefined;\n }\n }\n}\n","<div class=\"sd_waba_container_whatsapp_message_item\">\n <!-- Avatar/Image -->\n <div class=\"sd_waba_container_participant_avatar\" [ngStyle]=\"{\n 'float': inbound ? 'left' : 'right',\n 'margin-left': inbound ? '0px' : '6px',\n 'margin-right': inbound ? '6px' : '0px'\n }\">\n @if (attendeeImage) {\n <img class=\"sd_waba_unselectable\" src=\"{{ attendeeImage }}\" alt=\"{{ attendeeName || 'Attendee' }}\" (error)=\"onAttendeeImageError(attendeeRaw)\" />\n } @else {\n <ngx-avatars class=\"sd_waba_unselectable\" [initialsSize]=\"2\" [size]=\"28\" [round]=\"true\" [name]=\"attendeeName\"></ngx-avatars>\n }\n </div>\n\n <!-- Message bubble -->\n <div class=\"sd_waba_container_message_wrapper\"\n [ngStyle]=\"{ 'float': inbound ? 'left' : 'right', 'text-align': inbound ? 'left' : 'right' }\">\n\n @if (inbound) {\n <span class=\"sd_waba_bubble_arrow_left\"></span>\n } @else {\n <span class=\"sd_waba_bubble_arrow_right\"></span>\n }\n\n <div class=\"sd_waba_container_message_bubble\" [ngClass]=\"{ 'sd_waba_container_message_bubble_attachment': hasHeaderMediaTemplate() || message?.messageAttachments?.items?.length || (location?.latitude && location?.longitude) }\" [ngStyle]=\"{\n 'background': inbound ? '#fff' : '#d9fdd3',\n 'border-top-left-radius': inbound ? '0px' : '7.5px',\n 'border-top-right-radius': inbound ? '7.5px' : '0px'\n }\">\n\n <!-- per-message options -->\n @if (!isRestrictedToTemplateReplies) {\n <div class=\"sd_waba_container_message_actions\">\n <button class=\"sd_waba_button_message_actions_toggle\" type=\"button\" title=\"More options\"\n [matMenuTriggerFor]=\"conversationMessageOptions\">\n <svg width=\"13px\" viewBox=\"0 0 448 512\"><path fill=\"currentColor\" d=\"M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"/></svg>\n </button>\n <mat-menu #conversationMessageOptions=\"matMenu\">\n <button mat-menu-item class=\"sd_waba_btn_reply\" (click)=\"setAsReferenceMessage()\">\n <div class=\"sd_waba_btn_outer\">\n <span class=\"sd_waba_button_inner\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"><path fill=\"currentColor\" d=\"M760-200v-160q0-50-35-85t-85-35H273l144 144-57 56-240-240 240-240 57 56-144 144h367q83 0 141.5 58.5T840-360v160h-80Z\"/></svg>\n </span>\n <span class=\"sd_waba_button_text\">Reply</span>\n </div>\n </button>\n </mat-menu>\n </div>\n }\n\n <!-- Templated Message -->\n @if (isTemplatedMessage()) {\n @for (component of parseMessageTemplateComponents?.(message?.metadata) ?? []; track $index) {\n @switch (component?.type) {\n @case ('HEADER') {\n @switch (component?.format) {\n @case ('TEXT') {\n <h3>{{ component?.text }}</h3>\n }\n @case ('IMAGE') {\n <div class=\"sd_waba_container_template_header_image\">\n <img class=\"sd_waba_unselectable\" [src]=\"component?.example?.header_handle?.[0]\" alt=\"{{ component?.example?.header_handle?.[0] }}\">\n </div>\n }\n @case ('VIDEO') {\n <div class=\"sd_waba_container_template_media\">\n <video class=\"sd_waba_unselectable\" [src]=\"component?.example?.header_handle?.[0]\" controls></video>\n </div>\n }\n @case ('DOCUMENT') {\n <div class=\"sd_waba_container_template_media\">\n <a [href]=\"component?.example?.header_handle?.[0]\" target=\"_blank\">\n <i class=\"fa-regular fa-file\"></i>\n </a>\n </div>\n }\n @case ('LOCATION') {\n\n @if (location?.latitude && location?.longitude) {\n <div class=\"sd_waba_container_template_media\">\n <span class=\"sd_waba_trigger_location_preview\" (click)=\"openLocation(location.latitude, location.longitude)\">\n <img class=\"sd_waba_unselectable\" [src]=\"getMapPreview(location.latitude, location.longitude)\" alt=\"Location\">\n </span>\n </div>\n <!-- <p><b>{{ location?.name }}</b></p>\n <p>{{ location?.address }}</p> -->\n }\n }\n @default {\n Unsupported header format: {{ component?.format }}\n }\n }\n }\n\n @case ('BODY') {\n @if (component?.text?.trim().length > 0) {\n <p [innerHTML]=\"component?.text | WhatsAppTextFormatter\"></p>\n }\n }\n\n @case ('FOOTER') {\n <div class=\"sd_waba_container_template_footer\">\n <div class=\"sd_waba_text_template_footer\">\n {{ component?.text }}\n </div>\n </div>\n\n <div class=\"sd_waba_container_template_timestamp\">\n <label class=\"sd_waba_text_template_timestamp\">{{ message?.createdAt | formatEpochTimestamp: 'medium' }}</label>\n @if (!inbound) {\n @if (message?.temp_isSending) {\n <span class=\"sd_waba_icon_status_sending\"></span>\n } @else {\n <span class=\"sd_waba_icon_status_sent\"><svg width=\"11px\" height=\"11px\" viewBox=\"0 0 448 512\"><path fill=\"currentColor\" d=\"M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z\"/></svg></span>\n }\n }\n </div>\n }\n\n @case ('BUTTONS') {\n <div class=\"sd_waba_container_template_buttons\">\n @for (button of component?.buttons ?? []; track $index) {\n @switch (button?.type) {\n @case ('COPY_CODE') {\n <button type=\"button\">\n <i class=\"fa-regular fa-copy\"></i>\n {{ button?.text }}\n </button>\n }\n @case ('PHONE_NUMBER') {\n <button type=\"button\">\n <i class=\"fa-solid fa-phone\"></i>\n {{ button?.text }} - {{ button?.phone_number }}\n </button>\n }\n @case ('QUICK_REPLY') {\n <button type=\"button\">\n <i class=\"fa-regular fa-reply\"></i>\n {{ button?.text }}\n </button>\n }\n @case ('URL') {\n <a [href]=\"button?.url\" target=\"_blank\" class=\"sd_waba_button_template_web_link\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n Go to {{ button?.text }}\n </a>\n }\n @default {\n <button type=\"button\">\n {{ button?.text }}\n </button>\n }\n }\n }\n </div>\n }\n\n @default { }\n }\n }\n\n <!-- Errors -->\n @if (messageErrors?.length) {\n <div class=\"sd_waba_outer_container_errors\">\n <div class=\"sd_waba_container_attachment_errors\">\n <div class=\"sd_waba_container_error_header\">\n <span class=\"sd_waba_icon_error_warning\"><svg width=\"18px\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z\"/></svg></span>\n <div class=\"sd_waba_container_error_heading\">\n <p class=\"sd_waba_text_error_title\">Delivery issue</p>\n <p class=\"sd_waba_text_error_meta\">WhatsApp returned the following errors</p>\n </div>\n </div>\n\n <div class=\"sd_waba_container_error_list\">\n @for (error of messageErrors ?? []; track error?.code ?? $index) {\n <div class=\"sd_waba_container_error_item\">\n <span class=\"sd_waba_tag_error_code\">#{{ error?.code || 'N/A' }}</span>\n <div class=\"sd_waba_container_error_content\">\n <p class=\"sd_waba_text_error_message\">{{ error?.title || error?.message || 'WhatsApp error' }}</p>\n @if (getErrorDetails(error)) {\n <p class=\"sd_waba_text_error_details\">{{ getErrorDetails(error) }}</p>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n }\n\n <!-- Plain Message -->\n @else {\n <div class=\"sd_waba_container_plain_message_content\">\n\n <!-- Quoted / reference message -->\n @if (message?.referenceMessageId && referenceMessagesMap?.[message.referenceMessageId]) {\n <ng-container [ngTemplateOutlet]=\"referenceMessageTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: referenceMessagesMap[message.referenceMessageId] }\">\n </ng-container>\n }\n\n <!-- Attachments -->\n @if (message?.messageAttachments?.items?.length) {\n @for (attachment of message.messageAttachments.items; track attachment?.id ?? $index) {\n @switch (getAttachmentType?.(attachment)) {\n @case ('image') {\n <div class=\"sd_waba_container_attachment_media\">\n <img class=\"sd_waba_unselectable\" [src]=\"attachment?.file?.location\" alt=\"{{ attachment?.name || attachment?.file?.key || 'Image' }}\" />\n </div>\n }\n\n @case ('video') {\n <div class=\"sd_waba_container_attachment_media\">\n <video class=\"sd_waba_unselectable\" [src]=\"attachment?.file?.location\" controls></video>\n </div>\n }\n\n @case ('audio') {\n <div class=\"sd_waba_container_attachment_audio\" [ngClass]=\"{ 'sd_waba_container_attachment_audio_outbound' : !inbound }\">\n <audio class=\"sd_waba_unselectable\" [src]=\"attachment?.file?.location\" controls></audio>\n </div>\n }\n\n @case ('document') {\n <div class=\"sd_waba_link_attachment_outer\">\n <a class=\"sd_waba_link_attachment_document\" [ngClass]=\"{ 'sd_waba_link_attachment_document_outbound' : !inbound }\" [href]=\"attachment?.file?.location\" target=\"_blank\">\n <span class=\"sd_waba_icon_attachment_document\">\n <svg height=\"45\" viewBox=\"0 0 16 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M2 0C0.9 0 0.01 0.9 0.01 2L0 18C0 19.1 0.89 20 1.99 20H14C15.1 20 16 19.1 16 18V6.83C16 6.3 15.79 5.79 15.41 5.42L10.58 0.59C10.21 0.21 9.7 0 9.17 0H2ZM9 6V1.5L14.5 7H10C9.45 7 9 6.55 9 6ZM4 10C3.44772 10 3 10.4477 3 11C3 11.5523 3.44772 12 4 12H12C12.5523 12 13 11.5523 13 11C13 10.4477 12.5523 10 12 10H4ZM10 15C10 14.4477 9.55228 14 9 14H4C3.44772 14 3 14.4477 3 15C3 15.5523 3.44772 16 4 16H9C9.55228 16 10 15.5523 10 15Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <span class=\"sd_waba_text_attachment_name\">{{ attachment?.name || \"Attachment\" }}</span>\n </a>\n </div>\n\n }\n @default { }\n }\n }\n }\n\n <!-- Location (non-templated messages) -->\n @if (location?.latitude && location?.longitude) {\n <div class=\"sd_waba_container_attachment_media\">\n <span class=\"sd_waba_trigger_location_preview\" (click)=\"openLocation(location.latitude, location.longitude)\">\n <img class=\"sd_waba_unselectable\" [src]=\"getMapPreview(location.latitude, location.longitude)\" alt=\"Location\" />\n </span>\n </div>\n @if (location?.name) { <h6>{{ location.name }}</h6> }\n @if (location?.address) { <p>{{ location.address }}</p> }\n }\n\n <!-- Contacts -->\n @if (contacts?.length) {\n <div class=\"sd_waba_container_outer_contact\">\n <div class=\"sd_waba_container_attachment_contact\">\n @for (contact of contacts ?? []; track $index) {\n <div class=\"sd_waba_container_contact_card\">\n <div class=\"sd_waba_container_contact_header\">\n <span class=\"sd_waba_icon_contact_avatar\">\n <svg width=\"16px\" viewBox=\"0 0 448 512\"><path fill=\"currentColor\" d=\"M224 248a120 120 0 1 0 0-240 120 120 0 1 0 0 240zm-29.7 56C95.8 304 16 383.8 16 482.3 16 498.7 29.3 512 45.7 512l356.6 0c16.4 0 29.7-13.3 29.7-29.7 0-98.5-79.8-178.3-178.3-178.3l-59.4 0z\"/></svg>\n </span>\n <div class=\"sd_waba_container_contact_identity\">\n <p class=\"sd_waba_text_contact_name\">{{ contact?.name?.formatted_name || contact?.name?.first_name || 'Shared contact' }}</p>\n @if (contact?.org?.company) {\n <p class=\"sd_waba_text_contact_meta\">{{ contact?.org?.company }}</p>\n }\n @if (contact?.org?.department) {\n <p class=\"sd_waba_text_contact_meta\">{{ contact?.org?.department }}</p>\n }\n </div>\n </div>\n\n <div class=\"sd_waba_container_contact_channels\">\n @if (contact?.phones?.length) {\n @for (phone of contact?.phones ?? []; track $index) {\n <div class=\"sd_waba_container_contact_channel\">\n <span class=\"sd_waba_icon_contact_channel\"><svg width=\"12px\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M160.2 25C152.3 6.1 131.7-3.9 112.1 1.4l-5.5 1.5c-64.6 17.6-119.8 80.2-103.7 156.4 37.1 175 174.8 312.7 349.8 349.8 76.3 16.2 138.8-39.1 156.4-103.7l1.5-5.5c5.4-19.7-4.7-40.3-23.5-48.1l-97.3-40.5c-16.5-6.9-35.6-2.1-47 11.8l-38.6 47.2C233.9 335.4 177.3 277 144.8 205.3L189 169.3c13.9-11.3 18.6-30.4 11.8-47L160.2 25z\"/></svg></span>\n <div class=\"sd_waba_container_contact_channel_value\">\n <span class=\"sd_waba_text_contact_value\">{{ phone?.phone || phone?.wa_id }}</span>\n @if (phone?.type || phone?.wa_id) {\n <span class=\"sd_waba_tag_contact_label\">{{ phone?.type || 'WhatsApp' }}</span>\n }\n </div>\n </div>\n }\n }\n\n @if (contact?.emails?.length) {\n @for (email of contact?.emails ?? []; track $index) {\n <div class=\"sd_waba_container_contact_channel\">\n <span class=\"sd_waba_icon_contact_channel\"><i class=\"fa-solid fa-envelope\"></i></span>\n <div class=\"sd_waba_container_contact_channel_value\">\n <span class=\"sd_waba_text_contact_value\">{{ email?.email }}</span>\n @if (email?.type) {\n <span class=\"sd_waba_tag_contact_label\">{{ email?.type }}</span>\n }\n </div>\n </div>\n }\n }\n\n @if (contact?.addresses?.length) {\n @for (address of contact?.addresses ?? []; track $index) {\n <div class=\"sd_waba_container_contact_channel\">\n <span class=\"sd_waba_icon_contact_channel\"><i class=\"fa-solid fa-location-dot\"></i></span>\n <div class=\"sd_waba_container_contact_channel_value\">\n <span class=\"sd_waba_text_contact_value\">{{ formatContactAddress(address) }}</span>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n }\n\n <!-- Errors -->\n @if (messageErrors?.length) {\n <div class=\"sd_waba_outer_container_errors\">\n <div class=\"sd_waba_container_attachment_errors\">\n <div class=\"sd_waba_container_error_header\">\n <span class=\"sd_waba_icon_error_warning\"><svg width=\"18px\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z\"/></svg></span>\n <div class=\"sd_waba_container_error_heading\">\n <p class=\"sd_waba_text_error_title\">Delivery issue</p>\n <p class=\"sd_waba_text_error_meta\">WhatsApp returned the following errors</p>\n </div>\n </div>\n\n <div class=\"sd_waba_container_error_list\">\n @for (error of messageErrors ?? []; track error?.code ?? $index) {\n <div class=\"sd_waba_container_error_item\">\n <span class=\"sd_waba_tag_error_code\">#{{ error?.code || 'N/A' }}</span>\n <div class=\"sd_waba_container_error_content\">\n <p class=\"sd_waba_text_error_message\">{{ error?.title || error?.message || 'WhatsApp error' }}</p>\n @if (getErrorDetails(error)) {\n <p class=\"sd_waba_text_error_details\">{{ getErrorDetails(error) }}</p>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Text -->\n @if (message?.body?.trim()?.length > 0) {\n <div class=\"sd_waba_text_plain_message\" [innerHTML]=\"message.body.trim() | WhatsAppTextFormatter\"></div>\n }\n\n </div>\n\n <!-- Footer row: timestamp + sent/sending for outbound -->\n <div class=\"sd_waba_container_message_meta\">\n <span class=\"sd_waba_text_message_timestamp\">{{ message?.createdAt | formatEpochTimestamp: 'medium' }}</span>\n @if (!inbound) {\n @if (message?.temp_isSending) {\n <span class=\"sd_waba_icon_status_sending\"></span>\n } @else {\n <span class=\"sd_waba_icon_status_sent\"><svg width=\"11px\" height=\"11px\" viewBox=\"0 0 448 512\"><path fill=\"currentColor\" d=\"M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z\"/></svg></span>\n }\n }\n </div>\n }\n\n <!-- Emoji bar (hover) -->\n @if (!isRestrictedToTemplateReplies) {\n <div class=\"sd_waba_container_message_reactions\" [ngClass]=\"{ 'sd_waba_align_reactions_inbound': inbound, 'sd_waba_align_reactions_outbound': !inbound }\">\n <span class=\"sd_waba_button_message_reaction\">\n <!-- keep your emoji SVG here -->\n <svg viewBox=\"0 0 15 15\" width=\"15\" fill=\"none\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M0 7.5C0 11.6305 3.36946 15 7.5 15C11.6527 15 15 11.6305 15 7.5C15 3.36946 11.6305 0 7.5 0C3.36946 0 0 3.36946 0 7.5ZM10.995 8.69333C11.1128 8.67863 11.2219 8.66503 11.3211 8.65309C11.61 8.63028 11.8076 8.91918 11.6784 9.13965C10.8573 10.6374 9.29116 11.793 7.50455 11.793C5.71794 11.793 4.15181 10.6602 3.33072 9.16246C3.18628 8.91918 3.37634 8.63028 3.66524 8.65309C3.79123 8.66749 3.93521 8.68511 4.09426 8.70457C4.94292 8.80842 6.22074 8.96479 7.48174 8.96479C8.81855 8.96479 10.1378 8.80025 10.995 8.69333ZM5.41405 7.37207C6.05761 7.37207 6.60923 6.72851 6.60923 6.02978C6.60923 5.30348 6.05761 4.6875 5.41405 4.6875C4.77048 4.6875 4.21886 5.33106 4.21886 6.02978C4.20967 6.75609 4.77048 7.37207 5.41405 7.37207ZM10.7807 6.05619C10.7807 6.74114 10.24 7.37201 9.60912 7.37201C8.97825 7.37201 8.4375 6.76818 8.4375 6.05619C8.4375 5.37124 8.97825 4.74037 9.60912 4.74037C10.24 4.74037 10.7807 5.34421 10.7807 6.05619Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n </div>\n }\n </div>\n </div>\n\n <div class=\"sd_waba_clear\"></div>\n</div>\n\n\n<ng-template #referenceMessageTemplate let-message>\n <div class=\"sd_waba_container_reference_message_outer\">\n <div class=\"sd_waba_container_reference_message\" [ngClass]=\"{ 'sd_waba_background_incoming_bgcolor': inbound, 'sd_waba_background_outgoing_bgcolor': !inbound }\">\n <p class=\"sd_waba_reference_message_from\">{{ message?.interactionAttendee?.name }}</p>\n @if (message?.attachments?.length) {\n @for (attachment of message.attachments; track attachment?.id ?? $index) {\n <div>\n @switch (getAttachmentType(attachment)) {\n @case ('image') {\n <img src=\"{{ attachment?.file?.location }}\" alt=\"{{ attachment?.name }}\">\n }\n @case ('video') {\n <i class=\"fa-solid fa-video\"></i> {{ attachment?.name }}\n }\n @case ('audio') {\n <i class=\"fa-solid fa-headphones\"></i> {{ attachment?.name }}\n }\n @default {\n <i class=\"fa-solid fa-file\"></i> {{ attachment?.name }}\n }\n }\n </div>\n }\n }\n\n @if (parseJSON(message?.metadata)?.location) {\n <p>\n <i class=\"fa-solid fa-location-dot\"></i>\n \n {{ parseJSON(message?.metadata)?.location?.name }}, {{ parseJSON(message?.metadata)?.location?.address }}\n </p>\n }\n\n @if (parseJSON(message?.metadata)?.contacts) {\n <p>\n <i class=\"fa-solid fa-circle-user\"></i>\n \n {{ parseJSON(message?.metadata)?.contacts[0]?.name?.formatted_name }}\n </p>\n }\n\n <p>{{ message.body }}</p>\n </div>\n </div>\n</ng-template>\n","import { Injectable } from '@angular/core';\n\nimport { S3Object } from '../graphql/common.model';\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\n\nexport type WhatsappTemplateFile = {\n templateId: string;\n whatsappUrl: string;\n file: S3Object;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WhatsAppTemplateFileService {\n constructor(private readonly graphqlService: AppSyncGraphqlService) {}\n\n async GetWhatsappTemplateFile(templateId: string): Promise<WhatsappTemplateFile> {\n const statement = `query GetWhatsappTemplateFile($templateId: ID!) {\n getWhatsappTemplateFile(templateId: $templateId) {\n whatsappUrl\n file {\n key\n bucket\n location\n }\n createdAt\n updatedAt\n deletedAt\n }\n }`;\n const gqlAPIServiceArguments: any = {\n templateId,\n };\n const response = await this.graphqlService.query<{\n getWhatsappTemplateFile: WhatsappTemplateFile;\n }>(statement, gqlAPIServiceArguments);\n return response.data?.getWhatsappTemplateFile as WhatsappTemplateFile;\n }\n}\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\nimport { GoogleMapsConfig } from '../../../app.config';\n\nimport moment from 'moment-timezone';\n\n@Component({\n selector: 'lib-whatsapp-template-preview',\n templateUrl: './whatsapp-template-preview.component.html',\n styleUrl: './whatsapp-template-preview.component.css',\n standalone: false,\n})\nexport class WhatsAppTemplatePreviewComponent implements OnInit {\n @Input()\n selectedMessageTemplate!: any;\n\n @Input()\n bodyTextSegments!: Array<any>;\n\n @Input()\n templateMessageFormValue!: any;\n\n @Output('close')\n closeEv = new EventEmitter<void>();\n\n @Output('submitTemplate')\n submitTemplateEv = new EventEmitter<void>();\n\n templateMessagePreviewText!: string;\n selectedMessageTemplateComponentMap: any = {};\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n if (!this.selectedMessageTemplate) return;\n\n this.templateMessagePreviewText = '';\n for (let component of this.selectedMessageTemplate.components) {\n if (component.type === 'BODY') {\n const bodyParameters = this.templateMessageFormValue.bodyParameters;\n this.bodyTextSegments.forEach((part) => {\n if (part.input) {\n this.templateMessagePreviewText += bodyParameters?.[part.index]?.text || '';\n } else {\n this.templateMessagePreviewText += part.text;\n }\n });\n }\n this.selectedMessageTemplateComponentMap[component.type] = component;\n }\n\n this.cdr.detectChanges();\n }\n\n closePopup(): void {\n this.closeEv.emit();\n }\n\n submitPopup(): void {\n this.submitTemplateEv.emit();\n }\n\n getMapPreview(latitude: string, longitude: string): string {\n return `https://maps.googleapis.com/maps/api/staticmap?center=${latitude},${longitude}&zoom=15&size=400x250&maptype=roadmap&markers=color:red%7Clabel:S%7C${latitude},${longitude}&key=${GoogleMapsConfig.apiKey}`;\n }\n\n getCurrentTime(): number {\n return moment.utc().unix();\n }\n}\n","<div class=\"sd_waba_container_popup_grey_bg sd_waba_container_padding_business\">\n <div class=\"sd_waba_container_popup_grey sd_waba_container_template_preview_popup\">\n <div class=\"sd_waba_container_template_preview_disclaimer\">\n <h3>\n You're about to use the template\n \"<span>{{ selectedMessageTemplate.name }}</span>\"\n </h3>\n <p>Make sure you review the message content before sending.</p>\n </div>\n\n <div class=\"sd_waba_container_template_popup_content\">\n <div class=\"sd_waba_container_template_popup_content_inner\">\n <div class=\"sd_waba_container_template_preview_content\">\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_preview_padding_inner\">\n <div class=\"sd_waba_container_template_preview_message_list\">\n\n <!-- Left side sample message -->\n <div class=\"sd_waba_container_message_item\">\n <div class=\"sd_waba_container_message_image sd_waba_message_image_left\">\n <svg viewBox=\"0 0 212 212\" height=\"28\" width=\"28\" preserveAspectRatio=\"xMidYMid meet\" class=\"xh8yej3 x5yr21d\" version=\"1.1\" x=\"0px\" y=\"0px\" enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\" class=\"background\" d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\"></path>\n <g>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\"></path>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\"></path>\n </g>\n </svg>\n </div>\n <div class=\"sd_waba_container_message_item_content sd_waba_message_left_content\">\n <span class=\"sd_waba_message_arrow_left\"></span>\n <div class=\"sd_waba_container_message_content sd_waba_rounded_top_left\">\n <span class=\"sd_waba_skeleton_line_full\"></span>\n <span class=\"sd_waba_skeleton_line_full sd_waba_skeleton_line_short\"></span>\n </div>\n </div>\n <div class=\"sd_waba_clear\"></div>\n </div>\n\n <!-- Right side template message -->\n <div class=\"sd_waba_container_message_item sd_waba_container_message_item_right\">\n <div class=\"sd_waba_container_message_image sd_waba_message_image_right\">\n <svg viewBox=\"0 0 212 212\" height=\"28\" width=\"28\" preserveAspectRatio=\"xMidYMid meet\" version=\"1.1\" x=\"0px\" y=\"0px\" enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\" d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\" class=\"background\"></path>\n <g>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\"></path>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\"></path>\n </g>\n </svg>\n </div>\n\n <div class=\"sd_waba_container_message_item_content sd_waba_container_template_preview_popup_message_content sd_waba_message_right_content\">\n <span class=\"sd_waba_message_arrow_right\"></span>\n <div class=\"sd_waba_container_message_content sd_waba_dyn_bg_sd\">\n <!-- HEADER -->\n @if (selectedMessageTemplateComponentMap['HEADER']) {\n @switch (selectedMessageTemplateComponentMap['HEADER']?.format) {\n @case ('TEXT') {\n <h3>{{ selectedMessageTemplateComponentMap['HEADER']?.text }}</h3>\n }\n @case ('IMAGE') {\n <div class=\"sd_waba_container_template_image\">\n <img class=\"sd_waba_unselectable\" [src]=\"selectedMessageTemplateComponentMap['HEADER']?.example.header_handle[0]\" alt=\"{{ selectedMessageTemplateComponentMap['HEADER']?.example.header_handle[0] }}\" />\n </div>\n }\n @case ('VIDEO') {\n <div class=\"sd_waba_upload_container_sd\">\n <video class=\"sd_waba_unselectable\" [src]=\"selectedMessageTemplateComponentMap['HEADER']?.example.header_handle[0]\"></video>\n </div>\n }\n @case ('DOCUMENT') {\n <div class=\"sd_waba_upload_container_sd\">\n <a [href]=\"selectedMessageTemplateComponentMap['HEADER']?.example.header_handle[0]\" target=\"_blank\">\n <i class=\"fa-regular fa-file\"></i>\n </a>\n </div>\n }\n @case ('LOCATION') {\n <div class=\"sd_waba_upload_container_sd\">\n <img class=\"sd_waba_unselectable sd_waba_location_preview_image\" [src]=\"getMapPreview(\n templateMessageFormValue?.location?.latitude,\n templateMessageFormValue?.location?.longitude\n )\" alt=\"Location\" />\n <p><b>{{ templateMessageFormValue?.location?.name }}</b></p>\n <p>{{ templateMessageFormValue?.location?.address }}</p>\n </div>\n }\n @default {\n Unsupported header format: {{ selectedMessageTemplateComponentMap['HEADER']?.format }}\n }\n }\n }\n\n <!-- BODY -->\n @if (templateMessagePreviewText.length > 0) {\n <p [innerHTML]=\"templateMessagePreviewText | WhatsAppTextFormatter\"></p>\n }\n\n <!-- FOOTER -->\n @if (selectedMessageTemplateComponentMap['FOOTER']) {\n <div class=\"sd_waba_container_selected_template_form_footer\">\n <div class=\"sd_waba_footer_text_sd\">\n {{ selectedMessageTemplateComponentMap['FOOTER']?.text }}\n </div>\n </div>\n\n <div class=\"sd_waba_message_timestamp_container\">\n <label class=\"sd_waba_message_timestamp_preview\">\n {{ getCurrentTime() | formatEpochTimestamp : 'medium' }}\n </label>\n </div>\n }\n\n <!-- BUTTONS -->\n @if (selectedMessageTemplateComponentMap['BUTTONS']) {\n <div class=\"sd_waba_container_selected_template_form_buttons\">\n @for (button of selectedMessageTemplateComponentMap['BUTTONS']?.buttons ?? []; track $index) {\n @switch (button?.type) {\n @case ('COPY_CODE') {\n <button type=\"button\">\n <i class=\"fa-regular fa-copy\"></i> {{ button?.text }}\n </button>\n }\n @case ('PHONE_NUMBER') {\n <button type=\"button\">\n <i class=\"fa-solid fa-phone\"></i> {{ button?.text }} - {{ button?.phone_number }}\n </button>\n }\n @case ('QUICK_REPLY') {\n <button type=\"button\">\n <i class=\"fa-regular fa-reply\"></i> {{ button?.text }}\n </button>\n }\n @case ('URL') {\n <a [href]=\"button?.url\" target=\"_blank\" class=\"sd_waba_button_web_link\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Go to {{ button?.text }}\n </a>\n }\n @default {\n <button type=\"button\">{{ button?.text }}</button>\n }\n }\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Bottom buttons -->\n <div class=\"sd_waba_container_bottom_buttons\">\n <div class=\"sd_waba_container_selected_template_buttons_right\">\n <ul>\n <li>\n <button type=\"button\" class=\"sd_waba_button_cancel_preview\" (click)=\"closePopup()\">Cancel</button>\n </li>\n <li>\n <button type=\"submit\" class=\"sd_waba_button_submit\" (click)=\"submitPopup()\">Send</button>\n <!-- <button type=\"submit\" class=\"sd_waba_button_submit\" (click)=\"submitPopup()\"\n [ngClass]=\"{ 'button_submit_disabled' : showSubmitLoader }\"\n [disabled]=\"showSubmitLoader\">\n <span *ngIf=\"!showSubmitLoader else showSubmitLoaderTemplate\">Send</span>\n <ng-template #showSubmitLoaderTemplate>\n <span class=\"sd_waba_button_submit_loader\"></span>\n </ng-template>\n </button> -->\n </li>\n </ul>\n </div>\n </div>\n </div>\n\n <div class=\"sd_waba_clear\"></div>\n </div>\n</div>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n OnDestroy,\n Output,\n Renderer2,\n ViewChild,\n} from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { CustomValidators } from '@snugdesk/core';\nimport { GoogleMapsConfig } from '../../../../app.config';\n\ndeclare const google: any;\n\n@Component({\n selector: 'lib-location-input',\n templateUrl: './location-input.component.html',\n styleUrls: ['./location-input.component.css'],\n standalone: false,\n})\nexport class LocationInputComponent implements AfterViewInit, OnDestroy {\n @Output('close')\n closeEv = new EventEmitter<void>();\n\n @Output('submitLocation')\n submitLocationEv = new EventEmitter<{\n latitude: number;\n longitude: number;\n }>();\n\n @ViewChild('mapContainer', { static: false })\n mapContainer!: ElementRef<HTMLDivElement>;\n @ViewChild('searchInput', { static: false })\n searchInput!: ElementRef<HTMLInputElement>;\n\n private autocomplete!: any;\n\n currentLatitude!: number;\n currentLongitude!: number;\n\n map: any;\n primaryMarker: any; // single draggable marker\n resultMarkers: any[] = []; // non-draggable search result markers\n infoWindow: any;\n placesService: any;\n\n selectedLatitude!: number;\n selectedLongitude!: number;\n\n searchLocationForm: FormGroup;\n\n private destroyed = false;\n private mapsScriptLoading?: Promise<void>;\n\n constructor(\n private el: ElementRef,\n private renderer: Renderer2,\n private formBuilder: FormBuilder,\n private snackBar: MatSnackBar\n ) {\n this.searchLocationForm = this.formBuilder.group({\n text: ['', [Validators.required, CustomValidators.whitespace]],\n });\n }\n\n async ngAfterViewInit(): Promise<void> {\n try {\n await this.loadGoogleMapsScriptOnce();\n await this.ensureMapsCoreReady();\n\n // Ensure container has some height so the map renders\n const el = this.mapContainer?.nativeElement;\n if (\n el &&\n (el.offsetHeight || parseFloat(getComputedStyle(el).height || '0')) < 50\n ) {\n el.style.minHeight = '320px';\n }\n\n // Current location\n const position = await this.getCurrentLocation();\n if (this.destroyed) return;\n\n this.currentLatitude = position.coords.latitude;\n this.currentLongitude = position.coords.longitude;\n\n const center = { lat: this.currentLatitude, lng: this.currentLongitude };\n this.setSelected(center.lat, center.lng);\n\n // Map\n this.map = new google.maps.Map(this.mapContainer.nativeElement, {\n center,\n zoom: 15,\n });\n\n // Primary draggable marker\n this.primaryMarker = new google.maps.Marker({\n position: center,\n map: this.map,\n draggable: true,\n title: 'Drag me!',\n });\n\n // Drag -> update selection\n this.primaryMarker.addListener('dragend', (event: any) => {\n if (!event?.latLng) return;\n const { lat, lng } = this.latLngToNumbers(event.latLng);\n this.setSelected(lat, lng);\n });\n\n // Click map -> move primary + select\n this.map.addListener('click', (e: any) => {\n if (!e?.latLng) return;\n const { lat, lng } = this.latLngToNumbers(e.latLng);\n this.primaryMarker.setPosition({ lat, lng });\n this.map.panTo({ lat, lng });\n this.setSelected(lat, lng);\n });\n\n this.infoWindow = new google.maps.InfoWindow();\n\n // PlacesService for Text Search and Details\n if (google?.maps?.places?.PlacesService) {\n this.placesService = new google.maps.places.PlacesService(this.map);\n }\n\n // Autocomplete (no types/country restrictions -> broader results like Google Maps)\n if (\n google?.maps?.places?.Autocomplete &&\n this.searchInput?.nativeElement\n ) {\n this.autocomplete = new google.maps.places.Autocomplete(\n this.searchInput.nativeElement,\n {\n fields: ['place_id', 'geometry', 'name', 'formatted_address'],\n }\n );\n // Do NOT bind to bounds for broader suggestions\n // this.autocomplete.bindTo('bounds', this.map);\n\n this.autocomplete.addListener('place_changed', () => {\n const place = this.autocomplete.getPlace();\n if (!place) return;\n\n const moveTo = (latLng: any, title?: string) => {\n const lat =\n typeof latLng.lat === 'function' ? latLng.lat() : latLng.lat;\n const lng =\n typeof latLng.lng === 'function' ? latLng.lng() : latLng.lng;\n this.primaryMarker.setPosition({ lat, lng });\n this.map.setCenter({ lat, lng });\n this.map.setZoom(16);\n this.setSelected(lat, lng);\n if (this.infoWindow) {\n this.infoWindow.setContent(\n title || place.formatted_address || place.name || ''\n );\n this.infoWindow.open(this.map, this.primaryMarker);\n }\n };\n\n if (place.geometry?.location) {\n moveTo(place.geometry.location, place.name);\n return;\n }\n\n if (place.place_id && this.placesService?.getDetails) {\n this.placesService.getDetails(\n {\n placeId: place.place_id,\n fields: ['geometry', 'name', 'formatted_address'],\n },\n (p: any, status: any) => {\n if (\n status === google.maps.places.PlacesServiceStatus.OK &&\n p?.geometry?.location\n ) {\n moveTo(p.geometry.location, p.name);\n }\n }\n );\n }\n });\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(\n 'Oops! We encountered an error. Please try again.',\n 'Close',\n {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n }\n );\n }\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n }\n\n // --- UI actions ---\n onSearch(evt: Event): void {\n evt?.preventDefault();\n evt?.stopPropagation();\n this.findPlace();\n }\n\n setCurrentLocation(): void {\n if (!this.map || !this.primaryMarker) return;\n\n // Clear only result markers; keep the primary marker\n this.clearResultMarkers();\n\n const myLatLng = { lat: this.currentLatitude, lng: this.currentLongitude };\n this.primaryMarker.setPosition(myLatLng);\n this.setSelected(myLatLng.lat, myLatLng.lng);\n this.map.setCenter(myLatLng);\n }\n\n selectLocation(): void {\n this.submitLocationEv.emit({\n latitude: this.selectedLatitude,\n longitude: this.selectedLongitude,\n });\n }\n\n close(): void {\n this.closeEv.emit();\n }\n\n // --- Search: prefer Text Search, then new searchByText, then findPlaceFromQuery ---\n async findPlace(): Promise<void> {\n if (this.searchLocationForm.invalid || !this.map) return;\n\n const textQuery = (this.searchLocationForm.value.text || '').trim();\n if (!textQuery) return;\n\n try {\n // Clear ONLY result markers before a new search\n this.clearResultMarkers();\n\n // Helpers\n const centerOnLatLng = (lat: number, lng: number, title?: string) => {\n this.primaryMarker.setPosition({ lat, lng });\n this.map.setCenter({ lat, lng });\n this.map.setZoom(16);\n this.setSelected(lat, lng);\n if (title) {\n this.infoWindow?.setContent(title);\n this.infoWindow?.open(this.map, this.primaryMarker);\n }\n };\n\n const addResultMarker = (pos: any, title: string) => {\n const marker = new google.maps.Marker({\n map: this.map,\n position: pos,\n title: title || '',\n });\n this.resultMarkers.push(marker);\n marker.addListener('click', () => {\n const lat = typeof pos.lat === 'function' ? pos.lat() : pos.lat;\n const lng = typeof pos.lng === 'function' ? pos.lng() : pos.lng;\n this.primaryMarker.setPosition({ lat, lng });\n this.map.panTo({ lat, lng });\n this.setSelected(lat, lng);\n this.infoWindow?.setContent(title || '');\n this.infoWindow?.open(this.map, marker);\n });\n };\n\n const tryFindPlaceFromQuery = async (): Promise<void> =>\n new Promise<void>((resolve) => {\n if (!this.placesService?.findPlaceFromQuery) return resolve();\n const req = { query: textQuery, fields: ['name', 'geometry'] };\n this.placesService.findPlaceFromQuery(\n req,\n (results: any[], status: any) => {\n if (\n status === google.maps.places.PlacesServiceStatus.OK &&\n results?.length\n ) {\n const first = results[0];\n if (first.geometry?.location) {\n const lat = first.geometry.location.lat();\n const lng = first.geometry.location.lng();\n centerOnLatLng(lat, lng, first.name);\n }\n for (const place of results) {\n if (!place.geometry?.location) continue;\n addResultMarker(place.geometry.location, place.name || '');\n }\n }\n resolve();\n }\n );\n });\n\n const trySearchByText = async (): Promise<void> => {\n const Place = google?.maps?.places?.Place as any;\n if (!(Place && typeof Place.searchByText === 'function')) {\n await tryFindPlaceFromQuery();\n return;\n }\n const request: any = { textQuery, fields: ['displayName', 'location'] };\n const { places } = await Place.searchByText(request);\n if (places?.length) {\n const first = places[0];\n if (first.location) {\n const { lat, lng } = this.latLngishToNumbers(first.location);\n centerOnLatLng(lat, lng, first.displayName || '');\n }\n for (const p of places) {\n if (!p.location) continue;\n addResultMarker(p.location, p.displayName || '');\n }\n } else {\n await tryFindPlaceFromQuery();\n }\n };\n\n // 1) Prefer Text Search for broad matching (businesses + addresses)\n if (this.placesService?.textSearch) {\n this.placesService.textSearch(\n { query: textQuery },\n async (results: any[], status: any) => {\n if (\n status === google.maps.places.PlacesServiceStatus.OK &&\n results?.length\n ) {\n const first = results[0];\n if (first.geometry?.location) {\n const lat = first.geometry.location.lat();\n const lng = first.geometry.location.lng();\n centerOnLatLng(lat, lng, first.name);\n }\n for (const place of results) {\n if (!place.geometry?.location) continue;\n addResultMarker(place.geometry.location, place.name || '');\n }\n } else {\n // 2) Fallback to new Places API searchByText\n await trySearchByText();\n }\n }\n );\n return;\n }\n\n // If Text Search not available, try new Places API next\n await trySearchByText();\n\n if (!this.resultMarkers.length) {\n this.snackBar.open('No results found for your search.', 'Close', {\n duration: 3500,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open('Search failed. Please try again.', 'Close', {\n duration: 4000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n }\n }\n\n // --- Helpers ---\n private setSelected(lat: number, lng: number): void {\n this.selectedLatitude = lat;\n this.selectedLongitude = lng;\n }\n\n private clearResultMarkers(): void {\n for (const m of this.resultMarkers) {\n try {\n m.setMap(null);\n } catch {}\n }\n this.resultMarkers = [];\n }\n\n private latLngToNumbers(latLng: any): { lat: number; lng: number } {\n return {\n lat: typeof latLng.lat === 'function' ? latLng.lat() : latLng.lat,\n lng: typeof latLng.lng === 'function' ? latLng.lng() : latLng.lng,\n };\n }\n\n private latLngishToNumbers(input: any): { lat: number; lng: number } {\n if (input && typeof input.lat === 'function') {\n return { lat: input.lat(), lng: input.lng() };\n }\n return { lat: input.lat, lng: input.lng };\n }\n\n private async loadGoogleMapsScriptOnce(): Promise<void> {\n // Already loaded?\n if (typeof window !== 'undefined' && (window as any).google?.maps?.Map)\n return;\n if (this.mapsScriptLoading) return this.mapsScriptLoading;\n\n const apiKey = GoogleMapsConfig.apiKey; // from your app.config\n const src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&v=weekly&libraries=places&loading=async`;\n\n this.mapsScriptLoading = new Promise<void>((resolve, reject) => {\n const finishWhenReady = () => {\n const ready =\n (window as any).google?.maps &&\n typeof (window as any).google.maps.Map === 'function';\n if (ready) resolve();\n else setTimeout(finishWhenReady, 50);\n };\n\n // If any Google Maps script tag exists, poll until ready\n if (\n document.querySelector(\n 'script[src^=\"https://maps.googleapis.com/maps/api/js\"]'\n )\n ) {\n finishWhenReady();\n return;\n }\n\n const script = this.renderer.createElement('script');\n script.type = 'text/javascript';\n script.src = src;\n script.async = true;\n script.defer = true;\n script.onload = finishWhenReady;\n script.onerror = () =>\n reject(new Error('Failed to load Google Maps JS API'));\n\n // Append inside this component element (per your preference)\n this.renderer.appendChild(this.el.nativeElement, script);\n });\n\n return this.mapsScriptLoading;\n }\n\n private async ensureMapsCoreReady(): Promise<void> {\n const maxWaitMs = 4000;\n const start = Date.now();\n while (!(google?.maps && typeof google.maps.Map === 'function')) {\n if (Date.now() - start > maxWaitMs) break;\n await new Promise((r) => setTimeout(r, 30));\n }\n if (!(google?.maps && typeof google.maps.Map === 'function')) {\n throw new Error(\n 'Google Maps core not ready (Map constructor unavailable).'\n );\n }\n }\n\n private getCurrentLocation(): Promise<GeolocationPosition> {\n return new Promise((resolve, reject) => {\n if (!navigator.geolocation) {\n reject(new Error('Geolocation is not supported by this browser.'));\n return;\n }\n navigator.geolocation.getCurrentPosition(resolve, reject, {\n enableHighAccuracy: true,\n timeout: 15000,\n });\n });\n }\n}\n","<div class=\"sd_waba_container_popup_grey_bg sd_waba_container_padding_business\">\n <div class=\"sd_waba_container_popup_grey sd_waba_container_template_popup\">\n <div class=\"sd_waba_header_area_top\">\n <h2>Select Location</h2>\n <div class=\"sd_waba_close_right_top\">\n <span title=\"Close\" (click)=\"close()\">\n <svg class=\"svg-inline--fa fa-xmark\" aria-hidden=\"true\" width=\"18px\" focusable=\"false\" viewBox=\"0 0 384 512\">\n <path fill=\"currentColor\"\n d=\"M326.6 166.6L349.3 144 304 98.7l-22.6 22.6L192 210.7l-89.4-89.4L80 98.7 34.7 144l22.6 22.6L146.7 256 57.4 345.4 34.7 368 80 413.3l22.6-22.6L192 301.3l89.4 89.4L304 413.3 349.3 368l-22.6-22.6L237.3 256l89.4-89.4z\">\n </path>\n </svg>\n </span>\n </div>\n </div>\n\n <div class=\"sd_waba_container_search\">\n <form class=\"sd_waba_search_location_form\" [formGroup]=\"searchLocationForm\" (ngSubmit)=\"onSearch($event)\">\n <div class=\"sd_waba_search_area_templates\">\n <button type=\"button\" class=\"sd_waba_search_icon\" title=\"Search\" (click)=\"findPlace()\" (mousedown)=\"$event.preventDefault()\">\n <svg viewBox=\"0 0 20 20\" height=\"18\" width=\"18\" fill=\"none\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4.36653 4.3664C5.36341 3.36953 6.57714 2.87 8.00012 2.87C9.42309 2.87 10.6368 3.36953 11.6337 4.3664C12.6306 5.36329 13.1301 6.57724 13.1301 8.00062C13.1301 8.57523 13.0412 9.11883 12.8624 9.63057C12.6972 10.1038 12.4733 10.5419 12.1909 10.9444L16.5712 15.3247C16.7454 15.4989 16.8385 15.7046 16.8385 15.9375C16.8385 16.1704 16.7454 16.3761 16.5712 16.5503C16.396 16.7254 16.1866 16.8175 15.948 16.8175C15.7095 16.8175 15.5001 16.7254 15.3249 16.5503L10.9448 12.1906C10.5421 12.4731 10.104 12.697 9.63069 12.8623C9.11895 13.041 8.57535 13.13 8.00074 13.13C6.57736 13.13 5.36341 12.6305 4.36653 11.6336C3.36965 10.6367 2.87012 9.42297 2.87012 8C2.87012 6.57702 3.36965 5.36328 4.36653 4.3664ZM8.00012 4.63C7.06198 4.63 6.26877 4.95685 5.61287 5.61275C4.95698 6.26865 4.63012 7.06186 4.63012 8C4.63012 8.93813 4.95698 9.73134 5.61287 10.3872C6.26877 11.0431 7.06198 11.37 8.00012 11.37C8.93826 11.37 9.73146 11.0431 10.3874 10.3872C11.0433 9.73134 11.3701 8.93813 11.3701 8C11.3701 7.06186 11.0433 6.26865 10.3874 5.61275C9.73146 4.95685 8.93826 4.63 8.00012 4.63Z\" fill=\"currentColor\"></path></svg>\n </button>\n <input formControlName=\"text\" type=\"text\" placeholder=\"Search for a location\" #searchInput />\n </div>\n </form>\n <button class=\"sd_waba_current_location_btn\" type=\"button\" (click)=\"setCurrentLocation()\">\n <i class=\"fa-solid fa-location-crosshairs\"></i> Current Location\n </button>\n </div>\n\n <div class=\"sd_waba_container_template_popup_content\">\n <div class=\"sd_waba_container_template_popup_content_inner\">\n <div class=\"sd_waba_container_inner_outer\">\n <div class=\"sd_waba_container_map\">\n <div id=\"map\" #mapContainer></div>\n </div>\n </div>\n </div>\n\n <div class=\"sd_waba_container_bottom_buttons\">\n <div class=\"container_selected_template_buttons\">\n <div class=\"sd_waba_container_submit_btn\">\n <button type=\"button\" class=\"sd_waba_add_btn\" (click)=\"selectLocation()\">\n Add Location\n </button>\n </div>\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { HttpClient } from '@angular/common/http';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { lastValueFrom } from 'rxjs';\n\nimport { CleanDeep, CustomValidators } from '@snugdesk/core';\nimport { GoogleMapsConfig } from '../../../app.config';\nimport { InteractionWidget } from '../../services/interaction-widget.service';\nimport { WhatsAppHelperService } from '../../services/whatsapp-helper.service';\nimport { WhatsAppTemplateFileService } from '../../services/whatsapp-template-file.service';\n\n@Component({\n selector: 'lib-whatsapp-templates',\n templateUrl: './whatsapp-templates.component.html',\n styleUrls: ['./whatsapp-templates.component.css'],\n standalone: false,\n})\nexport class WhatsAppTemplatesComponent implements OnInit {\n @Input('whatsAppInteractionWidget')\n whatsAppInteractionWidget!: InteractionWidget;\n\n @Output('close')\n closeEv = new EventEmitter<void>();\n\n @Output('submitTemplate')\n submitTemplateEv = new EventEmitter<Object>();\n\n showTemplatesLoader: boolean = false;\n messageTemplates: any = [];\n selectedMessageTemplate!: any;\n\n searchQuery: string = '';\n\n templateMessageForm!: FormGroup;\n bodyTextSegments: Array<any> = [];\n\n showLocationPopup: boolean = false;\n showTemplatePreviewPopup: boolean = false;\n\n isFormSubmitted: boolean = false;\n\n get bodyParameters(): FormArray {\n return this.templateMessageForm.get('bodyParameters') as FormArray;\n }\n\n get bodyParameterGroups(): FormGroup[] {\n return this.bodyParameters.controls as FormGroup[];\n }\n\n constructor(private cdr: ChangeDetectorRef, private httpClient: HttpClient, private formBuilder: FormBuilder, private snackBar: MatSnackBar, private waHelperService: WhatsAppHelperService, private whatsappTemplateFileService: WhatsAppTemplateFileService) {\n this.templateMessageForm = this.formBuilder.group({\n bodyParameters: this.formBuilder.array([]),\n });\n }\n\n async ngOnInit(): Promise<void> {\n this.messageTemplates = [];\n\n this.showTemplatesLoader = true;\n try {\n const { businessAccountId, accessToken } = JSON.parse(this.whatsAppInteractionWidget?.configuration || '{}');\n if (!businessAccountId || !accessToken) {\n throw new Error('WhatsApp Business Account not configured');\n }\n\n const res_listMessageTemplates: any = await this.waHelperService.listMessageTemplates(businessAccountId, accessToken);\n // console.debug('res_listMessageTemplates: ', res_listMessageTemplates);\n\n this.messageTemplates = res_listMessageTemplates || [];\n\n // select the first approved template\n for (const template of this.messageTemplates) {\n if (template.status?.trim().toUpperCase() === 'APPROVED') {\n this.setSelectedMessageTemplate(template);\n break;\n }\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch WhatsApp templates`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showTemplatesLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n setSelectedMessageTemplate(template: any): void {\n if (template.status !== 'APPROVED') return;\n\n // reset\n this.isFormSubmitted = false;\n this.templateMessageForm.reset();\n this.bodyTextSegments = [];\n this.bodyParameters.clear();\n\n this.showLocationPopup = false;\n this.showTemplatePreviewPopup = false;\n\n this.selectedMessageTemplate = template;\n this.setMessageTemplateComponents(template.components);\n\n // console.debug('templateMessageForm: ', this.templateMessageForm);\n // console.debug('bodyTextSegments: ', this.bodyTextSegments);\n // console.debug('bodyParameters: ', this.bodyParameters);\n // console.debug('bodyParameterGroups: ', this.bodyParameterGroups);\n this.cdr.detectChanges();\n }\n\n setMessageTemplateComponents(templateComponents: any[]) {\n if (!templateComponents || templateComponents.length === 0) return;\n\n templateComponents.forEach((templateComponent) => {\n switch (templateComponent.type) {\n case 'BODY': {\n this.bodyTextSegments = this.splitTemplateText(templateComponent);\n const bodyTextExamples = templateComponent.example?.body_text?.[0] || [];\n for (let _ of bodyTextExamples) {\n this.bodyParameters.push(\n this.formBuilder.group({\n type: ['body'],\n text: ['', Validators.required],\n })\n );\n }\n break;\n }\n\n case 'HEADER': {\n const headerFormat = templateComponent.format;\n const headerExample = templateComponent.example;\n\n if (['IMAGE', 'VIDEO', 'DOCUMENT'].includes(headerFormat)) {\n const media = headerExample?.header_handle?.[0];\n if (media) {\n if (!this.templateMessageForm.contains('mediaUrl')) {\n this.templateMessageForm.addControl('mediaUrl', this.formBuilder.control(media, CustomValidators.whitespace));\n } else {\n this.templateMessageForm.patchValue({ mediaUrl: media });\n }\n }\n }\n\n if (headerFormat === 'LOCATION') {\n if (!this.templateMessageForm.contains('location')) {\n this.templateMessageForm.addControl(\n 'location',\n this.formBuilder.group({\n name: [''],\n address: [''],\n latitude: ['', Validators.required],\n longitude: ['', Validators.required],\n })\n );\n }\n }\n break;\n }\n\n case 'BUTTONS': {\n const buttons = templateComponent.buttons || [];\n for (const button of buttons) {\n const example = button.example?.[0] || '';\n switch (button.type) {\n case 'COPY_CODE':\n if (example) {\n if (!this.templateMessageForm.contains('couponCode')) {\n this.templateMessageForm.addControl('couponCode', this.formBuilder.control(example, CustomValidators.whitespace));\n } else {\n this.templateMessageForm.patchValue({\n couponCode: example,\n });\n }\n }\n break;\n case 'PHONE_NUMBER':\n this.bodyParameters.push(\n this.formBuilder.group({\n type: ['phone'],\n index: [button.index ?? 0],\n phoneNumber: [example, Validators.required],\n text: [button.text || '', Validators.required],\n })\n );\n break;\n case 'URL':\n this.bodyParameters.push(\n this.formBuilder.group({\n type: ['url'],\n index: [button.index ?? 0],\n url: [example, Validators.required],\n text: [button.text || '', Validators.required],\n })\n );\n break;\n case 'QUICK_REPLY':\n this.bodyParameters.push(\n this.formBuilder.group({\n type: ['quick_reply'],\n index: [button.index ?? 0],\n text: [button.text || '', Validators.required],\n })\n );\n break;\n }\n }\n break;\n }\n }\n });\n }\n\n splitTemplateText(component: any): any[] {\n const regex = /{{(\\d+)}}/g;\n let lastIndex = 0;\n let match: any;\n let inputIndex = 0;\n\n const text = component.text;\n const messageTemplateParts: any[] = [];\n\n while ((match = regex.exec(text)) !== null) {\n const textPart = text.substring(lastIndex, match.index);\n if (textPart) {\n messageTemplateParts.push({ text: textPart, input: false });\n }\n\n messageTemplateParts.push({\n text: '',\n input: true,\n index: inputIndex,\n placeholder: component?.example?.body_text[0][inputIndex],\n });\n\n inputIndex++;\n lastIndex = regex.lastIndex;\n }\n\n const remainingText = text.substring(lastIndex);\n if (remainingText) {\n messageTemplateParts.push({ text: remainingText, input: false });\n }\n\n return messageTemplateParts;\n }\n\n closePopup(): void {\n this.closeEv.emit();\n }\n\n openMessageTemplatePreviewPopup(): void {\n // console.debug('templateMessageForm: ', this.templateMessageForm);\n this.isFormSubmitted = true;\n this.templateMessageForm.markAllAsTouched();\n\n if (this.templateMessageForm.invalid) {\n // console.warn('Invalid form submission: ', this.templateMessageForm);\n return;\n }\n\n this.showTemplatePreviewPopup = true;\n this.cdr.detectChanges();\n }\n\n closeTemplatePreviewPopup(): void {\n this.showTemplatePreviewPopup = false;\n this.cdr.detectChanges();\n }\n\n async handleSubmitTemplatePreviewPopup(): Promise<void> {\n const { mediaUrl, couponCode, location, bodyParameters } = this.templateMessageForm.value;\n\n // Fetch uploaded media URL if applicable\n let resolvedMediaUrl = '';\n if (mediaUrl?.length > 0) {\n const res_getTemplateFile = await this.whatsappTemplateFileService.GetWhatsappTemplateFile(this.selectedMessageTemplate.id);\n // console.debug('res_getTemplateFile:', res_getTemplateFile);\n\n if (!res_getTemplateFile.file?.location) {\n throw new Error('File location not found');\n }\n\n resolvedMediaUrl = res_getTemplateFile.file.location;\n }\n\n // Emit final cleaned payload\n this.submitTemplateEv.emit(\n CleanDeep.clean({\n template: this.selectedMessageTemplate,\n bodyTextSegments: this.bodyTextSegments,\n bodyParameters,\n mediaUrl: resolvedMediaUrl,\n location,\n couponCode,\n })\n );\n }\n\n openLocationPopup(): void {\n this.showLocationPopup = true;\n this.cdr.detectChanges();\n }\n\n closeLocationPopup(): void {\n this.showLocationPopup = false;\n this.cdr.detectChanges();\n }\n\n async handleLocationSelection(event: any): Promise<void> {\n try {\n const geocodeUrl = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${event.latitude},${event.longitude}&key=${GoogleMapsConfig.apiKey}`;\n const res_getGeolocation: any = await lastValueFrom(this.httpClient.get(geocodeUrl));\n\n const locationGroup = this.templateMessageForm.get('location') as FormGroup;\n if (locationGroup) {\n locationGroup.patchValue({\n latitude: event.latitude,\n longitude: event.longitude,\n address: res_getGeolocation.results?.[0]?.formatted_address,\n });\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not get location`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showLocationPopup = false;\n this.cdr.detectChanges();\n }\n }\n\n getMapPreview(latitude: string, longitude: string): string {\n return `https://maps.googleapis.com/maps/api/staticmap?center=${latitude},${longitude}&zoom=15&size=400x250&maptype=roadmap&markers=color:red%7Clabel:S%7C${latitude},${longitude}&key=${GoogleMapsConfig.apiKey}`;\n }\n}\n","<div class=\"sd_waba_container_popup_grey_bg sd_waba_container_padding_business\">\n <div class=\"sd_waba_container_popup_grey sd_waba_container_template_popup\">\n <div class=\"sd_waba_container_template_popup_button_close\">\n <span title=\"Close\" (click)=\"closePopup()\">\n <svg class=\"svg-inline--fa fa-xmark\" aria-hidden=\"true\" width=\"18px\" focusable=\"false\" data-prefix=\"fass\" data-icon=\"xmark\"\n role=\"img\" viewBox=\"0 0 384 512\" data-fa-i2svg=\"\">\n <path fill=\"currentColor\"\n d=\"M326.6 166.6L349.3 144 304 98.7l-22.6 22.6L192 210.7l-89.4-89.4L80 98.7 34.7 144l22.6 22.6L146.7 256 57.4 345.4 34.7 368 80 413.3l22.6-22.6L192 301.3l89.4 89.4L304 413.3 349.3 368l-22.6-22.6L237.3 256l89.4-89.4z\">\n </path>\n </svg>\n </span>\n </div>\n <div class=\"sd_waba_container_template_popup_header\">\n <h2>WhatsApp message templates</h2>\n </div>\n <div class=\"sd_waba_container_template_popup_content\">\n <div class=\"sd_waba_container_template_popup_content_inner\">\n <div class=\"sd_waba_container_inner_outer\">\n<div class=\"sd_waba_left_container_st_content\">\n <div class=\"sd_waba_container_template_search\">\n <span class=\"sd_waba_icon_search\">\n <svg viewBox=\"0 0 20 20\" height=\"18\" width=\"18\" fill=\"none\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4.36653 4.3664C5.36341 3.36953 6.57714 2.87 8.00012 2.87C9.42309 2.87 10.6368 3.36953 11.6337 4.3664C12.6306 5.36329 13.1301 6.57724 13.1301 8.00062C13.1301 8.57523 13.0412 9.11883 12.8624 9.63057C12.6972 10.1038 12.4733 10.5419 12.1909 10.9444L16.5712 15.3247C16.7454 15.4989 16.8385 15.7046 16.8385 15.9375C16.8385 16.1704 16.7454 16.3761 16.5712 16.5503C16.396 16.7254 16.1866 16.8175 15.948 16.8175C15.7095 16.8175 15.5001 16.7254 15.3249 16.5503L10.9448 12.1906C10.5421 12.4731 10.104 12.697 9.63069 12.8623C9.11895 13.041 8.57535 13.13 8.00074 13.13C6.57736 13.13 5.36341 12.6305 4.36653 11.6336C3.36965 10.6367 2.87012 9.42297 2.87012 8C2.87012 6.57702 3.36965 5.36328 4.36653 4.3664ZM8.00012 4.63C7.06198 4.63 6.26877 4.95685 5.61287 5.61275C4.95698 6.26865 4.63012 7.06186 4.63012 8C4.63012 8.93813 4.95698 9.73134 5.61287 10.3872C6.26877 11.0431 7.06198 11.37 8.00012 11.37C8.93826 11.37 9.73146 11.0431 10.3874 10.3872C11.0433 9.73134 11.3701 8.93813 11.3701 8C11.3701 7.06186 11.0433 6.26865 10.3874 5.61275C9.73146 4.95685 8.93826 4.63 8.00012 4.63Z\" fill=\"currentColor\"></path></svg>\n </span>\n <input type=\"text\" placeholder=\"Type to search...\" [(ngModel)]=\"searchQuery\">\n </div>\n @if (showTemplatesLoader) {\n <div class=\"sd_waba_container_template_loader\">\n @for (i of [].constructor(9); track $index) {\n <div class=\"sd_waba_container_skeleton_loader\">\n <ngx-skeleton-loader\n [theme]=\"{ 'width': '250px', 'height': '13px', 'margin': '0px 0px 0px 15px', 'background-color': '#d9d9d9' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n </div>\n }\n </div>\n } @else {\n <div class=\"sd_waba_container_template_list\">\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n @let searchResults = messageTemplates | SearchFilter: 'name': searchQuery.trim();\n @if (!messageTemplates || !searchResults || searchResults?.length === 0) {\n <div class=\"sd_waba_container_no_results\">\n <div class=\"sd_waba_container_no_results_inner\">\n <div class=\"sd_waba_container_icon_no_results\">\n <img src=\"https://assets.snugdesk.com/images/no_result_found.png\" alt=\"No results found\">\n </div>\n <h4>No result found</h4>\n <p>\n {{ messageTemplates?.length > 0 ? \"Try changing your keywords or filters to find what you're looking for!\" : \"Looks like you haven't created any message templates yet.\" }}\n </p>\n </div>\n </div>\n } @else {\n <ul>\n @for (template of searchResults; track template?.id || $index) {\n <li\n [ngClass]=\"{ 'sd_waba_template_selected' : selectedMessageTemplate?.id === template?.id, 'sd_waba_disabled' : template.status !== 'APPROVED' }\"\n (click)=\"setSelectedMessageTemplate(template)\">\n <span class=\"sd_waba_template_icon\">\n <svg viewBox=\"0 0 576 512\" width=\"15px\"><path fill=\"currentColor\" d=\"M144 56c0 13.3-10.7 24-24 24-22.1 0-40 17.9-40 40 0 13.3-10.7 24-24 24s-24-10.7-24-24c0-48.6 39.4-88 88-88 13.3 0 24 10.7 24 24zM32 216c0-13.3 10.7-24 24-24s24 10.7 24 24l0 80c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-80zM56 368c13.3 0 24 10.7 24 24 0 22.1 17.9 40 40 40l122.7 0c2.8 16.8 7.8 32.9 14.8 48L120 480c-48.6 0-88-39.4-88-88 0-13.3 10.7-24 24-24zM480 214c-15.3-3.9-31.4-6-48-6l0-88c0-22.1-17.9-40-40-40-13.3 0-24-10.7-24-24s10.7-24 24-24c48.6 0 88 39.4 88 88l0 94zM296 80l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l80 0c13.3 0 24 10.7 24 24s-10.7 24-24 24zm-8 320a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-80c-8.8 0-16 7.2-16 16l0 48-48 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l48 0 0 48c0 8.8 7.2 16 16 16s16-7.2 16-16l0-48 48 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-48 0 0-48c0-8.8-7.2-16-16-16z\"/></svg>\n </span>\n <span class=\"sd_waba_template_name\" [ngClass]=\"{ 'sd_waba_disabled_text' : template.status !== 'APPROVED' }\">{{\n template.name }}</span>\n @if (template.status !== 'APPROVED') {\n <span class=\"sd_waba_template_status\">\n @switch (template.status) {\n <!-- Approved case intentionally omitted for disabled list item -->\n @case ('IN_APPEAL') {\n <span class=\"sd_waba_status_badge sd_waba_status_in_appeal\">In Appeal</span>\n }\n @case ('PENDING') {\n <span class=\"sd_waba_status_badge sd_waba_status_pending\">Pending</span>\n }\n @case ('REJECTED') {\n <span class=\"sd_waba_status_badge sd_waba_status_rejected\">Rejected</span>\n }\n @case ('PENDING_DELETION') {\n <span class=\"sd_waba_status_badge sd_waba_status_pending_deletion\">Pending Deletion</span>\n }\n @case ('DELETED') {\n <span class=\"sd_waba_status_badge sd_waba_status_deleted\">Deleted</span>\n }\n @case ('DISABLED') {\n <span class=\"sd_waba_status_badge sd_waba_status_disabled\">Disabled</span>\n }\n @case ('PAUSED') {\n <span class=\"sd_waba_status_badge sd_waba_status_paused\">Paused</span>\n }\n @case ('LIMIT_EXCEEDED') {\n <span class=\"sd_waba_status_badge sd_waba_status_limit_exceeded\">Limit Exceeded</span>\n }\n @case ('ARCHIVED') {\n <span class=\"sd_waba_status_badge sd_waba_status_archived\">Archived</span>\n }\n @default {\n <span class=\"sd_waba_status_badge sd_waba_status_default\">{{ template.status }}</span>\n }\n }\n </span>\n }\n\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </div>\n }\n</div>\n<div class=\"sd_waba_right_container_st_content\">\n <div class=\"sd_waba_container_selected_template_header\">\n <h4>\n <i class=\"fa-regular fa-square-dashed-circle-plus\"></i> {{ selectedMessageTemplate?.name }}\n </h4>\n </div>\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_container_selected_template_content\">\n <div class=\"sd_waba_container_selected_template_item\">\n <label>Message language</label>\n <p>{{ selectedMessageTemplate?.language }}</p>\n </div>\n <div class=\"sd_waba_container_selected_template_disclaimer\">\n <span><i class=\"fa-regular fa-circle-exclamation\"></i></span>\n <p>The template might contain advanced elements that won't be visible in the Snugdesk Interface (for\n example call to action links, quick replies or others). Check the final template structure in your\n WhatsApp provider account.</p>\n <div class=\"sd_waba_clear\"></div>\n </div>\n <div class=\"sd_waba_container_selected_template_item\">\n <label>Message preview</label>\n <div class=\"sd_waba_container_selected_template_form\">\n <form [formGroup]=\"templateMessageForm\">\n @for (component of selectedMessageTemplate?.components; track $index) {\n\n <!-- HEADER TEXT -->\n @if (component.type === 'HEADER' && component.format === 'TEXT') {\n <div class=\"sd_waba_container_selected_template_form_header\">\n <h6>{{ component.text }}</h6>\n </div>\n }\n\n <!-- HEADER MEDIA -->\n @if (component.type === 'HEADER' && (component.format === 'IMAGE' || component.format === 'VIDEO' || component.format === 'DOCUMENT')) {\n <div class=\"sd_waba_container_selected_template_form_header\">\n @if (component.format === 'IMAGE') {\n <label>Image Url</label>\n }\n @if (component.format === 'VIDEO') {\n <label>Video Url</label>\n }\n @if (component.format === 'DOCUMENT') {\n <label>Document Url</label>\n }\n <input type=\"text\" formControlName=\"mediaUrl\" class=\"sd_waba_input_media\" title=\"Media URL\" readonly>\n </div>\n }\n\n <!-- HEADER LOCATION -->\n @if (component.type === 'HEADER' && component.format === 'LOCATION') {\n <div class=\"sd_waba_container_selected_template_form_header\" [formGroupName]=\"'location'\">\n <div class=\"sd_waba_container_selected_template_form_header_location\">\n <div>\n <label>Location</label>\n @if (!templateMessageForm.value.location.latitude || !templateMessageForm.value.location.longitude) {\n <button type=\"button\" class=\"sd_waba_button_submit_location\" (click)=\"openLocationPopup()\">\n <i class=\"fa-sharp fa-solid fa-location-dot\"></i> Select Location\n </button>\n } @else {\n <img [src]=\"getMapPreview(templateMessageForm.value.location.latitude, templateMessageForm.value.location.longitude)\"\n alt=\"Location\" width=\"100%\">\n }\n </div>\n <div>\n <label>Name</label>\n <input type=\"text\" formControlName=\"name\" title=\"Name\">\n </div>\n <div>\n <label>Address</label>\n <textarea formControlName=\"address\" title=\"Address\"></textarea>\n </div>\n </div>\n </div>\n }\n\n <!-- BUTTONS -->\n @if (component.type === 'BUTTONS') {\n @for (button of component.buttons; track $index) {\n <!-- COPY_CODE -->\n @if (button.type === 'COPY_CODE' && button.example.length > 0) {\n <label>{{ button.text }}</label>\n <input type=\"text\" formControlName=\"couponCode\" title=\"Coupon code\" readonly>\n }\n\n <!-- PHONE_NUMBER -->\n @if (button.type === 'PHONE_NUMBER') {\n <label>Phone CTA: {{ button.text }}</label>\n @for (ctrl of bodyParameterGroups; track $index) {\n @if (ctrl.value?.type === 'phone' && ctrl.value?.index === button.index) {\n <div [formGroup]=\"ctrl\">\n <input type=\"text\" formControlName=\"phoneNumber\" placeholder=\"Phone number\"\n title=\"Phone number\">\n <input type=\"text\" formControlName=\"text\" placeholder=\"Button text\"\n title=\"Button label\">\n </div>\n }\n }\n }\n\n <!-- URL -->\n @if (button.type === 'URL') {\n <label>URL CTA: {{ button.text }}</label>\n @for (ctrl of bodyParameterGroups; track $index) {\n @if (ctrl.value?.type === 'url' && ctrl.value?.index === button.index) {\n <div [formGroup]=\"ctrl\">\n <input type=\"text\" formControlName=\"url\" placeholder=\"Link URL\" title=\"Link URL\">\n <input type=\"text\" formControlName=\"text\" placeholder=\"Button text\"\n title=\"Button label\">\n </div>\n }\n }\n }\n\n <!-- QUICK_REPLY -->\n @if (button.type === 'QUICK_REPLY') {\n <label>Quick Reply: {{ button.text }}</label>\n @for (ctrl of bodyParameterGroups; track $index) {\n @if (ctrl.value?.type === 'quick_reply' && ctrl.value?.index === button.index) {\n <div [formGroup]=\"ctrl\">\n <input type=\"text\" formControlName=\"text\" placeholder=\"Reply text\" title=\"Quick reply\">\n </div>\n }\n }\n }\n }\n }\n\n <!-- BODY -->\n @if (component.type === 'BODY') {\n <div class=\"sd_waba_container_selected_template_form_body\" formArrayName=\"bodyParameters\">\n @for (segment of bodyTextSegments; track $index; let i = $index) {\n @if (segment.input) {\n <div [formGroupName]=\"segment.index\" class=\"sd_waba_container_selected_template_form_body_input\">\n <input type=\"text\" formControlName=\"text\" placeholder=\"{{ segment.placeholder }}\" title=\"{{ segment.placeholder }}\"\n [ngClass]=\"{'sd_waba_container_selected_template_form_body_input_error': bodyParameterGroups[segment.index]?.get('text')?.invalid && bodyParameterGroups[segment.index]?.get('text')?.touched }\">\n </div>\n } @else {\n <span [innerHTML]=\"segment.text | WhatsAppTextFormatter\"></span>\n }\n }\n </div>\n }\n\n <!-- FOOTER -->\n @if (component.type === 'FOOTER') {\n <div class=\"sd_waba_container_selected_template_form_footer\">\n {{ component.text }}\n </div>\n }\n\n }\n </form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sd_waba_container_bottom_buttons\">\n <div class=\"sd_waba_container_selected_template_buttons\">\n <div class=\"sd_waba_container_selected_template_buttons_left\">\n <!-- <a href=\"https://www.twilio.com/docs/whatsapp/tutorial/send-whatsapp-notification-messages-templates\" target=\"_blank\" rel=\"noopener\">\n Learn more about WhatsApp message templates <i class=\"fa-solid fa-arrow-up-right\"></i>\n </a> -->\n @if (isFormSubmitted && templateMessageForm.invalid) {\n <span class=\"sd_waba_error_message\">*Please fill in all required text fields before submitting the form</span>\n }\n </div>\n <div class=\"sd_waba_container_selected_template_buttons_right\">\n <ul>\n <li>\n <button type=\"button\" class=\"sd_waba_button_cancel_preview\" (click)=\"closePopup()\">Cancel</button>\n </li>\n <li>\n <button type=\"submit\" class=\"sd_waba_button_submit sd_waba_button_preview\" (click)=\"openMessageTemplatePreviewPopup()\">Preview message</button>\n </li>\n <!-- <li><button class=\"sd_waba_button_preview\" (click)=\"generateBodyText()\">Preview message</button></li> -->\n </ul>\n </div>\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n@if (showTemplatePreviewPopup) {\n <lib-whatsapp-template-preview\n [selectedMessageTemplate]=\"selectedMessageTemplate\"\n [bodyTextSegments]=\"bodyTextSegments\" [templateMessageFormValue]=\"templateMessageForm.value\"\n (close)=\"closeTemplatePreviewPopup()\" (submitTemplate)=\"handleSubmitTemplatePreviewPopup()\" />\n}\n@if (showLocationPopup) {\n <lib-location-input (close)=\"closeLocationPopup()\" (submitLocation)=\"handleLocationSelection($event)\">\n </lib-location-input>\n}\n","import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, NgZone, OnChanges, OnDestroy, Output, SimpleChanges, ViewChild } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { lastValueFrom } from 'rxjs';\n\nimport { GoogleMapsConfig } from '../../../app.config';\nimport { ModelSortDirection } from '../../graphql/common.model';\nimport { Entity, EntityService } from '../../services/entity.service';\nimport { EntityConversation, EntityConversationService } from '../../services/entity-conversation.service';\nimport { InteractionService, InteractionChannel, InteractionContext, InteractionDirection, InteractionProvider, InteractionStatus, InteractionMessage, InteractionMessageAttachment, InteractionAttendee } from '../../services/interaction.service';\nimport { InteractionWidget } from '../../services/interaction-widget.service';\nimport { User, UserService } from '../../services/user.service';\n\nimport { WhatsAppHelperService } from '../../services/whatsapp-helper.service';\n\nimport { SnugdeskAuthenticationService, S3HelperService } from '@snugdesk/core';\nimport { CleanDeep, CustomValidators } from '@snugdesk/core';\n\nimport { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';\n\nimport moment from 'moment-timezone';\nimport { parsePhoneNumberFromString } from 'libphonenumber-js';\nimport { sort } from 'sort-nested-json';\nimport { v4 as uuidv4 } from 'uuid';\n\n@Component({\n selector: 'lib-whatsapp-messages',\n templateUrl: './whatsapp-messages.component.html',\n styleUrls: ['./whatsapp-messages.component.css'],\n standalone: false,\n})\nexport class WhatsAppMessagesComponent implements OnChanges, OnDestroy {\n @Input('selectedEntityConversation')\n selectedEntityConversation!: EntityConversation;\n\n @Input('wabaInteractionWidget')\n wabaInteractionWidget!: InteractionWidget;\n\n @Input('wabaPhoneNumbers')\n wabaPhoneNumbers!: any[];\n\n @Input('selectedWABAPhoneNumber')\n selectedWABAPhoneNumber: any;\n\n @Input('isSmallScreen')\n isSmallScreen: boolean;\n\n @Output('close')\n closeEv = new EventEmitter<void>();\n\n @Output('newMessage')\n newMessageEv = new EventEmitter<InteractionMessage>();\n\n @Output('changePhoneNumber')\n changePhoneNumberEv = new EventEmitter<any>();\n\n @ViewChild('scrollboxWhatsAppMessages') scrollbox!: ElementRef;\n @ViewChild('messageInput') messageInput!: ElementRef;\n\n entity!: Entity;\n entityPhoneNumbers: string[] = [];\n private selectedEntityPhoneNumber!: any | undefined;\n\n selectedEntityConversationMessages: any = [];\n private nextToken_entityConversationMessages!: string | undefined;\n private endOfList: boolean = false;\n private interactionMessageByEntityConversationIdSubscription!: any | undefined;\n\n interactionsMap: any = {};\n interactionAttendeesMap: any = {};\n\n selectedInteraction!: any;\n selectedInteractionAttendee!: any;\n\n selectedMessageTemplate!: any;\n\n referenceMessagesMap: any = {};\n selectedReferenceMessage!: any;\n\n showInitLoader: boolean = false;\n showAddEntityLoader: boolean = false;\n showInteractionMessageScrollLoader: boolean = false;\n showSubmitLoader: boolean = false;\n showMarkInteractionAsCompleteLoader: boolean = false;\n showMarkConversationAsBlockedLoader: boolean = false;\n showMarkConversationAsUnblockedLoader: boolean = false;\n showMarkEntityAsBlockedLoader: boolean = false;\n showMarkEntityAsUnblockedLoader: boolean = false;\n\n showTemplatePopup: boolean = false;\n\n showEmojiPicker: boolean = false;\n showContactDetailsPopup: boolean = false;\n\n showLocationPopup: boolean = false;\n showLocationPreviewPopup: boolean = false;\n\n showScrollToBottomButton: boolean = false;\n hasInitialScrollAligned: boolean = false;\n\n countdownInterval: any;\n remainingCountdownTime!: number;\n isRestrictedToTemplateReplies: boolean = false;\n\n selectedLocation: any = {};\n sharedContact: any = undefined;\n\n selectedFile!: any;\n selectedFilePreviewBuffer!: string | ArrayBuffer | null | undefined;\n uploadedFile!: any;\n\n locationForm!: FormGroup;\n textMessageForm!: FormGroup;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private zone: NgZone,\n private formBuilder: FormBuilder,\n private httpClient: HttpClient,\n private snackBar: MatSnackBar,\n private authenticationService: SnugdeskAuthenticationService,\n private s3HelperService: S3HelperService,\n private userService: UserService,\n private entityService: EntityService,\n private entityConversationService: EntityConversationService,\n private interactionService: InteractionService,\n private waHelperService: WhatsAppHelperService\n ) {\n this.textMessageForm = this.formBuilder.group({\n body: ['', [Validators.required, CustomValidators.whitespace]],\n });\n\n this.locationForm = this.formBuilder.group({\n name: [''],\n address: [''],\n longitude: ['', Validators.required],\n latitude: ['', Validators.required],\n });\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['isSmallScreen']) this.cdr.markForCheck();\n\n const change = changes['selectedEntityConversation'];\n if (!change) return;\n\n const { currentValue, previousValue } = change;\n if (!currentValue || currentValue.id === previousValue?.id) return;\n\n this.showInitLoader = true;\n this.resetConversationState();\n this.cdr.markForCheck();\n\n try {\n await this.loadEntityForConversation(currentValue);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not load the entity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.cdr.markForCheck();\n }\n\n try {\n await this.loadMessagesAndInteractions(currentValue);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not load messages`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showInitLoader = false;\n this.alignMessagesToBottom();\n setTimeout(() => {\n this.scrollToBottom();\n }, 500);\n this.cdr.detectChanges();\n }\n }\n\n ngOnDestroy(): void {\n this.interactionMessageByEntityConversationIdSubscription?.unsubscribe();\n if (this.countdownInterval) {\n clearInterval(this.countdownInterval);\n }\n }\n\n async onScrollWhatsappMessageList() {\n if (this.endOfList) return;\n\n this.zone.run(async () => {\n this.showInteractionMessageScrollLoader = true;\n this.cdr.markForCheck();\n\n if (this.selectedEntityConversationMessages?.length > 0 && this.nextToken_entityConversationMessages !== null) {\n try {\n const res_whatsappMessages = await this.fetchEntityConversationMessages(this.selectedEntityConversation.id);\n this.selectedEntityConversationMessages = [...res_whatsappMessages, ...this.selectedEntityConversationMessages];\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not load messages`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showInteractionMessageScrollLoader = false;\n this.cdr.detectChanges();\n }\n }\n });\n }\n\n async onSubmitWhatsappMessage() {\n if (this.isEntityConversationInactive()) return;\n\n this.showSubmitLoader = true;\n try {\n const now = moment.utc().unix();\n const interactionMessageId = uuidv4();\n const interactionMessageAttachmentId = uuidv4();\n\n await this.handleEntityConversation(now);\n if (this.selectedFile) {\n await this.uploadSelectedFile(interactionMessageAttachmentId);\n }\n\n const waMessage: any = await this.prepareWhatsAppMessage();\n // console.debug('Prepared waMessage: ', waMessage);\n\n let interactionMessage = this.prepareInteractionMessage(interactionMessageId, interactionMessageAttachmentId, waMessage, now);\n // console.debug('Prepared interactionMessage: ', interactionMessage);\n\n // Add new message to the list\n this.newMessageEv.emit(interactionMessage);\n this.selectedEntityConversationMessages.push({\n ...interactionMessage,\n temp_isSending: true,\n });\n this.showEmojiPicker = false;\n setTimeout(() => {\n this.scrollbox.nativeElement.scrollTop = Math.max(0, this.scrollbox.nativeElement.scrollHeight - this.scrollbox.nativeElement.offsetHeight);\n }, 500);\n\n const referenceMessage: any = this.selectedReferenceMessage;\n this.resetAllForms();\n\n let waMessageId: string;\n try {\n waMessageId = await this.sendWhatsAppMessage(waMessage, referenceMessage?.externalId);\n } catch (err) {\n console.warn(err);\n const msgMetatdata = this.parseJSON(interactionMessage.metadata);\n interactionMessage.metadata = JSON.stringify({\n ...msgMetatdata,\n errors: [err.error.error || err.error || err],\n });\n }\n interactionMessage = await this.createInteractionMessage(waMessageId, interactionMessage, referenceMessage?.id);\n // console.debug('interactionMessage: ', interactionMessage);\n\n // Remove temp flag\n const index = this.selectedEntityConversationMessages.findIndex((m: any) => m.id === interactionMessageId);\n if (index !== -1) {\n this.selectedEntityConversationMessages[index].metadata = interactionMessage.metadata;\n delete this.selectedEntityConversationMessages[index].temp_isSending;\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not send Whatsapp message`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showSubmitLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n resetAllForms(): void {\n this.textMessageForm.reset();\n this.locationForm.reset();\n this.selectedReferenceMessage = undefined;\n\n this.showTemplatePopup = false;\n this.selectedMessageTemplate = undefined;\n\n this.showLocationPopup = false;\n this.showLocationPreviewPopup = false;\n this.selectedLocation = undefined;\n\n this.selectedFile = undefined;\n this.selectedFilePreviewBuffer = undefined;\n this.uploadedFile = undefined;\n\n const textarea = this.messageInput?.nativeElement;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.rows = 1; // Reset to original row size\n }\n }\n\n setSelectedReferenceMessage(message: any) {\n this.selectedReferenceMessage = message;\n }\n\n removeSelectedReferenceMessage() {\n this.selectedReferenceMessage = undefined;\n }\n\n subscribeToEntityConversationMessages(entityConversationId: string) {\n this.interactionMessageByEntityConversationIdSubscription?.unsubscribe();\n // Add OnInteractionMessageByEntityConversationId subscription\n return this.interactionService.OnInteractionMessageByEntityConversationIdListener(entityConversationId).subscribe(async (event: any) => {\n this.zone.run(async () => {\n const message = event.value.data.OnInteractionMessageByEntityConversationId;\n // console.debug('message: ', message);\n\n // fallback for message attachments\n if (!message.messageAttachments?.items?.length) {\n const attachments = await this.fetchInteractionMessageAttachments(message.id);\n if (attachments?.length) {\n message.messageAttachments = { items: attachments };\n }\n }\n\n // fallback for interaction attendee\n if (message.interactionAttendeeId && !message.interactionAttendee) {\n let interactionAttendee = this.interactionAttendeesMap[message.interactionAttendeeId];\n if (!interactionAttendee) {\n interactionAttendee = await this.interactionService.GetInteractionAttendee(message.interactionAttendeeId);\n }\n message.interactionAttendee = interactionAttendee;\n }\n\n if (message.interactionAttendee?.entityId) {\n this.isRestrictedToTemplateReplies = false;\n this.startCountdownTimer(24 * 60 * 60); // 24 hours in seconds\n\n // Update the selected tenant phone number to the one receiving the new message\n this.selectedWABAPhoneNumber =\n this.wabaPhoneNumbers.find(\n (phoneNumber) =>\n this.cleanPhoneNumber(phoneNumber.display_phone_number) ===\n // this.cleanPhoneNumber(message.tenantAddress)\n this.cleanPhoneNumber(message.endpoint?.address)\n ) || this.wabaPhoneNumbers?.[0];\n }\n\n if (!this.selectedInteraction || this.selectedInteraction.id !== message.interactionId) {\n let interaction = message.interaction;\n if (message.interactionId && !message.interaction) {\n interaction = this.interactionService.GetInteraction(message.interactionId);\n }\n\n this.selectedInteraction = interaction;\n }\n\n const existingMessageIndex = this.selectedEntityConversationMessages.findIndex((msg: any) => msg.id === message.id);\n if (existingMessageIndex === -1) {\n // Add new message to the list\n this.newMessageEv.emit(message);\n this.selectedEntityConversationMessages.push(message);\n setTimeout(() => {\n this.scrollbox.nativeElement.scrollTop = Math.max(0, this.scrollbox.nativeElement.scrollHeight - this.scrollbox.nativeElement.offsetHeight);\n }, 100);\n } else {\n // Update the existing message\n this.selectedEntityConversationMessages[existingMessageIndex] = message;\n }\n\n await this.updateInteractionMap(message.interactionId, message.interaction);\n await this.updateInteractionAttendeeMap(message.interactionAttendeeId, message.interactionAttendee);\n await this.updateInteractionMessageReferenceMessageMap(message.referenceMessageId);\n this.cdr.detectChanges();\n });\n });\n }\n\n async updateInteractionMap(interactionId: string, interaction?: any) {\n // Fetch interaction if not in the map\n if (!this.interactionsMap[interactionId]) {\n try {\n const res_getInteraction = interaction || (await this.interactionService.GetInteraction(interactionId));\n this.interactionsMap[interactionId] = res_getInteraction;\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch Interaction`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n }\n }\n }\n\n // Start Mat menu right popup code\n isPopupOpen = false;\n isPopupClosing = false;\n popupMode: 'endInteraction' | 'blockConversation' | 'unblockConversation' | 'blockSender' | 'unblockSender' | null = null;\n showPopup(popupMode: 'endInteraction' | 'blockConversation' | 'unblockConversation' | 'blockSender' | 'unblockSender') {\n this.isPopupOpen = true;\n this.isPopupClosing = false;\n this.popupMode = popupMode;\n }\n\n requestClosePopup() {\n this.isPopupClosing = true;\n }\n\n onPopupAnimationEnd() {\n if (this.isPopupClosing) {\n this.isPopupOpen = false;\n this.isPopupClosing = false;\n this.popupMode = null;\n }\n }\n\n // End Mat menu right popup code\n async updateInteractionAttendeeMap(attendeeId: string, attendee?: any) {\n // Fetch interaction attendee if not in the map\n if (!this.interactionAttendeesMap[attendeeId]) {\n try {\n const res_getInteractionAttendee = attendee || (await this.interactionService.GetInteractionAttendee(attendeeId));\n this.interactionAttendeesMap[attendeeId] = res_getInteractionAttendee;\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch Interaction Attendee`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n }\n }\n }\n\n async updateInteractionMessageReferenceMessageMap(referenceMessageId: string, entityConversationMessages?: InteractionMessage[]) {\n const refId = referenceMessageId?.trim();\n if (!this.isValidReferenceId(refId) || this.referenceMessagesMap[refId]) {\n return;\n }\n\n const inProvidedMessages = this.findMessageById(entityConversationMessages, refId);\n if (this.cacheReferenceMessage(refId, inProvidedMessages)) {\n return;\n }\n\n const inLoadedMessages = this.findMessageById(this.selectedEntityConversationMessages, refId);\n if (this.cacheReferenceMessage(refId, inLoadedMessages)) {\n return;\n }\n\n try {\n const fetchedMessage = await this.interactionService.GetInteractionMessage(refId);\n this.cacheReferenceMessage(refId, fetchedMessage);\n } catch (err) {\n console.error(err);\n }\n }\n\n parseEntityPhoneNumbers(entity: any): string[] {\n const entityPhoneNumbers: string[] = [];\n\n // Check for primary phone number or phone numbers array\n const primaryPhoneNumber = entity.phoneNumberE164 || entity?.phoneNumber?.e164Number || entity?.phone_numbers?.[0];\n if (primaryPhoneNumber) {\n entityPhoneNumbers.push(primaryPhoneNumber);\n }\n\n // Process customFields if available\n if (Array.isArray(entity?.customFields)) {\n entity.customFields.forEach((field: string) => {\n try {\n const cfJSON = JSON.parse(field);\n Object.keys(cfJSON).forEach((key) => {\n if (key.startsWith('phonenumber') && cfJSON[key]?.e164Number) {\n entityPhoneNumbers.push(cfJSON[key].e164Number);\n }\n });\n } catch (err) {\n console.error('Error parsing custom field: ', err);\n }\n });\n }\n\n /* // Throw error if no phone numbers found\n if (entityPhoneNumbers.length === 0) {\n throw new Error('No phone number found for entity');\n } */\n\n return entityPhoneNumbers;\n }\n\n async fetchEntityConversationMessages(conversationId: string) {\n const scrollBox = document.getElementById('sd_scrollbox_whatsapp_messages');\n const msgCount = !!scrollBox && !!scrollBox.clientHeight && scrollBox.clientHeight > 0 ? Math.ceil(scrollBox.clientHeight / 40) : 25;\n\n const res_listMessagesByEntityConversationId = await this.interactionService.ListInteractionMessagesByEntityConversationId(\n conversationId,\n undefined,\n ModelSortDirection.DESC,\n {\n deletedAt: { attributeExists: false },\n },\n msgCount,\n this.nextToken_entityConversationMessages\n );\n // console.debug('res_listMessagesByEntityConversationId: ', res_listMessagesByEntityConversationId);\n\n this.endOfList = !res_listMessagesByEntityConversationId?.nextToken;\n this.nextToken_entityConversationMessages = res_listMessagesByEntityConversationId?.nextToken;\n\n const entityConversationMessages: any[] = res_listMessagesByEntityConversationId?.items || [];\n for (let message of entityConversationMessages) {\n await this.updateInteractionMap(message.interactionId, message.interaction);\n await this.updateInteractionAttendeeMap(message.interactionAttendeeId, message.interactionAttendee);\n await this.updateInteractionMessageReferenceMessageMap(message.referenceMessageId, entityConversationMessages);\n }\n\n return sort(entityConversationMessages).asc('createdAt');\n }\n\n private async fetchInteractionMessageAttachments(interactionMessageId: any): Promise<InteractionMessageAttachment[]> {\n if (!interactionMessageId) return [];\n\n const res_getInteractionMessageAttachments = await this.interactionService.ListInteractionMessageAttachmentsByInteractionMessageId(interactionMessageId, undefined, ModelSortDirection.ASC, {\n deletedAt: { attributeExists: false },\n });\n\n return res_getInteractionMessageAttachments?.items || [];\n }\n\n async fetchEntityInteractionAttendees(interactionId: string, entityId: string) {\n let entityInteractionAttendees: any[] = [];\n let nextToken_listInteractionAttendeesByInteractionIdAndEntityId!: string | undefined;\n do {\n const res_listInteractionAttendeesByInteractionIdAndEntityId = await this.interactionService.ListInteractionAttendeesByInteractionIdAndEntityId(\n interactionId,\n { eq: entityId },\n undefined,\n {\n deletedAt: { attributeExists: false },\n },\n undefined,\n nextToken_listInteractionAttendeesByInteractionIdAndEntityId\n );\n\n entityInteractionAttendees = [...entityInteractionAttendees, ...res_listInteractionAttendeesByInteractionIdAndEntityId.items];\n nextToken_listInteractionAttendeesByInteractionIdAndEntityId = res_listInteractionAttendeesByInteractionIdAndEntityId.nextToken || undefined;\n } while (nextToken_listInteractionAttendeesByInteractionIdAndEntityId);\n\n return entityInteractionAttendees;\n }\n\n async fetchUserInteractionAttendees(interactionId: string, userId: string) {\n let userInteractionAttendees: any[] = [];\n let nextToken_listInteractionAttendeesByInteractionIdAndUserId!: string | undefined;\n do {\n const res_listInteractionAttendeesByInteractionIdAndUserId = await this.interactionService.ListInteractionAttendeesByInteractionIdAndUserId(\n interactionId,\n { eq: userId },\n undefined,\n {\n deletedAt: { attributeExists: false },\n },\n undefined,\n nextToken_listInteractionAttendeesByInteractionIdAndUserId\n );\n\n userInteractionAttendees = [...userInteractionAttendees, ...res_listInteractionAttendeesByInteractionIdAndUserId.items];\n nextToken_listInteractionAttendeesByInteractionIdAndUserId = res_listInteractionAttendeesByInteractionIdAndUserId.nextToken || undefined;\n } while (nextToken_listInteractionAttendeesByInteractionIdAndUserId);\n\n return userInteractionAttendees;\n }\n\n async getLatestUserInteractionAttendee(interactionId: string, userId: string): Promise<any> {\n // Try to find the last message from the entity in local mesages\n // prettier-ignore\n for (let i = this.selectedEntityConversationMessages.length - 1; i >= 0; i--) {\n const msg = this.selectedEntityConversationMessages[i];\n if (msg.interactionId === interactionId &&\n msg.interactionAttendee?.userId === userId &&\n !msg.deletedAt &&\n !msg.interactionAttendee?.deletedAt) {\n return msg.interactionAttendee;\n }\n }\n\n const userInteractionAttendees: any[] = await this.fetchUserInteractionAttendees(interactionId, userId);\n // console.debug('userInteractionAttendees: ', userInteractionAttendees);\n\n // prettier-ignore\n if (!userInteractionAttendees || userInteractionAttendees.length === 0) {\n return null;\n }\n\n // using the latest entity interaction attendee\n const latestInteractionAttendee: any = sort(userInteractionAttendees).desc('createdAt')[0];\n\n return latestInteractionAttendee;\n }\n\n async getLastEntityInteractionMessage(interactionId: string, entityId: string): Promise<any> {\n // Try to find the last message from the entity in local mesages\n const now: number = moment.utc().unix();\n const twentyFourHoursInSeconds: number = 24 * 60 * 60;\n // prettier-ignore\n for (let i = this.selectedEntityConversationMessages.length - 1; i >= 0; i--) {\n const msg = this.selectedEntityConversationMessages[i];\n if (msg.interactionId === interactionId &&\n msg.interactionAttendee?.entityId === entityId &&\n !msg.deletedAt) {\n return msg;\n }\n\n // If the message is older than 24 hours, stop searching\n const messageAgeInSeconds = now - msg.createdAt;\n if (messageAgeInSeconds >= twentyFourHoursInSeconds) return null;\n }\n\n // if all messages have been already fetched, return null\n if (!this.nextToken_entityConversationMessages) return null;\n\n const entityInteractionAttendees: any = await this.fetchEntityInteractionAttendees(interactionId, entityId);\n // console.debug('entityInteractionAttendees: ', entityInteractionAttendees);\n\n // prettier-ignore\n if (!entityInteractionAttendees || entityInteractionAttendees.length === 0) {\n return null;\n }\n\n // using the latest entity interaction attendee\n const latestEntityAttendee: any = sort(entityInteractionAttendees).desc('createdAt')[0];\n\n // Fetch latest message\n const lastEntityMessages: any = await this.interactionService.ListInteractionMessagesByInteractionAttendeeId(\n latestEntityAttendee.id,\n undefined,\n ModelSortDirection.DESC,\n {\n deletedAt: { attributeExists: false },\n },\n 1\n );\n\n return lastEntityMessages?.items?.[0];\n }\n\n getSelectedPhoneNumberIndex(): number {\n return this.wabaPhoneNumbers.findIndex((phone) => phone.id === this.selectedWABAPhoneNumber?.id);\n }\n\n handleChangeSenderPhoneNumber(phoneNumber: any): void {\n this.selectedWABAPhoneNumber = phoneNumber;\n this.changePhoneNumberEv.emit(phoneNumber);\n }\n\n async handleEntityConversation(now: number) {\n if (!this.selectedEntityConversation) {\n this.selectedEntityConversation = await this.createEntityConversation(now);\n // console.debug('selectedEntityConversation: ', this.selectedEntityConversation);\n\n this.selectedInteraction = await this.createInteraction(now);\n // console.debug('selectedInteraction: ', this.selectedInteraction);\n\n this.selectedInteractionAttendee = await this.createInteractionAttendee(this.selectedInteraction.id, now);\n // console.debug('selectedInteractionAttendee: ', this.selectedInteractionAttendee);\n } else if (!this.selectedInteraction || !!this.selectedInteraction.deletedAt || !!this.selectedInteraction.completedAt || this.selectedInteraction.status === InteractionStatus.DISCONNECTED) {\n this.selectedInteraction = await this.createInteraction(now);\n // console.debug('selectedInteraction: ', this.selectedInteraction);\n\n this.selectedInteractionAttendee = await this.createInteractionAttendee(this.selectedInteraction.id, now);\n // console.debug('selectedInteractionAttendee: ', this.selectedInteractionAttendee);\n } else if (!this.selectedInteractionAttendee) {\n this.selectedInteractionAttendee = await this.createInteractionAttendee(this.selectedInteraction.id, now);\n // console.debug('selectedInteractionAttendee: ', this.selectedInteractionAttendee);\n }\n }\n\n async prepareWhatsAppMessage(): Promise<any> {\n if (this.selectedMessageTemplate) {\n const templateValues: any[] = [];\n\n // prettier-ignore\n const { template, bodyParameters, mediaUrl, couponCode, location } = this.selectedMessageTemplate;\n if (bodyParameters?.length > 0) {\n templateValues.push({\n type: 'body',\n parameters: bodyParameters,\n });\n }\n\n if (mediaUrl) {\n templateValues.push({\n type: 'header_media',\n mediaUrl,\n });\n }\n\n if (couponCode?.length > 0) {\n templateValues.push({\n type: 'coupon_code',\n couponCode,\n });\n }\n\n if (location) {\n templateValues.push({\n type: 'location',\n location,\n });\n }\n\n return CleanDeep.clean({\n template,\n templateValues,\n });\n }\n\n // Fallback: plain message (text/media/location)\n let messageBody: any;\n\n const trimmedBody = (this.textMessageForm.value.body || '').trim();\n\n if (this.selectedFile) {\n messageBody = {\n text: trimmedBody,\n media: {\n type: this.selectedFile.type,\n fileName: this.selectedFile.name || this.uploadedFile.key,\n mediaUrl: this.uploadedFile.location,\n caption: trimmedBody || undefined,\n },\n };\n } else if (this.showLocationPreviewPopup) {\n const name = (this.locationForm.value.name || '').trim();\n const address = (this.locationForm.value.address || '').trim();\n messageBody = {\n name,\n address,\n longitude: this.locationForm.value.longitude,\n latitude: this.locationForm.value.latitude,\n };\n } else {\n messageBody = {\n text: trimmedBody,\n };\n }\n\n return {\n messageBody,\n };\n }\n\n prepareInteractionMessage(interactionMessageId: string, interactionMessageAttachmentId: string, waMessage: any, waMessageTimestamp: number): any {\n const messageMetaData: any = this.selectedMessageTemplate\n ? {\n template: waMessage.template,\n location: waMessage.location,\n }\n : waMessage.messageBody?.longitude && waMessage.messageBody?.latitude\n ? {\n location: waMessage.messageBody,\n }\n : {};\n\n // TODO: Add endpointId as per the tenantAddress\n let message: any = {\n id: interactionMessageId,\n interactionId: this.selectedInteraction.id,\n interactionAttendeeId: this.selectedInteractionAttendee.id,\n interactionAttendee: this.selectedInteractionAttendee,\n entityConversationId: this.selectedEntityConversation.id,\n endpointId: 'TODO',\n metadata: JSON.stringify(CleanDeep.clean(messageMetaData)),\n referenceMessageId: this.selectedReferenceMessage?.id,\n // externalId: waMessage.externalId,\n body: waMessage.messageBody?.text,\n createdAt: waMessageTimestamp,\n updatedAt: waMessageTimestamp,\n };\n\n // If a file was uploaded\n if (this.uploadedFile) {\n const attachment: any = {\n id: interactionMessageAttachmentId,\n interactionId: this.selectedInteraction.id,\n interactionMessageId: interactionMessageId,\n name: this.selectedFile?.name || this.uploadedFile.key,\n size: this.selectedFile?.size,\n type: this.selectedFile.type,\n file: this.uploadedFile,\n createdAt: waMessageTimestamp,\n updatedAt: waMessageTimestamp,\n };\n message.messageAttachments = {\n items: [attachment],\n };\n }\n\n return CleanDeep.clean(message);\n }\n\n async sendWhatsAppMessage(waMessage: any, referenceMessageExternalId?: string) {\n // prettier-ignore\n const { businessAccountId, accessToken } = JSON.parse(this.wabaInteractionWidget.configuration || '{}');\n if (!businessAccountId || !accessToken) {\n throw new Error('WhatsApp Business Account not configured');\n }\n\n const res_sendWhatsAppMessage: any = waMessage.template\n ? await this.waHelperService.sendWhatsAppTemplateMessage(accessToken, this.selectedWABAPhoneNumber.id, this.selectedEntityPhoneNumber, waMessage.template, waMessage.templateValues, referenceMessageExternalId)\n : await this.waHelperService.sendWhatsAppMessage(accessToken, this.selectedWABAPhoneNumber.id, this.selectedEntityPhoneNumber, waMessage.messageBody, referenceMessageExternalId);\n // console.debug('res_sendWhatsAppMessage: ', res_sendWhatsAppMessage);\n\n return res_sendWhatsAppMessage.messages[0].id; // waMessageId from the response\n }\n\n replaceTemplatePlaceholders(template: any, values: any) {\n const hasPlaceholders = /{{\\d+}}/.test(template);\n if (!hasPlaceholders) {\n return template;\n }\n return template.replace(/{{(\\d+)}}/g, (_: string, index: string) => {\n // Convert index to zero-based\n const valueIndex = parseInt(index, 10) - 1;\n // Return the corresponding text from values array\n return values[valueIndex] ? values[valueIndex].text : '';\n });\n }\n\n async createEntityConversation(now: number): Promise<any> {\n const entityConversationId: string = uuidv4();\n const params_createEntityConversation = {\n id: entityConversationId,\n tenantId: this.authenticationService.getTenantId(),\n entityId: this.entity.id,\n entityAddress: this.selectedEntityPhoneNumber,\n interactionChannel: InteractionChannel.SOCIAL_CHAT,\n interactionProvider: InteractionProvider.WHATSAPP,\n lastActivityAt: now,\n isCampaignEngaged: false,\n createdAt: now,\n updatedAt: now,\n };\n\n const res_createEntityConversation = await this.entityConversationService.CreateEntityConversation(params_createEntityConversation);\n // console.debug('res_createEntityConversation: ', res_createEntityConversation);\n\n return {\n ...params_createEntityConversation,\n entity: this.entity,\n };\n }\n\n async createInteraction(now: number) {\n const res_createInteraction = await this.interactionService.CreateInteraction({\n tenantId: this.authenticationService.getTenantId(),\n widgetId: this.wabaInteractionWidget.id,\n endpointId: 'TODO',\n entityId: this.selectedEntityConversation?.entityId,\n entityConversationId: this.selectedEntityConversation.id,\n metadata: JSON.stringify({\n phoneNumber: this.selectedEntityPhoneNumber,\n }),\n channel: InteractionChannel.SOCIAL_CHAT,\n provider: InteractionProvider.WHATSAPP,\n context: InteractionContext.EXTERNAL,\n direction: InteractionDirection.OUT,\n status: InteractionStatus.CONNECTED_TO_AGENT,\n createdAt: now,\n updatedAt: now,\n });\n // console.debug('res_createInteraction: ', res_createInteraction);\n\n return res_createInteraction;\n }\n\n async createInteractionAttendee(interactionId: string, now: number) {\n const res_getUser: User = await this.userService.GetUser(this.authenticationService.getUserId());\n const res_createUserAttendee = await this.interactionService.CreateInteractionAttendee({\n interactionId: interactionId,\n name: res_getUser?.name || 'Attendee',\n userId: this.authenticationService.getUserId(),\n isAdministrator: true,\n userSessionId: this.authenticationService.getUserSessionId(),\n joinedAt: now,\n createdAt: now,\n updatedAt: now,\n });\n // console.debug('res_createUserAttendee: ', res_createUserAttendee);\n\n return res_createUserAttendee;\n }\n\n async createInteractionMessage(waMessageId: string, interactionMessage: any, referenceMessageId?: string) {\n // Ensure subscription is active\n if (!this.interactionMessageByEntityConversationIdSubscription) {\n this.subscribeToEntityConversationMessages(this.selectedEntityConversation.id);\n }\n\n // Build attachments array properly (await needed!)\n const attachments: any[] = [];\n\n if (interactionMessage.messageAttachments?.items?.length > 0) {\n for (const attachment of interactionMessage.messageAttachments.items) {\n const res_createInteractionMessageAttachment = await this.interactionService.CreateInteractionMessageAttachment(attachment);\n // console.debug('res_createInteractionMessageAttachment:', res_createInteractionMessageAttachment);\n attachments.push(res_createInteractionMessageAttachment);\n }\n }\n\n // Prepare payload for main message\n const params_createInteractionMessage: any = CleanDeep.clean({\n ...interactionMessage,\n externalId: waMessageId,\n referenceMessageId: referenceMessageId,\n });\n\n // Remove attachments before sending the message\n delete params_createInteractionMessage.endpoint;\n delete params_createInteractionMessage.entityConversation;\n delete params_createInteractionMessage.interaction;\n delete params_createInteractionMessage.interactionAttendee;\n delete params_createInteractionMessage.messageAttachments;\n\n // console.debug('params_createInteractionMessage: ', params_createInteractionMessage);\n\n // Create interaction message\n const res_createInteractionMessage = await this.interactionService.CreateInteractionMessage(params_createInteractionMessage);\n\n // console.debug('res_createInteractionMessage:', res_createInteractionMessage);\n\n // Return combined result\n return {\n ...res_createInteractionMessage,\n messageAttachments: {\n items: attachments,\n },\n };\n }\n\n async markEntityAsBlocked() {\n this.showMarkEntityAsBlockedLoader = true;\n this.cdr.markForCheck();\n try {\n const now = moment.utc().unix();\n const res_blockEntity = await this.entityService.UpdateEntity({\n id: this.selectedEntityConversation.entityId,\n blockedAt: now,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n updatedAt: this.selectedEntityConversation.updatedAt || now,\n });\n // console.debug('res_blockEntity', res_blockEntity);\n\n this.entity = res_blockEntity;\n this.selectedEntityConversation.entity = res_blockEntity;\n await this.markEntityConversationAsBlocked();\n this.snackBar.open(`Success! Blocked the entity successfully`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-warning'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n\n this.requestClosePopup();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not block the entity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showMarkEntityAsBlockedLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async markEntityAsUnblocked() {\n this.showMarkEntityAsUnblockedLoader = true;\n this.cdr.markForCheck();\n try {\n const now = moment.utc().unix();\n const res_unblockEntity = await this.entityService.UpdateEntity({\n id: this.selectedEntityConversation.entityId,\n blockedAt: null,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n updatedAt: this.selectedEntityConversation.updatedAt || now,\n });\n // console.debug('res_unblockEntity', res_unblockEntity);\n\n this.entity = res_unblockEntity;\n this.selectedEntityConversation.entity = res_unblockEntity;\n await this.markEntityConversationAsUnblocked();\n this.snackBar.open(`Success! Unblocked the entity successfully`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not unblock the entity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showMarkEntityAsUnblockedLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async markInteractionAsDisconnected() {\n this.showMarkInteractionAsCompleteLoader = true;\n this.cdr.markForCheck();\n try {\n const now = moment.utc().unix();\n const res_completeInteraction = await this.interactionService.UpdateInteraction({\n id: this.selectedInteraction.id,\n completedAt: now,\n status: InteractionStatus.DISCONNECTED,\n updatedAt: now,\n });\n // console.debug('res_completeInteraction: ', res_completeInteraction);\n this.selectedEntityConversation.interactions.items[0] = res_completeInteraction;\n\n this.selectedInteraction = undefined;\n this.selectedInteractionAttendee = undefined;\n this.snackBar.open(`Success! Marked Interaction as disconneted`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n\n this.requestClosePopup();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not mark Interaction as disconnected`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showMarkInteractionAsCompleteLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async markEntityConversationAsBlocked() {\n // Mark conversation as blocked means blocking the phone number / source of the conversation\n this.showMarkConversationAsBlockedLoader = true;\n this.cdr.markForCheck();\n try {\n const now = moment.utc().unix();\n const res_blockEntityConversation = await this.entityConversationService.UpdateEntityConversation({\n id: this.selectedEntityConversation.id,\n blockedAt: now,\n updatedAt: this.selectedEntityConversation.updatedAt,\n });\n // console.debug('res_blockEntityConversation: ', res_blockEntityConversation);\n this.selectedEntityConversation.blockedAt = now;\n\n this.snackBar.open(`Success! Blocked the conversation successfully`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-warning'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n\n this.requestClosePopup();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not block the entity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showMarkConversationAsBlockedLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async markEntityConversationAsUnblocked() {\n // Mark conversation as unblocked means unblocking the phone number / source of the conversation\n this.showMarkConversationAsUnblockedLoader = true;\n this.cdr.markForCheck();\n try {\n const now = moment.utc().unix();\n const res_unblockEntityConversation = await this.entityConversationService.UpdateEntityConversation({\n id: this.selectedEntityConversation.id,\n blockedAt: null,\n updatedAt: now,\n });\n // console.debug('res_unblockEntityConversation: ', res_unblockEntityConversation);\n delete this.selectedEntityConversation.blockedAt;\n\n this.snackBar.open(`Success! Unblocked the conversation successfully`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n\n this.requestClosePopup();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not unblock the conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showMarkConversationAsUnblockedLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n /****************************** Message Template Functions *********************************/\n\n checkReplyConditions(): boolean {\n const lastMessage = this.selectedEntityConversationMessages?.[this.selectedEntityConversationMessages.length - 1];\n const lastInteractionId = lastMessage?.interactionId;\n const lastInteraction = this.interactionsMap?.[lastInteractionId];\n\n return (\n !!this.selectedEntityConversation?.blockedAt ||\n this.isRestrictedToTemplateReplies ||\n !this.selectedEntityConversationMessages?.length ||\n !lastInteraction ||\n !!lastInteraction.completedAt ||\n lastInteraction.status === 'DISCONNECTED' ||\n this.getCurrentTime() - lastMessage?.createdAt > 24 * 60 * 60\n );\n }\n\n toggleMessageTemplatePopup(): void {\n this.showTemplatePopup = !this.showTemplatePopup;\n this.showEmojiPicker = false;\n if (!this.showTemplatePopup) {\n // Clear the selected message template and related properties\n this.selectedMessageTemplate = undefined;\n this.selectedLocation = undefined;\n }\n\n this.cdr.detectChanges();\n }\n\n handleSelectMessageTemplate(messageTemplate: any): void {\n this.selectedMessageTemplate = messageTemplate;\n this.showTemplatePopup = false;\n this.onSubmitWhatsappMessage();\n this.cdr.detectChanges();\n }\n\n /****************************** Supporting functions **************************************/\n\n autoGrow(event: KeyboardEvent) {\n // Ignore \"Enter\" key but allow \"Shift + Enter\"\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n return;\n }\n\n const textarea = event.target as HTMLTextAreaElement;\n textarea.style.height = 'auto';\n textarea.style.height = textarea.scrollHeight + 'px';\n }\n\n getCurrentTime() {\n return moment.utc().unix();\n }\n\n startCountdownTimer(remainingTime: number): void {\n if (this.countdownInterval) {\n clearInterval(this.countdownInterval);\n }\n\n this.remainingCountdownTime = remainingTime;\n this.zone.run(() => {\n this.countdownInterval = setInterval(() => {\n if (this.remainingCountdownTime > 0) {\n this.remainingCountdownTime--;\n this.cdr.markForCheck();\n } else {\n clearInterval(this.countdownInterval);\n this.isRestrictedToTemplateReplies = true;\n this.cdr.markForCheck();\n }\n }, 1000);\n });\n }\n\n formatTime(seconds: number): string {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const remainingSeconds = seconds % 60;\n\n return `${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${remainingSeconds < 10 ? '0' : ''}${remainingSeconds}`;\n }\n\n parseJSON(raw: any) {\n if (!raw) return undefined;\n if (typeof raw === 'object') return raw;\n try {\n return JSON.parse(String(raw));\n } catch {\n return undefined;\n }\n }\n\n onScroll(): void {\n const { scrollTop, scrollHeight, clientHeight } = this.scrollbox.nativeElement;\n // Check if the user has scrolled up more than 400px from the bottom\n if (scrollTop + clientHeight < scrollHeight - 400) {\n this.showScrollToBottomButton = true;\n } else {\n this.showScrollToBottomButton = false;\n }\n }\n\n scrollToBottom(): void {\n this.scrollbox.nativeElement.scrollTop = this.scrollbox.nativeElement.scrollHeight;\n if (!this.hasInitialScrollAligned) {\n this.hasInitialScrollAligned = true;\n this.cdr.detectChanges();\n }\n }\n\n private alignMessagesToBottom(): void {\n // Wait for the view to render so scrollHeight is accurate, then jump to the bottom once\n requestAnimationFrame(() => {\n if (!this.scrollbox?.nativeElement) {\n // If the view isn't ready yet, try again on the next frame\n this.alignMessagesToBottom();\n return;\n }\n this.scrollbox.nativeElement.scrollTop = this.scrollbox.nativeElement.scrollHeight;\n this.hasInitialScrollAligned = true;\n this.cdr.detectChanges();\n });\n }\n\n onEntityImageError(): void {\n if (!this.entity) return;\n this.entity.image = undefined;\n }\n\n getAttachmentType(attachment: any) {\n if (attachment.type.startsWith('image')) {\n return 'image';\n } else if (attachment.type.startsWith('video')) {\n return 'video';\n } else if (attachment.type.startsWith('audio')) {\n return 'audio';\n } else {\n return 'document';\n }\n }\n\n cleanPhoneNumber(phoneNumber: string): string {\n return phoneNumber?.replace(/\\D/g, '');\n }\n\n toggleEmojiPicker() {\n this.showEmojiPicker = !this.showEmojiPicker;\n }\n\n handleEmojiSelection(event: any) {\n this.textMessageForm.controls['body'].setValue((this.textMessageForm.controls['body'].value || '') + event?.emoji?.native);\n setTimeout(() => {\n (document.getElementById('sd_waba_bodyInput') as HTMLTextAreaElement)?.focus();\n });\n }\n\n openConversationAttachmentOptions() {\n this.showEmojiPicker = false;\n }\n\n openImageUpload() {\n document.getElementById('sd_whatsapp_image_upload-' + this.selectedEntityConversation?.id)?.click();\n this.showEmojiPicker = false;\n }\n\n openAudioUpload() {\n document.getElementById('sd_whatsapp_audio_upload-' + this.selectedEntityConversation?.id)?.click();\n this.showEmojiPicker = false;\n }\n\n openVideoUpload() {\n document.getElementById('sd_whatsapp_video_upload-' + this.selectedEntityConversation?.id)?.click();\n this.showEmojiPicker = false;\n }\n\n openDocumentUpload() {\n document.getElementById('sd_whatsapp_document_upload-' + this.selectedEntityConversation?.id)?.click();\n this.showEmojiPicker = false;\n }\n\n handleFileSelection(event: any) {\n this.selectedFile = undefined;\n this.uploadedFile = undefined;\n this.selectedFilePreviewBuffer = undefined;\n\n const fileSize = event.target.files[0].size;\n if (fileSize > 16 * 1024 * 1024) {\n this.snackBar.open(`Oops! File size larger than 16MB`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n return;\n }\n\n try {\n this.selectedFile = event.target.files[0];\n\n const reader = new FileReader();\n reader.onload = (e) => {\n this.selectedFilePreviewBuffer = e?.target?.result;\n };\n reader.readAsDataURL(this.selectedFile);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! There was an error uploading the file. Please try again`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.messageInput?.nativeElement?.focus();\n }\n }\n\n removeFileSelection() {\n this.selectedFile = undefined;\n this.uploadedFile = undefined;\n this.selectedFilePreviewBuffer = undefined;\n }\n\n openContactDetailPopup(contact: any) {\n this.sharedContact = contact;\n }\n\n closeContactDetailPopup() {\n this.sharedContact = undefined;\n }\n\n async saveContactAsEntity() {\n if (!this.sharedContact) {\n return;\n }\n\n try {\n this.showAddEntityLoader = true;\n\n const parsedPhoneNumber = parsePhoneNumberFromString(this.sharedContact.phones?.[0]?.phone);\n\n const now = moment.utc().unix();\n const params_createEntity: any = CleanDeep.clean({\n id: uuidv4(),\n tenantId: this.authenticationService.getTenantId(),\n name: this.sharedContact.name?.formatted_name,\n isOrganization: false,\n email: this.sharedContact.emails?.[0]?.email,\n phoneNumber: {\n countryCode: parsedPhoneNumber?.country,\n dialCode: parsedPhoneNumber?.countryCallingCode,\n e164Number: parsedPhoneNumber?.format('E.164'),\n internationalNumber: parsedPhoneNumber?.formatInternational(),\n nationalNumber: parsedPhoneNumber?.formatNational(),\n number: parsedPhoneNumber?.nationalNumber,\n },\n createdAt: now,\n updatedAt: now,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n });\n\n const res_createEntity = await this.entityService.CreateEntity(params_createEntity);\n // console.debug('res_createEntity: ', res_createEntity);\n\n // this.openEntityWorkspace(res_createEntity.id, res_createEntity.name);\n this.closeContactDetailPopup();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not add contact as Entity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showAddEntityLoader = false;\n }\n }\n\n openLocationPopup() {\n this.showLocationPopup = true;\n this.showEmojiPicker = false;\n this.cdr.detectChanges();\n }\n\n closeLocationPopup() {\n this.showLocationPopup = false;\n this.cdr.detectChanges();\n }\n\n async handleLocationSelection(event: any) {\n try {\n this.showLocationPopup = false;\n\n // Set selected location\n this.selectedLocation = {\n latitude: event.latitude,\n longitude: event.longitude,\n };\n\n // Generate geocode location url\n const geocodeUrl = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${event.latitude},${event.longitude}&key=${GoogleMapsConfig.apiKey}`;\n\n // Get geocode location\n const res_getGeolocation: any = await lastValueFrom(this.httpClient.get(geocodeUrl));\n\n this.showLocationPreviewPopup = true;\n this.locationForm.patchValue({\n latitude: event.latitude,\n longitude: event.longitude,\n address: res_getGeolocation.results?.[0]?.formatted_address,\n });\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not get location`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n getMapPreview(latitude: string, longitude: string) {\n return `https://maps.googleapis.com/maps/api/staticmap?center=${latitude},${longitude}&zoom=15&size=400x250&maptype=roadmap&markers=color:red%7Clabel:S%7C${latitude},${longitude}&key=${GoogleMapsConfig.apiKey}`;\n }\n\n closeLocationPreviewPopup() {\n this.showLocationPreviewPopup = false;\n this.selectedLocation = undefined;\n this.cdr.detectChanges();\n }\n\n handleClose() {\n this.closeEv.emit();\n }\n\n /****************************** Helper functions **************************************/\n\n parseIsInbound(message: InteractionMessage): boolean {\n const a = this.parseInteractionAttendee(message);\n return !!a?.entityId;\n }\n\n parseInteractionAttendee(message: InteractionMessage): InteractionAttendee | undefined {\n if (!message?.interactionAttendee) return message?.interactionAttendee as any;\n return this.interactionAttendeesMap?.[message.interactionAttendeeId as any] as any;\n }\n\n private resetConversationState() {\n this.entity = undefined;\n this.entityPhoneNumbers = [];\n this.selectedEntityPhoneNumber = undefined;\n\n this.selectedEntityConversationMessages = [];\n this.nextToken_entityConversationMessages = undefined;\n this.interactionMessageByEntityConversationIdSubscription?.unsubscribe();\n\n this.selectedInteraction = undefined;\n this.selectedInteractionAttendee = undefined;\n this.isRestrictedToTemplateReplies = false;\n this.remainingCountdownTime = 0;\n if (this.countdownInterval) {\n clearInterval(this.countdownInterval);\n }\n\n this.interactionsMap = {};\n this.interactionAttendeesMap = {};\n\n this.referenceMessagesMap = {};\n this.selectedReferenceMessage = undefined;\n this.hasInitialScrollAligned = false;\n\n this.resetAllForms();\n }\n\n private async loadEntityForConversation(entityConversation: EntityConversation) {\n this.entity = entityConversation.entity ?? (await this.entityService.GetEntity(entityConversation.entityId));\n this.entityPhoneNumbers = this.parseEntityPhoneNumbers(this.entity);\n this.selectedEntityPhoneNumber = entityConversation?.entityAddress || this.entityPhoneNumbers?.[0];\n }\n\n private async loadMessagesAndInteractions(entityConversation: EntityConversation) {\n const res_whatsappMessages = await this.fetchEntityConversationMessages(entityConversation.id);\n this.selectedEntityConversationMessages = res_whatsappMessages || [];\n this.interactionMessageByEntityConversationIdSubscription = this.subscribeToEntityConversationMessages(entityConversation.id);\n\n if (!this.selectedEntityConversationMessages?.length) return;\n\n this.updateSelectedPhoneFromLastMessage();\n const latestInteraction: any = entityConversation?.interactions?.items?.[0];\n\n if (latestInteraction && !latestInteraction.deletedAt && !latestInteraction.completedAt) {\n this.selectedInteraction = latestInteraction;\n this.selectedInteractionAttendee = await this.getLatestUserInteractionAttendee(latestInteraction.id, this.authenticationService.getUserId());\n }\n\n if (!latestInteraction || latestInteraction.deletedAt) {\n this.isRestrictedToTemplateReplies = true;\n return;\n }\n\n await this.updateTemplateRestriction(latestInteraction, entityConversation);\n }\n\n private updateSelectedPhoneFromLastMessage() {\n const lastIndex: number = this.selectedEntityConversationMessages.length - 1;\n const lastConversationMessage = this.selectedEntityConversationMessages[lastIndex];\n this.selectedWABAPhoneNumber = this.wabaPhoneNumbers.find((phoneNumber) => this.cleanPhoneNumber(phoneNumber.display_phone_number) === this.cleanPhoneNumber(lastConversationMessage.endpoint?.address)) || this.wabaPhoneNumbers?.[0];\n }\n\n private async updateTemplateRestriction(latestInteraction: any, entityConversation: EntityConversation) {\n const lastEntityMessage: any = await this.getLastEntityInteractionMessage(latestInteraction.id, entityConversation?.entityId);\n if (!lastEntityMessage) {\n this.isRestrictedToTemplateReplies = true;\n return;\n }\n\n const now = moment.utc().unix();\n const twentyFourHoursInSeconds = 24 * 60 * 60;\n const messageAgeInSeconds = now - lastEntityMessage.createdAt;\n\n this.isRestrictedToTemplateReplies = messageAgeInSeconds > twentyFourHoursInSeconds;\n if (!this.isRestrictedToTemplateReplies) {\n this.startCountdownTimer(lastEntityMessage.createdAt + twentyFourHoursInSeconds - now);\n }\n }\n\n private isEntityConversationInactive(): boolean {\n return !!this.entity?.blockedAt || !!this.entity?.deletedAt || !!this.selectedEntityConversation?.blockedAt || !!this.selectedEntityConversation?.deletedAt;\n }\n\n private async uploadSelectedFile(interactionMessageAttachmentId: string) {\n const previewBuffer: string | undefined = this.selectedFilePreviewBuffer as string | undefined;\n const meta = previewBuffer?.split(',')?.[0];\n const extFromPreview = meta?.split(';')[0]?.split('/')[1];\n\n const fileName = this.selectedFile.name || '';\n const lastDotIndex = fileName.lastIndexOf('.');\n const fileExtension = lastDotIndex !== -1 ? fileName.substring(lastDotIndex + 1) : '';\n\n const contentTypeFromFile = this.selectedFile.type;\n const contentTypeFromPreview = meta?.split(':')?.[1]?.split(';')?.[0];\n const contentType = contentTypeFromFile || contentTypeFromPreview;\n\n const s3Config = await this.s3HelperService.getS3Config(this.authenticationService.getToken(), 'ap-south-1');\n\n const fileArrayBuffer = await this.selectedFile.arrayBuffer();\n const params_uploadAttachment = {\n Bucket: 'snugdesk-interaction-attachments',\n Key: fileExtension || extFromPreview ? `${interactionMessageAttachmentId}.${fileExtension || extFromPreview}` : interactionMessageAttachmentId,\n Body: new Uint8Array(fileArrayBuffer),\n ContentType: contentType,\n };\n\n const res_uploadAttachment: any = await this.zone.runOutsideAngular(async () => {\n const client = new S3Client(s3Config);\n const command = new PutObjectCommand(params_uploadAttachment);\n const res = await client.send(command);\n return {\n ...res,\n Key: params_uploadAttachment.Key,\n Bucket: params_uploadAttachment.Bucket,\n Location: `https://${params_uploadAttachment.Bucket}.s3.${s3Config.region}.amazonaws.com/${params_uploadAttachment.Key}`,\n };\n });\n\n this.uploadedFile = {\n key: res_uploadAttachment.key || res_uploadAttachment.Key,\n bucket: res_uploadAttachment.Bucket,\n location: res_uploadAttachment.Location,\n };\n }\n\n private isValidReferenceId(refId?: string): refId is string {\n if (!refId) return false;\n const uuidV4Regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidV4Regex.test(refId);\n }\n\n private findMessageById(messages: InteractionMessage[] | undefined, refId: string): InteractionMessage | undefined {\n return messages?.find((msg: InteractionMessage) => msg?.id === refId);\n }\n\n private cacheReferenceMessage(refId: string, message?: InteractionMessage): boolean {\n if (!message) return false;\n this.referenceMessagesMap[refId] = message;\n return true;\n }\n}\n","<div class=\"sd_waba_container_whatsapp_messages_header\">\n @if (isSmallScreen) {\n <button type=\"button\" class=\"sd_waba_button_close_conversation\" title=\"Back\" (click)=\"handleClose()\">\n <svg height=\"28px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\" d=\"m313-440 224 224-57 56-320-320 320-320 57 56-224 224h487v80H313Z\" />\n </svg>\n </button>\n }\n\n @if (!entity) {\n <div class=\"sd_waba_container_conversation_entity_image\">\n <ngx-skeleton-loader appearance=\"circle\"\n [theme]=\"{ 'background-color': 'rgba(255, 255, 255, 0.2)', 'width': '40px', 'height': '40px', 'margin': '0px' }\"\n animation=\"progress\" />\n </div>\n <div class=\"sd_waba_container_conversation_entity_phone_number\">\n <ngx-skeleton-loader\n [theme]=\"{ 'background-color': 'rgba(255, 255, 255, 0.2)', 'width': '250px', 'height': '20px', 'margin': '0px', 'border-radius': '8px' }\"\n animation=\"progress\" />\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"conversationEntityDetails\"></ng-container>\n }\n</div>\n\n<div class=\"sd_waba_container_conversation_messages_content\">\n <div class=\"sd_waba_container_conversation_messages_content_inner\">\n <div class=\"sd_waba_scrollbox\" id=\"sd_scrollbox_whatsapp_messages\" infiniteScroll\n [style.scrollBehavior]=\"(!hasInitialScrollAligned || showInitLoader) ? 'auto' : 'smooth'\"\n [class.sd_waba_scroll_initializing]=\"!hasInitialScrollAligned && !showInitLoader\" [scrollWindow]=\"false\"\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"500\"\n [infiniteScrollDisabled]=\"showInteractionMessageScrollLoader\" (scrolledUp)=\"onScrollWhatsappMessageList()\"\n (scroll)=\"onScroll()\" #scrollboxWhatsAppMessages>\n <div class=\"sd_waba_scrollbox_content\">\n @if (showInitLoader || showInteractionMessageScrollLoader) {\n <div class=\"sd_waba_container_scroll_loader\">\n <div class=\"sd_waba_scroll_item_loader\"></div>\n </div>\n }\n\n <div class=\"sd_waba_container_conversation_messages_list\">\n @for (message of selectedEntityConversationMessages; track message?.id ?? $index) {\n <lib-whatsapp-message-item [message]=\"message\" [interactionAttendeesMap]=\"interactionAttendeesMap\"\n [referenceMessagesMap]=\"referenceMessagesMap\"\n [isRestrictedToTemplateReplies]=\"isRestrictedToTemplateReplies\"\n (reply)=\"setSelectedReferenceMessage(message)\" />\n }\n @empty {\n <!-- Empty state: shown when no messages exist -->\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n\n@if (showScrollToBottomButton) {\n<button type=\"button\" class=\"sd_waba_button_scroll_to_bottom\" title=\"Scroll to bottom\" (click)=\"scrollToBottom()\">\n <div class=\"sd_waba_square_box\">\n <svg viewBox=\"0 0 30 30\" class=\"sd_waba_arrow_st\" height=\"30\" width=\"30\" preserveAspectRatio=\"xMidYMid meet\" x=\"0px\"\n y=\"0px\">\n <path fill=\"currentColor\" d=\"M11,21.212L17.35,15L11,8.65l1.932-1.932L21.215,15l-8.282,8.282L11,21.212z\"></path>\n </svg>\n </div>\n</button>\n}\n\n<div class=\"sd_waba_container_conversation_message_reply\">\n @if (!!entity?.blockedAt || !!entity?.deletedAt || !!selectedEntityConversation?.blockedAt ||\n !!selectedEntityConversation?.deletedAt) {\n <div class=\"sd_waba_container_coversation_message_reply_inner\">\n <div class=\"sd_waba_container_message_reply_templated\">\n <div class=\"sd_waba_container_message_reply_templated_inner\">\n <div class=\"sd_waba_container_message_reply_templated_error\">\n <p>\n This contact is blocked, so your message can't be sent. Unblock them if you'd like to continue the\n conversation.\n </p>\n </div>\n </div>\n </div>\n </div>\n } @else if (showInitLoader) {\n <div class=\"sd_waba_container_coversation_message_reply_inner\">\n <div class=\"sd_waba_container_message_reply_loader\">\n <div class=\"sd_waba_container_skeleton_loader\">\n <ngx-skeleton-loader\n [theme]=\"{ 'width': '500px', 'height': '40px', 'background-color': '#e0e0e0', 'margin': '0px', 'border-radius': '5px' }\"\n animation=\"progress\">\n </ngx-skeleton-loader>\n </div>\n <div class=\"sd_waba_container_skeleton_loader\">\n <div class=\"sd_waba_container_skeleton_loader_icons\">\n <ngx-skeleton-loader [count]=\"3\" appearance=\"circle\"\n [theme]=\"{ 'width': '30px', 'height': '30px', 'margin': '0px 10px 0px 0px', 'background-color': '#e0e0e0' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n </div>\n <ngx-skeleton-loader\n [theme]=\"{ 'width': '40px', 'height': '40px', 'margin': '0px', 'background-color': 'var(--sd-app-color)', 'border-radius': '10px' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n </div>\n </div>\n </div>\n } @else if (checkReplyConditions() || !selectedInteraction || !selectedEntityConversationMessages ||\n selectedEntityConversationMessages.length === 0) {\n <div class=\"sd_waba_container_coversation_message_reply_inner\">\n <div class=\"sd_waba_container_message_reply_templated\">\n <div class=\"sd_waba_container_message_reply_templated_inner\">\n <div class=\"sd_waba_container_message_reply_templated_information\">\n <p>\n The reply time for this conversation has passed (24 hours). You can now reply using template\n messages approved by WhatsApp. If the customer replies, you'll be able to send regular messages\n again. <a href=\"https://www.twilio.com/docs/whatsapp/tutorial/send-whatsapp-notification-messages-templates\"\n target=\"_blank\" rel=\"noopener\">Learn more <i class=\"fa-solid fa-arrow-up-right\"></i></a>\n </p>\n </div>\n <div class=\"sd_waba_container_message_reply_templated_buttons\">\n <ul>\n @if (this.wabaPhoneNumbers && this.wabaPhoneNumbers.length > 1) {\n <li>\n <button class=\"sd_waba_sim_btn\" [matMenuTriggerFor]=\"whatsAppPhoneNumberOptions\"\n [disabled]=\"showSubmitLoader\">\n <span class=\"sd_waba_sim_select_outer\">{{ getSelectedPhoneNumberIndex() + 1}}</span>\n <svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path stroke=\"#26a884\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 19V5a2 2 0 0 0-2-2h-6.172a2 2 0 0 0-1.414.586L5.586 7.414A2 2 0 0 0 5 8.828V19c0 1.105.893 2 1.997 2h10.004A2 2 0 0 0 19 19z\" />\n </svg>\n </button>\n <mat-menu #whatsAppPhoneNumberOptions=\"matMenu\">\n @for (phoneNumber of wabaPhoneNumbers; track phoneNumber?.id ?? $index; let i = $index) {\n <button type=\"button\" mat-menu-item (click)=\"handleChangeSenderPhoneNumber(phoneNumber)\"\n [ngClass]=\"{ 'item_selected': phoneNumber.id === selectedWABAPhoneNumber?.id }\">\n <div class=\"sd_waba_container_sim_outer\">\n <div class=\"sd_waba_container_sim_selected\">\n <span class=\"sd_waba_sim_round_area\">\n @if (phoneNumber.id === selectedWABAPhoneNumber?.id) {\n <span class=\"sd_waba_sim_tick\">\n <i class=\"fa-solid fa-check\"></i></span>\n }\n </span>\n </div>\n <div class=\"sd_waba_container_sim_icon\">\n <span class=\"sd_waba_sim_count\">{{ i + 1 }}</span>\n <svg width=\"22px\" height=\"22px\" viewBox=\"0 0 24 24\" fill=\"#26a884\">\n <path stroke=\"#26a884\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 19V5a2 2 0 0 0-2-2h-6.172a2 2 0 0 0-1.414.586L5.586 7.414A2 2 0 0 0 5 8.828V19c0 1.105.893 2 1.997 2h10.004A2 2 0 0 0 19 19z\" />\n </svg>\n </div>\n <div class=\"sd_waba_container_sim_number\">\n <div class=\"sd_waba_sim_name\">\n <span\n [ngStyle]=\"{ 'text-decoration': phoneNumber.name_status?.trim().toUpperCase() === 'DECLINED' ? 'line-through' : 'none' }\">\n {{ phoneNumber.verified_name || '' }}\n </span>\n @if (phoneNumber.name_status?.trim().toUpperCase() === 'APPROVED') {\n <span class=\"sd_waba_sim_status\">\n <i class=\"fa-solid fa-badge-check\"></i>\n </span>\n }\n </div>\n <div class=\"sd_waba_sim_number\">\n {{ phoneNumber.display_phone_number }}\n </div>\n </div>\n </div>\n </button>\n }\n </mat-menu>\n </li>\n }\n <li>\n <button class=\"sd_waba_btn_select_template\" (click)=\"toggleMessageTemplatePopup()\">\n Select template\n </button>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n } @else {\n @if (selectedReferenceMessage) {\n <div class=\"sd_waba_container_message_reply_reference\">\n <ng-container [ngTemplateOutlet]=\"referenceMessageTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: selectedReferenceMessage }\"></ng-container>\n <button type=\"button\" title=\"Remove message\" (click)=\"removeSelectedReferenceMessage()\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" preserveAspectRatio=\"xMidYMid meet\" fill=\"currentColor\"\n enable-background=\"new 0 0 24 24\">\n <path\n d=\"M19.6004 17.2L14.3004 11.9L19.6004 6.60005L17.8004 4.80005L12.5004 10.2L7.20039 4.90005L5.40039 6.60005L10.7004 11.9L5.40039 17.2L7.20039 19L12.5004 13.7L17.8004 19L19.6004 17.2Z\">\n </path>\n </svg>\n </button>\n </div>\n }\n\n <div class=\"sd_waba_container_coversation_message_reply_inner\">\n @if (selectedFile) {\n <div class=\"sd_waba_container_image_upload\">\n <div class=\"sd_waba_btn_right_close\">\n <button type=\"button\" title=\"Remove file\" (click)=\"removeFileSelection()\" [disabled]=\"showSubmitLoader\"><svg\n viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" preserveAspectRatio=\"xMidYMid meet\" fill=\"currentColor\"\n enable-background=\"new 0 0 24 24\">\n <path\n d=\"M19.6004 17.2L14.3004 11.9L19.6004 6.60005L17.8004 4.80005L12.5004 10.2L7.20039 4.90005L5.40039 6.60005L10.7004 11.9L5.40039 17.2L7.20039 19L12.5004 13.7L17.8004 19L19.6004 17.2Z\">\n </path>\n </svg></button>\n </div>\n <div>\n @switch (getAttachmentType(selectedFile)) {\n @case ('image') {\n <div class=\"sd_waba_image_auto\"><img src=\"{{ selectedFilePreviewBuffer }}\" alt=\"{{ selectedFile?.name }}\">\n </div>\n }\n @case ('video') {\n <div class=\"sd_waba_image_auto\"><video width=\"200px\" [src]=\"selectedFilePreviewBuffer\" controls></video></div>\n <p>{{ selectedFile?.name || 'Video' }}</p>\n }\n @case ('audio') {\n <audio [src]=\"selectedFilePreviewBuffer\" controls></audio>\n <p> {{selectedFile?.name || 'Audio' }}</p>\n }\n @default {\n <div class=\"sd_waba_container_pdf\">\n <svg width=\"75px\" viewBox=\"0 0 16 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M2 0C0.9 0 0.01 0.9 0.01 2L0 18C0 19.1 0.89 20 1.99 20H14C15.1 20 16 19.1 16 18V6.83C16 6.3 15.79 5.79 15.41 5.42L10.58 0.59C10.21 0.21 9.7 0 9.17 0H2ZM9 6V1.5L14.5 7H10C9.45 7 9 6.55 9 6ZM4 10C3.44772 10 3 10.4477 3 11C3 11.5523 3.44772 12 4 12H12C12.5523 12 13 11.5523 13 11C13 10.4477 12.5523 10 12 10H4ZM10 15C10 14.4477 9.55228 14 9 14H4C3.44772 14 3 14.4477 3 15C3 15.5523 3.44772 16 4 16H9C9.55228 16 10 15.5523 10 15Z\"\n fill=\"currentColor\"></path>\n </svg>\n </div>\n <p>{{ selectedFile?.name || 'Document' }}</p>\n }\n }\n </div>\n </div>\n }\n @if (showLocationPreviewPopup) {\n <div class=\"sd_waba_location_form\">\n <form [formGroup]=\"locationForm\">\n @if (selectedLocation.latitude || selectedLocation.longitude) {\n <div class=\"sd_waba_locatin_img_st\">\n <img [src]=\"getMapPreview(selectedLocation.latitude, selectedLocation.longitude)\" alt=\"Location\">\n <div class=\"sd_waba_btn_right_close\">\n <button type=\"button\" title=\"Close\" (click)=\"closeLocationPreviewPopup()\"><svg viewBox=\"0 0 24 24\"\n height=\"24\" width=\"24\" preserveAspectRatio=\"xMidYMid meet\" fill=\"currentColor\"\n enable-background=\"new 0 0 24 24\">\n <path\n d=\"M19.6004 17.2L14.3004 11.9L19.6004 6.60005L17.8004 4.80005L12.5004 10.2L7.20039 4.90005L5.40039 6.60005L10.7004 11.9L5.40039 17.2L7.20039 19L12.5004 13.7L17.8004 19L19.6004 17.2Z\">\n </path>\n </svg></button>\n </div>\n </div>\n }\n <div class=\"sd_waba_full_width_form\">\n <div class=\"sd_waba_name_st_location\">\n <label>Name</label>\n <input type=\"text\" class=\"sd_waba_input_location\" formControlName=\"name\" placeholder=\"Name\">\n </div>\n <div class=\"sd_waba_address_send_continer\">\n <div class=\"sd_waba_left_location_ad\">\n <div class=\"sd_waba_address_label\"><label><i class=\"fa-regular fa-location-dot\"></i> Address</label></div>\n <div class=\"sd_waba_address_textarea\">\n <textarea formControlName=\"address\" placeholder=\"Address\"></textarea>\n <input class=\"sd_waba_hidden\" type=\"text\" formControlName=\"longitude\" placeholder=\"Longitude\">\n <input class=\"sd_waba_hidden\" type=\"text\" formControlName=\"latitude\" placeholder=\"Latitude\">\n </div>\n </div>\n <div class=\"sd_waba_btn_right_ad\"><button type=\"submit\" title=\"Send\" class=\"sd_waba_button_submit\"\n (click)=\"onSubmitWhatsappMessage()\" [ngClass]=\"{ 'sd_waba_button_submit_disabled' : showSubmitLoader }\"\n [disabled]=\"showSubmitLoader\">\n <svg viewBox=\"0 0 512 512\" width=\"16px\">\n <path fill=\"currentColor\"\n d=\"M49.9 27.8C15.1 12.7-19.2 50.1-1.2 83.5L68.1 212.2c4.4 8.3 12.6 13.8 21.9 15c0 0 0 0 0 0l176 22c3.4 .4 6 3.3 6 6.7s-2.6 6.3-6 6.7l-176 22s0 0 0 0c-9.3 1.2-17.5 6.8-21.9 15L-1.2 428.5c-18 33.4 16.3 70.8 51.1 55.7L491.8 292.7c32.1-13.9 32.1-59.5 0-73.4L49.9 27.8z\" />\n </svg>\n </button></div>\n </div>\n </div>\n </form>\n </div>\n } @else {\n <div class=\"sd_waba_container_message_reply_form\">\n <form [formGroup]=\"textMessageForm\">\n <textarea title=\"Add a caption...\" rows=\"1\" formControlName=\"body\" id=\"sd_waba_bodyInput\"\n [placeholder]=\"selectedFile ? 'Add a caption...' : 'Reply from Whatsapp...'\"\n [readonly]=\"checkReplyConditions()\" (keydown)=\"autoGrow($event)\"\n (keydown.enter)=\"(textMessageForm.valid || selectedFile) && onSubmitWhatsappMessage()\"\n #messageInput></textarea>\n </form>\n </div>\n <div class=\"sd_waba_container_message_reply_buttons\">\n <div class=\"sd_waba_container_message_reply_buttons_left\">\n <ul>\n <li class=\"test_st\">\n <button type=\"button\" title=\"Attachment options\" [matMenuTriggerFor]=\"conversationAttachmentOptions\"\n (click)=\"openConversationAttachmentOptions()\"\n [disabled]=\"showSubmitLoader || selectedFile || selectedReferenceMessage || checkReplyConditions()\">\n <svg class=\"sd_waba_svg_color_gray svg_x33\"\n [ngClass]=\"{ 'sd_waba_svg_color_gray_disabled': showSubmitLoader || selectedFile || selectedReferenceMessage || checkReplyConditions() }\"\n viewBox=\"0 0 24 24\" width=\"33px\" height=\"33px\" shape-rendering=\"crispEdges\">\n <path fill=\"currentColor\" d=\"M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6V13z\"></path>\n </svg>\n </button>\n <mat-menu #conversationAttachmentOptions=\"matMenu\" class=\"profile-menu\">\n <div class=\"sd_waba_container_attachment_options\">\n <ul>\n <li (click)=\"openImageUpload()\">\n <div class=\"sd_waba_container_attachment_options_item\">\n <div class=\"sd_waba_menu_attachment sd_waba_menu_attachment_img\"><svg width=\"20\" height=\"20\"\n viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M20 14V2C20 0.9 19.1 0 18 0H6C4.9 0 4 0.9 4 2V14C4 15.1 4.9 16 6 16H18C19.1 16 20 15.1 20 14ZM9.4 10.53L11.03 12.71L13.61 9.49C13.81 9.24 14.19 9.24 14.39 9.49L17.35 13.19C17.61 13.52 17.38 14 16.96 14H7C6.59 14 6.35 13.53 6.6 13.2L8.6 10.53C8.8 10.27 9.2 10.27 9.4 10.53ZM0 18V5C0 4.45 0.45 4 1 4C1.55 4 2 4.45 2 5V17C2 17.55 2.45 18 3 18H15C15.55 18 16 18.45 16 19C16 19.55 15.55 20 15 20H2C0.9 20 0 19.1 0 18Z\"\n fill=\"currentColor\"></path>\n </svg></div>\n <div class=\"sd_waba_menu_attachment_name\">Image</div>\n </div>\n </li>\n <li (click)=\"openAudioUpload()\">\n <div class=\"sd_waba_container_attachment_options_item\">\n <div class=\"sd_waba_menu_attachment sd_waba_menu_attachment_audio\"><svg viewBox=\"0 0 24 24\"\n height=\"24\" width=\"24\" class=\"\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M11.999,14.942c2.001,0,3.531-1.53,3.531-3.531V4.35c0-2.001-1.53-3.531-3.531-3.531 S8.469,2.35,8.469,4.35v7.061C8.469,13.412,9.999,14.942,11.999,14.942z M18.237,11.412c0,3.531-2.942,6.002-6.237,6.002 s-6.237-2.471-6.237-6.002H3.761c0,4.001,3.178,7.297,7.061,7.885v3.884h2.354v-3.884c3.884-0.588,7.061-3.884,7.061-7.885 L18.237,11.412z\">\n </path>\n </svg></div>\n <div class=\"sd_waba_menu_attachment_name\">Audio</div>\n </div>\n </li>\n <li (click)=\"openVideoUpload()\">\n <div class=\"sd_waba_container_attachment_options_item\">\n <div class=\"sd_waba_menu_attachment sd_waba_menu_attachment_video\"> <svg fill=\"currentColor\"\n width=\"20px\" height=\"20px\" viewBox=\"0 0 36 36\" version=\"1.1\"\n preserveAspectRatio=\"xMidYMid meet\">\n <path\n d=\"M32.12,10H3.88A1.88,1.88,0,0,0,2,11.88V30.12A1.88,1.88,0,0,0,3.88,32H32.12A1.88,1.88,0,0,0,34,30.12V11.88A1.88,1.88,0,0,0,32.12,10ZM24.18,21.83l-9.77,4.36A1,1,0,0,1,13,25.28V16.56a1,1,0,0,1,1.41-.91L24.18,20A1,1,0,0,1,24.18,21.83Z\"\n class=\"clr-i-solid clr-i-solid-path-1\"></path>\n <path d=\"M30.14,3h0a1,1,0,0,0-1-1h-22a1,1,0,0,0-1,1h0V4h24Z\"\n class=\"clr-i-solid clr-i-solid-path-2\"></path>\n <path d=\"M32.12,7V7a1,1,0,0,0-1-1h-26a1,1,0,0,0-1,1h0V8h28Z\"\n class=\"clr-i-solid clr-i-solid-path-3\"></path>\n <rect x=\"0\" y=\"0\" width=\"8\" height=\"8\" fill-opacity=\"0\" />\n </svg></div>\n <div class=\"sd_waba_menu_attachment_name\"> Video</div>\n </div>\n </li>\n <li (click)=\"openDocumentUpload()\">\n <div class=\"sd_waba_container_attachment_options_item\">\n <div class=\"sd_waba_menu_attachment sd_waba_menu_attachment_document\"><svg height=\"20\"\n viewBox=\"0 0 16 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M2 0C0.9 0 0.01 0.9 0.01 2L0 18C0 19.1 0.89 20 1.99 20H14C15.1 20 16 19.1 16 18V6.83C16 6.3 15.79 5.79 15.41 5.42L10.58 0.59C10.21 0.21 9.7 0 9.17 0H2ZM9 6V1.5L14.5 7H10C9.45 7 9 6.55 9 6ZM4 10C3.44772 10 3 10.4477 3 11C3 11.5523 3.44772 12 4 12H12C12.5523 12 13 11.5523 13 11C13 10.4477 12.5523 10 12 10H4ZM10 15C10 14.4477 9.55228 14 9 14H4C3.44772 14 3 14.4477 3 15C3 15.5523 3.44772 16 4 16H9C9.55228 16 10 15.5523 10 15Z\"\n fill=\"currentColor\"></path>\n </svg>\n </div>\n <div class=\"sd_waba_menu_attachment_name\">Document</div>\n </div>\n </li>\n <li (click)=\"openLocationPopup()\">\n <div class=\"sd_waba_container_attachment_options_item\">\n <div class=\"sd_waba_menu_attachment sd_waba_menu_attachment_location\"><svg width=\"20px\"\n height=\"20px\" viewBox=\"-1.5 0 15 15\">\n <path fill=\"currentColor\" fill-rule=\"evenodd\"\n d=\"M574,120 C575.324428,120 580,114.054994 580,110.833333 C580,107.611672 577.313708,105 574,105 C570.686292,105 568,107.611672 568,110.833333 C568,114.054994 572.675572,120 574,120 Z M574,113.333333 C575.420161,113.333333 576.571429,112.214045 576.571429,110.833333 C576.571429,109.452621 575.420161,108.333333 574,108.333333 C572.579839,108.333333 571.428571,109.452621 571.428571,110.833333 C571.428571,112.214045 572.579839,113.333333 574,113.333333 Z\"\n transform=\"translate(-568 -105)\" />\n </svg></div>\n <div class=\"sd_waba_menu_attachment_name\">Location</div>\n </div>\n </li>\n </ul>\n </div>\n </mat-menu>\n <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_image_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\" accept=\"image/*, .jpg, .jpeg, .png, .webp, .gif, .heic, .heif\" title=\"Upload image\"\n (change)=\"handleFileSelection($event)\">\n <!-- <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_audio_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\" accept=\"audio/*, .mp3, .aac, .m4a, .wav, .ogg, .opus, .amr, .flac, .3gpp\" title=\"Upload audio\"\n (change)=\"handleFileSelection($event)\"> -->\n <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_audio_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\" accept=\"audio/mpeg, audio/aac, audio/wav, audio/ogg, audio/opus, audio/amr, audio/flac, audio/3gpp\" title=\"Upload audio\"\n (change)=\"handleFileSelection($event)\">\n <!-- <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_video_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\" accept=\"video/*, .mp4, .3gp, .3gpp, .mov, .mkv, .webm\" title=\"Upload video\"\n (change)=\"handleFileSelection($event)\"> -->\n <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_video_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\" accept=\"video/mp4, video/3gpp, video/quicktime, video/x-matroska, video/webm\" title=\"Upload video\"\n (change)=\"handleFileSelection($event)\">\n <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_document_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\"\n accept=\".pdf, .doc, .docx, .rtf, .odt, .ppt, .pptx, .odp, .xls, .xlsx, .ods, .csv, .txt, .zip, .rar, .7z, .tar, .gz, .vcf\"\n title=\"Upload document\" (change)=\"handleFileSelection($event)\">\n </li>\n <li>\n <button type=\"button\" title=\"Emoji\" (click)=\"toggleEmojiPicker()\"\n [disabled]=\"showSubmitLoader || checkReplyConditions()\">\n <svg class=\"sd_waba_svg_color_gray\"\n [ngClass]=\"{ 'sd_waba_svg_color_gray_disabled': showSubmitLoader || checkReplyConditions() }\"\n viewBox=\"0 0 24 24\" height=\"26px\" width=\"26px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M9.153,11.603c0.795,0,1.439-0.879,1.439-1.962S9.948,7.679,9.153,7.679 S7.714,8.558,7.714,9.641S8.358,11.603,9.153,11.603z M5.949,12.965c-0.026-0.307-0.131,5.218,6.063,5.551 c6.066-0.25,6.066-5.551,6.066-5.551C12,14.381,5.949,12.965,5.949,12.965z M17.312,14.073c0,0-0.669,1.959-5.051,1.959 c-3.505,0-5.388-1.164-5.607-1.959C6.654,14.073,12.566,15.128,17.312,14.073z M11.804,1.011c-6.195,0-10.826,5.022-10.826,11.217 s4.826,10.761,11.021,10.761S23.02,18.423,23.02,12.228C23.021,6.033,17.999,1.011,11.804,1.011z M12,21.354 c-5.273,0-9.381-3.886-9.381-9.159s3.942-9.548,9.215-9.548s9.548,4.275,9.548,9.548C21.381,17.467,17.273,21.354,12,21.354z M15.108,11.603c0.795,0,1.439-0.879,1.439-1.962s-0.644-1.962-1.439-1.962s-1.439,0.879-1.439,1.962S14.313,11.603,15.108,11.603z\">\n </path>\n </svg>\n </button>\n </li>\n <li>\n <button type=\"button\" title=\"Templates\" (click)=\"toggleMessageTemplatePopup()\"\n [disabled]=\"showSubmitLoader || selectedFile || selectedReferenceMessage\">\n <svg class=\"sd_waba_svg_color_gray\"\n [ngClass]=\"{ 'sd_waba_svg_color_gray_disabled': showSubmitLoader || selectedFile || selectedReferenceMessage }\"\n viewBox=\"0 0 576 512\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M104 32H88C39.4 32 0 71.4 0 120v16c0 13.3 10.7 24 24 24s24-10.7 24-24V120c0-22.1 17.9-40 40-40h16c13.3 0 24-10.7 24-24s-10.7-24-24-24zM0 296c0 13.3 10.7 24 24 24s24-10.7 24-24V216c0-13.3-10.7-24-24-24s-24 10.7-24 24v80zm24 56c-13.3 0-24 10.7-24 24v16c0 48.6 39.4 88 88 88h16c13.3 0 24-10.7 24-24s-10.7-24-24-24H88c-22.1 0-40-17.9-40-40V376c0-13.3-10.7-24-24-24zM424 192c13.3 0 24-10.7 24-24V120c0-48.6-39.4-88-88-88H344c-13.3 0-24 10.7-24 24s10.7 24 24 24h16c22.1 0 40 17.9 40 40v48c0 13.3 10.7 24 24 24zM256 456c0-13.3-10.7-24-24-24H184c-13.3 0-24 10.7-24 24s10.7 24 24 24h48c13.3 0 24-10.7 24-24zm8-376c13.3 0 24-10.7 24-24s-10.7-24-24-24H184c-13.3 0-24 10.7-24 24s10.7 24 24 24h80zM432 512a144 144 0 1 0 0-288 144 144 0 1 0 0 288zm16-208v48h48c8.8 0 16 7.2 16 16s-7.2 16-16 16H448v48c0 8.8-7.2 16-16 16s-16-7.2-16-16V384H368c-8.8 0-16-7.2-16-16s7.2-16 16-16h48V304c0-8.8 7.2-16 16-16s16 7.2 16 16z\">\n </path>\n </svg>\n </button>\n </li>\n </ul>\n @if (showEmojiPicker) {\n <emoji-mart (emojiSelect)=\"handleEmojiSelection($event)\" title=\"Choose your emoji\" [showPreview]=\"false\"\n [darkMode]=\"false\" [isNative]=\"true\" [perLine]=\"10\">\n </emoji-mart>\n }\n </div>\n <div class=\"sd_waba_container_message_reply_buttons_right\">\n <ul>\n @if (this.wabaPhoneNumbers && this.wabaPhoneNumbers.length > 1) {\n <li>\n <button class=\"sd_waba_sim_btn\" [matMenuTriggerFor]=\"whatsAppPhoneNumberOptions\"\n [disabled]=\"showSubmitLoader || checkReplyConditions()\">\n <span class=\"sd_waba_sim_select_outer\">{{ getSelectedPhoneNumberIndex() + 1}}</span>\n <svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path stroke=\"#26a884\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 19V5a2 2 0 0 0-2-2h-6.172a2 2 0 0 0-1.414.586L5.586 7.414A2 2 0 0 0 5 8.828V19c0 1.105.893 2 1.997 2h10.004A2 2 0 0 0 19 19z\" />\n </svg>\n </button>\n <mat-menu #whatsAppPhoneNumberOptions=\"matMenu\">\n @for (phoneNumber of wabaPhoneNumbers; track phoneNumber?.id ?? $index; let i = $index) {\n <button mat-menu-item (click)=\"handleChangeSenderPhoneNumber(phoneNumber)\"\n [ngClass]=\"{ 'item_selected': phoneNumber.id === selectedWABAPhoneNumber?.id }\">\n <div class=\"sd_waba_container_sim_outer\">\n <div class=\"sd_waba_container_sim_selected\">\n <span class=\"sd_waba_sim_round_area\">\n @if (phoneNumber.id === selectedWABAPhoneNumber?.id) {\n <span class=\"sd_waba_sim_tick\"><i class=\"fa-solid fa-check\"></i></span>\n }\n </span>\n </div>\n <div class=\"sd_waba_container_sim_icon\">\n <span class=\"sd_waba_sim_count\">{{ i + 1 }}</span>\n <svg width=\"22px\" height=\"22px\" viewBox=\"0 0 24 24\" fill=\"#26a884\">\n <path stroke=\"#26a884\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 19V5a2 2 0 0 0-2-2h-6.172a2 2 0 0 0-1.414.586L5.586 7.414A2 2 0 0 0 5 8.828V19c0 1.105.893 2 1.997 2h10.004A2 2 0 0 0 19 19z\" />\n </svg>\n </div>\n <div class=\"sd_waba_container_sim_number\">\n <div class=\"sd_waba_sim_name\">\n <span\n [ngStyle]=\"{ 'text-decoration': phoneNumber.name_status?.trim().toUpperCase() === 'DECLINED' ? 'line-through' : 'none' }\">\n {{ phoneNumber.verified_name || '' }}\n </span>\n @if (phoneNumber.name_status?.trim().toUpperCase() === 'APPROVED') {\n <span class=\"sd_waba_sim_status\">\n <i class=\"fa-solid fa-badge-check\"></i>\n </span>\n }\n </div>\n <div class=\"sd_waba_sim_number\">\n {{ phoneNumber.display_phone_number }}\n </div>\n </div>\n </div>\n </button>\n }\n </mat-menu>\n </li>\n }\n <li>\n <button type=\"submit\" title=\"Send\" class=\"sd_waba_button_submit\" (click)=\"onSubmitWhatsappMessage()\"\n [disabled]=\"showSubmitLoader || (textMessageForm.invalid && !selectedFile)\">\n <svg viewBox=\"0 0 512 512\" width=\"16px\">\n <path fill=\"currentColor\"\n d=\"M49.9 27.8C15.1 12.7-19.2 50.1-1.2 83.5L68.1 212.2c4.4 8.3 12.6 13.8 21.9 15c0 0 0 0 0 0l176 22c3.4 .4 6 3.3 6 6.7s-2.6 6.3-6 6.7l-176 22s0 0 0 0c-9.3 1.2-17.5 6.8-21.9 15L-1.2 428.5c-18 33.4 16.3 70.8 51.1 55.7L491.8 292.7c32.1-13.9 32.1-59.5 0-73.4L49.9 27.8z\" />\n </svg>\n </button>\n </li>\n </ul>\n </div>\n <div class=\"sd_waba_clear\"></div>\n </div>\n }\n </div>\n }\n</div>\n\n<ng-template #conversationEntityDetails>\n <div class=\"sd_waba_container_conversation_entity_image\">\n @if (entity?.image?.location?.length > 0) {\n <img src=\"{{ entity?.image?.location }}\" alt=\"{{ entity?.name }}\" (error)=\"onEntityImageError()\" />\n }\n @else {\n <ngx-avatars initialsSize=\"2\" [name]=\"entity?.name\" [title]=\"entity?.name\" [round]=\"true\" [size]=\"40\" />\n }\n </div>\n\n <div class=\"sd_waba_container_conversation_entity_phone_number\">\n <div class=\"sd_waba_container_conversation_entity_name\">{{ entity?.name | titlecase }}</div>\n @if (!!entity?.blockedAt || !!entity?.deletedAt || !!selectedEntityConversation?.blockedAt ||\n !!selectedEntityConversation?.deletedAt) {\n <span>(BLOCKED)</span>\n }\n </div>\n\n @if (!!entity && !entity.blockedAt && !entity.deletedAt\n && !!selectedEntityConversation && !selectedEntityConversation.blockedAt && !selectedEntityConversation.deletedAt\n && !!selectedInteraction && !selectedInteraction.completedAt) {\n @if (!!remainingCountdownTime && remainingCountdownTime > 0) {\n <div class=\"sd_waba_container_conversation_timer\">\n <i class=\"fa-regular fa-clock\"></i> {{ formatTime(remainingCountdownTime) }}\n </div>\n }\n }\n\n <div class=\"sd_waba_container_conversation_options\">\n <button class=\"sd_waba_button_conversation_options\" type=\"button\" title=\"Options\" mat-button\n [matMenuTriggerFor]=\"conversationOptions\">\n <svg class=\"sd_waba_icon_options\" viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M12,7c1.104,0,2-0.896,2-2c0-1.105-0.895-2-2-2c-1.104,0-2,0.894-2,2 C10,6.105,10.895,7,12,7z M12,9c-1.104,0-2,0.894-2,2c0,1.104,0.895,2,2,2c1.104,0,2-0.896,2-2C13.999,9.895,13.104,9,12,9z M12,15 c-1.104,0-2,0.894-2,2c0,1.104,0.895,2,2,2c1.104,0,2-0.896,2-2C13.999,15.894,13.104,15,12,15z\">\n </path>\n </svg>\n </button>\n <mat-menu #conversationOptions=\"matMenu\">\n <div class=\"sd_waba_mat_menu_outer\">\n <!-- End Interaction -->\n @if (!!selectedInteraction && !selectedInteraction.completedAt) {\n <button mat-menu-item type=\"button\" (click)=\"showPopup('endInteraction')\">\n @if (showMarkInteractionAsCompleteLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n } @else {\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M40-120v-80h880v80H40Zm120-120q-33 0-56.5-23.5T80-320v-440q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v440q0 33-23.5 56.5T800-240H160Zm0-80h640v-440H160v440Zm0 0v-440 440Zm216-60 104-104 104 104 56-56-104-104 104-104-56-56-104 104-104-104-56 56 104 104-104 104 56 56Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">End Interaction</div>\n </div>\n }\n </button>\n }\n\n <!-- Block Conversation -->\n @if (!selectedEntityConversation?.blockedAt) {\n <button mat-menu-item type=\"button\" (click)=\"showPopup('blockConversation')\">\n @if (showMarkConversationAsBlockedLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n } @else {\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M280-400q-17 0-28.5-11.5T240-440q0-17 11.5-28.5T280-480q17 0 28.5 11.5T320-440q0 17-11.5 28.5T280-400Zm548 154-74-74h46v-480H274l-80-80h606q33 0 56.5 23.5T880-800v480q0 26-14.5 45.5T828-246ZM554-520l-80-80h246v80H554ZM820-28 606-240H240L80-80v-688l-52-52 56-56L876-84l-56 56ZM344-504Zm170-56Zm-234 40q-17 0-28.5-11.5T240-560q0-17 11.5-28.5T280-600q17 0 28.5 11.5T320-560q0 17-11.5 28.5T280-520Zm154-120-34-34v-46h320v80H434Zm-274-48v413l46-45h322L160-688Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Block Conversation</div>\n </div>\n }\n </button>\n }\n\n <!-- Unblock Conversation -->\n @if (!!selectedEntityConversation?.blockedAt) {\n <button mat-menu-item type=\"button\" (click)=\"showPopup('unblockConversation')\">\n @if (showMarkConversationAsUnblockedLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n } @else {\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd sd_waba_btn_unblock\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M280-400q17 0 28.5-11.5T320-440q0-17-11.5-28.5T280-480q-17 0-28.5 11.5T240-440q0 17 11.5 28.5T280-400Zm0-120q17 0 28.5-11.5T320-560q0-17-11.5-28.5T280-600q-17 0-28.5 11.5T240-560q0 17 11.5 28.5T280-520Zm0-120q17 0 28.5-11.5T320-680q0-17-11.5-28.5T280-720q-17 0-28.5 11.5T240-680q0 17 11.5 28.5T280-640Zm120 240h200v-80H400v80Zm0-120h320v-80H400v80Zm0-120h320v-80H400v80ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Unblock Conversation</div>\n </div>\n }\n </button>\n }\n\n <!-- Block Sender -->\n @if (!entity?.blockedAt) {\n <button mat-menu-item type=\"button\" (click)=\"showPopup('blockSender')\">\n @if (showMarkEntityAsBlockedLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n } @else {\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M791-55 686-160H160v-112q0-34 17.5-62.5T224-378q45-23 91.5-37t94.5-21L55-791l57-57 736 736-57 57ZM240-240h366L486-360h-6q-56 0-111 13.5T260-306q-9 5-14.5 14t-5.5 20v32Zm496-138q29 14 46 42.5t18 61.5L666-408q18 7 35.5 14t34.5 16ZM568-506l-59-59q23-9 37-29.5t14-45.5q0-33-23.5-56.5T480-720q-25 0-45.5 14T405-669l-59-59q23-34 58-53t76-19q66 0 113 47t47 113q0 41-19 76t-53 58Zm38 266H240h366ZM457-617Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Block Sender</div>\n </div>\n }\n </button>\n }\n\n <!-- Unblock Sender -->\n @if (!!entity?.blockedAt) {\n <button mat-menu-item type=\"button\" (click)=\"showPopup('unblockSender')\">\n @if (showMarkEntityAsUnblockedLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n } @else {\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd sd_waba_btn_unblock\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M480-480q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM160-160v-112q0-34 17.5-62.5T224-378q62-31 126-46.5T480-440q66 0 130 15.5T736-378q29 15 46.5 43.5T800-272v112H160Zm80-80h480v-32q0-11-5.5-20T700-306q-54-27-109-40.5T480-360q-56 0-111 13.5T260-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T560-640q0-33-23.5-56.5T480-720q-33 0-56.5 23.5T400-640q0 33 23.5 56.5T480-560Zm0-80Zm0 400Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Unblock Sender</div>\n </div>\n }\n </button>\n }\n </div>\n </mat-menu>\n </div>\n</ng-template>\n\n<ng-template #referenceMessageTemplate let-message>\n @let isInbound = parseIsInbound(message);\n <div class=\"sd_waba_container_reference_message_outer\">\n <div class=\"sd_waba_container_reference_message\"\n [ngClass]=\"{ 'sd_waba_background_incoming_bgcolor': isInbound, 'sd_waba_background_outgoing_bgcolor': !isInbound }\">\n <p class=\"sd_waba_reference_message_from\">{{ message?.interactionAttendee?.name }}</p>\n @if (message?.attachments?.length) {\n @for (attachment of message.attachments; track attachment?.id ?? $index) {\n <div>\n @switch (getAttachmentType(attachment)) {\n @case ('image') {\n <img src=\"{{ attachment?.file?.location }}\" alt=\"{{ attachment?.name }}\">\n }\n @case ('video') {\n <i class=\"fa-solid fa-video\"></i> {{ attachment?.name }}\n }\n @case ('audio') {\n <i class=\"fa-solid fa-headphones\"></i> {{ attachment?.name }}\n }\n @default {\n <i class=\"fa-solid fa-file\"></i> {{ attachment?.name }}\n }\n }\n </div>\n }\n }\n @if (parseJSON(message?.metadata)?.location) {\n <p>\n <i class=\"fa-solid fa-location-dot\"></i>\n \n {{ parseJSON(message?.metadata)?.location?.name }}, {{ parseJSON(message?.metadata)?.location?.address }}\n </p>\n }\n @if (parseJSON(message?.metadata)?.contacts) {\n <p>\n <i class=\"fa-solid fa-circle-user\"></i>\n \n {{ parseJSON(message?.metadata)?.contacts[0]?.name?.formatted_name }}\n </p>\n }\n <p>{{ message.body }}</p>\n </div>\n </div>\n</ng-template>\n\n@if (sharedContact) {\n<div class=\"sd_waba_container_popup_grey_bg sd_waba_container_padding\">\n <div class=\"sd_waba_container_popup_grey\">\n <div class=\"sd_waba_view_container_wizard\">\n <div class=\"sd_waba_wizard_header_area_top\">\n <h2>View contact</h2>\n </div>\n <div class=\"sd_waba_container_outer_wizard\">\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_contact_view_inner\">\n @if (sharedContact.phones && sharedContact.phones.length > 0) {\n @for (phone of sharedContact.phones; track phone?.phone ?? $index) {\n <div class=\"sd_waba_contact_outer_area\">\n <div class=\"sd_waba_contact_icon\">\n <!-- SVG omitted for brevity; unchanged -->\n <svg viewBox=\"0 0 212 212\" height=\"49\" width=\"49\" preserveAspectRatio=\"xMidYMid meet\" class=\"\"\n version=\"1.1\" x=\"0px\" y=\"0px\" enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\" class=\"primary\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\" class=\"primary\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_name_st\">{{ sharedContact.name.prefix }} {{ sharedContact.name.formatted_name\n }} {{ sharedContact.name.suffix }}</div>\n <div class=\"sd_waba_contact_number_st\">{{ phone.phone }}</div>\n </div>\n </div>\n }\n }\n\n @if (sharedContact.emails && sharedContact.emails.length > 0) {\n @for (email of sharedContact.emails; track email?.email ?? $index) {\n <div class=\"sd_waba_contact_outer_area_rpt\">\n <div class=\"sd_waba_contact_icon\">\n <div class=\"sd_waba_contact_icon2\">\n <svg width=\"15px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M176 56l0 40 160 0 0-40c0-4.4-3.6-8-8-8L184 48c-4.4 0-8 3.6-8 8zM128 96l0-40c0-30.9 25.1-56 56-56L328 0c30.9 0 56 25.1 56 56l0 40 64 0c35.3 0 64 28.7 64 64l0 120 0 136c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 280 0 160c0-35.3 28.7-64 64-64l64 0zM48 304l0 112c0 8.8 7.2 16 16 16l384 0c8.8 0 16-7.2 16-16l0-112-144 0 0 16c0 17.7-14.3 32-32 32l-64 0c-17.7 0-32-14.3-32-32l0-16L48 304zm144-48l128 0 144 0 0-96c0-8.8-7.2-16-16-16l-88 0-208 0-88 0c-8.8 0-16 7.2-16 16l0 96 144 0z\" />\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_number_st\">\n <div class=\"sd_waba_name_type\">{{ email.type }}:</div>\n <div class=\"sd_waba_name_details\"> {{ email.email }}</div>\n </div>\n </div>\n </div>\n }\n }\n\n @if (sharedContact.birthday) {\n <div class=\"sd_waba_contact_outer_area_rpt\">\n <div class=\"sd_waba_contact_icon\">\n <div class=\"sd_waba_contact_icon2\">\n <svg width=\"17px\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\"\n d=\"M86.4 5.5L61.8 47.6C58 54.1 56 61.6 56 69.2L56 72c0 22.1 17.9 40 40 40s40-17.9 40-40l0-2.8c0-7.6-2-15-5.8-21.6L105.6 5.5C103.6 2.1 100 0 96 0s-7.6 2.1-9.6 5.5zm128 0L189.8 47.6c-3.8 6.5-5.8 14-5.8 21.6l0 2.8c0 22.1 17.9 40 40 40s40-17.9 40-40l0-2.8c0-7.6-2-15-5.8-21.6L233.6 5.5C231.6 2.1 228 0 224 0s-7.6 2.1-9.6 5.5zM317.8 47.6c-3.8 6.5-5.8 14-5.8 21.6l0 2.8c0 22.1 17.9 40 40 40s40-17.9 40-40l0-2.8c0-7.6-2-15-5.8-21.6L361.6 5.5C359.6 2.1 356 0 352 0s-7.6 2.1-9.6 5.5L317.8 47.6zM128 176c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 48c-35.3 0-64 28.7-64 64l0 71c8.3 5.2 18.1 9 28.8 9c13.5 0 27.2-6.1 38.4-13.4c5.4-3.5 9.9-7.1 13-9.7c1.5-1.3 2.7-2.4 3.5-3.1c.4-.4 .7-.6 .8-.8l.1-.1s0 0 0 0s0 0 0 0s0 0 0 0s0 0 0 0c3.1-3.2 7.4-4.9 11.9-4.8s8.6 2.1 11.6 5.4c0 0 0 0 0 0s0 0 0 0l.1 .1c.1 .1 .4 .4 .7 .7c.7 .7 1.7 1.7 3.1 3c2.8 2.6 6.8 6.1 11.8 9.5c10.2 7.1 23 13.1 36.3 13.1s26.1-6 36.3-13.1c5-3.5 9-6.9 11.8-9.5c1.4-1.3 2.4-2.3 3.1-3c.3-.3 .6-.6 .7-.7l.1-.1c3-3.5 7.4-5.4 12-5.4s9 2 12 5.4l.1 .1c.1 .1 .4 .4 .7 .7c.7 .7 1.7 1.7 3.1 3c2.8 2.6 6.8 6.1 11.8 9.5c10.2 7.1 23 13.1 36.3 13.1s26.1-6 36.3-13.1c5-3.5 9-6.9 11.8-9.5c1.4-1.3 2.4-2.3 3.1-3c.3-.3 .6-.6 .7-.7l.1-.1c2.9-3.4 7.1-5.3 11.6-5.4s8.7 1.6 11.9 4.8c0 0 0 0 0 0s0 0 0 0s0 0 0 0l.1 .1c.2 .2 .4 .4 .8 .8c.8 .7 1.9 1.8 3.5 3.1c3.1 2.6 7.5 6.2 13 9.7c11.2 7.3 24.9 13.4 38.4 13.4c10.7 0 20.5-3.9 28.8-9l0-71c0-35.3-28.7-64-64-64l0-48c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 48-64 0 0-48c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 48-64 0 0-48zM448 394.6c-8.5 3.3-18.2 5.4-28.8 5.4c-22.5 0-42.4-9.9-55.8-18.6c-4.1-2.7-7.8-5.4-10.9-7.8c-2.8 2.4-6.1 5-9.8 7.5C329.8 390 310.6 400 288 400s-41.8-10-54.6-18.9c-3.5-2.4-6.7-4.9-9.4-7.2c-2.7 2.3-5.9 4.7-9.4 7.2C201.8 390 182.6 400 160 400s-41.8-10-54.6-18.9c-3.7-2.6-7-5.2-9.8-7.5c-3.1 2.4-6.8 5.1-10.9 7.8C71.2 390.1 51.3 400 28.8 400c-10.6 0-20.3-2.2-28.8-5.4L0 480c0 17.7 14.3 32 32 32l384 0c17.7 0 32-14.3 32-32l0-85.4z\" />\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_number_st\">\n <div class=\"sd_waba_name_type\">Birthday:</div>\n <div class=\"sd_waba_name_details\"> {{ sharedContact.birthday }}</div>\n </div>\n </div>\n </div>\n }\n\n @if (sharedContact.org) {\n <div class=\"sd_waba_contact_outer_area_rpt\">\n <div class=\"sd_waba_contact_icon\">\n <div class=\"sd_waba_contact_icon2\">\n <svg width=\"18px\" viewBox=\"0 0 16 16\" version=\"1.1\">\n <path fill=\"currentColor\"\n d=\"M14 15v-11h-3v-3h-9v14h-2v1h7v-3h2v3h7v-1h-2zM6 11h-2v-2h2v2zM6 8h-2v-2h2v2zM6 5h-2v-2h2v2zM9 11h-2v-2h2v2zM9 8h-2v-2h2v2zM9 5h-2v-2h2v2zM13 11h-2v-2h2v2zM13 8h-2v-2h2v2z\">\n </path>\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_number_st\">\n <div class=\"sd_waba_name_type\">COMPANY:</div>\n <div class=\"sd_waba_name_details\">{{ sharedContact.org.company }} {{ sharedContact.org.department }}\n {{\n sharedContact.org.title }}</div>\n </div>\n </div>\n </div>\n }\n\n @if (sharedContact.urls && sharedContact.urls.length > 0) {\n @for (url of sharedContact.urls; track url?.url ?? $index) {\n <div class=\"sd_waba_contact_outer_area_rpt\">\n <div class=\"sd_waba_contact_icon\">\n <div class=\"sd_waba_contact_icon2\">\n <svg width=\"18px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M55.7 199.7L96 240l48 0 48 48 0 64 32 32 0 64 64 0 0-48 64-64 0-80-128 0-32-32 0-32 80 0 0-32-32-32 0-16 32-32 0-31.4c-5.3-.4-10.6-.6-16-.6C160.6 48 80.3 112.2 55.7 199.7zM464 256c0-36.9-9.6-71.5-26.4-101.6L400 192l0 80 63.4 0c.4-5.3 .6-10.6 .6-16zM0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256z\" />\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_number_st\">\n <div class=\"sd_waba_name_type\">{{ url.type }}:</div>\n <div class=\"sd_waba_name_details\"><span>{{ url.url }}</span></div>\n </div>\n </div>\n </div>\n }\n }\n\n @if (sharedContact.addresses && sharedContact.addresses.length > 0) {\n @for (address of sharedContact.addresses; track address?.id ?? $index) {\n <div class=\"sd_waba_contact_outer_area_rpt\">\n <div class=\"sd_waba_contact_icon\">\n <div class=\"sd_waba_contact_icon2\">\n <svg width=\"15px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M176 56l0 40 160 0 0-40c0-4.4-3.6-8-8-8L184 48c-4.4 0-8 3.6-8 8zM128 96l0-40c0-30.9 25.1-56 56-56L328 0c30.9 0 56 25.1 56 56l0 40 64 0c35.3 0 64 28.7 64 64l0 120 0 136c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 280 0 160c0-35.3 28.7-64 64-64l64 0zM48 304l0 112c0 8.8 7.2 16 16 16l384 0c8.8 0 16-7.2 16-16l0-112-144 0 0 16c0 17.7-14.3 32-32 32l-64 0c-17.7 0-32-14.3-32-32l0-16L48 304zm144-48l128 0 144 0 0-96c0-8.8-7.2-16-16-16l-88 0-208 0-88 0c-8.8 0-16 7.2-16 16l0 96 144 0z\" />\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_number_st\">\n <div class=\"sd_waba_name_type\">ADDRESS:</div>\n <div class=\"sd_waba_name_details\"> {{ address.city }} {{ address.country }}\n {{ address.country_code }}\n {{ address.state }} {{ address.street }} {{ address.type }} {{ address.zip }}</div>\n </div>\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"sd_waba_container_bottom_wizard\">\n <div class=\"sd_waba_container_settings_buttons\">\n <ul>\n <li><button class=\"sd_waba_button_cancel\" (click)=\"closeContactDetailPopup()\">Close</button></li>\n <li><button class=\"sd_waba_button_submit\" (click)=\"saveContactAsEntity()\">Save contact</button></li>\n </ul>\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n\n@if (showTemplatePopup) {\n<lib-whatsapp-templates [whatsAppInteractionWidget]=\"wabaInteractionWidget\" (close)=\"toggleMessageTemplatePopup()\"\n (submitTemplate)=\"handleSelectMessageTemplate($event)\"></lib-whatsapp-templates>\n}\n\n@if (showLocationPopup) {\n<lib-location-input (close)=\"closeLocationPopup()\" (submitLocation)=\"handleLocationSelection($event)\">\n</lib-location-input>\n}\n\n@if (isPopupOpen) {\n<div class=\"sd_waba_container_popup_grey_bg\" [ngClass]=\"{ 'sd_waba_fade_out': isPopupClosing }\"\n (animationend)=\"onPopupAnimationEnd()\">\n\n <div class=\"sd_waba_container_popup_alert\" [ngClass]=\"{ 'sd_waba_scale_out': isPopupClosing }\">\n <div class=\"sd_waba_container_popup_grey_inner\" [ngClass]=\"{ 'sd_waba_scale_out': isPopupClosing }\">\n <span class=\"sd_waba_icon_delete\">\n @switch (popupMode) {\n @case ('blockConversation') {\n <svg height=\"26px\" viewBox=\"0 -960 960 960\" width=\"26px\">\n <path fill=\"currentColor\" d=\"M280-400q-17 0-28.5-11.5T240-440q0-17 11.5-28.5T280-480q17 0 28.5 11.5T320-440q0 17-11.5 28.5T280-400Zm548 154-74-74h46v-480H274l-80-80h606q33 0 56.5 23.5T880-800v480q0 26-14.5 45.5T828-246ZM554-520l-80-80h246v80H554ZM820-28 606-240H240L80-80v-688l-52-52 56-56L876-84l-56 56ZM344-504Zm170-56Zm-234 40q-17 0-28.5-11.5T240-560q0-17 11.5-28.5T280-600q17 0 28.5 11.5T320-560q0 17-11.5 28.5T280-520Zm154-120-34-34v-46h320v80H434Zm-274-48v413l46-45h322L160-688Z\" />\n </svg>\n }\n @case ('unblockConversation') {\n <svg height=\"26px\" viewBox=\"0 -960 960 960\" width=\"26px\" class=\"sd_waba_success_icon_color\">\n <path fill=\"currentColor\" d=\"M280-400q17 0 28.5-11.5T320-440q0-17-11.5-28.5T280-480q-17 0-28.5 11.5T240-440q0 17 11.5 28.5T280-400Zm0-120q17 0 28.5-11.5T320-560q0-17-11.5-28.5T280-600q-17 0-28.5 11.5T240-560q0 17 11.5 28.5T280-520Zm0-120q17 0 28.5-11.5T320-680q0-17-11.5-28.5T280-720q-17 0-28.5 11.5T240-680q0 17 11.5 28.5T280-640Zm120 240h200v-80H400v80Zm0-120h320v-80H400v80Zm0-120h320v-80H400v80ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z\"></path>\n </svg>\n }\n @case ('blockSender') {\n <svg height=\"28px\" viewBox=\"0 -960 960 960\" width=\"28px\">\n <path fill=\"currentColor\" d=\"M791-55 686-160H160v-112q0-34 17.5-62.5T224-378q45-23 91.5-37t94.5-21L55-791l57-57 736 736-57 57ZM240-240h366L486-360h-6q-56 0-111 13.5T260-306q-9 5-14.5 14t-5.5 20v32Zm496-138q29 14 46 42.5t18 61.5L666-408q18 7 35.5 14t34.5 16ZM568-506l-59-59q23-9 37-29.5t14-45.5q0-33-23.5-56.5T480-720q-25 0-45.5 14T405-669l-59-59q23-34 58-53t76-19q66 0 113 47t47 113q0 41-19 76t-53 58Zm38 266H240h366ZM457-617Z\" />\n </svg>\n }\n @case ('unblockSender') {\n <svg height=\"28px\" viewBox=\"0 -960 960 960\" width=\"28px\" class=\"sd_waba_success_icon_color\"><path fill=\"currentColor\" d=\"M480-480q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM160-160v-112q0-34 17.5-62.5T224-378q62-31 126-46.5T480-440q66 0 130 15.5T736-378q29 15 46.5 43.5T800-272v112H160Zm80-80h480v-32q0-11-5.5-20T700-306q-54-27-109-40.5T480-360q-56 0-111 13.5T260-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T560-640q0-33-23.5-56.5T480-720q-33 0-56.5 23.5T400-640q0 33 23.5 56.5T480-560Zm0-80Zm0 400Z\"></path></svg>\n }\n @default {\n <svg width=\"30px\" height=\"30px\" viewBox=\"0 -960 960 960\">\n <path fill=\"currentColor\" d=\"M40-120v-80h880v80H40Zm120-120q-33 0-56.5-23.5T80-320v-440q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v440q0 33-23.5 56.5T800-240H160Zm0-80h640v-440H160v440Zm0 0v-440 440Zm216-60 104-104 104 104 56-56-104-104 104-104-56-56-104 104-104-104-56 56 104 104-104 104 56 56Z\" />\n </svg>\n }\n }\n </span>\n @switch (popupMode) {\n @case ('blockConversation') {\n <h2>Block conversation with {{ entity?.name || 'this contact' }}?</h2>\n <p>Are you sure you want to block this conversation? You will stop receiving messages until it is unblocked.</p>\n }\n @case ('unblockConversation') {\n <h2>Unblock conversation with {{ entity?.name || 'this contact' }}?</h2>\n <p>This will allow messages from this conversation to come through again.</p>\n }\n @case ('blockSender') {\n <h2>Block {{ entity?.name || 'this contact' }}?</h2>\n <p>Blocking the sender stops messages from this contact across conversations until you unblock them.</p>\n }\n @case ('unblockSender') {\n <h2>Unblock {{ entity?.name || 'this contact' }}?</h2>\n <p>Unblocking the sender will allow messages from this contact to come through again.</p>\n }\n @default {\n <h2>End Interaction with {{ entity?.name || 'this contact' }}?</h2>\n <p>Are you sure you want to continue? A new interaction starts when you send or receive a message.</p>\n }\n }\n\n <div class=\"sd_waba_container_popup_grey_buttons\">\n <ul>\n <li>\n <button type=\"button\" class=\"sd_waba_button_cancel\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"requestClosePopup()\">\n Cancel\n </button>\n </li>\n <li>\n @switch (popupMode) {\n @case ('blockConversation') {\n <button type=\"button\" class=\"sd_waba_button_delete_submit\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"markEntityConversationAsBlocked()\">\n <span>Block</span>\n </button>\n }\n @case ('unblockConversation') {\n <button type=\"button\" class=\"sd_waba_button_delete_submit\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"markEntityConversationAsUnblocked()\">\n <span>Unblock</span>\n </button>\n }\n @case ('blockSender') {\n <button type=\"button\" class=\"sd_waba_button_delete_submit\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"markEntityAsBlocked()\">\n <span>Block</span>\n </button>\n }\n @case ('unblockSender') {\n <button type=\"button\" class=\"sd_waba_button_delete_submit\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"markEntityAsUnblocked()\">\n <span>Unblock</span>\n </button>\n }\n @default {\n <button type=\"button\" class=\"sd_waba_button_delete_submit\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"markInteractionAsDisconnected()\">\n <span>End</span>\n </button>\n }\n }\n </li>\n </ul>\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n </div>\n</div>\n}\n","import { AfterViewInit, ElementRef, Component, HostListener, Input, OnInit, ViewChild, ChangeDetectorRef, OnChanges, SimpleChanges } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\nimport { EntityConversationService } from './services/entity-conversation.service';\nimport { InteractionMessage } from './services/interaction.service';\nimport { WhatsAppAccountService } from './services/whatsapp-account.service';\nimport { WhatsAppHelperService } from './services/whatsapp-helper.service';\n\nimport moment from 'moment-timezone';\n\nexport class CustomError extends Error {\n constructor(status: number, message: string) {\n super(message);\n this.name = 'SnugdeskCustomError';\n }\n}\n\n@Component({\n selector: 'snugdesk-whatsapp-widget',\n templateUrl: './whatsapp-widget.component.html',\n styleUrls: ['./whatsapp-widget.component.css'],\n standalone: false,\n})\nexport class WhatsAppWidgetComponent implements OnInit, AfterViewInit, OnChanges {\n @Input('token')\n token!: string;\n\n @Input('tenantId')\n tenantId!: string;\n\n @Input('userId')\n userId!: string;\n\n @Input('baseColor')\n baseColor?: string; // --sd-app-color\n\n @ViewChild('mainContainer')\n mainContainerRef!: ElementRef;\n\n isSmallScreen: boolean = false;\n containerDimensions: { width: number; height: number } = {\n width: 1000,\n height: 1000,\n };\n\n error!: CustomError | null;\n\n showInitLoader: boolean = true;\n\n wabaInteractionWidget!: any;\n wabaPhoneNumbers!: any[];\n selectedWABAPhoneNumber!: any;\n\n selectedConversation!: any;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elRef: ElementRef,\n private authenticationService: SnugdeskAuthenticationService,\n private entityConversationService: EntityConversationService,\n private whatsAppAccountService: WhatsAppAccountService,\n private waHelperService: WhatsAppHelperService,\n private snackBar: MatSnackBar\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.showInitLoader = true;\n try {\n // Authenticate\n const res_auth = await this.authenticationService.authenticate(this.token, this.tenantId, this.userId);\n // console.debug('res_auth: ', res_auth);\n\n if (!res_auth) throw new CustomError(403, 'Authentication failed');\n\n // Fetch WhatsApp Account\n this.wabaInteractionWidget = await this.whatsAppAccountService.getWhatsAppAccountByTenantId(this.tenantId);\n // console.debug('Fetched WhatsApp Account: ', this.wabaInteractionWidget);\n\n if (!this.wabaInteractionWidget) throw new CustomError(409, 'WhatsApp account not found');\n\n // Fetch WhatsApp phone numbers\n const { businessAccountId, accessToken } = JSON.parse(this.wabaInteractionWidget.configuration || '{}');\n if (!businessAccountId || !accessToken) {\n throw new CustomError(409, 'WhatsApp account not configured');\n }\n\n const res_listPhoneNumbers: any[] = await this.waHelperService.listPhoneNumbers(businessAccountId, accessToken);\n // console.debug('res_listPhoneNumbers: ', res_listPhoneNumbers);\n\n // this.wabaPhoneNumbers = res_listPhoneNumbers;\n this.wabaPhoneNumbers = res_listPhoneNumbers?.filter((phoneNumber: any) => phoneNumber.health_status?.can_send_message === 'AVAILABLE');\n // console.debug('Fetched WhatsApp Phone Numbers: ', this.wabaPhoneNumbers);\n\n if (!this.wabaPhoneNumbers?.length) {\n throw new CustomError(409, 'No active WhatsApp Phone Numbers found');\n }\n\n this.selectedWABAPhoneNumber = this.wabaPhoneNumbers[0];\n } catch (err: any) {\n console.error(err);\n this.error = err;\n this.snackBar.open(`Oops! ${err instanceof CustomError ? this.error?.message : 'An unexpected error occurred'}`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showInitLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n ngAfterViewInit() {\n this.checkContainerDimensions();\n this.cdr.detectChanges();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['baseColor']) {\n const newColor = changes['baseColor'].currentValue;\n if (newColor && /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(newColor)) {\n this.applyColorTheme(newColor);\n this.cdr.detectChanges();\n }\n }\n }\n\n @HostListener('window:resize')\n onResize() {\n this.checkContainerDimensions();\n this.cdr.detectChanges();\n }\n\n private checkContainerDimensions() {\n const width = this.mainContainerRef?.nativeElement?.offsetWidth || null;\n const height = this.mainContainerRef?.nativeElement?.offsetHeight || null;\n if (!width || !height) return;\n\n this.isSmallScreen = width <= 768;\n this.containerDimensions = { width, height };\n }\n\n private applyColorTheme(baseColor: string): void {\n const darkColor = this.adjustColor(baseColor, -25);\n const lighterColor = this.adjustColor(baseColor, 25);\n const lightColor = this.adjustColor(baseColor, 90);\n\n const host = this.elRef.nativeElement;\n host.style.setProperty('--sd-app-color', baseColor);\n host.style.setProperty('--sd-app-color-dark', darkColor);\n host.style.setProperty('--sd-app-color-lighter', lighterColor);\n host.style.setProperty('--sd-app-color-light', lightColor);\n }\n\n private adjustColor(hex: string, percent: number): string {\n // normalize #RGB to #RRGGBB\n if (/^#([a-f\\d])([a-f\\d])([a-f\\d])$/i.test(hex)) {\n hex = hex.replace(/^#([a-f\\d])([a-f\\d])([a-f\\d])$/i, (_, r, g, b) => `#${r}${r}${g}${g}${b}${b}`);\n }\n\n let r = parseInt(hex.slice(1, 3), 16);\n let g = parseInt(hex.slice(3, 5), 16);\n let b = parseInt(hex.slice(5, 7), 16);\n\n // clamp percent to [-100, 100]\n const t = Math.max(-100, Math.min(100, percent)) / 100;\n\n const mix = (c: number) =>\n t < 0\n ? c * (1 + t) // darken toward 0 (black)\n : c + (255 - c) * t; // lighten toward 255 (white)\n\n r = Math.round(Math.min(255, Math.max(0, mix(r))));\n g = Math.round(Math.min(255, Math.max(0, mix(g))));\n b = Math.round(Math.min(255, Math.max(0, mix(b))));\n\n return `#${this.toHex(r)}${this.toHex(g)}${this.toHex(b)}`;\n }\n\n private toHex(value: number): string {\n const hex = Math.round(value).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }\n\n async handleSelectConversation(conversation: any): Promise<void> {\n const previouslySelectedConversation = this.selectedConversation;\n this.selectedConversation = conversation;\n\n if (conversation && previouslySelectedConversation && previouslySelectedConversation.id === conversation.id) return;\n\n const now = moment.utc().unix();\n\n // update previous conversation\n if (previouslySelectedConversation) {\n try {\n const res_updatePreviouslySelectedEntityConversation = await this.entityConversationService.UpdateEntityConversation({\n id: previouslySelectedConversation.id,\n lastActivityAt: now,\n updatedAt: previouslySelectedConversation.updatedAt,\n });\n // console.debug('res_updatePreviouslySelectedEntityConversation: ', res_updatePreviouslySelectedEntityConversation);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not update last activity for previous conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n previouslySelectedConversation.lastActivityAt = now;\n this.cdr.detectChanges();\n }\n }\n\n // update selected conversation\n if (this.selectedConversation && this.selectedConversation.lastActivityAt && this.selectedConversation.lastActivityAt < now - 1) {\n try {\n const res_updateSelectedEntityConversation = await this.entityConversationService.UpdateEntityConversation({\n id: this.selectedConversation.id,\n lastActivityAt: now,\n updatedAt: this.selectedConversation.updatedAt,\n });\n // console.debug('res_updateSelectedEntityConversation: ', res_updateSelectedEntityConversation);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not update last activity for selected conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.selectedConversation.lastActivityAt = now;\n this.cdr.detectChanges();\n }\n }\n }\n\n async handleCloseSelectedConversation(): Promise<void> {\n const previousSelectedConversation = { ...this.selectedConversation };\n this.selectedConversation = undefined;\n this.cdr.detectChanges();\n\n if (!previousSelectedConversation) return;\n\n try {\n const now = moment.utc().unix();\n const res_updateEntityConversation = await this.entityConversationService.UpdateEntityConversation({\n id: previousSelectedConversation.id,\n lastActivityAt: now,\n updatedAt: previousSelectedConversation.updatedAt,\n });\n // console.debug('res_updateEntityConversation', res_updateEntityConversation);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not update last activity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n handleNewMessage(interactionMessage: InteractionMessage) {\n // console.debug('Got new message: ', interactionMessage);\n if (!this.selectedConversation) return;\n\n this.selectedConversation = {\n ...this.selectedConversation,\n messages: {\n items: [interactionMessage],\n },\n };\n this.cdr.detectChanges();\n }\n\n handleChangeWhatsAppPhoneNumber(phoneNumber: any): void {\n this.selectedWABAPhoneNumber = phoneNumber;\n this.cdr.detectChanges();\n }\n}\n","<div class=\"sd_waba_container_whatsapp_widget\" #mainContainer>\n @if (showInitLoader) {\n <sd-app-loader></sd-app-loader>\n } @else if (error) {\n <sd-app-error [error]=\"error\"></sd-app-error>\n } @else {\n <div class=\"sd_waba_container_conversations_whatsapp\">\n <div class=\"sd_waba_container_conversations_whatsapp_inner\">\n <div [hidden]=\"isSmallScreen && !!selectedConversation\" [ngClass]=\"{\n 'sd_waba_container_conversations_whatsapp_left': !isSmallScreen,\n 'sd_waba_container_conversations_whatsapp_left_full_width': isSmallScreen\n }\">\n <lib-whatsapp-conversations [selectedConversation]=\"selectedConversation\"\n [containerDimensions]=\"containerDimensions\" (selectConversation)=\"handleSelectConversation($event)\">\n </lib-whatsapp-conversations>\n </div>\n <div [ngClass]=\"{\n 'sd_waba_container_conversations_whatsapp_right': !isSmallScreen,\n 'sd_waba_container_conversations_whatsapp_right_full_width': isSmallScreen\n }\">\n @if (selectedConversation) {\n <lib-whatsapp-messages [isSmallScreen]=\"isSmallScreen\" [wabaInteractionWidget]=\"wabaInteractionWidget\"\n [wabaPhoneNumbers]=\"wabaPhoneNumbers\" [selectedEntityConversation]=\"selectedConversation\"\n [selectedWABAPhoneNumber]=\"selectedWABAPhoneNumber\" (newMessage)=\"handleNewMessage($event)\"\n (changePhoneNumber)=\"handleChangeWhatsAppPhoneNumber($event)\" (close)=\"handleCloseSelectedConversation()\" />\n } @else {\n <div class=\"sd_waba_new_conve_message_outer_area\">\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_container_new_conv_inner\">\n <div class=\"sd_waba_conve_new_images\"></div>\n <h2>No conversation selected</h2>\n <p>\n Select an existing conversation from the list, or click here to start one.\n </p>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSelectModule } from '@angular/material/select';\n\nimport { SnugdeskCoreModule, CustomPipesModule } from '@snugdesk/core';\nimport { provideAppSyncConfig } from './services/appsync-graphql.service';\nimport { defaultAppSyncConfig } from './config/appsync.config';\n\nimport { WhatsAppContactCreateComponent } from './components/whatsapp-contact-create/whatsapp-contact-create.component';\nimport { WhatsAppContactListComponent } from './components/whatsapp-contact-list/whatsapp-contact-list.component';\nimport { WhatsAppWidgetComponent } from './whatsapp-widget.component';\nimport { WhatsAppConversationsComponent } from './components/whatsapp-conversations/whatsapp-conversations.component';\nimport { WhatsAppMessagesComponent } from './components/whatsapp-messages/whatsapp-messages.component';\nimport { WhatsAppMessageItemComponent } from './components/whatsapp-message-item/whatsapp-message-item.component';\nimport { WhatsAppTemplatesComponent } from './components/whatsapp-templates/whatsapp-templates.component';\nimport { WhatsAppTemplatePreviewComponent } from './components/whatsapp-template-preview/whatsapp-template-preview.component';\n\nimport { PhoneInputComponent } from './shared/form-controls/phone-input/phone-input.component';\nimport { LocationInputComponent } from './shared/form-controls/location-input/location-input.component';\n\nimport { WhatsAppTextFormatterPipe } from './shared/pipes/whatsapp-text-formatter.pipe';\n\nimport { AvatarModule } from 'ngx-avatars';\nimport { InfiniteScrollDirective } from 'ngx-infinite-scroll';\nimport { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';\nimport { PickerModule } from '@ctrl/ngx-emoji-mart';\n\n@NgModule({\n declarations: [\n WhatsAppWidgetComponent,\n WhatsAppContactCreateComponent,\n WhatsAppConversationsComponent,\n WhatsAppContactListComponent,\n WhatsAppMessagesComponent,\n WhatsAppMessageItemComponent,\n WhatsAppTemplatesComponent,\n WhatsAppTemplatePreviewComponent,\n WhatsAppTextFormatterPipe,\n LocationInputComponent,\n PhoneInputComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n // ReactiveFormsModule.withConfig({ warnOnNgModelWithFormControl: 'never' }),\n NgTemplateOutlet,\n MatNativeDateModule,\n MatButtonModule,\n MatCheckboxModule,\n MatDatepickerModule,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatMenuModule,\n MatRadioModule,\n MatSelectModule,\n SnugdeskCoreModule,\n CustomPipesModule,\n AvatarModule,\n InfiniteScrollDirective,\n NgxSkeletonLoaderModule,\n PickerModule,\n ],\n exports: [WhatsAppWidgetComponent, WhatsAppTextFormatterPipe],\n providers: [provideAppSyncConfig(defaultAppSyncConfig)],\n})\nexport class WhatsAppWidgetModule {}\n","/*\n * Public API Surface of whatsapp-widget\n */\n\nexport * from './lib/whatsapp-widget.module';\nexport * from './lib/whatsapp-widget.component';\n\nexport * from './lib/components/whatsapp-contact-create/whatsapp-contact-create.component';\nexport * from './lib/components/whatsapp-contact-list/whatsapp-contact-list.component';\nexport * from './lib/components/whatsapp-conversations/whatsapp-conversations.component';\nexport * from './lib/components/whatsapp-message-item/whatsapp-message-item.component';\nexport * from './lib/components/whatsapp-messages/whatsapp-messages.component';\nexport * from './lib/components/whatsapp-template-preview/whatsapp-template-preview.component';\nexport * from './lib/components/whatsapp-templates/whatsapp-templates.component';\n\nexport * from './lib/shared/form-controls/phone-input/phone-input.component';\nexport * from './lib/shared/form-controls/location-input/location-input.component';\nexport * from './lib/shared/pipes/whatsapp-text-formatter.pipe';\n\nexport * from './lib/services/appsync-graphql.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.AppSyncGraphqlService","i2","i4","i6","i3.EntityService","i5","i7","i8.PhoneInputComponent","i2.EntityService","i9.WhatsAppContactCreateComponent","i1.AppSyncGraphqlService","i1.InteractionWidgetService","uuidv4","i3.EntityConversationService","i8","i9","i10","i11.WhatsAppContactListComponent","i12.WhatsAppTextFormatterPipe","i3","i5.WhatsAppTextFormatterPipe","i2.WhatsAppTextFormatterPipe","i4.WhatsAppHelperService","i5.WhatsAppTemplateFileService","i8.WhatsAppTemplatePreviewComponent","i9.LocationInputComponent","i11.WhatsAppTextFormatterPipe","i5.UserService","i6.EntityService","i7.EntityConversationService","i8.InteractionService","i9.WhatsAppHelperService","i12","i13","i14","i15","i17.WhatsAppMessageItemComponent","i18.WhatsAppTemplatesComponent","i19.LocationInputComponent","i2.EntityConversationService","i3.WhatsAppAccountService","i7.WhatsAppConversationsComponent","i8.WhatsAppMessagesComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"snugdesk-whatsapp-widget.mjs","sources":["../../../projects/whatsapp-widget/src/lib/config/appsync.config.ts","../../../projects/whatsapp-widget/src/lib/services/appsync-graphql.service.ts","../../../projects/whatsapp-widget/src/lib/graphql/common.model.ts","../../../projects/whatsapp-widget/src/lib/services/entity.service.ts","../../../projects/whatsapp-widget/src/app.config.ts","../../../projects/whatsapp-widget/src/lib/shared/form-controls/phone-input/phone-input.component.ts","../../../projects/whatsapp-widget/src/lib/shared/form-controls/phone-input/phone-input.component.html","../../../projects/whatsapp-widget/src/lib/components/whatsapp-contact-create/whatsapp-contact-create.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-contact-create/whatsapp-contact-create.component.html","../../../projects/whatsapp-widget/src/lib/components/whatsapp-contact-list/whatsapp-contact-list.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-contact-list/whatsapp-contact-list.component.html","../../../projects/whatsapp-widget/src/lib/services/entity-conversation.service.ts","../../../projects/whatsapp-widget/src/lib/services/interaction.service.ts","../../../projects/whatsapp-widget/src/lib/services/interaction-widget.service.ts","../../../projects/whatsapp-widget/src/lib/services/whatsapp-account.service.ts","../../../projects/whatsapp-widget/src/lib/services/whatsapp-helper.service.ts","../../../projects/whatsapp-widget/src/lib/shared/pipes/whatsapp-text-formatter.pipe.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-conversations/whatsapp-conversations.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-conversations/whatsapp-conversations.component.html","../../../projects/whatsapp-widget/src/lib/services/user.service.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-message-item/whatsapp-message-item.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-message-item/whatsapp-message-item.component.html","../../../projects/whatsapp-widget/src/lib/services/whatsapp-template-file.service.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-template-preview/whatsapp-template-preview.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-template-preview/whatsapp-template-preview.component.html","../../../projects/whatsapp-widget/src/lib/shared/form-controls/location-input/location-input.component.ts","../../../projects/whatsapp-widget/src/lib/shared/form-controls/location-input/location-input.component.html","../../../projects/whatsapp-widget/src/lib/components/whatsapp-templates/whatsapp-templates.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-templates/whatsapp-templates.component.html","../../../projects/whatsapp-widget/src/lib/components/whatsapp-messages/whatsapp-messages.component.ts","../../../projects/whatsapp-widget/src/lib/components/whatsapp-messages/whatsapp-messages.component.html","../../../projects/whatsapp-widget/src/lib/whatsapp-widget.component.ts","../../../projects/whatsapp-widget/src/lib/whatsapp-widget.component.html","../../../projects/whatsapp-widget/src/lib/whatsapp-widget.module.ts","../../../projects/whatsapp-widget/src/public-api.ts","../../../projects/whatsapp-widget/src/snugdesk-whatsapp-widget.ts"],"sourcesContent":["import { AppSyncGraphqlConfig } from '../services/appsync-graphql.service';\n\nexport const defaultAppSyncConfig: AppSyncGraphqlConfig = {\n endpoint:\n 'https://sgbnsklbvrh67mcvh3wqkzgyou.appsync-api.ap-south-1.amazonaws.com/graphql',\n region: 'ap-south-1',\n};\n","import { Inject, Injectable, InjectionToken, Optional, ValueProvider } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\nimport { defaultAppSyncConfig } from '../config/appsync.config';\n\nimport { Amplify, API } from 'aws-amplify';\nimport { GRAPHQL_AUTH_MODE, GraphQLResult } from '@aws-amplify/api-graphql';\n\nexport interface AppSyncGraphqlConfig {\n endpoint: string;\n region: string;\n}\n\nexport const APPSYNC_GRAPHQL_CONFIG = new InjectionToken<AppSyncGraphqlConfig>('APPSYNC_GRAPHQL_CONFIG');\n\nexport function provideAppSyncConfig(config: AppSyncGraphqlConfig): ValueProvider {\n return {\n provide: APPSYNC_GRAPHQL_CONFIG,\n useValue: config,\n };\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AppSyncGraphqlService {\n private configured = false;\n private authMode = GRAPHQL_AUTH_MODE.AWS_LAMBDA;\n\n private readonly config: AppSyncGraphqlConfig;\n\n constructor(\n @Optional()\n @Inject(APPSYNC_GRAPHQL_CONFIG)\n config: AppSyncGraphqlConfig | null,\n private readonly authenticationService: SnugdeskAuthenticationService\n ) {\n this.config = config ?? defaultAppSyncConfig;\n // this.ensureConfigured();\n }\n\n async query<T>(statement: string, variables?: Record<string, unknown>): Promise<GraphQLResult<T>> {\n this.ensureConfigured();\n // console.debug('token: ', token);\n try {\n return (await API.graphql({\n query: statement,\n variables,\n authMode: this.authMode,\n ...(this.authMode === GRAPHQL_AUTH_MODE.AWS_LAMBDA ? { authToken: this.getToken() } : {}),\n })) as GraphQLResult<T>;\n } catch (err: any) {\n const normalizedErrors =\n err?.errors?.map((e: any) => ({\n message: e?.message,\n errorType: e?.errorType,\n data: e?.data,\n path: e?.path,\n })) ??\n err?.response?.data?.errors ??\n err?.errors;\n const errorMessage = err?.message ?? normalizedErrors?.[0]?.message;\n console.error('AppSync query failed', {\n statement,\n variables,\n message: errorMessage,\n status: err?.response?.status,\n response: err?.response?.data,\n errors: normalizedErrors,\n });\n if (err) {\n console.error('AppSync query failed (raw error)', err);\n }\n throw err;\n }\n }\n\n async mutate<T>(statement: string, variables?: Record<string, unknown>): Promise<GraphQLResult<T>> {\n return this.query<T>(statement, variables);\n }\n\n subscribe<T>(statement: string, variables?: Record<string, unknown>): Observable<GraphQLResult<T>> {\n this.ensureConfigured();\n try {\n return API.graphql({\n query: statement,\n variables,\n authMode: this.authMode,\n ...(this.authMode === GRAPHQL_AUTH_MODE.AWS_LAMBDA ? { authToken: this.getToken() } : {}),\n }) as unknown as Observable<GraphQLResult<T>>;\n } catch (err: any) {\n const normalizedErrors =\n err?.errors?.map((e: any) => ({\n message: e?.message,\n errorType: e?.errorType,\n data: e?.data,\n path: e?.path,\n })) ??\n err?.response?.data?.errors ??\n err?.errors;\n const errorMessage = err?.message ?? normalizedErrors?.[0]?.message;\n console.error('AppSync subscription failed', {\n statement,\n variables,\n message: errorMessage,\n status: err?.response?.status,\n response: err?.response?.data,\n errors: normalizedErrors,\n });\n if (err) {\n console.error('AppSync subscription failed (raw error)', err);\n }\n throw err;\n }\n }\n\n private ensureConfigured(): void {\n if (this.configured) {\n return;\n }\n\n const hostConfig = this.getHostConfig();\n if (hostConfig.useHost) {\n this.authMode = this.normalizeAuthMode(hostConfig.authMode) ?? GRAPHQL_AUTH_MODE.API_KEY;\n this.configured = true;\n return;\n }\n\n if (!this.config?.endpoint || !this.config?.region) {\n throw new Error('AppSync GraphQL configuration is missing.');\n }\n\n const { endpoint, region } = this.config;\n\n Amplify.configure({\n aws_project_region: region,\n aws_appsync_graphqlEndpoint: endpoint,\n aws_appsync_region: region,\n aws_appsync_authenticationType: GRAPHQL_AUTH_MODE.AWS_LAMBDA,\n API: {\n GraphQL: {\n endpoint,\n region,\n defaultAuthMode: GRAPHQL_AUTH_MODE.AWS_LAMBDA,\n graphql_headers: async () => this.buildAuthHeaders(),\n functionAuthProvider: async () => ({\n token: this.getToken(),\n }),\n },\n },\n });\n\n this.authMode = GRAPHQL_AUTH_MODE.AWS_LAMBDA;\n this.configured = true;\n }\n\n private getHostConfig(): { useHost: boolean; authMode?: string } {\n const existing = (Amplify as any).getConfig?.() ?? {};\n const existingEndpoint = existing?.API?.GraphQL?.endpoint ?? existing?.API?.GraphQL?.graphql_endpoint ?? existing?.aws_appsync_graphqlEndpoint;\n const existingAuthMode = existing?.API?.GraphQL?.defaultAuthMode ?? existing?.aws_appsync_authenticationType;\n\n const useHost = existingEndpoint === defaultAppSyncConfig.endpoint;\n console.debug('[WhatsAppWidget] Host Amplify config', {\n existingEndpoint,\n existingAuthMode,\n useHost,\n });\n\n return {\n useHost,\n authMode: existingAuthMode,\n };\n }\n\n private normalizeAuthMode(mode?: string): GRAPHQL_AUTH_MODE | undefined {\n if (!mode) {\n return undefined;\n }\n\n switch (mode) {\n case 'API_KEY':\n return GRAPHQL_AUTH_MODE.API_KEY;\n case 'AWS_IAM':\n return GRAPHQL_AUTH_MODE.AWS_IAM;\n case 'OPENID_CONNECT':\n return GRAPHQL_AUTH_MODE.OPENID_CONNECT;\n case 'AMAZON_COGNITO_USER_POOLS':\n return GRAPHQL_AUTH_MODE.AMAZON_COGNITO_USER_POOLS;\n case 'AWS_LAMBDA':\n return GRAPHQL_AUTH_MODE.AWS_LAMBDA;\n default:\n return undefined;\n }\n }\n\n private buildAuthHeaders(): { Authorization: string } {\n const token = this.getToken();\n\n if (!token) {\n throw new Error('Missing authentication token for AppSync request.');\n }\n\n return {\n Authorization: token,\n };\n }\n\n private getToken(): string {\n const token = this.authenticationService.getToken();\n\n if (!token) {\n throw new Error('Missing authentication token for AppSync request.');\n }\n\n return token;\n }\n}\n","import { GraphQLResult } from '@aws-amplify/api-graphql';\n\nexport enum ModelAttributeTypes {\n binary = 'binary',\n binarySet = 'binarySet',\n bool = 'bool',\n list = 'list',\n map = 'map',\n number = 'number',\n numberSet = 'numberSet',\n string = 'string',\n stringSet = 'stringSet',\n _null = '_null',\n}\n\nexport enum ModelSortDirection {\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport type ModelSizeInput = {\n ne?: number | null;\n eq?: number | null;\n le?: number | null;\n lt?: number | null;\n ge?: number | null;\n gt?: number | null;\n between?: Array<number | null> | null;\n};\n\nexport type ModelBooleanInput = {\n ne?: boolean | null;\n eq?: boolean | null;\n attributeExists?: boolean | null;\n attributeType?: ModelAttributeTypes | null;\n};\n\nexport type ModelIntInput = {\n ne?: number | null;\n eq?: number | null;\n le?: number | null;\n lt?: number | null;\n ge?: number | null;\n gt?: number | null;\n between?: Array<number | null> | null;\n attributeExists?: boolean | null;\n attributeType?: ModelAttributeTypes | null;\n};\n\nexport type ModelIDInput = {\n ne?: string | null;\n eq?: string | null;\n le?: string | null;\n lt?: string | null;\n ge?: string | null;\n gt?: string | null;\n contains?: string | null;\n notContains?: string | null;\n between?: Array<string | null> | null;\n beginsWith?: string | null;\n attributeExists?: boolean | null;\n attributeType?: ModelAttributeTypes | null;\n size?: ModelSizeInput | null;\n};\n\nexport type ModelStringInput = {\n ne?: string | null;\n eq?: string | null;\n le?: string | null;\n lt?: string | null;\n ge?: string | null;\n gt?: string | null;\n contains?: string | null;\n notContains?: string | null;\n between?: Array<string | null> | null;\n beginsWith?: string | null;\n attributeExists?: boolean | null;\n attributeType?: ModelAttributeTypes | null;\n size?: ModelSizeInput | null;\n};\n\nexport type ModelIDKeyConditionInput = {\n eq?: string | null;\n le?: string | null;\n lt?: string | null;\n ge?: string | null;\n gt?: string | null;\n between?: Array<string | null> | null;\n beginsWith?: string | null;\n};\n\nexport type ModelIntKeyConditionInput = {\n eq?: number | null;\n le?: number | null;\n lt?: number | null;\n ge?: number | null;\n gt?: number | null;\n between?: Array<number | null> | null;\n};\n\nexport type ModelStringKeyConditionInput = {\n eq?: string | null;\n le?: string | null;\n lt?: string | null;\n ge?: string | null;\n gt?: string | null;\n between?: Array<string | null> | null;\n beginsWith?: string | null;\n};\n\nexport interface SubscriptionResponse<T> {\n value: GraphQLResult<T>;\n}\n\nexport type Country = {\n code: string;\n nameEn: string;\n nameLocal?: string | null;\n currency?: CountryCurrency | null;\n officialLanguage?: CountryLanguage | null;\n callingCode?: string | null;\n region?: string | null;\n flag?: string | null;\n};\n\nexport type CountryCurrency = {\n code: string;\n nameEn: string;\n};\n\nexport type CountryLanguage = {\n code: string;\n nameEn: string;\n nameLocal?: string | null;\n};\n\nexport type Language = {\n code: string;\n nameEn: string;\n nameLocal?: string | null;\n};\n\nexport type LanguageInput = {\n code: string;\n nameEn: string;\n nameLocal?: string | null;\n};\n\nexport type PhoneNumber = {\n countryCode?: string | null;\n dialCode?: string | null;\n e164Number?: string | null;\n internationalNumber?: string | null;\n nationalNumber?: string | null;\n number?: string | null;\n};\n\nexport type PhoneNumberInput = {\n countryCode?: string | null;\n dialCode?: string | null;\n e164Number?: string | null;\n internationalNumber?: string | null;\n nationalNumber?: string | null;\n number?: string | null;\n};\n\nexport type S3Object = {\n key: string;\n bucket: string;\n location: string;\n};\n\nexport type S3ObjectInput = {\n key: string;\n bucket: string;\n location: string;\n};\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nimport { Language, ModelBooleanInput, ModelIDInput, ModelIntInput, ModelSortDirection, ModelStringInput, ModelStringKeyConditionInput, PhoneNumber, S3Object } from '@snugdesk/core';\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\n\nexport type Entity = {\n id: string;\n externalId?: string | null;\n tenantId: string;\n name: string;\n image?: S3Object | null;\n email?: string | null;\n phoneNumber?: PhoneNumber | null;\n phoneNumberE164?: string | null;\n preferences?: EntityPreferences | null;\n contactPreferences?: EntityContactPreferences | null;\n createdAt: number;\n updatedAt: number;\n blockedAt?: number | null;\n deletedAt?: number | null;\n};\n\n/* export type Entity = {\n id: string;\n externalId?: string | null;\n tenantId: string;\n entityTypeId?: string | null;\n entityType?: EntityType | null;\n parentId?: string | null;\n parent?: Entity | null;\n name: string;\n image?: S3Object | null;\n email?: string | null;\n phoneNumber?: PhoneNumber | null;\n phoneNumberE164?: string | null;\n isOrganization: boolean;\n notes?: string | null;\n customFields?: Array<string | null> | null;\n preferences?: EntityPreferences | null;\n contactPreferences?: EntityContactPreferences | null;\n createdAt: number;\n updatedAt: number;\n blockedAt?: number | null;\n deletedAt?: number | null;\n updatedByUserId: string;\n updatedByUserSessionId?: string | null;\n};\n\nexport type EntityType = {\n id: string;\n externalId?: string | null;\n tenantId: string;\n name: string;\n description?: string | null;\n image?: S3Object | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n entityFields?: Array<string | null> | null;\n organizationFields?: Array<string | null> | null;\n};\n*/\n\nexport type EntityPreferences = {\n timezoneName?: string | null;\n language?: Language | null;\n};\n\nexport type EntityContactPreferences = {\n allowCall?: boolean | null;\n allowEmail?: boolean | null;\n allowSMS?: boolean | null;\n allowWhatsApp?: boolean | null;\n};\n\nexport type CreateEntityInput = {\n id?: string | null;\n externalId?: string | null;\n tenantId: string;\n // entityTypeId?: string | null;\n // parentId?: string | null;\n name: string;\n image?: S3Object | null;\n email?: string | null;\n phoneNumber?: PhoneNumber | null;\n phoneNumberE164?: string | null;\n isOrganization: boolean;\n // notes?: string | null;\n // customFields?: Array<string | null> | null;\n // preferences?: EntityPreferences | null;\n // contactPreferences?: EntityContactPreferences | null;\n createdAt: number;\n updatedAt: number;\n blockedAt?: number | null;\n deletedAt?: number | null;\n updatedByUserId: string;\n updatedByUserSessionId?: string | null;\n};\n\nexport type UpdateEntityInput = {\n id: string;\n externalId?: string | null;\n tenantId?: string | null;\n // entityTypeId?: string | null;\n // parentId?: string | null;\n name?: string | null;\n image?: S3Object | null;\n email?: string | null;\n phoneNumber?: PhoneNumber | null;\n phoneNumberE164?: string | null;\n isOrganization?: boolean | null;\n // notes?: string | null;\n // customFields?: Array<string | null> | null;\n // preferences?: EntityPreferences | null;\n // contactPreferences?: EntityContactPreferences | null;\n createdAt?: number | null;\n updatedAt: number;\n blockedAt?: number | null;\n deletedAt?: number | null;\n updatedByUserId?: string | null;\n updatedByUserSessionId?: string | null;\n};\n\n/* export type EntityPreferencesInput = {\n timezoneName?: string | null;\n language?: LanguageInput | null;\n};\n\nexport type EntityContactPreferencesInput = {\n allowCall?: boolean | null;\n allowEmail?: boolean | null;\n allowSMS?: boolean | null;\n allowWhatsApp?: boolean | null;\n}; */\n\nexport type ModelEntityConditionInput = {\n externalId?: ModelStringInput | null;\n tenantId?: ModelIDInput | null;\n entityTypeId?: ModelIDInput | null;\n parentId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n email?: ModelStringInput | null;\n phoneNumberE164?: ModelStringInput | null;\n isOrganization?: ModelBooleanInput | null;\n // notes?: ModelStringInput | null;\n // customFields?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n blockedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n // updatedByUserId?: ModelIDInput | null;\n // updatedByUserSessionId?: ModelIDInput | null;\n and?: Array<ModelEntityConditionInput | null> | null;\n or?: Array<ModelEntityConditionInput | null> | null;\n not?: ModelEntityConditionInput | null;\n};\n\nexport type ModelEntityFilterInput = {\n id?: ModelIDInput | null;\n externalId?: ModelStringInput | null;\n tenantId?: ModelIDInput | null;\n entityTypeId?: ModelIDInput | null;\n parentId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n email?: ModelStringInput | null;\n phoneNumberE164?: ModelStringInput | null;\n isOrganization?: ModelBooleanInput | null;\n // notes?: ModelStringInput | null;\n // customFields?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n blockedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n // updatedByUserId?: ModelIDInput | null;\n // updatedByUserSessionId?: ModelIDInput | null;\n and?: Array<ModelEntityFilterInput | null> | null;\n or?: Array<ModelEntityFilterInput | null> | null;\n not?: ModelEntityFilterInput | null;\n};\n\nexport type ListEntities = {\n items: Array<Entity | null>;\n nextToken?: string | null;\n};\n\nconst ENTITY_SELECTION = /* GraphQL */ `\n id\n externalId\n tenantId\n entityTypeId\n entityType {\n id\n externalId\n tenantId\n name\n description\n image {\n location\n }\n createdAt\n updatedAt\n deletedAt\n }\n parentId\n parent {\n id\n externalId\n tenantId\n entityTypeId\n name\n image {\n location\n }\n isOrganization\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n createdAt\n updatedAt\n blockedAt\n deletedAt\n }\n name\n image {\n location\n }\n isOrganization\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n preferences {\n timezoneName\n language {\n code\n nameEn\n nameLocal\n }\n }\n contactPreferences {\n allowCall\n allowEmail\n allowSMS\n allowWhatsApp\n }\n createdAt\n updatedAt\n blockedAt\n deletedAt\n`;\n\nconst ENTITY_SELECTION_MINIMAL = /* GraphQL */ `\n id\n externalId\n tenantId\n name\n image {\n location\n }\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n preferences {\n timezoneName\n language {\n code\n nameEn\n nameLocal\n }\n }\n contactPreferences {\n allowCall\n allowEmail\n allowSMS\n allowWhatsApp\n }\n createdAt\n updatedAt\n blockedAt\n deletedAt\n`;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class EntityService {\n private readonly searchBaseUrl = 'https://search.snugdesk.com';\n\n constructor(private http: HttpClient, private readonly graphqlService: AppSyncGraphqlService) {}\n\n private getEntitySearchEndpoint() {\n return this.searchBaseUrl + '/entities';\n }\n\n searchEntities(queryString: string) {\n return lastValueFrom(this.http.get(this.getEntitySearchEndpoint() + '?' + queryString));\n }\n\n async GetEntity(id: string): Promise<Entity> {\n const statement = /* GraphQL */ `\n query GetEntity($id: ID!) {\n getEntity(id: $id) {\n ${ENTITY_SELECTION_MINIMAL}\n }\n }\n `;\n const response = await this.graphqlService.query<any>(statement, { id });\n return <Entity>response.data.getEntity;\n }\n\n async CreateEntity(input: CreateEntityInput, condition?: ModelEntityConditionInput): Promise<Entity> {\n const statement = /* GraphQL */ `\n mutation CreateEntity($input: CreateEntityInput!, $condition: ModelEntityConditionInput) {\n createEntity(input: $input, condition: $condition) {\n ${ENTITY_SELECTION_MINIMAL}\n }\n }\n `;\n const variables: { input: CreateEntityInput; condition?: ModelEntityConditionInput } = { input };\n if (condition) {\n variables.condition = condition;\n }\n const response = await this.graphqlService.query<any>(statement, variables);\n return <Entity>response.data.createEntity;\n }\n\n async UpdateEntity(input: UpdateEntityInput, condition?: ModelEntityConditionInput): Promise<Entity> {\n const statement = /* GraphQL */ `\n mutation UpdateEntity($input: UpdateEntityInput!, $condition: ModelEntityConditionInput) {\n updateEntity(input: $input, condition: $condition) {\n ${ENTITY_SELECTION_MINIMAL}\n }\n }\n `;\n const variables: { input: UpdateEntityInput; condition?: ModelEntityConditionInput } = { input };\n if (condition) {\n variables.condition = condition;\n }\n const response = await this.graphqlService.query<any>(statement, variables);\n return <Entity>response.data.updateEntity;\n }\n\n async ListEntitiesByTenantId(tenantId: string, name?: ModelStringKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelEntityFilterInput, limit?: number, nextToken?: string): Promise<ListEntities> {\n const statement = `query ListEntitiesByTenantId($tenantId: ID!, $name: ModelStringKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelEntityFilterInput, $limit: Int, $nextToken: String) {\n listEntitiesByTenantId(\n tenantId: $tenantId\n name: $name\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${ENTITY_SELECTION_MINIMAL}\n }\n nextToken\n }\n }`;\n const gqlAPIServiceArguments: any = {\n tenantId,\n };\n if (name) {\n gqlAPIServiceArguments.name = name;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListEntities>response.data.listEntitiesByTenantId;\n }\n\n async ListEntitiesByTenantIdAndPhoneNumberE164(tenantId: string, phoneNumberE164?: ModelStringKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelEntityFilterInput, limit?: number, nextToken?: string): Promise<ListEntities> {\n const statement = `query ListEntitiesByTenantIdAndPhoneNumberE164($tenantId: ID!, $phoneNumberE164: ModelStringKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelEntityFilterInput, $limit: Int, $nextToken: String) {\n listEntitiesByTenantIdAndPhoneNumberE164(\n tenantId: $tenantId\n phoneNumberE164: $phoneNumberE164\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${ENTITY_SELECTION_MINIMAL}\n }\n nextToken\n }\n }`;\n const gqlAPIServiceArguments: any = {\n tenantId,\n };\n if (phoneNumberE164) {\n gqlAPIServiceArguments.phoneNumberE164 = phoneNumberE164;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListEntities>response.data.listEntitiesByTenantIdAndPhoneNumberE164;\n }\n}\n","export const AppConfigData = {\n appDomain: 'snugdesk.com',\n appLogoURL: 'https://assets.snugdesk.com/logo/snugdesk.svg',\n appName: 'Snugdesk',\n appSupportEmail: 'support@snug.in',\n companyName: 'Snug Technologies Pvt. Ltd.',\n companyAddress: '403, Tower B, Global Business Park, MG Road, Gurugram, Haryana 122002, India',\n};\n\nexport const AppApiConfig = {\n endpoint: 'https://api.snugdesk.com',\n};\n\nexport const AppUtilityConfig = {\n countryEndpoint: 'https://snugdesk-assets.s3.amazonaws.com/metadata/countries.json',\n ipLookupEndpoint: 'https://ipapi.co/json/',\n};\n\nexport const GoogleMapsConfig = {\n apiKey: 'AIzaSyDOPOMzdMNj6QHFbBWzGmiaXP6yFFUMwok',\n};\n\nexport const WhatsAppConfig = {\n endpoint: 'https://graph.facebook.com/v24.0',\n};\n","import { Component, EventEmitter, Input, OnInit, Output, forwardRef } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { AbstractControl, ControlValueAccessor, FormBuilder, FormGroup, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator, Validators } from '@angular/forms';\nimport { lastValueFrom } from 'rxjs';\n\nimport { MatSelectChange } from '@angular/material/select';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { parsePhoneNumberFromString } from 'libphonenumber-js';\n\nimport { AppUtilityConfig } from '../../../../app.config';\n\nexport type PhoneNumber = {\n countryCode?: string | null;\n dialCode?: string | null;\n e164Number?: string | null;\n internationalNumber?: string | null;\n nationalNumber?: string | null;\n number?: string | null;\n};\n\n@Component({\n selector: 'app-phone-input',\n templateUrl: './phone-input.component.html',\n styleUrls: ['./phone-input.component.css'],\n standalone: false,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PhoneInputComponent),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => PhoneInputComponent),\n multi: true,\n },\n ],\n})\nexport class PhoneInputComponent implements OnInit, ControlValueAccessor, Validator {\n @Input()\n label: string = 'Phone Number';\n\n @Input()\n placeholder!: string;\n\n @Output('phoneChange')\n phoneChange = new EventEmitter<PhoneNumber>();\n\n form: FormGroup;\n\n countriesData: any[] = [];\n filteredCountries: any[] = [];\n countrySearchTerm = '';\n\n private onChangeFn: (value: PhoneNumber | null) => void = () => {};\n private onTouchedFn: () => void = () => {};\n private touched = false;\n private pendingValue: PhoneNumber | null | undefined = undefined;\n\n constructor(private fb: FormBuilder, private httpClient: HttpClient, private snackBar: MatSnackBar) {\n this.form = this.fb.group({\n country: [null, Validators.required],\n phone: ['', Validators.required],\n });\n }\n\n async ngOnInit() {\n try {\n this.countriesData = await this.getAllCountries();\n this.filteredCountries = [...this.countriesData];\n\n await this.setDefaultCountryByLocation();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not load countries`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n }\n }\n\n private async getAllCountries(): Promise<any[]> {\n return await lastValueFrom(this.httpClient.get<any[]>(AppUtilityConfig.countryEndpoint));\n }\n\n private async setDefaultCountryByLocation() {\n const countryControl = this.form.get('country');\n const alreadySet = countryControl?.value;\n\n if (alreadySet || this.countriesData.length === 0) {\n return;\n }\n\n const country = await this.resolveCountryFromIp();\n // console.debug('country: ', country);\n if (country) {\n countryControl?.setValue(country, { emitEvent: false });\n } else {\n countryControl?.setValue(this.countriesData[0], { emitEvent: false });\n }\n }\n\n private async resolveCountryFromIp() {\n try {\n const response = await lastValueFrom(this.httpClient.get<{ country_code?: string }>(AppUtilityConfig.ipLookupEndpoint));\n const countryCode = response?.country_code?.toUpperCase();\n\n if (!countryCode) {\n throw new Error('IP details not found');\n }\n\n return this.countriesData.find((country) => country.code?.toUpperCase() === countryCode) ?? null;\n } catch (err) {\n console.error(err);\n return null;\n }\n }\n\n validateNumber(emitChange = true) {\n const country = this.form.value.country;\n const rawInput = this.form.value.phone?.toString().trim();\n const shouldEmit = emitChange && !this.form.disabled;\n\n if (emitChange) {\n this.markAsTouched();\n }\n\n if (!country || !rawInput) {\n this.setPhoneError('pattern', false);\n this.emitEmpty(shouldEmit);\n return;\n }\n\n const full = `+${country.callingCode}${rawInput}`;\n const parsed = parsePhoneNumberFromString(full);\n\n if (!parsed || !parsed.isValid()) {\n this.setPhoneError('pattern', true);\n this.emitInvalidNumber(rawInput, country, shouldEmit);\n return;\n }\n\n this.setPhoneError('pattern', false);\n\n const result: PhoneNumber = {\n countryCode: country.code,\n dialCode: country.callingCode,\n e164Number: parsed.number,\n internationalNumber: parsed.formatInternational(),\n nationalNumber: parsed.formatNational(),\n number: rawInput,\n };\n\n this.emitResult(result, shouldEmit);\n }\n\n writeValue(value: PhoneNumber | null): void {\n if (this.countriesData.length === 0) {\n this.pendingValue = value ?? null;\n return;\n }\n this.applyExternalValue(value ?? null);\n }\n\n registerOnChange(fn: (value: PhoneNumber | null) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n if (isDisabled) {\n this.form.disable({ emitEvent: false });\n } else {\n this.form.enable({ emitEvent: false });\n }\n }\n\n validate(_: AbstractControl): ValidationErrors | null {\n if (this.form.disabled) {\n return null;\n }\n const errors: ValidationErrors = {};\n const phoneControl = this.form.get('phone');\n const countryControl = this.form.get('country');\n\n if (phoneControl?.hasError('required')) {\n errors['required'] = true;\n }\n\n if (phoneControl?.hasError('pattern')) {\n errors['pattern'] = true;\n }\n\n if (countryControl?.hasError('required')) {\n errors['required'] = true;\n }\n\n return Object.keys(errors).length > 0 ? errors : null;\n }\n\n onCountrySelectionChange(_: MatSelectChange): void {\n this.validateNumber();\n }\n\n onCountrySearchTermChanged(term: string) {\n this.countrySearchTerm = term;\n this.applyCountryFilter();\n }\n\n onCountrySelectOpened(opened: boolean) {\n if (!opened) {\n this.onCountrySearchTermChanged('');\n }\n }\n\n onPhoneInput(event: Event) {\n const inputEl = event.target as HTMLInputElement | null;\n const control = this.form.get('phone');\n\n if (!inputEl || !control) {\n return;\n }\n\n const sanitized = inputEl.value.replace(/\\D+/g, '');\n\n if (sanitized !== inputEl.value) {\n inputEl.value = sanitized;\n }\n\n if (control.value !== sanitized) {\n control.setValue(sanitized, { emitEvent: false });\n }\n\n this.validateNumber();\n }\n\n private applyCountryFilter() {\n const term = this.countrySearchTerm.trim();\n\n if (!term) {\n this.filteredCountries = [...this.countriesData];\n return;\n }\n\n const digitsOnly = /^\\d+$/.test(term);\n\n if (digitsOnly) {\n this.filteredCountries = this.countriesData.filter((country) => country.callingCode?.toString().startsWith(term));\n return;\n }\n\n const normalized = term.toLowerCase();\n this.filteredCountries = this.countriesData.filter((country) => country.nameEn?.toLowerCase().includes(normalized));\n }\n\n private applyExternalValue(value: PhoneNumber | null) {\n const countryControl = this.form.get('country');\n const phoneControl = this.form.get('phone');\n\n const resolvedCountry = value ? this.findCountryForValue(value) : null;\n const countryFallback = this.countriesData[0] ?? null;\n\n countryControl?.setValue(resolvedCountry ?? countryFallback, { emitEvent: false });\n const resolvedNumber = value?.number ?? value?.nationalNumber ?? '';\n const normalizedNumber = resolvedNumber ? resolvedNumber.toString() : '';\n phoneControl?.setValue(normalizedNumber, { emitEvent: false });\n\n this.countrySearchTerm = '';\n this.filteredCountries = [...this.countriesData];\n\n this.validateNumber(false);\n }\n\n private findCountryForValue(value: PhoneNumber | null) {\n if (!value) {\n return null;\n }\n\n const normalizedCode = value.countryCode?.toUpperCase();\n if (normalizedCode) {\n const byCode = this.countriesData.find((country) => country.code?.toUpperCase() === normalizedCode);\n if (byCode) {\n return byCode;\n }\n }\n\n if (value.dialCode) {\n const dial = value.dialCode.toString();\n const byDial = this.countriesData.find((country) => country.callingCode?.toString() === dial);\n if (byDial) {\n return byDial;\n }\n }\n\n return null;\n }\n\n private setPhoneError(errorKey: string, present: boolean) {\n const control = this.form.get('phone');\n if (!control) {\n return;\n }\n const errors = { ...(control.errors ?? {}) };\n\n if (present) {\n errors[errorKey] = true;\n } else {\n delete errors[errorKey];\n }\n\n const hasErrors = Object.keys(errors).length > 0;\n control.setErrors(hasErrors ? errors : null);\n }\n\n private emitResult(result: PhoneNumber, emit: boolean) {\n if (emit) {\n this.onChangeFn(result);\n this.phoneChange.emit(result);\n }\n }\n\n private emitEmpty(emit: boolean) {\n const empty = this.buildEmptyValue();\n if (emit) {\n this.onChangeFn(null);\n this.phoneChange.emit(empty);\n }\n }\n\n private emitInvalidNumber(rawInput: string, country: any, emit: boolean) {\n if (!emit) {\n return;\n }\n\n const partial: PhoneNumber = {\n countryCode: country?.code ?? null,\n dialCode: country?.callingCode ?? null,\n e164Number: null,\n internationalNumber: null,\n nationalNumber: rawInput,\n number: rawInput,\n };\n\n this.onChangeFn(partial);\n this.phoneChange.emit(partial);\n }\n\n private markAsTouched() {\n this.onTouchedFn();\n if (!this.touched) {\n this.form.markAllAsTouched();\n this.touched = true;\n }\n }\n\n private buildEmptyValue(): PhoneNumber {\n const selectedCountry = this.form.get('country')?.value;\n return {\n countryCode: selectedCountry?.code ?? null,\n dialCode: selectedCountry?.callingCode ?? null,\n e164Number: null,\n internationalNumber: null,\n nationalNumber: null,\n number: null,\n };\n }\n}\n","<div [formGroup]=\"form\" class=\"sd_waba_container_phone_input\">\n\n <!-- Country select -->\n <mat-form-field class=\"sd_waba_phone_country_field\">\n <mat-label>Country</mat-label>\n <mat-select formControlName=\"country\" panelClass=\"sd_waba_country_select\"\n (selectionChange)=\"onCountrySelectionChange($event)\" (openedChange)=\"onCountrySelectOpened($event)\">\n <mat-select-trigger>\n <span class=\"sd_waba_country_trigger\">\n <span class=\"sd_waba_country_trigger_flag\">{{ form?.value?.country?.flag }}</span>\n <span class=\"sd_waba_country_trigger_code\">+{{ form?.value?.country?.callingCode }}</span>\n </span>\n </mat-select-trigger>\n <mat-option class=\"sd_waba_country_search\" matRippleDisabled (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <input type=\"text\" class=\"sd_waba_country_search_input\" placeholder=\"Search Country\"\n [ngModel]=\"countrySearchTerm\" [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onCountrySearchTermChanged($event)\" (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" />\n </mat-option>\n @if (filteredCountries.length === 0) {\n <mat-option disabled>No matches found</mat-option>\n }\n @for (c of filteredCountries; track c.code) {\n <mat-option [value]=\"c\" class=\"sd_waba_country_option\">\n <span class=\"sd_waba_country_option_flag\">{{ c.flag }}</span>\n <span class=\"sd_waba_country_option_name\">{{ c.nameEn }}</span>\n <span class=\"sd_waba_country_option_dial\">+{{ c.callingCode }}</span>\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <!-- Phone number input -->\n <mat-form-field class=\"sd_waba_phone_number_field\">\n <mat-label>{{ label }}</mat-label>\n <input matInput type=\"tel\" formControlName=\"phone\" placeholder=\"{{ placeholder || ''}}\" (input)=\"onPhoneInput($event)\" />\n <!-- @if (form.get('phone')?.hasError('invalid')) {\n <mat-error>\n Invalid phone number\n </mat-error>\n }\n @if (form.get('phone')?.hasError('required')) {\n <mat-error>\n Phone number is required\n </mat-error>\n } -->\n </mat-form-field>\n\n</div>\n","import { ChangeDetectorRef, Component, EventEmitter, NgZone, Output } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\n\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { CleanDeep, CustomValidators, SnugdeskAuthenticationService } from '@snugdesk/core';\nimport { ModelSortDirection, PhoneNumber } from '../../graphql/common.model';\nimport { Entity, EntityService } from '../../services/entity.service';\n\nimport moment from 'moment-timezone';\n\n@Component({\n selector: 'lib-whatsapp-contact-create',\n templateUrl: './whatsapp-contact-create.component.html',\n styleUrl: './whatsapp-contact-create.component.css',\n standalone: false,\n})\nexport class WhatsAppContactCreateComponent {\n @Output('close')\n closeEv: EventEmitter<void> = new EventEmitter<void>();\n\n @Output('newContact')\n newContactEv: EventEmitter<Entity> = new EventEmitter<Entity>();\n\n createEntityForm!: FormGroup;\n isFormSubmitted: boolean = false;\n showSubmitLoader: boolean = false;\n\n showContactExistsError: boolean = false;\n\n constructor(private cdr: ChangeDetectorRef, private formBuilder: FormBuilder, private zone: NgZone, private authenticationService: SnugdeskAuthenticationService, private entityService: EntityService, private snackBar: MatSnackBar) {\n this.createEntityForm = this.formBuilder.group({\n name: [\n '',\n Validators.compose([\n Validators.required,\n // Validators.minLength(3),\n Validators.pattern(\"^[a-zA-ZÀ-ÖØ-öø-ÿ'\\\\- ]+$\"),\n CustomValidators.trimLength(3),\n CustomValidators.whitespace,\n ]),\n ],\n email: [\n '',\n Validators.compose([\n // Validators.required,\n Validators.email,\n // Validators.pattern('^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$'),\n Validators.pattern('^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,15}$'),\n // Validators.pattern('^[A-Za-z0-9._%+-]{1,64}@[A-Za-z0-9.-]{2,255}\\\\.[A-Za-z]{2,15}$'),\n CustomValidators.whitespace,\n ]),\n ],\n phoneNumber: [null, Validators.compose([Validators.required])],\n });\n }\n\n async onSubmit() {\n this.isFormSubmitted = true;\n this.createEntityForm.markAllAsTouched();\n this.cdr.markForCheck();\n\n if (this.createEntityForm.invalid) {\n // console.debug('Invalid form: ', this.createEntityForm.errors);\n return;\n }\n\n this.showSubmitLoader = true;\n this.createEntityForm.disable();\n this.cdr.detectChanges();\n\n try {\n const now = moment.utc().unix();\n const { name, email, phoneNumber } = this.createEntityForm.value;\n\n const res_ListEntitiesByTenantIdAndPhoneNumberE164 = await this.entityService.ListEntitiesByTenantIdAndPhoneNumberE164(\n this.authenticationService.getTenantId(),\n {\n eq: phoneNumber.e164Number,\n },\n ModelSortDirection.ASC,\n {\n deletedAt: { attributeExists: false },\n }\n );\n // console.debug('res_ListEntitiesByTenantIdAndPhoneNumberE164: ', res_ListEntitiesByTenantIdAndPhoneNumberE164);\n\n if (res_ListEntitiesByTenantIdAndPhoneNumberE164 && res_ListEntitiesByTenantIdAndPhoneNumberE164?.items?.length > 0) {\n this.showContactExistsError = true;\n return;\n }\n\n // create new entity\n const res_createEntity: Entity = await this.entityService.CreateEntity(\n CleanDeep.clean({\n tenantId: this.authenticationService.getTenantId(),\n name: name.trim(),\n email: email.trim().toLowerCase() || null,\n phoneNumber,\n phoneNumberE164: phoneNumber.e164Number,\n isOrganization: false,\n createdAt: now,\n updatedAt: now,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n })\n );\n // console.debug('res_createEntity: ', res_createEntity);\n\n this.newContactEv.emit(res_createEntity);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! We could not save the contact. Please try again.`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showSubmitLoader = false;\n this.createEntityForm.enable();\n this.cdr.detectChanges();\n }\n }\n\n onClose() {\n this.closeEv.emit();\n }\n\n handleEmailInput(event: Event) {\n const control = this.createEntityForm.get('email');\n const inputEl = event.target as HTMLInputElement | null;\n\n if (!control || !inputEl) {\n return;\n }\n\n const sanitized = inputEl.value.replace(/\\s+/g, '');\n\n if (sanitized !== inputEl.value) {\n inputEl.value = sanitized;\n }\n\n if (control.value !== sanitized) {\n control.setValue(sanitized, { emitEvent: false });\n }\n }\n\n handlePhoneInput(data: PhoneNumber) {\n this.showContactExistsError = false;\n this.createEntityForm.patchValue({\n phoneNumber: data,\n });\n }\n}\n","<div class=\"sd_waba_contact_header\">\n <div class=\"sd_waba_contact_header_left\">\n <button type=\"button\" class=\"sd_waba_button_back\" title=\"Back\" (click)=\"onClose()\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" fill=\"none\">\n <path\n d=\"M7.8248 13L12.7248 17.9C12.9248 18.1 13.0206 18.3333 13.0123 18.6C13.004 18.8667 12.8998 19.1 12.6998 19.3C12.4998 19.4833 12.2665 19.5792 11.9998 19.5875C11.7331 19.5958 11.4998 19.5 11.2998 19.3L4.6998 12.7C4.5998 12.6 4.52897 12.4917 4.4873 12.375C4.44564 12.2583 4.4248 12.1333 4.4248 12C4.4248 11.8667 4.44564 11.7417 4.4873 11.625C4.52897 11.5083 4.5998 11.4 4.6998 11.3L11.2998 4.69999C11.4831 4.51665 11.7123 4.42499 11.9873 4.42499C12.2623 4.42499 12.4998 4.51665 12.6998 4.69999C12.8998 4.89999 12.9998 5.13749 12.9998 5.41249C12.9998 5.68749 12.8998 5.92499 12.6998 6.12499L7.8248 11H18.9998C19.2831 11 19.5206 11.0958 19.7123 11.2875C19.904 11.4792 19.9998 11.7167 19.9998 12C19.9998 12.2833 19.904 12.5208 19.7123 12.7125C19.5206 12.9042 19.2831 13 18.9998 13H7.8248Z\"\n fill=\"currentColor\"></path>\n </svg>\n </button>\n <span class=\"sd_waba_header_title\">New contact</span>\n </div>\n</div>\n\n<div class=\"sd_waba_contact_content\">\n <div class=\"sd_waba_contact_content_inner\">\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_contact_form\">\n <div class=\"sd_waba_contact_avatar\">\n <svg width=\"40px\" viewBox=\"0 0 640 640\">\n <path fill=\"currentColor\"\n d=\"M320 312C386.3 312 440 258.3 440 192C440 125.7 386.3 72 320 72C253.7 72 200 125.7 200 192C200 258.3 253.7 312 320 312zM290.3 368C191.8 368 112 447.8 112 546.3C112 562.7 125.3 576 141.7 576L498.3 576C514.7 576 528 562.7 528 546.3C528 447.8 448.2 368 349.7 368L290.3 368z\" />\n </svg>\n </div>\n\n <form [formGroup]=\"createEntityForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"sd_waba_contact_form_inner\">\n <div class=\"sd_waba_contact_form_field\">\n <mat-form-field>\n <mat-label>Name</mat-label>\n <input matInput formControlName=\"name\" title=\"Name\" />\n <ng-container *ngTemplateOutlet=\"fieldErrors; context: {\n $implicit: createEntityForm.get('name'),\n requiredMsg: 'Name is required',\n invalidLengthMsg: 'Name must be atleast 3 characters long',\n invalidPatternMsg: 'Special characters and numbers are not allowed'\n }\"></ng-container>\n </mat-form-field>\n </div>\n\n <div class=\"sd_waba_contact_form_field\">\n <mat-form-field>\n <mat-label>Email</mat-label>\n <input matInput formControlName=\"email\" title=\"Email\" (input)=\"handleEmailInput($event)\" />\n <ng-container *ngTemplateOutlet=\"fieldErrors; context: {\n $implicit: createEntityForm.get('email'),\n requiredMsg: 'Email is required',\n invalidPatternMsg: 'Enter a valid email address'\n }\"></ng-container>\n </mat-form-field>\n </div>\n\n <div class=\"sd_waba_contact_form_field_tel\">\n <app-phone-input formControlName=\"phoneNumber\" label=\"Phone Number\"\n (phoneChange)=\"handlePhoneInput($event)\" />\n <ng-container *ngTemplateOutlet=\"fieldErrors; context: {\n $implicit: createEntityForm.get('phoneNumber'),\n requiredMsg: 'Phone number is required',\n invalidPatternMsg: 'Enter a valid phone number'\n }\"></ng-container>\n @if (showContactExistsError && (createEntityForm.controls['phoneNumber']?.touched || isFormSubmitted) &&\n !createEntityForm.controls['phoneNumber']?.invalid) {\n <mat-error>This phone number is already registered</mat-error>\n }\n </div>\n <div class=\"sd_waba_contact_form_actions\">\n <button type=\"submit\" class=\"sd_waba_button_save\" title=\"Save\" [disabled]=\"showSubmitLoader\">\n @if (showSubmitLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n }\n @else {\n <span>Save</span>\n }\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Error helper: pass AbstractControl as $implicit; optional requiredMsg / invalidLengthMsg / invalidPatternMsg -->\n<ng-template #fieldErrors let-ctrl let-requiredMsg=\"requiredMsg\" let-invalidLengthMsg=\"invalidLengthMsg\" let-invalidPatternMsg=\"invalidPatternMsg\">\n @if ((ctrl?.touched || isFormSubmitted)\n && (ctrl?.hasError('required') || ctrl?.hasError('whitespace'))) {\n <mat-error>{{ requiredMsg }}</mat-error>\n }\n\n @if ((ctrl?.touched || isFormSubmitted)\n && (ctrl?.hasError('minlength') || ctrl?.hasError('trimLength'))\n && !ctrl?.hasError('required') && !ctrl?.hasError('whitespace')\n && !ctrl?.hasError('pattern')) {\n <mat-error>{{ invalidLengthMsg }}</mat-error>\n }\n\n @if ((ctrl?.touched || isFormSubmitted)\n && ctrl?.hasError('pattern')\n && !ctrl?.hasError('required') && !ctrl?.hasError('whitespace')\n && !ctrl?.hasError('minlength') && !ctrl?.hasError('trimLength')) {\n <mat-error>{{ invalidPatternMsg }}</mat-error>\n }\n</ng-template>\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\n\nimport { ModelSortDirection } from '../../graphql/common.model';\nimport { Entity, EntityService } from '../../services/entity.service';\n\n@Component({\n selector: 'lib-whatsapp-contact-list',\n templateUrl: './whatsapp-contact-list.component.html',\n styleUrl: './whatsapp-contact-list.component.css',\n standalone: false,\n})\nexport class WhatsAppContactListComponent implements OnInit, OnChanges {\n @Input('containerDimensions')\n containerDimensions!: { width: number; height: number };\n\n @Output('close')\n closeEv = new EventEmitter<void>();\n\n @Output('selectContact')\n selectContactEv = new EventEmitter<Entity>();\n\n entities: Entity[] = [];\n nextToken_entities!: string | undefined;\n endOfList: boolean = false;\n\n showInitLoader: boolean = true;\n showRefreshLoader: boolean = false;\n showEntityScrollLoader: boolean = false;\n\n searchQuery: string = '';\n filteredEntities: Entity[] = [];\n\n showNewContact: boolean = false;\n\n constructor(private cdr: ChangeDetectorRef, private authenticationService: SnugdeskAuthenticationService, private entityService: EntityService, private snackBar: MatSnackBar) {}\n\n async ngOnInit(): Promise<void> {\n this.showInitLoader = true;\n try {\n // List entities using cloud search\n // this.entities = await this.entityService.searchEntities(this.searchQuery);\n\n // load the first page\n this.entities = await this.listEntitiesByTenantId();\n\n // load all other pages\n while (!this.endOfList) {\n await this.onScrollEntityList();\n }\n // console.debug('entities: ', this.entities);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch contacts`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showInitLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['containerDimensions']) {\n this.cdr.detectChanges();\n }\n }\n\n onClose(): void {\n this.searchQuery = '';\n this.showNewContact = false;\n this.filterEntities();\n\n this.closeEv.emit();\n this.cdr.detectChanges();\n }\n\n async listEntitiesByTenantId(): Promise<Entity[]> {\n if (this.endOfList) return [];\n\n const res_listEntitiesByTenantId = await this.entityService.ListEntitiesByTenantId(\n this.authenticationService.getTenantId(),\n undefined,\n ModelSortDirection.ASC,\n {\n and: [\n {\n phoneNumberE164: { attributeExists: true },\n },\n {\n deletedAt: { attributeExists: false },\n },\n ],\n },\n undefined,\n this.nextToken_entities\n );\n // console.debug('res_listEntitiesByTenantId: ', res_listEntitiesByTenantId);\n\n this.endOfList = !res_listEntitiesByTenantId.nextToken;\n this.nextToken_entities = res_listEntitiesByTenantId.nextToken || undefined;\n\n return res_listEntitiesByTenantId.items || [];\n }\n\n filterEntities(): void {\n if (!this.searchQuery || this.searchQuery.trim().length === 0) {\n this.filteredEntities = this.entities;\n return;\n }\n\n const cleanedSearchQuery = this.searchQuery.replace(/[\\s+\\(\\)\\[\\]\\{\\}]/g, '');\n const isSearchingByPhoneNumber = /^\\d+$/.test(cleanedSearchQuery);\n this.filteredEntities = this.entities?.filter((entity: any) => {\n if (isSearchingByPhoneNumber && entity.phoneNumber && entity.phoneNumber.e164Number) {\n const countryCode = entity.phoneNumber.e164Number.split(' ')[0] || '';\n const cleanedEntityPhoneNumber = entity.phoneNumber.e164Number.substring(countryCode.length).replace(/[\\s+\\(\\)\\[\\]\\{\\}]/g, '');\n return cleanedEntityPhoneNumber.includes(cleanedSearchQuery);\n } else {\n return entity.name?.toLowerCase().includes(this.searchQuery.trim().toLowerCase());\n }\n });\n\n if (!this.filteredEntities) {\n this.filteredEntities = [];\n }\n }\n\n async refreshEntityList(): Promise<void> {\n this.showRefreshLoader = true;\n try {\n this.entities = [];\n this.filteredEntities = [];\n\n // list all entities\n this.endOfList = false;\n this.nextToken_entities = undefined;\n this.entities = await this.listEntitiesByTenantId();\n\n // load all other pages\n while (!this.endOfList) {\n await this.onScrollEntityList();\n }\n // console.debug('Refreshed entities: ', this.entities);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch contacts`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.filterEntities();\n this.showRefreshLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async onScrollEntityList(): Promise<void> {\n if (this.endOfList) return;\n\n this.showEntityScrollLoader = true;\n try {\n const res_listEntitiesByTenantId: Entity[] = await this.listEntitiesByTenantId();\n this.entities = this.entities.concat(...res_listEntitiesByTenantId);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! We encountered an error. Please try again.`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.filterEntities();\n this.showEntityScrollLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n toggleNewContact(): void {\n this.showNewContact = !this.showNewContact;\n this.cdr.detectChanges();\n }\n\n handleNewContact(entity: Entity): void {\n this.showNewContact = false;\n this.entities.unshift(entity);\n this.entities.sort((a, b) => {\n const an = a.name?.trim().toLowerCase() ?? '';\n const bn = b.name?.trim().toLowerCase() ?? '';\n return an.localeCompare(bn);\n });\n this.filterEntities();\n\n this.selectContactEv.emit(entity);\n this.cdr.detectChanges();\n }\n\n handleSelectContact(entity: Entity): void {\n this.searchQuery = '';\n this.showNewContact = false;\n this.filterEntities();\n\n this.selectContactEv.emit(entity);\n this.cdr.detectChanges();\n }\n\n isNumeric(value: string): boolean {\n return /^\\d+$/.test(value?.trim());\n }\n\n getScrollLoaderCount(): number {\n return Math.ceil((this.containerDimensions.height - 300) / 75);\n }\n\n handleEntityImageError(entity: any): void {\n if (entity && entity.image_url) {\n entity.image_url = null;\n } else {\n entity.image = null;\n }\n }\n}\n","<div class=\"sd_waba_container_contact_list_header\">\n <div class=\"sd_waba_container_contact_list_header_inner\">\n <button type=\"button\" class=\"sd_waba_button_back\" title=\"Back\" (click)=\"onClose()\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" fill=\"none\">\n <path\n d=\"M7.8248 13L12.7248 17.9C12.9248 18.1 13.0206 18.3333 13.0123 18.6C13.004 18.8667 12.8998 19.1 12.6998 19.3C12.4998 19.4833 12.2665 19.5792 11.9998 19.5875C11.7331 19.5958 11.4998 19.5 11.2998 19.3L4.6998 12.7C4.5998 12.6 4.52897 12.4917 4.4873 12.375C4.44564 12.2583 4.4248 12.1333 4.4248 12C4.4248 11.8667 4.44564 11.7417 4.4873 11.625C4.52897 11.5083 4.5998 11.4 4.6998 11.3L11.2998 4.69999C11.4831 4.51665 11.7123 4.42499 11.9873 4.42499C12.2623 4.42499 12.4998 4.51665 12.6998 4.69999C12.8998 4.89999 12.9998 5.13749 12.9998 5.41249C12.9998 5.68749 12.8998 5.92499 12.6998 6.12499L7.8248 11H18.9998C19.2831 11 19.5206 11.0958 19.7123 11.2875C19.904 11.4792 19.9998 11.7167 19.9998 12C19.9998 12.2833 19.904 12.5208 19.7123 12.7125C19.5206 12.9042 19.2831 13 18.9998 13H7.8248Z\"\n fill=\"currentColor\"></path>\n </svg>\n </button>\n <span class=\"sd_waba_header_title\">New chat</span>\n </div>\n</div>\n\n<div class=\"sd_waba_container_contact_list_search\">\n <span class=\"sd_waba_icon_search\">\n <svg viewBox=\"0 0 20 20\" height=\"20\" width=\"20\" fill=\"none\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.36653 4.3664C5.36341 3.36953 6.57714 2.87 8.00012 2.87C9.42309 2.87 10.6368 3.36953 11.6337 4.3664C12.6306 5.36329 13.1301 6.57724 13.1301 8.00062C13.1301 8.57523 13.0412 9.11883 12.8624 9.63057C12.6972 10.1038 12.4733 10.5419 12.1909 10.9444L16.5712 15.3247C16.7454 15.4989 16.8385 15.7046 16.8385 15.9375C16.8385 16.1704 16.7454 16.3761 16.5712 16.5503C16.396 16.7254 16.1866 16.8175 15.948 16.8175C15.7095 16.8175 15.5001 16.7254 15.3249 16.5503L10.9448 12.1906C10.5421 12.4731 10.104 12.697 9.63069 12.8623C9.11895 13.041 8.57535 13.13 8.00074 13.13C6.57736 13.13 5.36341 12.6305 4.36653 11.6336C3.36965 10.6367 2.87012 9.42297 2.87012 8C2.87012 6.57702 3.36965 5.36328 4.36653 4.3664ZM8.00012 4.63C7.06198 4.63 6.26877 4.95685 5.61287 5.61275C4.95698 6.26865 4.63012 7.06186 4.63012 8C4.63012 8.93813 4.95698 9.73134 5.61287 10.3872C6.26877 11.0431 7.06198 11.37 8.00012 11.37C8.93826 11.37 9.73146 11.0431 10.3874 10.3872C11.0433 9.73134 11.3701 8.93813 11.3701 8C11.3701 7.06186 11.0433 6.26865 10.3874 5.61275C9.73146 4.95685 8.93826 4.63 8.00012 4.63Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input type=\"search\" class=\"sd_waba_input_search\" placeholder=\"Search\" [(ngModel)]=\"searchQuery\"\n (keyup)=\"filterEntities()\" [disabled]=\"showInitLoader || showRefreshLoader\">\n</div>\n\n<div class=\"sd_waba_container_contact_add\">\n <button type=\"button\" title=\"New contact\" class=\"sd_waba_button_contact_add\" (click)=\"toggleNewContact()\">\n <div class=\"sd_waba_container_icon_add\">\n <div class=\"sd_waba_container_icon_add_inner\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" fill=\"none\">\n <path\n d=\"M18 11H16C15.7167 11 15.4792 10.9042 15.2875 10.7125C15.0958 10.5208 15 10.2833 15 10C15 9.71667 15.0958 9.47917 15.2875 9.2875C15.4792 9.09583 15.7167 9 16 9H18V7C18 6.71667 18.0958 6.47917 18.2875 6.2875C18.4792 6.09583 18.7167 6 19 6C19.2833 6 19.5208 6.09583 19.7125 6.2875C19.9042 6.47917 20 6.71667 20 7V9H22C22.2833 9 22.5208 9.09583 22.7125 9.2875C22.9042 9.47917 23 9.71667 23 10C23 10.2833 22.9042 10.5208 22.7125 10.7125C22.5208 10.9042 22.2833 11 22 11H20V13C20 13.2833 19.9042 13.5208 19.7125 13.7125C19.5208 13.9042 19.2833 14 19 14C18.7167 14 18.4792 13.9042 18.2875 13.7125C18.0958 13.5208 18 13.2833 18 13V11ZM9 12C7.9 12 6.95833 11.6083 6.175 10.825C5.39167 10.0417 5 9.1 5 8C5 6.9 5.39167 5.95833 6.175 5.175C6.95833 4.39167 7.9 4 9 4C10.1 4 11.0417 4.39167 11.825 5.175C12.6083 5.95833 13 6.9 13 8C13 9.1 12.6083 10.0417 11.825 10.825C11.0417 11.6083 10.1 12 9 12ZM1 18V17.2C1 16.6333 1.14583 16.1125 1.4375 15.6375C1.72917 15.1625 2.11667 14.8 2.6 14.55C3.63333 14.0333 4.68333 13.6458 5.75 13.3875C6.81667 13.1292 7.9 13 9 13C10.1 13 11.1833 13.1292 12.25 13.3875C13.3167 13.6458 14.3667 14.0333 15.4 14.55C15.8833 14.8 16.2708 15.1625 16.5625 15.6375C16.8542 16.1125 17 16.6333 17 17.2V18C17 18.55 16.8042 19.0208 16.4125 19.4125C16.0208 19.8042 15.55 20 15 20H3C2.45 20 1.97917 19.8042 1.5875 19.4125C1.19583 19.0208 1 18.55 1 18Z\"\n fill=\"currentColor\"></path>\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_container_label_add\">\n <span>New contact</span>\n </div>\n </button>\n</div>\n\n<div class=\"sd_waba_container_contact_list_content\">\n <div class=\"sd_waba_container_contact_list_content_inner\">\n <div class=\"sd_waba_scrollbox\" id=\"sd_contacts_whatsapp_scrollbox\" infiniteScroll [scrollWindow]=\"false\"\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"500\" [infiniteScrollDisabled]=\"showEntityScrollLoader\"\n (scrolled)=\"onScrollEntityList()\" #scrollboxWhatsAppContacts>\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_container_contact_list\">\n @if (showInitLoader || showRefreshLoader) {\n <div class=\"sd_waba_container_contacts_init_loader\">\n @for (count of [].constructor(getScrollLoaderCount()); track $index) {\n <div class=\"sd_waba_container_skeleton_loader\">\n <ngx-skeleton-loader appearance=\"circle\"\n [theme]=\"{ 'width': '49px', 'height': '49px', 'background-color': '#d9d9d9' }\" animation=\"progress\">\n </ngx-skeleton-loader>\n <div class=\"sd_waba_container_skeleton_loader_messages\">\n <ngx-skeleton-loader [theme]=\"{ 'width': '30%', 'height': '16px', 'background-color': '#d9d9d9' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ 'width': '80%', 'height': '14px', 'background-color': '#e0e0e0', 'margin-bottom': '0px' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n </div>\n </div>\n }\n </div>\n }\n @else {\n @let searchResults = (searchQuery ? filteredEntities : entities) || [];\n\n @if (searchResults && searchResults.length > 0) {\n <div class=\"sd_waba_contact_list\">\n <ul>\n @for (entity of searchResults; track entity.id) {\n <li (click)=\"handleSelectContact(entity)\">\n <div class=\"sd_waba_container_contact_list_item\">\n <div class=\"sd_waba_container_contact_avatar\"\n [ngClass]=\"{ 'sd_waba_container_contact_avatar_grayscale': !!entity.blockedAt }\">\n @if (entity[\"image_url\"] || entity.image?.location) {\n <img src=\"{{ entity['image_url'] || entity?.image?.location }}\" alt=\"{{ entity.name || '' }}\"\n (error)=\"handleEntityImageError(entity)\" />\n } @else if (!entity?.blockedAt) {\n <ngx-avatars initialsSize=\"2\" [size]=\"49\" [round]=\"true\" [name]=\"entity?.name || '?'\" />\n } @else {\n <ngx-avatars initialsSize=\"2\" [size]=\"49\" [round]=\"true\" [name]=\"entity?.name || '?'\"\n [bgColor]=\"'#d3d3d3'\" />\n }\n </div>\n <div class=\"sd_waba_container_contact_details\">\n <div class=\"sd_waba_container_contact_name\">\n {{ entity.name || '' }}\n </div>\n <div class=\"sd_waba_container_contact_number\">\n {{ entity.phoneNumber?.internationalNumber || entity.phoneNumber?.e164Number || entity.phoneNumberE164 || '' }}\n </div>\n </div>\n </div>\n </li>\n }\n </ul>\n </div>\n\n @if (showEntityScrollLoader) {\n <div class=\"sd_waba_container_contacts_scroll_loader\">\n <div class=\"sd_waba_scroll_item_loader\"></div>\n </div>\n }\n }\n @else {\n <div class=\"sd_waba_container_no_results\">\n <div class=\"sd_waba_container_no_results_inner\">\n <div class=\"sd_waba_container_icon_no_results\">\n <svg version=\"1.1\" viewBox=\"0 0 60 60\" width=\"68px\" style=\"enable-background:new 0 0 60 60;\" xml:space=\"preserve\">\n<path fill=\"currentColor\" d=\"M54,2H6C2.748,2,0,4.748,0,8v33c0,3.252,2.748,6,6,6h8v10c0,0.413,0.254,0.784,0.64,0.933C14.757,57.978,14.879,58,15,58\n\tc0.276,0,0.547-0.115,0.74-0.327L25.442,47H54c3.252,0,6-2.748,6-6V8C60,4.748,57.252,2,54,2z M12,15h15c0.553,0,1,0.448,1,1\n\ts-0.447,1-1,1H12c-0.553,0-1-0.448-1-1S11.447,15,12,15z M46,33H12c-0.553,0-1-0.448-1-1s0.447-1,1-1h34c0.553,0,1,0.448,1,1\n\tS46.553,33,46,33z M46,25H12c-0.553,0-1-0.448-1-1s0.447-1,1-1h34c0.553,0,1,0.448,1,1S46.553,25,46,25z\"/>\n</svg>\n </div>\n <h2>No chats or contacts found</h2>\n @if (!entities || entities?.length === 0) {\n <p>Contacts you create will appear here.</p>\n }\n @else {\n <p>No results found for your search. Please try different keywords.</p>\n }\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n\n@if (showNewContact) {\n<div class=\"sd_waba_container_contact_create\"\n [ngClass]=\"{ 'sd_waba_slide_in_right': showNewContact, 'sd_waba_slide_out_right': !showNewContact }\">\n <lib-whatsapp-contact-create (close)=\"toggleNewContact()\" (newContact)=\"handleNewContact($event)\" />\n</div>\n}\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { ModelBooleanInput, ModelIDInput, ModelIntInput, ModelIntKeyConditionInput, ModelSortDirection, ModelStringInput, ModelStringKeyConditionInput, SubscriptionResponse } from '../graphql/common.model';\nimport { Entity } from './entity.service';\nimport { Interaction, InteractionChannel, InteractionMessage, InteractionProvider, ModelInteractionChannelInput, ModelInteractionProviderInput } from './interaction.service';\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\n\nexport type EntityConversation = {\n id: string;\n tenantId: string;\n entityId?: string | null;\n entity?: Entity | null;\n entityAddress: string;\n interactionChannel: InteractionChannel;\n interactionProvider: InteractionProvider;\n isCampaignEngaged: boolean;\n campaignId?: string | null;\n lastCampaignFlowNodeId?: string | null;\n lastInteractionMessageId?: string | null;\n metadata?: string | null;\n lastActivityAt?: number | null;\n lastMessageAt?: number | null;\n archivedAt?: number | null;\n blockedAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n interactions?: {\n items: Array<Interaction | null>;\n nextToken?: string | null;\n } | null;\n messages?: {\n items: Array<InteractionMessage | null>;\n nextToken?: string | null;\n } | null;\n};\n\nexport type ListEntityConversations = {\n items: Array<EntityConversation | null>;\n nextToken?: string | null;\n};\n\nexport type CreateEntityConversationInput = {\n id?: string | null;\n tenantId: string;\n entityId?: string | null;\n entityAddress: string;\n interactionChannel: InteractionChannel;\n interactionProvider: InteractionProvider;\n isCampaignEngaged: boolean;\n campaignId?: string | null;\n lastCampaignFlowNodeId?: string | null;\n lastInteractionMessageId?: string | null;\n metadata?: string | null;\n lastActivityAt?: number | null;\n lastMessageAt?: number | null;\n archivedAt?: number | null;\n blockedAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type UpdateEntityConversationInput = {\n id: string;\n tenantId?: string | null;\n entityId?: string | null;\n entityAddress?: string | null;\n interactionChannel?: InteractionChannel | null;\n interactionProvider?: InteractionProvider | null;\n isCampaignEngaged?: boolean | null;\n campaignId?: string | null;\n lastCampaignFlowNodeId?: string | null;\n lastInteractionMessageId?: string | null;\n metadata?: string | null;\n lastActivityAt?: number | null;\n lastMessageAt?: number | null;\n archivedAt?: number | null;\n blockedAt?: number | null;\n createdAt?: number | null;\n updatedAt?: number | null;\n deletedAt?: number | null;\n};\n\nexport type ModelEntityConversationConditionInput = {\n tenantId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n entityAddress?: ModelStringInput | null;\n interactionChannel?: ModelInteractionChannelInput | null;\n interactionProvider?: ModelInteractionProviderInput | null;\n isCampaignEngaged?: ModelBooleanInput | null;\n campaignId?: ModelIDInput | null;\n lastCampaignFlowNodeId?: ModelIDInput | null;\n lastInteractionMessageId?: ModelIDInput | null;\n metadata?: ModelStringInput | null;\n lastActivityAt?: ModelIntInput | null;\n lastMessageAt?: ModelIntInput | null;\n archivedAt?: ModelIntInput | null;\n blockedAt?: ModelIntInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelEntityConversationConditionInput | null> | null;\n or?: Array<ModelEntityConversationConditionInput | null> | null;\n not?: ModelEntityConversationConditionInput | null;\n};\n\nexport type ModelEntityConversationFilterInput = {\n id?: ModelIDInput | null;\n tenantId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n entityAddress?: ModelStringInput | null;\n interactionChannel?: ModelInteractionChannelInput | null;\n interactionProvider?: ModelInteractionProviderInput | null;\n isCampaignEngaged?: ModelBooleanInput | null;\n campaignId?: ModelIDInput | null;\n lastCampaignFlowNodeId?: ModelIDInput | null;\n lastInteractionMessageId?: ModelIDInput | null;\n metadata?: ModelStringInput | null;\n lastActivityAt?: ModelIntInput | null;\n lastMessageAt?: ModelIntInput | null;\n archivedAt?: ModelIntInput | null;\n blockedAt?: ModelIntInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelEntityConversationFilterInput | null> | null;\n or?: Array<ModelEntityConversationFilterInput | null> | null;\n not?: ModelEntityConversationFilterInput | null;\n};\n\nexport type __SubscriptionContainer = {\n OnEntityConversationByTenantId: EntityConversation;\n};\n\nexport const FIELDS_ENTITY_CONVERSATION: string = `\n id\n tenantId\n entityId\n entityAddress\n interactionChannel\n interactionProvider\n isCampaignEngaged\n campaignId\n lastCampaignFlowNodeId\n lastInteractionMessageId\n metadata\n lastActivityAt\n lastMessageAt\n archivedAt\n blockedAt\n createdAt\n updatedAt\n deletedAt\n`;\n\nexport const FIELDS_ENTITY_CONVERSATION_EXPANDED = `\n id\n tenantId\n entityId\n entity {\n id\n externalId\n tenantId\n entityTypeId\n parentId\n name\n image {\n key\n bucket\n location\n }\n isOrganization\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n notes\n customFields\n preferences {\n timezoneName\n language {\n code\n nameEn\n nameLocal\n }\n }\n contactPreferences {\n allowCall\n allowEmail\n allowSMS\n allowWhatsApp\n }\n createdAt\n updatedAt\n blockedAt\n deletedAt\n }\n entityAddress\n interactionChannel\n interactionProvider\n isCampaignEngaged\n campaignId\n lastCampaignFlowNodeId\n lastInteractionMessageId\n metadata\n lastActivityAt\n lastMessageAt\n archivedAt\n blockedAt\n createdAt\n updatedAt\n deletedAt\n interactions (limit: 1, sortDirection: ${ModelSortDirection.DESC}) {\n items {\n id\n tenantId\n entityId\n entityConversationId\n teamId\n widgetId\n metadata\n subject\n direction\n status\n last_status\n hostId\n startedAt\n completedAt\n createdAt\n updatedAt\n deletedAt\n }\n nextToken\n }\n messages (limit: 1, sortDirection: ${ModelSortDirection.DESC}) {\n items {\n id\n externalId\n endpointId\n entityConversationId\n interactionId\n interactionAttendeeId\n referenceMessageId\n body\n metadata\n createdAt\n updatedAt\n deletedAt\n messageAttachments {\n items {\n id\n externalId\n interactionId\n interactionMessageId\n interactionId\n name\n size\n type\n file {\n key\n bucket\n location\n }\n createdAt\n updatedAt\n deletedAt\n }\n nextToken\n }\n }\n nextToken\n }\n`;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class EntityConversationService {\n constructor(private readonly graphqlService: AppSyncGraphqlService) {}\n\n async GetEntityConversation(id: string): Promise<EntityConversation> {\n const statement = `query GetEntityConversation($id: ID!) {\n getEntityConversation(id: $id) {\n ${FIELDS_ENTITY_CONVERSATION_EXPANDED}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { id };\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <EntityConversation>response.data.getEntityConversation;\n }\n\n async CreateEntityConversation(input: CreateEntityConversationInput, condition?: ModelEntityConversationConditionInput): Promise<EntityConversation> {\n const statement = `mutation CreateEntityConversation($input: CreateEntityConversationInput!, $condition: ModelEntityConversationConditionInput) {\n createEntityConversation(input: $input, condition: $condition) {\n ${FIELDS_ENTITY_CONVERSATION}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <EntityConversation>response.data.createEntityConversation;\n }\n\n async UpdateEntityConversation(input: UpdateEntityConversationInput, condition?: ModelEntityConversationConditionInput): Promise<EntityConversation> {\n const statement = `mutation UpdateEntityConversation($input: UpdateEntityConversationInput!, $condition: ModelEntityConversationConditionInput) {\n updateEntityConversation(input: $input, condition: $condition) {\n ${FIELDS_ENTITY_CONVERSATION}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <EntityConversation>response.data.updateEntityConversation;\n }\n\n async ListEntityConversationsByTenantIdAndEntityAddress(tenantId: string, entityAddress?: ModelStringKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelEntityConversationFilterInput, limit?: number, nextToken?: string): Promise<ListEntityConversations> {\n const statement = `query ListEntityConversationsByTenantIdAndEntityAddress($tenantId: ID!, $entityAddress: ModelStringKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelEntityConversationFilterInput, $limit: Int, $nextToken: String) {\n listEntityConversationsByTenantIdAndEntityAddress(\n tenantId: $tenantId\n entityAddress: $entityAddress\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_ENTITY_CONVERSATION_EXPANDED}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { tenantId };\n if (entityAddress) {\n gqlAPIServiceArguments.entityAddress = entityAddress;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListEntityConversations>response.data.listEntityConversationsByTenantIdAndEntityAddress;\n }\n\n async ListEntityConversationsByTenantIdAndArchivedAt(tenantId: string, archivedAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelEntityConversationFilterInput, limit?: number, nextToken?: string): Promise<ListEntityConversations> {\n const statement = `query ListEntityConversationsByTenantIdAndArchivedAt($tenantId: ID!, $archivedAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelEntityConversationFilterInput, $limit: Int, $nextToken: String) {\n listEntityConversationsByTenantIdAndArchivedAt(\n tenantId: $tenantId\n archivedAt: $archivedAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_ENTITY_CONVERSATION_EXPANDED}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { tenantId };\n if (archivedAt) {\n gqlAPIServiceArguments.archivedAt = archivedAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListEntityConversations>response.data.listEntityConversationsByTenantIdAndArchivedAt;\n }\n\n async ListEntityConversationsByTenantIdAndLastMessageAt(tenantId: string, lastMessageAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelEntityConversationFilterInput, limit?: number, nextToken?: string): Promise<ListEntityConversations> {\n const statement = `query ListEntityConversationsByTenantIdAndLastMessageAt($tenantId: ID!, $lastMessageAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelEntityConversationFilterInput, $limit: Int, $nextToken: String) {\n listEntityConversationsByTenantIdAndLastMessageAt(\n tenantId: $tenantId\n lastMessageAt: $lastMessageAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_ENTITY_CONVERSATION_EXPANDED}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { tenantId };\n if (lastMessageAt) {\n gqlAPIServiceArguments.lastMessageAt = lastMessageAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListEntityConversations>response.data.listEntityConversationsByTenantIdAndLastMessageAt;\n }\n\n OnEntityConversationByTenantIdListener(tenantId: string): Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnEntityConversationByTenantId'>>> {\n const statement = `subscription OnEntityConversationByTenantId($tenantId: ID!) {\n OnEntityConversationByTenantId(tenantId: $tenantId) {\n ${FIELDS_ENTITY_CONVERSATION_EXPANDED}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { tenantId };\n return this.graphqlService.subscribe<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnEntityConversationByTenantId'>>>(statement, gqlAPIServiceArguments) as any;\n /* as Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnEntityConversationByTenantId'>>> */\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nimport { ModelBooleanInput, ModelIDInput, ModelIDKeyConditionInput, ModelIntInput, ModelIntKeyConditionInput, ModelSortDirection, ModelStringInput, S3Object, S3ObjectInput, SubscriptionResponse } from '../graphql/common.model';\nimport { Entity } from './entity.service';\nimport { EntityConversation } from './entity-conversation.service';\nimport { InteractionEndpoint } from './interaction-endpoint.service';\nimport { InteractionWidget } from './interaction-widget.service';\nimport { Team } from './team.service';\nimport { User } from './user.service';\nimport { UserSession } from './user-session.service';\n\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\n\nexport enum InteractionChannel {\n EMAIL = 'EMAIL',\n PHONE = 'PHONE',\n SMS = 'SMS',\n WEB_CHAT = 'WEB_CHAT',\n SOCIAL_CHAT = 'SOCIAL_CHAT',\n}\n\nexport enum InteractionContext {\n INTERNAL = 'INTERNAL',\n EXTERNAL = 'EXTERNAL',\n}\n\nexport enum InteractionDirection {\n IN = 'IN',\n OUT = 'OUT',\n}\n\nexport enum InteractionStatus {\n INITIATED = 'INITIATED',\n QUEUED = 'QUEUED',\n RINGING = 'RINGING',\n CONNECTED_TO_AGENT = 'CONNECTED_TO_AGENT',\n CONNECTED_TO_BOT = 'CONNECTED_TO_BOT',\n HELD = 'HELD',\n DISCONNECTED = 'DISCONNECTED',\n CANCELLED = 'CANCELLED',\n REJECTED = 'REJECTED',\n NO_ANSWER = 'NO_ANSWER',\n MISSED = 'MISSED',\n FAILED = 'FAILED',\n}\n\nexport enum InteractionProvider {\n AVAYA_IPO = 'AVAYA_IPO',\n TELNYX = 'TELNYX',\n WHATSAPP = 'WHATSAPP',\n TELEGRAM = 'TELEGRAM',\n SNUGDESK = 'SNUGDESK',\n}\n\nexport type InteractionRouteConfiguration = {\n teamId?: string | null;\n routingLogic?: InteractionRouteLogic | null;\n maxWaitTimeoutSeconds?: number | null;\n};\n\nexport enum InteractionRouteLogic {\n MOST_IDLE_AGENT = 'MOST_IDLE_AGENT',\n PARALLEL = 'PARALLEL',\n}\n\nexport type Interaction = {\n id: string;\n tenantId: string;\n widgetId: string;\n widget?: InteractionWidget | null;\n endpointId: string;\n endpoint?: InteractionEndpoint | null;\n entityConversationId?: string | null;\n entityConversation?: EntityConversation | null;\n entityId?: string | null;\n entity?: Entity | null;\n teamId?: string | null;\n team?: Team | null;\n hostId?: string | null;\n host?: InteractionHost | null;\n providerInteractionId?: string | null;\n channel: InteractionChannel;\n provider: InteractionProvider;\n context: InteractionContext;\n direction: InteractionDirection;\n status?: InteractionStatus | null;\n last_status?: InteractionStatus | null;\n metadata?: string | null;\n subject?: string | null;\n routeConfiguration?: InteractionRouteConfiguration | null;\n startedAt?: number | null;\n completedAt?: number | null;\n duration?: number | null;\n summary?: string | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n /*\n invitees?: ListInteractionInvitees | null;\n attendees?: ListInteractionAttendees | null;\n messages?: ListInteractionMessages | null;\n messageAttachments?: ListInteractionMessageAttachments | null;\n */\n};\n\nexport type InteractionHost = {\n id: string;\n interactionId: string;\n interaction?: Interaction | null;\n entityId?: string | null;\n entity?: Entity | null;\n teamId?: string | null;\n team?: Team | null;\n userId?: string | null;\n user?: User | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type InteractionInvitee = {\n id: string;\n interactionId: string;\n interaction?: Interaction | null;\n entityId?: string | null;\n entity?: Entity | null;\n teamId?: string | null;\n team?: Team | null;\n userId?: string | null;\n user?: User | null;\n isAdministrator: boolean;\n temp_expiringAt?: number | null;\n expiredAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type InteractionAttendee = {\n id: string;\n interactionId: string;\n interaction?: Interaction | null;\n entityId?: string | null;\n entity?: Entity | null;\n interactionWidgetSessionId?: string | null;\n teamId?: string | null;\n team?: Team | null;\n userId?: string | null;\n user?: User | null;\n userSessionId?: string | null;\n userSession?: UserSession | null;\n name: string;\n metadata?: string | null;\n customFields?: Array<string | null> | null;\n isAdministrator: boolean;\n joinedAt?: number | null;\n exitedAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type InteractionMessage = {\n id: string;\n externalId?: string | null;\n endpointId?: string | null;\n endpoint?: InteractionEndpoint | null;\n campaignId?: string | null;\n campaignFlowNodeId?: string | null;\n entityConversationId: string;\n entityConversation?: EntityConversation | null;\n interactionId: string;\n interaction?: Interaction | null;\n interactionAttendeeId?: string | null;\n interactionAttendee?: InteractionAttendee | null;\n referenceMessageId?: string | null;\n body?: string | null;\n metadata?: string | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n messageAttachments?: ListInteractionMessageAttachments | null;\n temp_isSending?: boolean | null;\n};\n\nexport type InteractionMessageAttachment = {\n id: string;\n externalId?: string | null;\n interactionId: string;\n interactionMessageId: string;\n name: string;\n size?: number | null;\n type?: string | null;\n file: S3Object;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type ListInteractionInvitees = {\n items: Array<InteractionInvitee | null>;\n nextToken?: string | null;\n};\n\nexport type ListInteractionAttendees = {\n items: Array<InteractionAttendee | null>;\n nextToken?: string | null;\n};\n\nexport type ListInteractionMessages = {\n items: Array<InteractionMessage | null>;\n nextToken?: string | null;\n};\n\nexport type ListInteractionMessageAttachments = {\n items: Array<InteractionMessageAttachment | null>;\n nextToken?: string | null;\n};\n\nexport type CreateInteractionInput = {\n id?: string | null;\n tenantId: string;\n widgetId: string;\n endpointId: string;\n entityConversationId?: string | null;\n entityId?: string | null;\n teamId?: string | null;\n hostId?: string | null;\n providerInteractionId?: string | null;\n channel: InteractionChannel;\n provider: InteractionProvider;\n context: InteractionContext;\n direction: InteractionDirection;\n status?: InteractionStatus | null;\n last_status?: InteractionStatus | null;\n metadata?: string | null;\n subject?: string | null;\n routeConfiguration?: InteractionRouteConfigurationInput | null;\n startedAt?: number | null;\n completedAt?: number | null;\n duration?: number | null;\n summary?: string | null;\n temp_isLocked?: boolean | null;\n temp_isAvailableTenantIdUnion?: string | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type UpdateInteractionInput = {\n id: string;\n tenantId?: string | null;\n widgetId?: string | null;\n endpointId?: string | null;\n entityConversationId?: string | null;\n entityId?: string | null;\n teamId?: string | null;\n hostId?: string | null;\n providerInteractionId?: string | null;\n channel?: InteractionChannel | null;\n provider?: InteractionProvider | null;\n context?: InteractionContext | null;\n direction?: InteractionDirection | null;\n status?: InteractionStatus | null;\n last_status?: InteractionStatus | null;\n metadata?: string | null;\n subject?: string | null;\n routeConfiguration?: InteractionRouteConfigurationInput | null;\n startedAt?: number | null;\n completedAt?: number | null;\n duration?: number | null;\n summary?: string | null;\n temp_isLocked?: boolean | null;\n temp_isAvailableTenantIdUnion?: string | null;\n createdAt?: number | null;\n updatedAt?: number | null;\n deletedAt?: number | null;\n};\n\nexport type CreateInteractionAttendeeInput = {\n id?: string | null;\n interactionId: string;\n entityId?: string | null;\n interactionWidgetSessionId?: string | null;\n teamId?: string | null;\n userId?: string | null;\n userSessionId?: string | null;\n name: string;\n metadata?: string | null;\n customFields?: Array<string | null> | null;\n isAdministrator: boolean;\n joinedAt?: number | null;\n exitedAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type CreateInteractionMessageInput = {\n id?: string | null;\n externalId?: string | null;\n endpointId?: string | null;\n campaignId?: string | null;\n campaignFlowNodeId?: string | null;\n entityConversationId: string;\n interactionId: string;\n interactionAttendeeId?: string | null;\n referenceMessageId?: string | null;\n body?: string | null;\n metadata?: string | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type CreateInteractionMessageAttachmentInput = {\n id?: string | null;\n externalId?: string | null;\n interactionId: string;\n interactionMessageId: string;\n name: string;\n size?: number | null;\n type?: string | null;\n file: S3ObjectInput;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type ModelInteractionConditionInput = {\n tenantId?: ModelIDInput | null;\n widgetId?: ModelIDInput | null;\n endpointId?: ModelIDInput | null;\n entityConversationId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n teamId?: ModelIDInput | null;\n hostId?: ModelIDInput | null;\n providerInteractionId?: ModelStringInput | null;\n channel?: ModelInteractionChannelInput | null;\n provider?: ModelInteractionProviderInput | null;\n context?: ModelInteractionContextInput | null;\n direction?: ModelInteractionDirectionInput | null;\n status?: ModelInteractionStatusInput | null;\n last_status?: ModelInteractionStatusInput | null;\n metadata?: ModelStringInput | null;\n subject?: ModelStringInput | null;\n startedAt?: ModelIntInput | null;\n completedAt?: ModelIntInput | null;\n duration?: ModelIntInput | null;\n summary?: ModelStringInput | null;\n temp_isLocked?: ModelBooleanInput | null;\n temp_isAvailableTenantIdUnion?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionConditionInput | null> | null;\n or?: Array<ModelInteractionConditionInput | null> | null;\n not?: ModelInteractionConditionInput | null;\n};\n\nexport type ModelInteractionInviteeFilterInput = {\n id?: ModelIDInput | null;\n interactionId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n teamId?: ModelIDInput | null;\n userId?: ModelIDInput | null;\n isAdministrator?: ModelBooleanInput | null;\n temp_expiringAt?: ModelIntInput | null;\n expiredAt?: ModelIntInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionInviteeFilterInput | null> | null;\n or?: Array<ModelInteractionInviteeFilterInput | null> | null;\n not?: ModelInteractionInviteeFilterInput | null;\n};\n\nexport type ModelInteractionAttendeeConditionInput = {\n interactionId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n interactionWidgetSessionId?: ModelIDInput | null;\n teamId?: ModelIDInput | null;\n userId?: ModelIDInput | null;\n userSessionId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n metadata?: ModelStringInput | null;\n customFields?: ModelStringInput | null;\n isAdministrator?: ModelBooleanInput | null;\n joinedAt?: ModelIntInput | null;\n exitedAt?: ModelIntInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionAttendeeConditionInput | null> | null;\n or?: Array<ModelInteractionAttendeeConditionInput | null> | null;\n not?: ModelInteractionAttendeeConditionInput | null;\n};\n\nexport type ModelInteractionAttendeeFilterInput = {\n id?: ModelIDInput | null;\n interactionId?: ModelIDInput | null;\n entityId?: ModelIDInput | null;\n interactionWidgetSessionId?: ModelIDInput | null;\n teamId?: ModelIDInput | null;\n userId?: ModelIDInput | null;\n userSessionId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n metadata?: ModelStringInput | null;\n customFields?: ModelStringInput | null;\n isAdministrator?: ModelBooleanInput | null;\n joinedAt?: ModelIntInput | null;\n exitedAt?: ModelIntInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionAttendeeFilterInput | null> | null;\n or?: Array<ModelInteractionAttendeeFilterInput | null> | null;\n not?: ModelInteractionAttendeeFilterInput | null;\n};\n\nexport type ModelInteractionMessageConditionInput = {\n externalId?: ModelStringInput | null;\n endpointId?: ModelIDInput | null;\n campaignId?: ModelIDInput | null;\n campaignFlowNodeId?: ModelIDInput | null;\n entityConversationId?: ModelIDInput | null;\n interactionId?: ModelIDInput | null;\n interactionAttendeeId?: ModelIDInput | null;\n referenceMessageId?: ModelIDInput | null;\n body?: ModelStringInput | null;\n metadata?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionMessageConditionInput | null> | null;\n or?: Array<ModelInteractionMessageConditionInput | null> | null;\n not?: ModelInteractionMessageConditionInput | null;\n};\n\nexport type ModelInteractionMessageFilterInput = {\n id?: ModelIDInput | null;\n externalId?: ModelStringInput | null;\n endpointId?: ModelIDInput | null;\n campaignId?: ModelIDInput | null;\n campaignFlowNodeId?: ModelIDInput | null;\n entityConversationId?: ModelIDInput | null;\n interactionId?: ModelIDInput | null;\n interactionAttendeeId?: ModelIDInput | null;\n referenceMessageId?: ModelIDInput | null;\n body?: ModelStringInput | null;\n metadata?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionMessageFilterInput | null> | null;\n or?: Array<ModelInteractionMessageFilterInput | null> | null;\n not?: ModelInteractionMessageFilterInput | null;\n};\n\nexport type ModelInteractionMessageAttachmentConditionInput = {\n externalId?: ModelStringInput | null;\n interactionId?: ModelIDInput | null;\n interactionMessageId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n size?: ModelIntInput | null;\n type?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionMessageAttachmentConditionInput | null> | null;\n or?: Array<ModelInteractionMessageAttachmentConditionInput | null> | null;\n not?: ModelInteractionMessageAttachmentConditionInput | null;\n};\n\nexport type ModelInteractionMessageAttachmentFilterInput = {\n id?: ModelIDInput | null;\n externalId?: ModelStringInput | null;\n interactionId?: ModelIDInput | null;\n interactionMessageId?: ModelIDInput | null;\n name?: ModelStringInput | null;\n size?: ModelIntInput | null;\n type?: ModelStringInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionMessageAttachmentFilterInput | null> | null;\n or?: Array<ModelInteractionMessageAttachmentFilterInput | null> | null;\n not?: ModelInteractionMessageAttachmentFilterInput | null;\n};\n\nexport type ModelInteractionChannelInput = {\n eq?: InteractionChannel | null;\n ne?: InteractionChannel | null;\n};\n\nexport type ModelInteractionContextInput = {\n eq?: InteractionContext | null;\n ne?: InteractionContext | null;\n};\n\nexport type ModelInteractionDirectionInput = {\n eq?: InteractionDirection | null;\n ne?: InteractionDirection | null;\n};\n\nexport type ModelInteractionProviderInput = {\n eq?: InteractionProvider | null;\n ne?: InteractionProvider | null;\n};\n\nexport type ModelInteractionStatusInput = {\n eq?: InteractionStatus | null;\n ne?: InteractionStatus | null;\n};\n\nexport type InteractionRouteConfigurationInput = {\n teamId?: string | null;\n routingLogic?: InteractionRouteLogic | null;\n maxWaitTimeoutSeconds?: number | null;\n};\n\nexport type __SubscriptionContainer = {\n OnInteractionInviteeByUserId: InteractionInvitee;\n OnInteractionMessageByEntityConversationId: InteractionMessage;\n};\n\nconst FIELDS_INTERACTION = `\n id\n tenantId\n widgetId\n endpointId\n entityConversationId\n entityId\n teamId\n hostId\n providerInteractionId\n channel\n provider\n context\n direction\n status\n last_status\n metadata\n subject\n routeConfiguration {\n teamId\n routingLogic\n maxWaitTimeoutSeconds\n }\n startedAt\n completedAt\n duration\n summary\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_EXPANDED = `\n id\n tenantId\n widgetId\n widget {\n id\n tenantId\n channel\n provider\n providerAccountId\n name\n description\n configuration\n isRecordingEnabledByDefault\n isRecordingEnabledOnDemand\n isTranscriptionEnabledByDefault\n isTranscriptionEnabledOnDemand\n createdAt\n updatedAt\n deletedAt\n }\n endpointId\n endpoint {\n id\n externalId\n tenantId\n widgetId\n address\n configuration\n createdAt\n updatedAt\n deletedAt\n }\n entityConversationId\n entityConversation {\n id\n tenantId\n entityId\n entityAddress\n interactionChannel\n interactionProvider\n isCampaignEngaged\n campaignId\n lastCampaignFlowNodeId\n lastInteractionMessageId\n metadata\n lastActivityAt\n lastMessageAt\n archivedAt\n blockedAt\n createdAt\n updatedAt\n deletedAt\n }\n entityId\n entity {\n id\n externalId\n tenantId\n entityTypeId\n entityType {\n id\n externalId\n name\n description\n createdAt\n updatedAt\n deletedAt\n }\n parentId\n name\n image {\n key\n bucket\n location\n }\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n isOrganization\n notes\n customFields\n createdAt\n updatedAt\n blockedAt\n deletedAt\n }\n teamId\n team {\n id\n tenantId\n name\n description\n createdAt\n updatedAt\n deletedAt\n }\n hostId\n host {\n id\n interactionId\n entityId\n teamId\n userId\n createdAt\n updatedAt\n deletedAt\n }\n providerInteractionId\n channel\n provider\n context\n direction\n status\n last_status\n metadata\n subject\n routeConfiguration {\n teamId\n routingLogic\n maxWaitTimeoutSeconds\n }\n startedAt\n completedAt\n duration\n summary\n temp_isLocked\n temp_isAvailableTenantIdUnion\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_ATTENDEE = `\n id\n interactionId\n entityId\n interactionWidgetSessionId\n teamId\n userId\n userSessionId\n name\n metadata\n customFields\n isAdministrator\n joinedAt\n exitedAt\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_ATTENDEE_EXPANDED = `\n id\n interactionId\n entityId\n entity {\n id\n externalId\n tenantId\n entityTypeId\n entityType {\n id\n externalId\n name\n description\n createdAt\n updatedAt\n deletedAt\n }\n parentId\n name\n image {\n key\n bucket\n location\n }\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n isOrganization\n notes\n customFields\n createdAt\n updatedAt\n blockedAt\n deletedAt\n }\n interactionWidgetSessionId\n teamId\n team {\n id\n tenantId\n name\n description\n image {\n key\n bucket\n location\n }\n createdAt\n updatedAt\n deletedAt\n ticketFields\n }\n userId\n user {\n id\n externalId\n tenantId\n name\n image {\n key\n bucket\n location\n }\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n type\n preferences {\n timezoneName\n language {\n code\n nameEn\n nameLocal\n }\n }\n notificationSettings {\n allowPush\n allowEmail\n allowSMS\n allowWhatsApp\n }\n activatedAt\n blockedAt\n createdAt\n updatedAt\n deletedAt\n }\n userSessionId\n name\n metadata\n customFields\n isAdministrator\n joinedAt\n exitedAt\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_INVITEE = `\n id\n interactionId\n interaction {\n ${FIELDS_INTERACTION}\n }\n entityId\n entity {\n id\n externalId\n tenantId\n entityTypeId\n entityType {\n id\n externalId\n name\n description\n createdAt\n updatedAt\n deletedAt\n }\n parentId\n name\n image {\n key\n bucket\n location\n }\n email\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n phoneNumberE164\n isOrganization\n notes\n customFields\n createdAt\n updatedAt\n blockedAt\n deletedAt\n }\n teamId\n userId\n isAdministrator\n temp_expiringAt\n expiredAt\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_MESSAGE_ATTACHMENT = `\n id\n externalId\n interactionId\n interactionMessageId\n name\n size\n type\n file {\n key\n bucket\n location\n }\n createdAt\n updatedAt\n deletedAt\n`;\n\nconst FIELDS_INTERACTION_MESSAGE = `\n id\n externalId\n endpointId\n endpoint {\n id\n externalId\n tenantId\n widgetId\n address\n configuration\n createdAt\n updatedAt\n deletedAt\n }\n campaignId\n campaignFlowNodeId\n entityConversationId\n interactionId\n interactionAttendeeId\n interactionAttendee {\n id\n interactionId\n entityId\n interactionWidgetSessionId\n teamId\n userId\n userSessionId\n name\n metadata\n customFields\n isAdministrator\n joinedAt\n exitedAt\n createdAt\n updatedAt\n deletedAt\n }\n body\n metadata\n referenceMessageId\n createdAt\n updatedAt\n deletedAt\n messageAttachments {\n items {\n ${FIELDS_INTERACTION_MESSAGE_ATTACHMENT}\n }\n nextToken\n }\n`;\n\nconst FIELDS_INTERACTION_MESSAGE_MINIMAL = `\n id\n externalId\n endpointId\n campaignId\n campaignFlowNodeId\n entityConversationId\n interactionId\n interactionAttendeeId\n body\n metadata\n referenceMessageId\n createdAt\n updatedAt\n deletedAt\n messageAttachments {\n items {\n ${FIELDS_INTERACTION_MESSAGE_ATTACHMENT}\n }\n nextToken\n }\n`;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class InteractionService {\n public newInteractionInviteObservable$: BehaviorSubject<any> = new BehaviorSubject<any>(undefined);\n\n constructor(private readonly graphqlService: AppSyncGraphqlService) {}\n\n async GetInteraction(id: string): Promise<Interaction> {\n const statement = `query GetInteraction($id: ID!) {\n getInteraction(id: $id) {\n ${FIELDS_INTERACTION_EXPANDED}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { id };\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <Interaction>response.data.getInteraction;\n }\n\n async GetInteractionAttendee(id: string): Promise<InteractionAttendee> {\n const statement = `query GetInteractionAttendee($id: ID!) {\n getInteractionAttendee(id: $id) {\n ${FIELDS_INTERACTION_ATTENDEE}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { id };\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionAttendee>response.data.getInteractionAttendee;\n }\n\n async GetInteractionMessage(id: string): Promise<InteractionMessage> {\n const statement = `query GetInteractionMessage($id: ID!) {\n getInteractionMessage(id: $id) {\n ${FIELDS_INTERACTION_MESSAGE}\n }\n }`;\n const gqlAPIServiceArguments: any = {\n id,\n };\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionMessage>response.data.getInteractionMessage;\n }\n\n async CreateInteraction(input: CreateInteractionInput, condition?: ModelInteractionConditionInput): Promise<Interaction> {\n const statement = `mutation CreateInteraction($input: CreateInteractionInput!, $condition: ModelInteractionConditionInput) {\n createInteraction(input: $input, condition: $condition) {\n ${FIELDS_INTERACTION}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <Interaction>response.data.createInteraction;\n }\n\n async UpdateInteraction(input: UpdateInteractionInput, condition?: ModelInteractionConditionInput): Promise<Interaction> {\n const statement = `mutation UpdateInteraction($input: UpdateInteractionInput!, $condition: ModelInteractionConditionInput) {\n updateInteraction(input: $input, condition: $condition) {\n ${FIELDS_INTERACTION}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <Interaction>response.data.updateInteraction;\n }\n\n async CreateInteractionAttendee(input: CreateInteractionAttendeeInput, condition?: ModelInteractionAttendeeConditionInput): Promise<InteractionAttendee> {\n const statement = `mutation CreateInteractionAttendee($input: CreateInteractionAttendeeInput!, $condition: ModelInteractionAttendeeConditionInput) {\n createInteractionAttendee(input: $input, condition: $condition) {\n ${FIELDS_INTERACTION_ATTENDEE}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionAttendee>response.data.createInteractionAttendee;\n }\n\n async CreateInteractionMessage(input: CreateInteractionMessageInput, condition?: ModelInteractionMessageConditionInput): Promise<InteractionMessage> {\n const statement = `mutation CreateInteractionMessage($input: CreateInteractionMessageInput!, $condition: ModelInteractionMessageConditionInput) {\n createInteractionMessage(input: $input, condition: $condition) {\n ${FIELDS_INTERACTION_MESSAGE_MINIMAL}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionMessage>response.data.createInteractionMessage;\n }\n\n async CreateInteractionMessageAttachment(input: CreateInteractionMessageAttachmentInput, condition?: ModelInteractionMessageAttachmentConditionInput): Promise<InteractionMessageAttachment> {\n const statement = `mutation CreateInteractionMessageAttachment($input: CreateInteractionMessageAttachmentInput!, $condition: ModelInteractionMessageAttachmentConditionInput) {\n createInteractionMessageAttachment(input: $input, condition: $condition) {\n ${FIELDS_INTERACTION_MESSAGE_ATTACHMENT}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { input };\n if (condition) {\n gqlAPIServiceArguments.condition = condition;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionMessageAttachment>response.data.createInteractionMessageAttachment;\n }\n\n async ListInteractionInviteesByUserId(userId: string, createdAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionInviteeFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionInvitees> {\n const statement = `query ListInteractionInviteesByUserId($userId: ID!, $createdAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionInviteeFilterInput, $limit: Int, $nextToken: String) {\n listInteractionInviteesByUserId(\n userId: $userId\n createdAt: $createdAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_INVITEE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { userId };\n if (createdAt) {\n gqlAPIServiceArguments.createdAt = createdAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionInvitees>response.data.listInteractionInviteesByUserId;\n }\n\n async ListInteractionAttendeesByInteractionIdAndEntityId(interactionId: string, entityId?: ModelIDKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionAttendeeFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionAttendees> {\n const statement = `query ListInteractionAttendeesByInteractionIdAndEntityId($interactionId: ID!, $entityId: ModelIDKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionAttendeeFilterInput, $limit: Int, $nextToken: String) {\n listInteractionAttendeesByInteractionIdAndEntityId(\n interactionId: $interactionId\n entityId: $entityId\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_ATTENDEE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { interactionId };\n if (entityId) {\n gqlAPIServiceArguments.entityId = entityId;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionAttendees>response.data.listInteractionAttendeesByInteractionIdAndEntityId;\n }\n\n async ListInteractionAttendeesByInteractionIdAndUserId(interactionId: string, userId?: ModelIDKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionAttendeeFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionAttendees> {\n const statement = `query ListInteractionAttendeesByInteractionIdAndUserId($interactionId: ID!, $userId: ModelIDKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionAttendeeFilterInput, $limit: Int, $nextToken: String) {\n listInteractionAttendeesByInteractionIdAndUserId(\n interactionId: $interactionId\n userId: $userId\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_ATTENDEE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { interactionId };\n if (userId) {\n gqlAPIServiceArguments.userId = userId;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionAttendees>response.data.listInteractionAttendeesByInteractionIdAndUserId;\n }\n\n async ListInteractionMessagesByEntityConversationId(entityConversationId: string, createdAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionMessageFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionMessages> {\n const statement = `query ListInteractionMessagesByEntityConversationId($entityConversationId: ID!, $createdAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionMessageFilterInput, $limit: Int, $nextToken: String) {\n listInteractionMessagesByEntityConversationId(\n entityConversationId: $entityConversationId\n createdAt: $createdAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_MESSAGE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { entityConversationId };\n if (createdAt) {\n gqlAPIServiceArguments.createdAt = createdAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionMessages>response.data.listInteractionMessagesByEntityConversationId;\n }\n\n async ListInteractionMessagesByExternalMessageId(externalMessageId: string, createdAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionMessageFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionMessages> {\n const statement = `query ListInteractionMessagesByExternalMessageId($externalMessageId: ID!, $createdAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionMessageFilterInput, $limit: Int, $nextToken: String) {\n listInteractionMessagesByExternalMessageId(\n externalMessageId: $externalMessageId\n createdAt: $createdAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_MESSAGE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { externalMessageId };\n if (createdAt) {\n gqlAPIServiceArguments.createdAt = createdAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionMessages>response.data.listInteractionMessagesByExternalMessageId;\n }\n\n async ListInteractionMessagesByInteractionAttendeeId(interactionAttendeeId: string, createdAt?: ModelIntKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionMessageFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionMessages> {\n const statement = `query ListInteractionMessagesByInteractionAttendeeId($interactionAttendeeId: ID!, $createdAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionMessageFilterInput, $limit: Int, $nextToken: String) {\n listInteractionMessagesByInteractionAttendeeId(\n interactionAttendeeId: $interactionAttendeeId\n createdAt: $createdAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_MESSAGE}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { interactionAttendeeId };\n if (createdAt) {\n gqlAPIServiceArguments.createdAt = createdAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionMessages>response.data.listInteractionMessagesByInteractionAttendeeId;\n }\n\n async ListInteractionMessageAttachmentsByInteractionMessageId(\n interactionMessageId: string,\n createdAt?: ModelIntKeyConditionInput,\n sortDirection?: ModelSortDirection,\n filter?: ModelInteractionMessageAttachmentFilterInput,\n limit?: number,\n nextToken?: string\n ): Promise<ListInteractionMessageAttachments> {\n const statement = `query ListInteractionMessageAttachmentsByInteractionMessageId($interactionMessageId: ID!, $createdAt: ModelIntKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionMessageAttachmentFilterInput, $limit: Int, $nextToken: String) {\n listInteractionMessageAttachmentsByInteractionMessageId(\n interactionMessageId: $interactionMessageId\n createdAt: $createdAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_MESSAGE_ATTACHMENT}\n }\n nextToken\n }\n }`;\n const gqlAPIServiceArguments: any = {\n interactionMessageId,\n };\n if (createdAt) {\n gqlAPIServiceArguments.createdAt = createdAt;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionMessageAttachments>response.data.listInteractionMessageAttachmentsByInteractionMessageId;\n }\n\n OnInteractionInviteeByUserIdListener(userId: string): Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnInteractionInviteeByUserId'>>> {\n const statement = `subscription OnInteractionInviteeByUserId($userId: ID!) {\n OnInteractionInviteeByUserId(userId: $userId) {\n ${FIELDS_INTERACTION_INVITEE}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { userId };\n return this.graphqlService.subscribe<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnInteractionInviteeByUserId'>>>(statement, gqlAPIServiceArguments) as any;\n /* as Observable<SubscriptionResponse<Pick<__SubscriptionContainer, \"OnInteractionInviteeByUserId\">>>; */\n }\n\n OnInteractionMessageByEntityConversationIdListener(entityConversationId: string): Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnInteractionMessageByEntityConversationId'>>> {\n const statement = `subscription OnInteractionMessageByEntityConversationId($entityConversationId: ID!) {\n OnInteractionMessageByEntityConversationId(\n entityConversationId: $entityConversationId\n ) {\n ${FIELDS_INTERACTION_MESSAGE}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { entityConversationId };\n return this.graphqlService.subscribe<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnInteractionMessageByEntityConversationId'>>>(statement, gqlAPIServiceArguments) as any;\n /* as Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnInteractionMessageByEntityConversationId'>>>; */\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { ModelBooleanInput, ModelIDInput, ModelIntInput, ModelSortDirection, ModelStringInput, ModelStringKeyConditionInput } from '../graphql/common.model';\nimport { InteractionChannel, InteractionProvider, InteractionRouteConfiguration, InteractionRouteConfigurationInput, ModelInteractionChannelInput, ModelInteractionProviderInput } from './interaction.service';\nimport { Tenant } from './tenant.service';\n\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\n\nexport type InteractionWidget = {\n id: string;\n tenantId: string;\n tenant?: Tenant | null;\n channel: InteractionChannel;\n provider: InteractionProvider;\n providerAccountId?: string | null;\n name: string;\n description?: string | null;\n configuration?: string | null;\n isRecordingEnabledByDefault: boolean;\n isRecordingEnabledOnDemand: boolean;\n isTranscriptionEnabledByDefault: boolean;\n isTranscriptionEnabledOnDemand: boolean;\n routeConfiguration?: InteractionRouteConfiguration | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type ListInteractionWidgets = {\n items: Array<InteractionWidget | null>;\n nextToken?: string | null;\n};\n\nexport type ModelInteractionWidgetConditionInput = {\n tenantId?: ModelIDInput | null;\n channel?: ModelInteractionChannelInput | null;\n provider?: ModelInteractionProviderInput | null;\n providerAccountId?: ModelStringInput | null;\n name?: ModelStringInput | null;\n description?: ModelStringInput | null;\n configuration?: ModelStringInput | null;\n isRecordingEnabledByDefault?: ModelBooleanInput | null;\n isRecordingEnabledOnDemand?: ModelBooleanInput | null;\n isTranscriptionEnabledByDefault?: ModelBooleanInput | null;\n isTranscriptionEnabledOnDemand?: ModelBooleanInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n updatedByUserId?: ModelIDInput | null;\n updatedByUserSessionId?: ModelIDInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionWidgetConditionInput | null> | null;\n or?: Array<ModelInteractionWidgetConditionInput | null> | null;\n not?: ModelInteractionWidgetConditionInput | null;\n};\n\nexport type ModelInteractionWidgetFilterInput = {\n id?: ModelIDInput | null;\n tenantId?: ModelIDInput | null;\n channel?: ModelInteractionChannelInput | null;\n provider?: ModelInteractionProviderInput | null;\n providerAccountId?: ModelStringInput | null;\n name?: ModelStringInput | null;\n description?: ModelStringInput | null;\n configuration?: ModelStringInput | null;\n isRecordingEnabledByDefault?: ModelBooleanInput | null;\n isRecordingEnabledOnDemand?: ModelBooleanInput | null;\n isTranscriptionEnabledByDefault?: ModelBooleanInput | null;\n isTranscriptionEnabledOnDemand?: ModelBooleanInput | null;\n createdAt?: ModelIntInput | null;\n updatedAt?: ModelIntInput | null;\n updatedByUserId?: ModelIDInput | null;\n updatedByUserSessionId?: ModelIDInput | null;\n deletedAt?: ModelIntInput | null;\n and?: Array<ModelInteractionWidgetFilterInput | null> | null;\n or?: Array<ModelInteractionWidgetFilterInput | null> | null;\n not?: ModelInteractionWidgetFilterInput | null;\n};\n\nexport const FIELDS_INTERACTION_WIDGET = `\n id\n tenantId\n channel\n provider\n providerAccountId\n name\n description\n configuration\n isRecordingEnabledByDefault\n isRecordingEnabledOnDemand\n isTranscriptionEnabledByDefault\n isTranscriptionEnabledOnDemand\n routeConfiguration {\n teamId\n routingLogic\n maxWaitTimeoutSeconds\n }\n createdAt\n updatedAt\n deletedAt\n`;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class InteractionWidgetService {\n constructor(private readonly graphqlService: AppSyncGraphqlService) {}\n\n async GetInteractionWidget(id: string): Promise<InteractionWidget> {\n const statement = `query GetInteractionWidget($id: ID!) {\n getInteractionWidget(id: $id) {\n ${FIELDS_INTERACTION_WIDGET}\n }\n }`;\n\n const gqlAPIServiceArguments: any = { id };\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <InteractionWidget>response.data.getInteractionWidget;\n }\n\n async ListInteractionWidgetsByTenantId(tenantId: string, name?: ModelStringKeyConditionInput, sortDirection?: ModelSortDirection, filter?: ModelInteractionWidgetFilterInput, limit?: number, nextToken?: string): Promise<ListInteractionWidgets> {\n const statement = `query ListInteractionWidgetsByTenantId($tenantId: ID!, $name: ModelStringKeyConditionInput, $sortDirection: ModelSortDirection, $filter: ModelInteractionWidgetFilterInput, $limit: Int, $nextToken: String) {\n listInteractionWidgetsByTenantId(\n tenantId: $tenantId\n name: $name\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n ${FIELDS_INTERACTION_WIDGET}\n }\n nextToken\n }\n }`;\n\n const gqlAPIServiceArguments: any = { tenantId };\n if (name) {\n gqlAPIServiceArguments.name = name;\n }\n if (sortDirection) {\n gqlAPIServiceArguments.sortDirection = sortDirection;\n }\n if (filter) {\n gqlAPIServiceArguments.filter = filter;\n }\n if (limit) {\n gqlAPIServiceArguments.limit = limit;\n }\n if (nextToken) {\n gqlAPIServiceArguments.nextToken = nextToken;\n }\n\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <ListInteractionWidgets>response.data.listInteractionWidgetsByTenantId;\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { ModelSortDirection } from '../graphql/common.model';\nimport { InteractionProvider } from './interaction.service';\nimport { InteractionWidgetService } from './interaction-widget.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WhatsAppAccountService {\n constructor(private interactionWidgetService: InteractionWidgetService) {}\n\n async getWhatsAppAccountByTenantId(tenantId: string): Promise<any> {\n let myWhatsAppAccounts: any[] = [];\n let nextToken_listWhatsAppAccounts!: string | undefined;\n\n do {\n const res_listWhatsAppAccounts = await this.interactionWidgetService.ListInteractionWidgetsByTenantId(\n tenantId,\n undefined,\n ModelSortDirection.ASC,\n {\n and: [{ provider: { eq: InteractionProvider.WHATSAPP } }, { deletedAt: { attributeExists: false } }],\n },\n undefined,\n nextToken_listWhatsAppAccounts\n );\n nextToken_listWhatsAppAccounts = res_listWhatsAppAccounts.nextToken || undefined;\n myWhatsAppAccounts = [...myWhatsAppAccounts, ...res_listWhatsAppAccounts.items];\n } while (nextToken_listWhatsAppAccounts);\n\n /* if (myWhatsAppAccounts.length === 0) {\n throw new Error('No WhatsApp account found');\n } else */ if (myWhatsAppAccounts.length > 1) {\n throw new Error('Multiple WhatsApp accounts found');\n }\n\n return myWhatsAppAccounts?.[0];\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\nimport { CleanDeep } from '@snugdesk/core';\nimport { WhatsAppConfig } from '../../app.config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WhatsAppHelperService {\n constructor(private httpClient: HttpClient) {}\n\n private getHeaderMediaType(template: any): 'image' | 'video' | 'document' | null {\n const header = template.components?.find((c: any) => c.type === 'HEADER');\n switch (header?.format) {\n case 'IMAGE':\n return 'image';\n case 'VIDEO':\n return 'video';\n case 'DOCUMENT':\n return 'document';\n default:\n return null;\n }\n }\n\n async listPhoneNumbers(businessAccountId: string, accessToken: string): Promise<any[]> {\n const phoneNumbers: any[] = [];\n\n const fields =\n 'id,account_mode,certificate,code_verification_status,conversational_automation,' +\n 'display_phone_number,eligibility_for_api_business_global_search,health_status,is_official_business_account,' +\n 'is_on_biz_app,is_pin_enabled,is_preverified_number,last_onboarded_time,messaging_limit_tier,' +\n 'name_status,new_certificate,new_name_status,platform_type,quality_rating,' +\n 'quality_score{date,reasons,score},search_visibility,status,throughput,verified_name';\n\n let nextUrl: string | null = `${WhatsAppConfig.endpoint}/${businessAccountId}/phone_numbers?fields=${fields}`;\n\n while (nextUrl) {\n const response: any = await lastValueFrom(\n this.httpClient.get(nextUrl, {\n headers: new HttpHeaders({\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n }),\n })\n );\n\n const data = response?.data;\n if (Array.isArray(data)) {\n phoneNumbers.push(...data);\n }\n\n // Pagination\n nextUrl = response?.paging?.next ?? null;\n }\n\n return phoneNumbers;\n }\n\n async listMessageTemplates(businessAccountId: string, accessToken: string) {\n const baseUrl = `${WhatsAppConfig.endpoint}/${businessAccountId}/message_templates`;\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n });\n\n const templates: any[] = [];\n\n let nextUrl: string | null = baseUrl;\n while (nextUrl) {\n const response: any = await lastValueFrom(this.httpClient.get(nextUrl, { headers }));\n\n const pageData = response?.data ?? [];\n templates.push(...pageData);\n\n nextUrl = response?.paging?.next || null;\n }\n\n return templates;\n }\n\n async sendWhatsAppTemplateMessage(accessToken: string, phoneNumberId: string, receiverNumber: string, template: any, values: any[] = [], referenceMessageId?: string) {\n const components: any[] = [];\n\n for (const value of values) {\n switch (value.type) {\n case 'body':\n if (value.parameters?.length) {\n components.push({\n type: 'body',\n parameters: value.parameters,\n });\n }\n break;\n\n case 'header_media':\n if (value.mediaUrl) {\n const mediaType = this.getHeaderMediaType(template);\n if (mediaType) {\n components.push({\n type: 'header',\n parameters: [\n {\n type: mediaType,\n [mediaType]: { link: value.mediaUrl },\n },\n ],\n });\n }\n }\n break;\n\n case 'coupon_code':\n if (value.couponCode) {\n components.push({\n type: 'button',\n sub_type: 'COPY_CODE',\n index: 0,\n parameters: [\n {\n type: 'text',\n text: value.couponCode,\n },\n ],\n });\n }\n break;\n\n case 'location':\n if (value.location) {\n components.push({\n type: 'header',\n parameters: [\n {\n type: 'location',\n location: value.location,\n },\n ],\n });\n }\n break;\n }\n }\n\n const params_sendWATemplatedMessage: any = {\n messaging_product: 'whatsapp',\n to: receiverNumber,\n type: 'template',\n template: {\n name: template.name,\n language: { code: template.language, policy: 'deterministic' },\n components: components ?? [],\n },\n };\n\n if (referenceMessageId?.length > 0) {\n params_sendWATemplatedMessage.context = { message_id: referenceMessageId };\n }\n // console.debug('params_sendWATemplatedMessage: ', params_sendWATemplatedMessage);\n\n const res_sendWATemplatedMessage = await lastValueFrom(\n this.httpClient.post(`${WhatsAppConfig.endpoint}/${phoneNumberId}/messages`, params_sendWATemplatedMessage, {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n }),\n })\n );\n // console.debug('res_sendWATemplatedMessage: ', res_sendWATemplatedMessage);\n return res_sendWATemplatedMessage;\n }\n\n async sendWhatsAppMessage(accessToken: string, phoneNumberId: string, receiverNumber: string, body: any, referenceMessageId?: string) {\n const params_sendWAMessage: any = {\n messaging_product: 'whatsapp',\n to: receiverNumber,\n };\n\n // Add reference message (reply feature)\n if (referenceMessageId) {\n params_sendWAMessage.context = { message_id: referenceMessageId };\n }\n\n if (body.media) {\n const media = body.media;\n const type = media.type?.toLowerCase();\n\n if (type?.startsWith('image')) {\n params_sendWAMessage.type = 'image';\n params_sendWAMessage.image = {\n link: media.mediaUrl,\n caption: media.caption,\n };\n } else if (type?.startsWith('video')) {\n params_sendWAMessage.type = 'video';\n params_sendWAMessage.video = {\n link: media.mediaUrl,\n caption: media.caption,\n };\n } else if (type?.startsWith('audio')) {\n params_sendWAMessage.type = 'audio';\n params_sendWAMessage.audio = {\n link: media.mediaUrl,\n };\n } else if (type?.startsWith('application') || type?.startsWith('document') || type?.startsWith('text')) {\n params_sendWAMessage.type = 'document';\n params_sendWAMessage.document = {\n link: media.mediaUrl,\n filename: media.fileName,\n caption: media.caption,\n };\n } else {\n // Default any unknown file type to document to avoid falling back to plain text\n params_sendWAMessage.type = 'document';\n params_sendWAMessage.document = {\n link: media.mediaUrl,\n filename: media.fileName,\n caption: media.caption,\n };\n }\n } else if (body.latitude !== undefined && body.longitude !== undefined) {\n params_sendWAMessage.type = 'location';\n params_sendWAMessage.location = {\n latitude: body.latitude,\n longitude: body.longitude,\n name: body.name,\n address: body.address,\n };\n } else if (body.text?.trim()) {\n params_sendWAMessage.type = 'text';\n params_sendWAMessage.text = {\n preview_url: true,\n body: body.text,\n };\n }\n // console.debug('params_sendWAMessage: ', params_sendWAMessage);\n\n const res_sendWAMessage = await lastValueFrom(\n this.httpClient.post(`${WhatsAppConfig.endpoint}/${phoneNumberId}/messages`, CleanDeep.clean(params_sendWAMessage), {\n headers: new HttpHeaders({\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n }),\n })\n );\n // console.debug('res_sendWAMessage: ', res_sendWAMessage);\n\n return res_sendWAMessage;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Pipe({\n name: 'WhatsAppTextFormatter',\n standalone: false,\n})\nexport class WhatsAppTextFormatterPipe implements PipeTransform {\n constructor(private sanitizer: DomSanitizer) {}\n\n transform(value: string): SafeHtml {\n if (!value) {\n return value;\n }\n\n // Helpers to escape content for HTML and attributes\n const escapeHtml = (str: string) =>\n str.replace(/[&<>\"']/g, (s) => {\n switch (s) {\n case '&':\n return '&';\n case '<':\n return '<';\n case '>':\n return '>';\n case '\"':\n return '"';\n case \"'\":\n return ''';\n default:\n return s;\n }\n });\n\n const escapeAttr = (str: string) =>\n str.replace(/[\"&<>]/g, (s) => {\n switch (s) {\n case '&':\n return '&';\n case '<':\n return '<';\n case '>':\n return '>';\n case '\"':\n return '"';\n default:\n return s;\n }\n });\n\n // Regexes\n const codeBlockSplitter = /(```[\\s\\S]*?```)/g; // preserves triple-backtick blocks\n const urlRegex = /(https?:\\/\\/[^\\s`<]+)|(www\\.[^\\s`<]+)/gi;\n\n // Process a non-code segment: split by URLs and apply formatting only to non-URL pieces\n function processNonCodeSegment(segment: string): string {\n let out = '';\n let lastIndex = 0;\n urlRegex.lastIndex = 0;\n let m: RegExpExecArray | null;\n\n while ((m = urlRegex.exec(segment)) !== null) {\n const match = m[0];\n const start = m.index;\n const end = urlRegex.lastIndex;\n\n // 1) Handle text before URL: escape, then apply formatting\n if (start > lastIndex) {\n const beforeText = segment.slice(lastIndex, start);\n out += applyFormattingToEscapedText(beforeText);\n }\n\n // 2) Handle URL: trim trailing punctuation (common punctuation that likely isn't part of URL)\n const trimmed = match.replace(/([,!?;:)\\]\\}]+)$/g, '');\n const trailing = match.slice(trimmed.length);\n\n const href = /^www\\./i.test(trimmed) ? `http://${trimmed}` : trimmed;\n\n const safeHref = escapeAttr(href);\n const safeDisplay = escapeHtml(trimmed);\n\n out += `<a href=\"${safeHref}\" target=\"_blank\" rel=\"noopener noreferrer\">${safeDisplay}</a>${escapeHtml(trailing)}`;\n\n lastIndex = end;\n }\n\n // Remaining text after last URL\n if (lastIndex < segment.length) {\n const tail = segment.slice(lastIndex);\n out += applyFormattingToEscapedText(tail);\n }\n\n return out;\n }\n\n // Escape text first, then run formatting replacements on escaped text so tags are safe to insert\n function applyFormattingToEscapedText(raw: string): string {\n const escaped = escapeHtml(raw);\n\n // Apply non-greedy replacements; don't affect inside already-existing HTML tags\n // Bold: *text*\n let formatted = escaped.replace(/\\*(.*?)\\*/g, '<b>$1</b>');\n\n // Italic: _text_\n formatted = formatted.replace(/_(.*?)_/g, '<i>$1</i>');\n\n // Strikethrough: ~text~\n formatted = formatted.replace(/~(.*?)~/g, '<s>$1</s>');\n\n return formatted;\n }\n\n // 1) Split by code blocks so that code blocks are preserved verbatim (escaped)\n const topParts = value.split(codeBlockSplitter);\n\n // 2) Process each top-level part: code blocks vs others\n const processed = topParts\n .map((part) => {\n if (/^```[\\s\\S]*```$/.test(part)) {\n // strip backticks, escape inner, then wrap in <code>\n const inner = part.replace(/^```/, '').replace(/```$/, '');\n return `<code>${escapeHtml(inner)}</code>`;\n } else {\n // Non-code: process for URLs and formatting (formatting will NOT be applied to the URL parts)\n return processNonCodeSegment(part);\n }\n })\n .join('');\n\n // 3) Final: return safe HTML\n return this.sanitizer.bypassSecurityTrustHtml(processed);\n }\n}\n","import { ChangeDetectorRef, Component, EventEmitter, Input, NgZone, OnChanges, OnDestroy, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { SnugdeskAuthenticationService, CleanDeep } from '@snugdesk/core';\n\nimport { ModelSortDirection } from '../../graphql/common.model';\nimport { Entity, EntityService } from '../../services/entity.service';\nimport { EntityConversation, EntityConversationService } from '../../services/entity-conversation.service';\nimport { InteractionChannel, InteractionProvider } from '../../services/interaction.service';\n\nimport moment from 'moment-timezone';\nimport { v4 as uuidv4 } from 'uuid';\n\n@Component({\n selector: 'lib-whatsapp-conversations',\n templateUrl: './whatsapp-conversations.component.html',\n styleUrls: ['./whatsapp-conversations.component.css'],\n standalone: false,\n})\nexport class WhatsAppConversationsComponent implements OnInit, OnChanges, OnDestroy {\n @Input('selectedConversation')\n selectedConversation!: any;\n\n @Input('containerDimensions')\n containerDimensions!: { width: number; height: number };\n\n @Output('selectConversation')\n selectConversationEv: EventEmitter<EntityConversation> = new EventEmitter<EntityConversation>();\n\n conversations: EntityConversation[] = [];\n nextToken_conversations!: string | undefined;\n endOfList: boolean = false;\n entityConversationsSubscription!: any;\n\n showInitLoader: boolean = true;\n showRefreshLoader: boolean = false;\n showEntityConversationScrollLoader: boolean = false;\n showArchivedConversations: boolean = false;\n\n searchQuery: string = '';\n filteredConversations: EntityConversation[] = [];\n\n showNewConversation: boolean = false;\n\n reConfiguringEntityId!: string | undefined;\n reConfiguringConversationId!: string | undefined;\n\n /* showMarkConversationAsArchivedLoader: boolean = false;\n showMarkConversationAsUnarchivedLoader: boolean = false;\n showMarkConversationAsBlockedLoader: boolean = false;\n showMarkConversationAsUnblockedLoader: boolean = false;\n showMarkEntityAsBlockedLoader: boolean = false;\n showMarkEntityAsUnblockedLoader: boolean = false; */\n\n constructor(private cdr: ChangeDetectorRef, private zone: NgZone, private authenticationService: SnugdeskAuthenticationService, private entityService: EntityService, private entityConversationService: EntityConversationService, private snackBar: MatSnackBar) {}\n\n async ngOnInit(): Promise<void> {\n this.showInitLoader = true;\n try {\n // load the first page\n this.conversations = await this.listRecentEntityConversationsByTenantId();\n\n // load all other pages\n while (!this.endOfList) {\n await this.onScrollEntityConversationList();\n }\n\n // console.debug('conversations: ', this.conversations);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch conversations`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.subscribeToEntityConversations();\n this.showInitLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['containerDimensions']) {\n this.cdr.detectChanges();\n }\n\n if (changes['selectedConversation']) {\n const selectedConversation = changes['selectedConversation'].currentValue;\n const selectedConversationMessage = selectedConversation?.messages?.items?.[0];\n\n if (!selectedConversation || !selectedConversationMessage) return;\n\n const existingIndex = this.conversations.findIndex((conv) => conv.id === selectedConversation.id);\n if (existingIndex === -1) {\n this.conversations.unshift(selectedConversation);\n return;\n }\n\n const existingConversationMessage = this.conversations[existingIndex]?.messages?.items?.[0];\n if (!existingConversationMessage || existingConversationMessage.id !== selectedConversationMessage.id) {\n this.conversations.splice(existingIndex, 1);\n this.conversations.unshift(this.selectedConversation);\n return;\n }\n }\n }\n\n ngOnDestroy(): void {\n this.entityConversationsSubscription?.unsubscribe();\n }\n\n async listRecentEntityConversationsByTenantId(): Promise<EntityConversation[]> {\n if (this.endOfList) return [];\n\n const res_listEntityConversationsByTenantId = await this.entityConversationService.ListEntityConversationsByTenantIdAndLastMessageAt(\n this.authenticationService.getTenantId(),\n undefined,\n ModelSortDirection.DESC,\n {\n and: [\n {\n deletedAt: { attributeExists: false },\n },\n {\n archivedAt: { attributeExists: false },\n },\n /* {\n interactionChannel: { eq: InteractionChannel.SOCIAL_CHAT },\n }, */\n {\n interactionProvider: { eq: InteractionProvider.WHATSAPP },\n },\n ],\n },\n undefined,\n this.nextToken_conversations\n );\n // console.debug('res_listEntityConversationsByTenantId: ', res_listEntityConversationsByTenantId);\n\n this.endOfList = !res_listEntityConversationsByTenantId.nextToken;\n this.nextToken_conversations = res_listEntityConversationsByTenantId.nextToken || undefined;\n\n return res_listEntityConversationsByTenantId.items || [];\n }\n\n async listArchivedEntityConversationsByTenantId(): Promise<EntityConversation[]> {\n if (this.endOfList) return [];\n\n const res_listEntityConversationsByTenantId = await this.entityConversationService.ListEntityConversationsByTenantIdAndArchivedAt(\n this.authenticationService.getTenantId(),\n undefined,\n ModelSortDirection.DESC,\n {\n and: [\n {\n deletedAt: { attributeExists: false },\n },\n /* {\n interactionChannel: { eq: InteractionChannel.SOCIAL_CHAT },\n }, */\n {\n interactionProvider: { eq: InteractionProvider.WHATSAPP },\n },\n ],\n },\n undefined,\n this.nextToken_conversations\n );\n\n // console.debug('res_listEntityConversationsByTenantId: ', res_listEntityConversationsByTenantId);\n\n this.endOfList = !res_listEntityConversationsByTenantId.nextToken;\n this.nextToken_conversations = res_listEntityConversationsByTenantId.nextToken || undefined;\n\n return res_listEntityConversationsByTenantId.items || [];\n }\n\n filterConversations(): void {\n if (!this.searchQuery || this.searchQuery.trim().length === 0) {\n this.filteredConversations = this.conversations;\n return;\n }\n\n // prettier-ignore\n const cleanedSearchQuery = this.searchQuery.replace(/[\\s+\\(\\)\\[\\]\\{\\}]/g, '');\n const isSearchingByPhoneNumber = /^\\d+$/.test(cleanedSearchQuery);\n this.filteredConversations = this.conversations?.filter((conv: any) => {\n if (isSearchingByPhoneNumber && conv.entityAddress) {\n const countryCode = conv.entityAddress.split(' ')[0] || '';\n const cleanedEntityAddress = conv.entityAddress.substring(countryCode.length).replace(/[\\s+\\(\\)\\[\\]\\{\\}]/g, '');\n return cleanedEntityAddress.includes(cleanedSearchQuery);\n } else {\n return conv.entity?.name?.toLowerCase().includes(this.searchQuery.trim().toLowerCase());\n }\n });\n\n if (!this.filteredConversations) {\n this.filteredConversations = [];\n }\n }\n\n async refreshConversationList(): Promise<void> {\n this.showRefreshLoader = true;\n try {\n this.conversations = [];\n this.filteredConversations = [];\n\n // List conversations\n this.endOfList = false;\n this.nextToken_conversations = undefined;\n if (this.showArchivedConversations) {\n this.conversations = await this.listArchivedEntityConversationsByTenantId();\n } else {\n this.conversations = await this.listRecentEntityConversationsByTenantId();\n }\n\n // load all other pages\n while (!this.endOfList) {\n await this.onScrollEntityConversationList();\n }\n // console.debug('Refreshed conversations: ', this.conversations);\n\n /*\n if (this.conversations?.length > 0 && !this.selectedConversation) {\n await this.handleSelectConversation(this.conversations[0]);\n }\n */\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch conversations`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.filterConversations();\n this.showRefreshLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async onScrollEntityConversationList(): Promise<void> {\n if (this.endOfList) return;\n\n this.showEntityConversationScrollLoader = true;\n try {\n let res_listEntitiesByTenantId: EntityConversation[];\n if (this.showArchivedConversations) {\n res_listEntitiesByTenantId = await this.listArchivedEntityConversationsByTenantId();\n } else {\n res_listEntitiesByTenantId = await this.listRecentEntityConversationsByTenantId();\n }\n // console.debug('res_listEntitiesByTenantId: ', res_listEntitiesByTenantId);\n\n this.conversations = this.conversations.concat(...res_listEntitiesByTenantId);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! We encountered an error. Please try again.`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.filterConversations();\n this.showEntityConversationScrollLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async toggleNewConversation(): Promise<void> {\n this.showNewConversation = !this.showNewConversation;\n this.cdr.detectChanges();\n }\n\n async startConversation(entity: Entity): Promise<void> {\n this.showNewConversation = false;\n\n // search loaded conversation list\n const index = this.conversations?.findIndex((convo: any) => convo.entityId === entity.id);\n if (index !== undefined && index > -1) {\n return await this.handleSelectConversation(this.conversations[index]);\n }\n\n // search conversation in database (both archived or unarchived)\n try {\n const res_searchConversation = await this.entityConversationService.ListEntityConversationsByTenantIdAndEntityAddress(\n this.authenticationService.getTenantId(),\n {\n eq: entity.phoneNumberE164,\n },\n undefined,\n {\n and: [\n {\n deletedAt: { attributeExists: false },\n },\n /* {\n interactionChannel: { eq: InteractionChannel.SOCIAL_CHAT },\n }, */\n {\n interactionProvider: { eq: InteractionProvider.WHATSAPP },\n },\n ],\n }\n );\n // console.debug('res_searchConversation: ', res_searchConversation);\n\n const conversation = res_searchConversation?.items?.[0];\n if (conversation) {\n return await this.handleSelectConversation(conversation);\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not start a new conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.cdr.detectChanges();\n }\n\n const now = moment.utc().unix();\n const entityConversationId: string = uuidv4();\n const params_createEntityConversation = {\n id: entityConversationId,\n tenantId: this.authenticationService.getTenantId(),\n entityId: entity.id,\n entityAddress: entity.phoneNumberE164,\n interactionChannel: InteractionChannel.SOCIAL_CHAT,\n interactionProvider: InteractionProvider.WHATSAPP,\n lastActivityAt: now,\n isCampaignEngaged: false,\n createdAt: now,\n updatedAt: now,\n };\n\n const conversation = {\n ...params_createEntityConversation,\n entity,\n };\n\n this.handleSelectConversation(conversation);\n this.cdr.detectChanges();\n\n // create a new entity conversation\n try {\n const res_createEntityConversation = await this.entityConversationService.CreateEntityConversation(params_createEntityConversation);\n // console.debug('res_createEntityConversation: ', res_createEntityConversation);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not start a new conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n async handleSelectConversation(conversation: EntityConversation): Promise<void> {\n this.showNewConversation = false;\n\n // update current conversation\n const now = moment.utc().unix();\n conversation.lastActivityAt = now;\n\n // update previous conversation\n const previouslySelectedConversation = this.selectedConversation;\n if (previouslySelectedConversation) {\n const index = this.conversations?.findIndex((convo: any) => convo.id === previouslySelectedConversation.id);\n if (index !== undefined && index > -1) {\n this.conversations[index].lastActivityAt = now;\n }\n }\n\n // event to update the conversations in database\n this.selectConversationEv.emit(conversation);\n this.cdr.detectChanges();\n }\n\n private subscribeToEntityConversations(): void {\n this.entityConversationsSubscription?.unsubscribe();\n this.entityConversationsSubscription = this.entityConversationService.OnEntityConversationByTenantIdListener(this.authenticationService.getTenantId()).subscribe((conversation) => {\n this.zone.run(async () => {\n try {\n let entityConversation = conversation?.value?.data?.OnEntityConversationByTenantId;\n if (!entityConversation) return;\n if (entityConversation.interactionProvider !== InteractionProvider.WHATSAPP) return;\n if (!entityConversation.lastMessageAt) return;\n\n const shouldRemoveConversation = !!entityConversation.deletedAt || (!this.showArchivedConversations && !!entityConversation.archivedAt) || (this.showArchivedConversations && !entityConversation.archivedAt);\n\n // get expanded object as it may not be received in the event\n if (!shouldRemoveConversation) {\n await new Promise((resolve) => setTimeout(resolve, 1000)); // ⏳ wait for 1 second\n entityConversation = await this.entityConversationService.GetEntityConversation(entityConversation.id);\n }\n\n const index = this.conversations?.findIndex((convo: any) => convo.id === entityConversation.id);\n if (index !== undefined && index > -1) {\n if (shouldRemoveConversation) {\n // Remove the conversation\n this.conversations.splice(index, 1);\n } else if (!!entityConversation?.messages?.items?.length && entityConversation?.messages?.items?.[0]?.id !== this.conversations[index].messages?.items?.[0]?.id) {\n // Move the updated one to the top of the list\n const temp = this.conversations.splice(index, 1);\n this.conversations.unshift({\n ...temp,\n ...CleanDeep.clean(entityConversation),\n });\n } else {\n // Update the existing conversation with the new data\n if (!entityConversation.blockedAt) delete this.conversations[index].blockedAt;\n if (!entityConversation.deletedAt) delete this.conversations[index].deletedAt;\n\n this.conversations[index] = {\n ...this.conversations[index],\n ...CleanDeep.clean(entityConversation),\n };\n }\n } else if (!shouldRemoveConversation && this.showArchivedConversations === !!entityConversation.archivedAt) {\n // Add the conversation to the list if it's not blocked or deleted and not found in the current list\n if (this.conversations) {\n this.conversations.unshift(entityConversation);\n } else {\n this.conversations = [entityConversation];\n }\n }\n\n if (this.selectedConversation?.id === entityConversation.id) {\n if (!entityConversation.blockedAt) delete this.selectedConversation.blockedAt;\n if (!entityConversation.deletedAt) delete this.selectedConversation.deletedAt;\n const conversation = {\n ...this.selectedConversation,\n ...CleanDeep.clean(entityConversation),\n };\n this.selectConversationEv.emit(conversation);\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.filterConversations();\n this.cdr.detectChanges();\n }\n });\n });\n }\n\n async onToggleArchivedConversations(): Promise<void> {\n if (this.showInitLoader || this.showRefreshLoader || this.showEntityConversationScrollLoader) return;\n\n this.showArchivedConversations = !this.showArchivedConversations;\n await this.refreshConversationList();\n }\n\n async markConversationAsArchived(conversation: any): Promise<void> {\n // this.showMarkConversationAsArchivedLoader = true;\n this.reConfiguringConversationId = conversation.id;\n\n const prvArchivedAt: number = conversation.archivedAt;\n try {\n const now = moment.utc().unix();\n conversation.archivedAt = now;\n const res_updateEntityConversationAsArchived = await this.entityConversationService.UpdateEntityConversation({\n id: conversation.id,\n archivedAt: now,\n updatedAt: conversation.updatedAt,\n });\n // console.debug('res_updateEntityConversationAsArchived: ', res_updateEntityConversationAsArchived);\n\n if (!this.showArchivedConversations) {\n this.conversations = this.conversations?.filter((convo: any) => convo.id !== conversation.id);\n\n if (this.selectedConversation?.id === conversation.id) {\n this.selectConversationEv.emit(conversation);\n }\n }\n this.snackBar.open(`Success! The conversation has been successfully archived`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n prvArchivedAt ? (conversation.archivedAt = prvArchivedAt) : delete conversation.archivedAt;\n this.snackBar.open(`Oops! Could not mark conversation as archived`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkConversationAsArchivedLoader = false;\n this.reConfiguringConversationId = undefined;\n this.filterConversations();\n this.cdr.detectChanges();\n }\n }\n\n async markConversationAsUnarchived(conversation: any): Promise<void> {\n // this.showMarkConversationAsUnarchivedLoader = true;\n this.reConfiguringConversationId = conversation.id;\n\n const prvArchivedAt: number = conversation.archivedAt;\n try {\n delete conversation.archivedAt;\n const res_updateEntityConversationAsUnarchived = await this.entityConversationService.UpdateEntityConversation({\n id: conversation.id,\n archivedAt: null,\n updatedAt: conversation.updatedAt,\n });\n // console.debug('res_updateEntityConversationAsUnarchived: ', res_updateEntityConversationAsUnarchived);\n\n if (this.showArchivedConversations) {\n this.conversations = this.conversations?.filter((convo: any) => convo.id !== conversation.id);\n\n if (this.selectedConversation?.id === conversation.id) {\n this.selectConversationEv.emit(conversation);\n }\n }\n\n this.snackBar.open(`Success! The conversation has been restored and is now active`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n prvArchivedAt ? (conversation.archivedAt = prvArchivedAt) : delete conversation.archivedAt;\n this.snackBar.open(`Oops! Could not mark conversation as unarchived`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkConversationAsUnarchivedLoader = false;\n this.reConfiguringConversationId = undefined;\n this.filterConversations();\n this.cdr.detectChanges();\n }\n }\n\n async markConversationAsBlocked(conversation: any): Promise<void> {\n // Mark conversation as blocked means blocking the phone number / source of the conversation\n // this.showMarkConversationAsBlockedLoader = true;\n this.reConfiguringConversationId = conversation.id;\n\n const prvBlockedAt: number = conversation.blockedAt;\n try {\n const now = moment.utc().unix();\n\n conversation.blockedAt = now;\n const res_updateEntityConversationAsBlocked = await this.entityConversationService.UpdateEntityConversation({\n id: conversation.id,\n blockedAt: now,\n updatedAt: conversation.updatedAt,\n });\n // console.debug('res_updateEntityConversationAsBlocked: ', res_updateEntityConversationAsBlocked);\n\n if (this.selectedConversation?.id === conversation.id) {\n this.selectConversationEv.emit(conversation);\n }\n\n this.snackBar.open(`Success! The conversation has been blocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n prvBlockedAt ? (conversation.blockedAt = prvBlockedAt) : delete conversation.blockedAt;\n this.snackBar.open(`Oops! Could not block the conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkConversationAsBlockedLoader = false;\n this.reConfiguringConversationId = undefined;\n this.cdr.detectChanges();\n }\n }\n\n async markConversationAsUnblocked(conversation: any): Promise<void> {\n // Mark conversation as unblocked means unblocking the phone number / source of the conversation\n // this.showMarkConversationAsUnblockedLoader = true;\n this.reConfiguringConversationId = conversation.id;\n\n const prvBlockedAt: number = conversation.blockedAt;\n try {\n delete conversation.blockedAt;\n const res_updateEntityConversationAsUnblocked = await this.entityConversationService.UpdateEntityConversation({\n id: conversation.id,\n blockedAt: null,\n updatedAt: conversation.updatedAt,\n });\n // console.debug('res_updateEntityConversationAsUnblocked: ', res_updateEntityConversationAsUnblocked);\n\n if (this.selectedConversation?.id === conversation.id) {\n this.selectConversationEv.emit(conversation);\n }\n this.snackBar.open(`Success! The conversation has been successfully unblocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n prvBlockedAt ? (conversation.blockedAt = prvBlockedAt) : delete conversation.blockedAt;\n this.snackBar.open(`Oops! Could not unblock the conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkConversationAsUnblockedLoader = false;\n this.reConfiguringConversationId = undefined;\n this.cdr.detectChanges();\n }\n }\n\n async markEntityAndConversationAsBlocked(conversation: any): Promise<void> {\n // this.showMarkEntityAsBlockedLoader = true;\n this.reConfiguringEntityId = conversation.entityId;\n this.reConfiguringConversationId = conversation.id;\n\n try {\n const now = moment.utc().unix();\n const res_updateEntityAsBlocked = await this.entityService.UpdateEntity({\n id: conversation.entityId,\n blockedAt: now,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n updatedAt: conversation.entity?.updatedAt || now,\n });\n // console.debug('res_updateEntityAsBlocked: ', res_updateEntityAsBlocked);\n\n await this.markConversationAsBlocked(conversation);\n this.snackBar.open(`Success! The contact has been blocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not mark the contact as blocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkEntityAsBlockedLoader = false;\n this.reConfiguringEntityId = undefined;\n this.reConfiguringConversationId = undefined;\n this.cdr.detectChanges();\n }\n }\n\n async markEntityAndConversationAsUnblocked(conversation: any): Promise<void> {\n // this.showMarkEntityAsUnblockedLoader = true;\n this.reConfiguringEntityId = conversation.entityId;\n this.reConfiguringConversationId = conversation.id;\n\n try {\n const now = moment.utc().unix();\n const res_updateEntityAsUnblocked = await this.entityService.UpdateEntity({\n id: conversation.entityId,\n blockedAt: null,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n updatedAt: conversation.entity?.updatedAt || now,\n });\n // console.debug('res_updateEntityAsUnblocked: ', res_updateEntityAsUnblocked);\n\n await this.markConversationAsUnblocked(conversation);\n\n this.snackBar.open(`Success! The contact has been successfully unblocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not mark the contact as unblocked`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n // this.showMarkEntityAsUnblockedLoader = false;\n this.reConfiguringEntityId = undefined;\n this.reConfiguringConversationId = undefined;\n this.cdr.detectChanges();\n }\n }\n\n isNumeric(value: string): boolean {\n return /^\\d+$/.test(value?.trim());\n }\n\n getScrollLoaderCount(): number {\n return Math.ceil((this.containerDimensions.height - 175) / 75);\n }\n\n handleEntityImageError(entity: any): void {\n if (entity && entity.image_url) {\n entity.image_url = null;\n } else {\n entity.image = null;\n }\n }\n\n getAttachmentType(attachment: any): string {\n if (attachment.type.startsWith('image')) {\n return 'image';\n } else if (attachment.type.startsWith('video')) {\n return 'video';\n } else if (attachment.type.startsWith('audio')) {\n return 'audio';\n } else {\n return 'document';\n }\n }\n\n parseJSON(raw: any): any | null {\n if (!raw) return null;\n if (typeof raw === 'object') return raw;\n try {\n return JSON.parse(String(raw));\n } catch {\n return null;\n }\n }\n}\n","<div class=\"sd_waba_container_conversations_header\">\n <div class=\"sd_waba_container_conversations_header_left\">\n <!-- <svg viewBox=\"0 0 212 212\" height=\"40\" width=\"40\" preserveAspectRatio=\"xMidYMid meet\" version=\"1.1\" x=\"0px\" y=\"0px\" enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\" class=\"background\" d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg> -->\n </div>\n <div class=\"sd_waba_container_conversations_header_right\">\n <div class=\"sd_waba_container_button_new_conversation\">\n <button type=\"button\" class=\"sd_waba_button_new_conversation\" title=\"New Conversation\"\n [ngClass]=\"{'sd_waba_button_new_conversation_selected': showNewConversation}\" (click)=\"toggleNewConversation()\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" preserveAspectRatio=\"xMidYMid meet\" fill=\"none\">\n <path\n d=\"M9.53277 12.9911H11.5086V14.9671C11.5086 15.3999 11.7634 15.8175 12.1762 15.9488C12.8608 16.1661 13.4909 15.6613 13.4909 15.009V12.9911H15.4672C15.9005 12.9911 16.3181 12.7358 16.449 12.3226C16.6659 11.6381 16.1606 11.0089 15.5086 11.0089H13.4909V9.03332C13.4909 8.60007 13.2361 8.18252 12.8233 8.05119C12.1391 7.83391 11.5086 8.33872 11.5086 8.991V11.0089H9.49088C8.83941 11.0089 8.33411 11.6381 8.55097 12.3226C8.68144 12.7358 9.09947 12.9911 9.53277 12.9911Z\"\n fill=\"currentColor\"></path>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M0.944298 5.52617L2.99998 8.84848V17.3333C2.99998 18.8061 4.19389 20 5.66665 20H19.3333C20.8061 20 22 18.8061 22 17.3333V6.66667C22 5.19391 20.8061 4 19.3333 4H1.79468C1.01126 4 0.532088 4.85997 0.944298 5.52617ZM4.99998 8.27977V17.3333C4.99998 17.7015 5.29845 18 5.66665 18H19.3333C19.7015 18 20 17.7015 20 17.3333V6.66667C20 6.29848 19.7015 6 19.3333 6H3.58937L4.99998 8.27977Z\"\n fill=\"currentColor\"></path>\n </svg>\n </button>\n </div>\n <div class=\"sd_waba_container_button_refresh\">\n <button type=\"button\" class=\"sd_waba_button_refresh\" title=\"Refresh\" (click)=\"refreshConversationList()\"\n [disabled]=\"showInitLoader || showRefreshLoader\">\n <svg viewBox=\"0 0 512 512\" width=\"16px\"><path fill=\"currentColor\" d=\"M386.3 160L336 160c-17.7 0-32 14.3-32 32s14.3 32 32 32l128 0c17.7 0 32-14.3 32-32l0-128c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 51.2L414.4 97.6c-87.5-87.5-229.3-87.5-316.8 0s-87.5 229.3 0 316.8s229.3 87.5 316.8 0c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0c-62.5 62.5-163.8 62.5-226.3 0s-62.5-163.8 0-226.3s163.8-62.5 226.3 0L386.3 160z\"></path></svg>\n </button>\n </div>\n </div>\n</div>\n\n<div class=\"sd_waba_container_conversations_search\">\n <span class=\"sd_waba_icon_search\"><svg viewBox=\"0 0 20 20\" height=\"20\" width=\"20\" fill=\"none\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4.36653 4.3664C5.36341 3.36953 6.57714 2.87 8.00012 2.87C9.42309 2.87 10.6368 3.36953 11.6337 4.3664C12.6306 5.36329 13.1301 6.57724 13.1301 8.00062C13.1301 8.57523 13.0412 9.11883 12.8624 9.63057C12.6972 10.1038 12.4733 10.5419 12.1909 10.9444L16.5712 15.3247C16.7454 15.4989 16.8385 15.7046 16.8385 15.9375C16.8385 16.1704 16.7454 16.3761 16.5712 16.5503C16.396 16.7254 16.1866 16.8175 15.948 16.8175C15.7095 16.8175 15.5001 16.7254 15.3249 16.5503L10.9448 12.1906C10.5421 12.4731 10.104 12.697 9.63069 12.8623C9.11895 13.041 8.57535 13.13 8.00074 13.13C6.57736 13.13 5.36341 12.6305 4.36653 11.6336C3.36965 10.6367 2.87012 9.42297 2.87012 8C2.87012 6.57702 3.36965 5.36328 4.36653 4.3664ZM8.00012 4.63C7.06198 4.63 6.26877 4.95685 5.61287 5.61275C4.95698 6.26865 4.63012 7.06186 4.63012 8C4.63012 8.93813 4.95698 9.73134 5.61287 10.3872C6.26877 11.0431 7.06198 11.37 8.00012 11.37C8.93826 11.37 9.73146 11.0431 10.3874 10.3872C11.0433 9.73134 11.3701 8.93813 11.3701 8C11.3701 7.06186 11.0433 6.26865 10.3874 5.61275C9.73146 4.95685 8.93826 4.63 8.00012 4.63Z\" fill=\"currentColor\"></path></svg></span>\n <input type=\"search\" class=\"sd_waba_input_search_conversation\" placeholder=\"Search\" [(ngModel)]=\"searchQuery\"\n (keyup)=\"filterConversations()\" [disabled]=\"showInitLoader || showRefreshLoader\">\n</div>\n\n<!--\n<div class=\"sd_waba_container_conversations_filters\">\n <button type=\"button\" class=\"sd_waba_filter_selected\" title=\"All\">All</button>\n <button type=\"button\" title=\"Unread\">Unread</button>\n <button type=\"button\" title=\"Groups\">Groups</button>\n</div>\n-->\n\n@if (!showArchivedConversations) {\n<div class=\"sd_waba_container_conversations_views\" (click)=\"onToggleArchivedConversations()\">\n <div class=\"sd_waba_container_conversations_view_icon\">\n <svg viewBox=\"0 0 20 20\" height=\"20\" width=\"20\" preserveAspectRatio=\"xMidYMid meet\" fill=\"none\">\n <path\n d=\"M18.54 3.23L17.15 1.55C16.88 1.21 16.47 1 16 1H4C3.53 1 3.12 1.21 2.84 1.55L1.46 3.23C1.17 3.57 1 4.02 1 4.5V17C1 18.1 1.9 19 3 19H17C18.1 19 19 18.1 19 17V4.5C19 4.02 18.83 3.57 18.54 3.23ZM4.24 3H15.76L16.57 3.97H3.44L4.24 3ZM3 17V6H17V17H3ZM11.45 8H8.55V11H6L10 15L14 11H11.45V8Z\"\n fill=\"currentColor\"></path>\n </svg>\n </div>\n <div class=\"sd_waba_container_conversations_view_label\">\n <div class=\"sd_waba_container_conversations_view_name\">\n Archived\n </div>\n </div>\n <!-- <div class=\"sd_waba_container_conversations_view_count\">12</div> -->\n</div>\n}\n\n@if (showArchivedConversations) {\n<div class=\"sd_waba_container_conversations_views sd_waba_container_conversations_views_archived\">\n <div class=\"sd_waba_container_conversations_view_icon\" (click)=\"onToggleArchivedConversations()\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" preserveAspectRatio=\"xMidYMid meet\" class=\"\" version=\"1.1\" x=\"0px\"\n y=\"0px\" enable-background=\"new 0 0 24 24\">\n <path fill=\"currentColor\" d=\"M12,4l1.4,1.4L7.8,11H20v2H7.8l5.6,5.6L12,20l-8-8L12,4z\"></path>\n </svg>\n </div>\n <div class=\"sd_waba_container_conversations_view_label\">\n <div class=\"sd_waba_container_conversations_view_name sd_waba_container_conversations_view_name_archived\">\n Archived\n </div>\n </div>\n <!-- <div class=\"sd_waba_container_conversations_view_count\">12</div> -->\n <p></p>\n</div>\n}\n\n<div class=\"sd_waba_container_conversations_content\">\n <div class=\"sd_waba_container_conversations_content_inner\">\n <div class=\"sd_waba_scrollbox\" id=\"sd_waba_conversations_scrollbox\" infiniteScroll [scrollWindow]=\"false\"\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"500\"\n [infiniteScrollDisabled]=\"showEntityConversationScrollLoader\" (scrolled)=\"onScrollEntityConversationList()\"\n #scrollboxWhatsAppConversations>\n <div class=\"sd_waba_scrollbox_content\">\n @if (showInitLoader || showRefreshLoader) {\n <div class=\"sd_waba_container_conversations_init_loader\">\n <!-- <div class=\"container_table_loader\">\n <div class=\"table_loader\">\n <p>Loading</p>\n <span></span>\n </div>\n </div> -->\n @for (count of [].constructor(getScrollLoaderCount()); track $index) {\n <div class=\"sd_waba_container_skeleton_loader\">\n <ngx-skeleton-loader appearance=\"circle\"\n [theme]=\"{ 'width': '49px', 'height': '49px', 'background-color': '#d9d9d9' }\" animation=\"progress\">\n </ngx-skeleton-loader>\n <div class=\"sd_waba_container_skeleton_loader_messages\">\n <ngx-skeleton-loader [theme]=\"{ 'width': '30%', 'height': '16px', 'background-color': '#d9d9d9' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ 'width': '80%', 'height': '14px', 'background-color': '#e0e0e0', 'margin-bottom': '0px' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n </div>\n </div>\n }\n </div>\n }\n @else {\n @let searchResults = (searchQuery ? filteredConversations : conversations) || [];\n\n @if (showArchivedConversations) {\n <div class=\"sd_waba_archived_view_message\">\n <p>These chats stay archived when new messages are received. Tab to change</p>\n </div>\n }\n\n @if (searchResults && searchResults.length > 0) {\n <div class=\"sd_waba_container_conversations_list\">\n <ul>\n @for (conversation of searchResults; track conversation.id) {\n <li (click)=\"handleSelectConversation(conversation)\"\n [ngClass]=\"{ 'sd_waba_conversation_selected': conversation.id === selectedConversation?.id }\">\n <div class=\"sd_waba_container_conversation_item\"\n [ngClass]=\"{ 'sd_waba_conversation_blocked': !!conversation.blockedAt || !!conversation.entity?.blockedAt }\">\n <div class=\"sd_waba_container_conversation_avatar\"\n [ngClass]=\"{ 'sd_waba_container_conversation_avatar_grayscale': !!conversation.blockedAt || !!conversation.entity?.blockedAt }\">\n @let entityImage = conversation.entity?.image?.location;\n @if (entityImage) {\n <img src=\"{{ entityImage }}\" alt=\"{{ conversation.entity?.name }}\"\n (error)=\"handleEntityImageError(conversation.entity)\">\n }\n @else {\n @if (!!conversation.blockedAt || !!conversation.entity?.blockedAt) {\n <ngx-avatars initialsSize=\"2\" [size]=\"49\" [round]=\"true\" [name]=\"conversation.entity?.name\"\n [bgColor]=\"'#d3d3d3'\"></ngx-avatars>\n }\n @else {\n <ngx-avatars initialsSize=\"2\" [size]=\"49\" [round]=\"true\" [name]=\"conversation.entity?.name\">\n </ngx-avatars>\n }\n }\n </div>\n <div class=\"sd_waba_container_conversation_details\">\n @let lastMessage = conversation.messages?.items?.[0];\n <div class=\"sd_waba_container_conversation_title\">\n <div class=\"sd_waba_title_left\">\n <div class=\"sd_waba_container_conversation_address\">\n @if (!isNumeric(searchQuery)) {\n {{ conversation.entity?.name || conversation.entityAddress | titlecase }}\n }\n @else {\n {{ conversation.entityAddress }}\n }\n @if (!!conversation.blockedAt || !!conversation.entity?.blockedAt) {\n <span> (Blocked)</span>\n }\n </div>\n </div>\n <div class=\"sd_waba_title_right\"\n [ngClass]=\"{'sd_waba_container_conversation_alert': (lastMessage?.createdAt || conversation.lastMessageAt) >= conversation.lastActivityAt && conversation.id !== selectedConversation?.id}\">\n {{ lastMessage ? (lastMessage.createdAt |\n formatEpochTimestamp: 'short' ) : '--' }}\n </div>\n </div>\n <div class=\"sd_waba_container_conversation_last_message\">\n\n <div class=\"sd_waba_container_last_message_content\">\n @if (!!lastMessage) {\n @let metadata = lastMessage.metadata ? parseJSON(lastMessage.metadata) : {};\n\n <!-- 1. ERROR MESSAGE -->\n @if (metadata?.errors) {\n @let error = metadata.errors[0];\n <span class=\"sd_waba_message_content\">\n <span class=\"sd_waba_error_icon\"><svg width=\"10px\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z\"></path></svg></span>\n <span class=\"sd_waba_error_content\">{{ error?.title || error?.message || 'WhatsApp error' }}</span>\n </span>\n }\n\n <!-- 2. TEMPLATE MESSAGE -->\n @else if (metadata?.template) {\n @let components = metadata.template.components;\n\n @for (component of components ?? []; track $index) {\n @switch (component?.type) {\n @case ('HEADER') {\n @switch (component?.format) {\n @case ('TEXT') {\n <span>{{ component?.text }}</span> \n }\n @case ('IMAGE') {\n <span><i class=\"fa-regular fa-image\"></i></span> \n }\n @case ('VIDEO') {\n <span><i class=\"fa-regular fa-video\"></i></span> \n }\n @case ('DOCUMENT') {\n <span><i class=\"fa-regular fa-file\"></i></span> \n }\n @case ('LOCATION') {\n <span><i class=\"fa-solid fa-location-pin\"></i></span> \n }\n }\n }\n\n @case ('BODY') {\n @if (component?.text?.trim().length > 0) {\n <span [innerHTML]=\"component.text | WhatsAppTextFormatter\"></span>\n }\n }\n }\n }\n }\n\n <!-- 3. SHARED CONTACT -->\n @else if (metadata?.contacts) {\n @let contact = metadata.contacts[0];\n <span class=\"sd_waba_message_content\">\n <span><svg width=\"15px\" height=\"15px\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M96 0C60.7 0 32 28.7 32 64l0 384c0 35.3 28.7 64 64 64l288 0c35.3 0 64-28.7 64-64l0-384c0-35.3-28.7-64-64-64L96 0zM208 288l64 0c44.2 0 80 35.8 80 80 0 8.8-7.2 16-16 16l-192 0c-8.8 0-16-7.2-16-16 0-44.2 35.8-80 80-80zm-24-96a56 56 0 1 1 112 0 56 56 0 1 1 -112 0zM512 80c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 64c0 8.8 7.2 16 16 16s16-7.2 16-16l0-64zm0 128c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 64c0 8.8 7.2 16 16 16s16-7.2 16-16l0-64zM496 320c-8.8 0-16 7.2-16 16l0 64c0 8.8 7.2 16 16 16s16-7.2 16-16l0-64c0-8.8-7.2-16-16-16z\"/></svg></span>\n {{ contact?.name?.formatted_name || contact?.name?.first_name || 'Shared contact' }}\n </span>\n }\n\n <!-- 4. LOCATION -->\n @else if (metadata?.location) {\n @let location = metadata.location;\n <span class=\"sd_waba_message_content\">\n <span>\n <svg width=\"15px\" height=\"15px\"\n viewBox=\"-1.5 0 15 15\">\n <path fill=\"currentColor\" fill-rule=\"evenodd\"\n d=\"M574,120 C575.324428,120 580,114.054994 580,110.833333 C580,107.611672 577.313708,105 574,105 C570.686292,105 568,107.611672 568,110.833333 C568,114.054994 572.675572,120 574,120 Z M574,113.333333 C575.420161,113.333333 576.571429,112.214045 576.571429,110.833333 C576.571429,109.452621 575.420161,108.333333 574,108.333333 C572.579839,108.333333 571.428571,109.452621 571.428571,110.833333 C571.428571,112.214045 572.579839,113.333333 574,113.333333 Z\"\n transform=\"translate(-568 -105)\" />\n </svg>\n </span>{{ location.name || 'Shared location' }}\n </span>\n }\n\n <!-- 5. ATTACHMENTS -->\n @else if (lastMessage?.messageAttachments?.items?.length > 0) {\n @let attachment = lastMessage?.messageAttachments.items[0];\n @switch (getAttachmentType(attachment)) {\n @case ('image') {\n <span>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M20 14V2C20 0.9 19.1 0 18 0H6C4.9 0 4 0.9 4 2V14C4 15.1 4.9 16 6 16H18C19.1 16 20 15.1 20 14ZM9.4 10.53L11.03 12.71L13.61 9.49C13.81 9.24 14.19 9.24 14.39 9.49L17.35 13.19C17.61 13.52 17.38 14 16.96 14H7C6.59 14 6.35 13.53 6.6 13.2L8.6 10.53C8.8 10.27 9.2 10.27 9.4 10.53ZM0 18V5C0 4.45 0.45 4 1 4C1.55 4 2 4.45 2 5V17C2 17.55 2.45 18 3 18H15C15.55 18 16 18.45 16 19C16 19.55 15.55 20 15 20H2C0.9 20 0 19.1 0 18Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n }\n @case ('video') {\n <span><svg fill=\"currentColor\" width=\"16px\"\n height=\"16px\" viewBox=\"0 0 36 36\" version=\"1.1\" preserveAspectRatio=\"xMidYMid meet\">\n <path\n d=\"M32.12,10H3.88A1.88,1.88,0,0,0,2,11.88V30.12A1.88,1.88,0,0,0,3.88,32H32.12A1.88,1.88,0,0,0,34,30.12V11.88A1.88,1.88,0,0,0,32.12,10ZM24.18,21.83l-9.77,4.36A1,1,0,0,1,13,25.28V16.56a1,1,0,0,1,1.41-.91L24.18,20A1,1,0,0,1,24.18,21.83Z\"\n class=\"clr-i-solid clr-i-solid-path-1\"></path>\n <path d=\"M30.14,3h0a1,1,0,0,0-1-1h-22a1,1,0,0,0-1,1h0V4h24Z\"\n class=\"clr-i-solid clr-i-solid-path-2\"></path>\n <path d=\"M32.12,7V7a1,1,0,0,0-1-1h-26a1,1,0,0,0-1,1h0V8h28Z\"\n class=\"clr-i-solid clr-i-solid-path-3\"></path>\n <rect x=\"0\" y=\"0\" width=\"8\" height=\"8\" fill-opacity=\"0\" />\n </svg></span>\n }\n @case ('audio') {\n <span><svg viewBox=\"0 0 24 24\" height=\"16\" width=\"16\"\n class=\"\" version=\"1.1\" x=\"0px\" y=\"0px\" enable-background=\"new 0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M11.999,14.942c2.001,0,3.531-1.53,3.531-3.531V4.35c0-2.001-1.53-3.531-3.531-3.531 S8.469,2.35,8.469,4.35v7.061C8.469,13.412,9.999,14.942,11.999,14.942z M18.237,11.412c0,3.531-2.942,6.002-6.237,6.002 s-6.237-2.471-6.237-6.002H3.761c0,4.001,3.178,7.297,7.061,7.885v3.884h2.354v-3.884c3.884-0.588,7.061-3.884,7.061-7.885 L18.237,11.412z\">\n </path>\n </svg></span>\n }\n @case ('document') {\n <span><svg height=\"16\" viewBox=\"0 0 16 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M2 0C0.9 0 0.01 0.9 0.01 2L0 18C0 19.1 0.89 20 1.99 20H14C15.1 20 16 19.1 16 18V6.83C16 6.3 15.79 5.79 15.41 5.42L10.58 0.59C10.21 0.21 9.7 0 9.17 0H2ZM9 6V1.5L14.5 7H10C9.45 7 9 6.55 9 6ZM4 10C3.44772 10 3 10.4477 3 11C3 11.5523 3.44772 12 4 12H12C12.5523 12 13 11.5523 13 11C13 10.4477 12.5523 10 12 10H4ZM10 15C10 14.4477 9.55228 14 9 14H4C3.44772 14 3 14.4477 3 15C3 15.5523 3.44772 16 4 16H9C9.55228 16 10 15.5523 10 15Z\"\n fill=\"currentColor\"></path>\n </svg></span>\n }\n @default {\n <span><i class=\"fa-solid fa-paperclip-vertical\"></i></span>\n }\n }\n <span>{{ lastMessage?.body?.trim() || (getAttachmentType(attachment) === 'document' ? attachment?.name : (getAttachmentType(attachment) | titlecase)) || 'Attachment' }}</span>\n }\n\n <!-- 6. NORMAL MESSAGE -->\n @else {\n <span class=\"sd_waba_message_content\">\n {{ lastMessage?.body?.trim() || '' }}\n </span>\n }\n }\n </div>\n\n @if ((lastMessage?.createdAt || conversation.lastMessageAt) >= conversation.lastActivityAt && conversation.id !== selectedConversation?.id) {\n <div class=\"sd_waba_container_last_message_alert\"></div>\n }\n <div class=\"sd_waba_container_arrow_down\">\n @if (conversation.id === reConfiguringConversationId || conversation.entityId ===\n reConfiguringEntityId) {\n <span>...</span>\n }\n @else {\n <span mat-button class=\"sd_waba_button_conversation_options\"\n [matMenuTriggerFor]=\"menuConversationOptions\" (click)=\"$event.stopPropagation()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13px\" viewBox=\"0 0 448 512\"><path fill=\"currentColor\" d=\"M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"/></svg>\n </span>\n <mat-menu #menuConversationOptions>\n <!-- @if (!(conversation.entity || conversation.entityId || conversation.entity?.id)) {\n <button type=\"button\" mat-menu-item>Assign to contact</button>\n } -->\n @if (!conversation.archivedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markConversationAsArchived(conversation)\">\n <div class=\"sd_waba_btn_content_outer\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg viewBox=\"0 0 20 20\" height=\"20\" width=\"20\" preserveAspectRatio=\"xMidYMid meet\"\n fill=\"none\">\n <path\n d=\"M18.54 3.23L17.15 1.55C16.88 1.21 16.47 1 16 1H4C3.53 1 3.12 1.21 2.84 1.55L1.46 3.23C1.17 3.57 1 4.02 1 4.5V17C1 18.1 1.9 19 3 19H17C18.1 19 19 18.1 19 17V4.5C19 4.02 18.83 3.57 18.54 3.23ZM4.24 3H15.76L16.57 3.97H3.44L4.24 3ZM3 17V6H17V17H3ZM11.45 8H8.55V11H6L10 15L14 11H11.45V8Z\"\n fill=\"currentColor\"></path>\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Archive chat</div>\n </div>\n </button>\n }\n @if (!!conversation.archivedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markConversationAsUnarchived(conversation)\">\n <div class=\"sd_waba_btn_content_outer\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\">\n <path fill=\"currentColor\"\n d=\"M480-560 320-400l56 56 64-64v168h80v-168l64 64 56-56-160-160Zm-280-80v440h560v-440H200Zm0 520q-33 0-56.5-23.5T120-200v-499q0-14 4.5-27t13.5-24l50-61q11-14 27.5-21.5T250-840h460q18 0 34.5 7.5T772-811l50 61q9 11 13.5 24t4.5 27v499q0 33-23.5 56.5T760-120H200Zm16-600h528l-34-40H250l-34 40Zm264 300Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Unarchive chat</div>\n </div>\n </button>\n }\n @if (!conversation.blockedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markConversationAsBlocked(conversation)\">\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg width=\"28px\" viewBox=\"0 0 640 640\">\n <path fill=\"currentColor\"\n d=\"M449.1 483.1L156.9 190.9C128.8 226.4 112 271.2 112 320C112 434.9 205.1 528 320 528C368.8 528 413.7 511.2 449.1 483.1zM483 449.2C511.1 413.7 527.9 368.9 527.9 320.1C527.9 205.2 434.8 112.1 319.9 112.1C271.1 112.1 226.2 128.9 190.8 157L483.1 449.1zM64 320C64 178.6 178.6 64 320 64C461.4 64 576 178.6 576 320C576 461.4 461.4 576 320 576C178.6 576 64 461.4 64 320z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Block chat</div>\n </div>\n </button>\n }\n @if (!!conversation.blockedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markConversationAsUnblocked(conversation)\">\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd sd_waba_btn_unblock\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg width=\"28px\" viewBox=\"0 0 640 640\">\n <path fill=\"currentColor\"\n d=\"M449.1 483.1L156.9 190.9C128.8 226.4 112 271.2 112 320C112 434.9 205.1 528 320 528C368.8 528 413.7 511.2 449.1 483.1zM483 449.2C511.1 413.7 527.9 368.9 527.9 320.1C527.9 205.2 434.8 112.1 319.9 112.1C271.1 112.1 226.2 128.9 190.8 157L483.1 449.1zM64 320C64 178.6 178.6 64 320 64C461.4 64 576 178.6 576 320C576 461.4 461.4 576 320 576C178.6 576 64 461.4 64 320z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Unblock chat</div>\n </div>\n\n </button>\n }\n <!-- @if (conversation.entity && !conversation.entity.blockedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markEntityAndConversationAsBlocked(conversation)\">\n Block contact\n </button>\n }\n @if (conversation.entity && !!conversation.entity.blockedAt) {\n <button type=\"button\" mat-menu-item (click)=\"markEntityAndConversationAsUnblocked(conversation)\">\n Unblock contact\n </button>\n } -->\n </mat-menu>\n }\n </div>\n </div>\n </div>\n </div>\n </li>\n }\n </ul>\n\n @if (showEntityConversationScrollLoader) {\n <div class=\"sd_waba_container_conversations_scroll_loader\">\n <div class=\"sd_waba_scroll_item_loader\"></div>\n </div>\n }\n\n </div>\n }\n @else {\n <div class=\"sd_waba_container_no_results\">\n <div class=\"sd_waba_container_no_results_inner\">\n <div class=\"sd_waba_container_icon_no_results\">\n <svg version=\"1.1\" viewBox=\"0 0 60 60\" width=\"68px\" style=\"enable-background:new 0 0 60 60;\" xml:space=\"preserve\">\n<path fill=\"currentColor\" d=\"M54,2H6C2.748,2,0,4.748,0,8v33c0,3.252,2.748,6,6,6h8v10c0,0.413,0.254,0.784,0.64,0.933C14.757,57.978,14.879,58,15,58\n\tc0.276,0,0.547-0.115,0.74-0.327L25.442,47H54c3.252,0,6-2.748,6-6V8C60,4.748,57.252,2,54,2z M12,15h15c0.553,0,1,0.448,1,1\n\ts-0.447,1-1,1H12c-0.553,0-1-0.448-1-1S11.447,15,12,15z M46,33H12c-0.553,0-1-0.448-1-1s0.447-1,1-1h34c0.553,0,1,0.448,1,1\n\tS46.553,33,46,33z M46,25H12c-0.553,0-1-0.448-1-1s0.447-1,1-1h34c0.553,0,1,0.448,1,1S46.553,25,46,25z\"/>\n</svg>\n </div>\n <h2>No chats or contacts found</h2>\n @if (!conversations || conversations?.length === 0) {\n <p>Messages you send or receive will appear here.</p>\n }\n @else {\n <p>No results found for your search. Please try different keywords.</p>\n }\n </div>\n </div>\n }\n\n }\n </div>\n </div>\n </div>\n</div>\n\n@if (showNewConversation) {\n<div class=\"sd_waba_container_slider\"\n [ngClass]=\"{ 'sd_waba_slide_in_left': showNewConversation, 'sd_waba_slide_out_left': !showNewConversation }\">\n <lib-whatsapp-contact-list [containerDimensions]=\"containerDimensions\" (close)=\"toggleNewConversation()\"\n (selectContact)=\"startConversation($event)\" />\n</div>\n}\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\nimport { Language, PhoneNumber, S3Object, SubscriptionResponse } from '../graphql/common.model';\n\nimport * as uuid from 'uuid';\n\nconst FIELDS_USER_EXPANDED = `\n id\n externalId\n tenantId\n email\n name\n image {\n key\n bucket\n location\n }\n phoneNumber {\n countryCode\n dialCode\n e164Number\n internationalNumber\n nationalNumber\n number\n }\n preferences {\n timezoneName\n language {\n code\n nameEn\n nameLocal\n }\n }\n notificationSettings {\n allowPush\n allowEmail\n allowSMS\n allowWhatsApp\n }\n type\n activatedAt\n blockedAt\n createdAt\n updatedAt\n deletedAt\n`;\n\nexport type UserPreferences = {\n timezoneName?: string | null;\n language?: Language | null;\n};\n\nexport type UserNotificationSettings = {\n allowPush?: boolean | null;\n allowEmail?: boolean | null;\n allowSMS?: boolean | null;\n allowWhatsApp?: boolean | null;\n};\n\nexport enum UserStatus {\n READY = 'READY',\n NOT_READY = 'NOT_READY',\n INVITED = 'INVITED',\n BUSY = 'BUSY',\n AFTER_CALL_WORK = 'AFTER_CALL_WORK',\n}\n\nexport enum UserType {\n AGENT = 'AGENT',\n SUPERVISOR = 'SUPERVISOR',\n ADMINISTRATOR = 'ADMINISTRATOR',\n}\n\nexport type User = {\n id: string;\n externalId?: string | null;\n tenantId: string;\n email: string;\n name?: string | null;\n image?: S3Object | null;\n phoneNumber?: PhoneNumber | null;\n preferences?: UserPreferences | null;\n notificationSettings?: UserNotificationSettings | null;\n type?: UserType | null;\n activatedAt?: number | null;\n blockedAt?: number | null;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\nexport type ModelUserStatusInput = {\n eq?: UserStatus | null;\n ne?: UserStatus | null;\n};\n\nexport type __SubscriptionContainer = {\n OnUserById: User;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UserService {\n constructor(private readonly graphqlService: AppSyncGraphqlService) {}\n\n async getUserById(id: string): Promise<User> {\n if (!id || !uuid.validate(id)) {\n throw { code: 400, message: `Invalid id: ${id}` };\n }\n\n const user = await this.GetUser(id);\n if (!user || !!user.deletedAt) {\n throw { code: 400, message: `User not found` };\n }\n if (!user.activatedAt) {\n throw { code: 403, message: `User not activated.` };\n }\n if (!!user.blockedAt) {\n throw { code: 403, message: `User has been blocked.` };\n }\n\n return user;\n }\n\n async GetUser(id: string): Promise<User> {\n const statement = `query GetUser($id: ID!) {\n getUser(id: $id) {\n ${FIELDS_USER_EXPANDED}\n }\n }`;\n const gqlAPIServiceArguments: any = { id };\n const response = await this.graphqlService.query<any>(statement, gqlAPIServiceArguments);\n return <User>response.data.getUser;\n }\n\n OnUserByIdListener(id: string): Observable<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnUserById'>>> {\n const statement = `subscription OnUserById($id: ID!) {\n OnUserById(id: $id) {\n ${FIELDS_USER_EXPANDED}\n }\n }`;\n const gqlAPIServiceArguments: any = { id };\n return this.graphqlService.subscribe<SubscriptionResponse<Pick<__SubscriptionContainer, 'OnUserById'>>>(statement, gqlAPIServiceArguments) as any;\n /* as Observable<SubscriptionResponse<Pick<__SubscriptionContainer, \"OnUserById\">>>; */\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { GoogleMapsConfig } from '../../../app.config';\nimport { InteractionAttendee, InteractionMessage } from '../../services/interaction.service';\n\n@Component({\n selector: 'lib-whatsapp-message-item',\n templateUrl: './whatsapp-message-item.component.html',\n styleUrls: ['./whatsapp-message-item.component.css'],\n standalone: false,\n})\nexport class WhatsAppMessageItemComponent {\n /** Required inputs */\n @Input() message!: InteractionMessage;\n\n /** Maps / helpers passed from parent */\n @Input() interactionAttendeesMap!: Record<string | number, InteractionAttendee>;\n @Input() referenceMessagesMap!: Record<string | number, InteractionMessage>;\n\n /** UI flags */\n @Input() isRestrictedToTemplateReplies = false;\n\n /** Outputs (use these to bubble actions back to parent if needed) */\n @Output('reply')\n reply = new EventEmitter<InteractionMessage>();\n\n /** Derived helpers (safe lookups & parsing) */\n get inbound(): boolean {\n const a = this.attendeeRaw;\n // inbound if attendee is linked to an entityId (matches how you compute IsInboundMessage today)\n return !!a?.entityId;\n }\n\n get attendeeRaw(): InteractionAttendee | undefined {\n if (!this.message?.interactionAttendee) return this.message?.interactionAttendee as any;\n return this.interactionAttendeesMap?.[this.message.interactionAttendeeId as any] as any;\n }\n\n get attendeeName(): string | undefined {\n const a = this.attendeeRaw;\n return a?.entity?.name || a?.user?.name || a?.name;\n }\n\n get attendeeImage(): string | undefined {\n const a = this.attendeeRaw;\n return a?.entity?.image?.location || a?.user?.image?.location;\n }\n\n get meta(): any {\n return this.parseJSON(this.message?.metadata);\n }\n\n get location(): any {\n return this.meta?.location;\n }\n\n get contacts(): any[] | undefined {\n return this.meta?.contacts;\n }\n\n get messageErrors(): any[] | undefined {\n const errors = this.meta?.errors;\n return Array.isArray(errors) ? errors : undefined;\n }\n\n setAsReferenceMessage() {\n this.reply.emit(this.message);\n }\n\n getMapPreview(latitude: string, longitude: string) {\n return `https://maps.googleapis.com/maps/api/staticmap?center=${latitude},${longitude}&zoom=15&size=400x250&maptype=roadmap&markers=color:red%7Clabel:S%7C${latitude},${longitude}&key=${GoogleMapsConfig.apiKey}`;\n }\n\n getErrorDetails(error: any): string {\n if (!error) {\n return '';\n }\n\n return error?.error_data?.details || error?.message || error?.title || 'Something went wrong while delivering this message.';\n }\n\n openLocation(latitude: string, longitude: string) {\n return window.open(`https://www.google.com/maps?q=${latitude},${longitude}`, '_blank');\n }\n\n formatContactAddress(address: any): string {\n if (!address) {\n return '';\n }\n\n const parts = [address.street, address.city, address.state, address.zip || address.postal_code, address.country].map((part) => (typeof part === 'string' ? part.trim() : part)).filter((part) => !!part && String(part).length > 0);\n\n return parts.join(', ');\n }\n\n onAttendeeImageError(attendee: any) {\n attendee.image = undefined;\n }\n\n getAttachmentType(attachment: any) {\n if (attachment.type.startsWith('image')) {\n return 'image';\n } else if (attachment.type.startsWith('video')) {\n return 'video';\n } else if (attachment.type.startsWith('audio')) {\n return 'audio';\n } else {\n return 'document';\n }\n }\n\n isTemplatedMessage(): boolean {\n if (!this.message?.metadata) {\n return false;\n }\n\n try {\n return !!this.meta.template;\n } catch (err) {\n // If message.metadata is not valid JSON, return false\n return false;\n }\n }\n\n hasHeaderMediaTemplate(): boolean {\n try {\n const comps = this.parseJSON(this.message?.metadata)?.template?.components;\n return Array.isArray(comps) && comps.some((c) => c?.type === 'HEADER' && ['IMAGE', 'VIDEO', 'DOCUMENT', 'LOCATION'].includes(c?.format));\n } catch {\n return false;\n }\n }\n\n parseMessageTemplateComponents(metadata: any) {\n return this.parseJSON(metadata)?.template?.components;\n }\n\n parseJSON(raw: any) {\n if (!raw) return undefined;\n if (typeof raw === 'object') return raw;\n try {\n return JSON.parse(String(raw));\n } catch {\n return undefined;\n }\n }\n}\n","<div class=\"sd_waba_container_whatsapp_message_item\">\n <!-- Avatar/Image -->\n <div class=\"sd_waba_container_participant_avatar\" [ngStyle]=\"{\n 'float': inbound ? 'left' : 'right',\n 'margin-left': inbound ? '0px' : '6px',\n 'margin-right': inbound ? '6px' : '0px'\n }\">\n @if (attendeeImage) {\n <img class=\"sd_waba_unselectable\" src=\"{{ attendeeImage }}\" alt=\"{{ attendeeName || 'Attendee' }}\" (error)=\"onAttendeeImageError(attendeeRaw)\" />\n } @else {\n <ngx-avatars class=\"sd_waba_unselectable\" [initialsSize]=\"2\" [size]=\"28\" [round]=\"true\" [name]=\"attendeeName\"></ngx-avatars>\n }\n </div>\n\n <!-- Message bubble -->\n <div class=\"sd_waba_container_message_wrapper\"\n [ngStyle]=\"{ 'float': inbound ? 'left' : 'right', 'text-align': inbound ? 'left' : 'right' }\">\n\n @if (inbound) {\n <span class=\"sd_waba_bubble_arrow_left\"></span>\n } @else {\n <span class=\"sd_waba_bubble_arrow_right\"></span>\n }\n\n <div class=\"sd_waba_container_message_bubble\" [ngClass]=\"{ 'sd_waba_container_message_bubble_attachment': hasHeaderMediaTemplate() || message?.messageAttachments?.items?.length || (location?.latitude && location?.longitude) }\" [ngStyle]=\"{\n 'background': inbound ? '#fff' : '#d9fdd3',\n 'border-top-left-radius': inbound ? '0px' : '7.5px',\n 'border-top-right-radius': inbound ? '7.5px' : '0px'\n }\">\n\n <!-- per-message options -->\n @if (!isRestrictedToTemplateReplies) {\n <div class=\"sd_waba_container_message_actions\">\n <button class=\"sd_waba_button_message_actions_toggle\" type=\"button\" title=\"More options\"\n [matMenuTriggerFor]=\"conversationMessageOptions\">\n <svg width=\"13px\" viewBox=\"0 0 448 512\"><path fill=\"currentColor\" d=\"M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"/></svg>\n </button>\n <mat-menu #conversationMessageOptions=\"matMenu\">\n <button mat-menu-item class=\"sd_waba_btn_reply\" (click)=\"setAsReferenceMessage()\">\n <div class=\"sd_waba_btn_outer\">\n <span class=\"sd_waba_button_inner\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"><path fill=\"currentColor\" d=\"M760-200v-160q0-50-35-85t-85-35H273l144 144-57 56-240-240 240-240 57 56-144 144h367q83 0 141.5 58.5T840-360v160h-80Z\"/></svg>\n </span>\n <span class=\"sd_waba_button_text\">Reply</span>\n </div>\n </button>\n </mat-menu>\n </div>\n }\n\n <!-- Templated Message -->\n @if (isTemplatedMessage()) {\n @for (component of parseMessageTemplateComponents?.(message?.metadata) ?? []; track $index) {\n @switch (component?.type) {\n @case ('HEADER') {\n @switch (component?.format) {\n @case ('TEXT') {\n <h3>{{ component?.text }}</h3>\n }\n @case ('IMAGE') {\n <div class=\"sd_waba_container_template_header_image\">\n <img class=\"sd_waba_unselectable\" [src]=\"component?.example?.header_handle?.[0]\" alt=\"{{ component?.example?.header_handle?.[0] }}\">\n </div>\n }\n @case ('VIDEO') {\n <div class=\"sd_waba_container_template_media\">\n <video class=\"sd_waba_unselectable\" [src]=\"component?.example?.header_handle?.[0]\" controls></video>\n </div>\n }\n @case ('DOCUMENT') {\n <div class=\"sd_waba_container_template_media\">\n <a [href]=\"component?.example?.header_handle?.[0]\" target=\"_blank\">\n <i class=\"fa-regular fa-file\"></i>\n </a>\n </div>\n }\n @case ('LOCATION') {\n\n @if (location?.latitude && location?.longitude) {\n <div class=\"sd_waba_container_template_media\">\n <span class=\"sd_waba_trigger_location_preview\" (click)=\"openLocation(location.latitude, location.longitude)\">\n <img class=\"sd_waba_unselectable\" [src]=\"getMapPreview(location.latitude, location.longitude)\" alt=\"Location\">\n </span>\n </div>\n <!-- <p><b>{{ location?.name }}</b></p>\n <p>{{ location?.address }}</p> -->\n }\n }\n @default {\n Unsupported header format: {{ component?.format }}\n }\n }\n }\n\n @case ('BODY') {\n @if (component?.text?.trim().length > 0) {\n <p [innerHTML]=\"component?.text | WhatsAppTextFormatter\"></p>\n }\n }\n\n @case ('FOOTER') {\n <div class=\"sd_waba_container_template_footer\">\n <div class=\"sd_waba_text_template_footer\">\n {{ component?.text }}\n </div>\n </div>\n\n <div class=\"sd_waba_container_template_timestamp\">\n <label class=\"sd_waba_text_template_timestamp\">{{ message?.createdAt | formatEpochTimestamp: 'medium' }}</label>\n @if (!inbound) {\n @if (message?.temp_isSending) {\n <span class=\"sd_waba_icon_status_sending\"></span>\n } @else {\n <span class=\"sd_waba_icon_status_sent\"><svg width=\"11px\" height=\"11px\" viewBox=\"0 0 448 512\"><path fill=\"currentColor\" d=\"M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z\"/></svg></span>\n }\n }\n </div>\n }\n\n @case ('BUTTONS') {\n <div class=\"sd_waba_container_template_buttons\">\n @for (button of component?.buttons ?? []; track $index) {\n @switch (button?.type) {\n @case ('COPY_CODE') {\n <button type=\"button\">\n <i class=\"fa-regular fa-copy\"></i>\n {{ button?.text }}\n </button>\n }\n @case ('PHONE_NUMBER') {\n <button type=\"button\">\n <i class=\"fa-solid fa-phone\"></i>\n {{ button?.text }} - {{ button?.phone_number }}\n </button>\n }\n @case ('QUICK_REPLY') {\n <button type=\"button\">\n <i class=\"fa-regular fa-reply\"></i>\n {{ button?.text }}\n </button>\n }\n @case ('URL') {\n <a [href]=\"button?.url\" target=\"_blank\" class=\"sd_waba_button_template_web_link\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n Go to {{ button?.text }}\n </a>\n }\n @default {\n <button type=\"button\">\n {{ button?.text }}\n </button>\n }\n }\n }\n </div>\n }\n\n @default { }\n }\n }\n\n <!-- Errors -->\n @if (messageErrors?.length) {\n <div class=\"sd_waba_outer_container_errors\">\n <div class=\"sd_waba_container_attachment_errors\">\n <div class=\"sd_waba_container_error_header\">\n <span class=\"sd_waba_icon_error_warning\"><svg width=\"18px\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z\"/></svg></span>\n <div class=\"sd_waba_container_error_heading\">\n <p class=\"sd_waba_text_error_title\">Delivery issue</p>\n <p class=\"sd_waba_text_error_meta\">WhatsApp returned the following errors</p>\n </div>\n </div>\n\n <div class=\"sd_waba_container_error_list\">\n @for (error of messageErrors ?? []; track error?.code ?? $index) {\n <div class=\"sd_waba_container_error_item\">\n <span class=\"sd_waba_tag_error_code\">#{{ error?.code || 'N/A' }}</span>\n <div class=\"sd_waba_container_error_content\">\n <p class=\"sd_waba_text_error_message\">{{ error?.title || error?.message || 'WhatsApp error' }}</p>\n @if (getErrorDetails(error)) {\n <p class=\"sd_waba_text_error_details\">{{ getErrorDetails(error) }}</p>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n }\n\n <!-- Plain Message -->\n @else {\n <div class=\"sd_waba_container_plain_message_content\">\n\n <!-- Quoted / reference message -->\n @if (message?.referenceMessageId && referenceMessagesMap?.[message.referenceMessageId]) {\n <ng-container [ngTemplateOutlet]=\"referenceMessageTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: referenceMessagesMap[message.referenceMessageId] }\">\n </ng-container>\n }\n\n <!-- Attachments -->\n @if (message?.messageAttachments?.items?.length) {\n @for (attachment of message.messageAttachments.items; track attachment?.id ?? $index) {\n @switch (getAttachmentType?.(attachment)) {\n @case ('image') {\n <div class=\"sd_waba_container_attachment_media\">\n <img class=\"sd_waba_unselectable\" [src]=\"attachment?.file?.location\" alt=\"{{ attachment?.name || attachment?.file?.key || 'Image' }}\" />\n </div>\n }\n\n @case ('video') {\n <div class=\"sd_waba_container_attachment_media\">\n <video class=\"sd_waba_unselectable\" [src]=\"attachment?.file?.location\" controls></video>\n </div>\n }\n\n @case ('audio') {\n <div class=\"sd_waba_container_attachment_audio\" [ngClass]=\"{ 'sd_waba_container_attachment_audio_outbound' : !inbound }\">\n <audio class=\"sd_waba_unselectable\" [src]=\"attachment?.file?.location\" controls></audio>\n </div>\n }\n\n @case ('document') {\n <div class=\"sd_waba_link_attachment_outer\">\n <a class=\"sd_waba_link_attachment_document\" [ngClass]=\"{ 'sd_waba_link_attachment_document_outbound' : !inbound }\" [href]=\"attachment?.file?.location\" target=\"_blank\">\n <span class=\"sd_waba_icon_attachment_document\">\n <svg height=\"45\" viewBox=\"0 0 16 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M2 0C0.9 0 0.01 0.9 0.01 2L0 18C0 19.1 0.89 20 1.99 20H14C15.1 20 16 19.1 16 18V6.83C16 6.3 15.79 5.79 15.41 5.42L10.58 0.59C10.21 0.21 9.7 0 9.17 0H2ZM9 6V1.5L14.5 7H10C9.45 7 9 6.55 9 6ZM4 10C3.44772 10 3 10.4477 3 11C3 11.5523 3.44772 12 4 12H12C12.5523 12 13 11.5523 13 11C13 10.4477 12.5523 10 12 10H4ZM10 15C10 14.4477 9.55228 14 9 14H4C3.44772 14 3 14.4477 3 15C3 15.5523 3.44772 16 4 16H9C9.55228 16 10 15.5523 10 15Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <span class=\"sd_waba_text_attachment_name\">{{ attachment?.name || \"Attachment\" }}</span>\n </a>\n </div>\n\n }\n @default { }\n }\n }\n }\n\n <!-- Location (non-templated messages) -->\n @if (location?.latitude && location?.longitude) {\n <div class=\"sd_waba_container_attachment_media\">\n <span class=\"sd_waba_trigger_location_preview\" (click)=\"openLocation(location.latitude, location.longitude)\">\n <img class=\"sd_waba_unselectable\" [src]=\"getMapPreview(location.latitude, location.longitude)\" alt=\"Location\" />\n </span>\n </div>\n @if (location?.name) { <h6>{{ location.name }}</h6> }\n @if (location?.address) { <p>{{ location.address }}</p> }\n }\n\n <!-- Contacts -->\n @if (contacts?.length) {\n <div class=\"sd_waba_container_outer_contact\">\n <div class=\"sd_waba_container_attachment_contact\">\n @for (contact of contacts ?? []; track $index) {\n <div class=\"sd_waba_container_contact_card\">\n <div class=\"sd_waba_container_contact_header\">\n <span class=\"sd_waba_icon_contact_avatar\">\n <svg width=\"16px\" viewBox=\"0 0 448 512\"><path fill=\"currentColor\" d=\"M224 248a120 120 0 1 0 0-240 120 120 0 1 0 0 240zm-29.7 56C95.8 304 16 383.8 16 482.3 16 498.7 29.3 512 45.7 512l356.6 0c16.4 0 29.7-13.3 29.7-29.7 0-98.5-79.8-178.3-178.3-178.3l-59.4 0z\"/></svg>\n </span>\n <div class=\"sd_waba_container_contact_identity\">\n <p class=\"sd_waba_text_contact_name\">{{ contact?.name?.formatted_name || contact?.name?.first_name || 'Shared contact' }}</p>\n @if (contact?.org?.company) {\n <p class=\"sd_waba_text_contact_meta\">{{ contact?.org?.company }}</p>\n }\n @if (contact?.org?.department) {\n <p class=\"sd_waba_text_contact_meta\">{{ contact?.org?.department }}</p>\n }\n </div>\n </div>\n\n <div class=\"sd_waba_container_contact_channels\">\n @if (contact?.phones?.length) {\n @for (phone of contact?.phones ?? []; track $index) {\n <div class=\"sd_waba_container_contact_channel\">\n <span class=\"sd_waba_icon_contact_channel\"><svg width=\"12px\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M160.2 25C152.3 6.1 131.7-3.9 112.1 1.4l-5.5 1.5c-64.6 17.6-119.8 80.2-103.7 156.4 37.1 175 174.8 312.7 349.8 349.8 76.3 16.2 138.8-39.1 156.4-103.7l1.5-5.5c5.4-19.7-4.7-40.3-23.5-48.1l-97.3-40.5c-16.5-6.9-35.6-2.1-47 11.8l-38.6 47.2C233.9 335.4 177.3 277 144.8 205.3L189 169.3c13.9-11.3 18.6-30.4 11.8-47L160.2 25z\"/></svg></span>\n <div class=\"sd_waba_container_contact_channel_value\">\n <span class=\"sd_waba_text_contact_value\">{{ phone?.phone || phone?.wa_id }}</span>\n @if (phone?.type || phone?.wa_id) {\n <span class=\"sd_waba_tag_contact_label\">{{ phone?.type || 'WhatsApp' }}</span>\n }\n </div>\n </div>\n }\n }\n\n @if (contact?.emails?.length) {\n @for (email of contact?.emails ?? []; track $index) {\n <div class=\"sd_waba_container_contact_channel\">\n <span class=\"sd_waba_icon_contact_channel\"><i class=\"fa-solid fa-envelope\"></i></span>\n <div class=\"sd_waba_container_contact_channel_value\">\n <span class=\"sd_waba_text_contact_value\">{{ email?.email }}</span>\n @if (email?.type) {\n <span class=\"sd_waba_tag_contact_label\">{{ email?.type }}</span>\n }\n </div>\n </div>\n }\n }\n\n @if (contact?.addresses?.length) {\n @for (address of contact?.addresses ?? []; track $index) {\n <div class=\"sd_waba_container_contact_channel\">\n <span class=\"sd_waba_icon_contact_channel\"><i class=\"fa-solid fa-location-dot\"></i></span>\n <div class=\"sd_waba_container_contact_channel_value\">\n <span class=\"sd_waba_text_contact_value\">{{ formatContactAddress(address) }}</span>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n }\n\n <!-- Errors -->\n @if (messageErrors?.length) {\n <div class=\"sd_waba_outer_container_errors\">\n <div class=\"sd_waba_container_attachment_errors\">\n <div class=\"sd_waba_container_error_header\">\n <span class=\"sd_waba_icon_error_warning\"><svg width=\"18px\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z\"/></svg></span>\n <div class=\"sd_waba_container_error_heading\">\n <p class=\"sd_waba_text_error_title\">Delivery issue</p>\n <p class=\"sd_waba_text_error_meta\">WhatsApp returned the following errors</p>\n </div>\n </div>\n\n <div class=\"sd_waba_container_error_list\">\n @for (error of messageErrors ?? []; track error?.code ?? $index) {\n <div class=\"sd_waba_container_error_item\">\n <span class=\"sd_waba_tag_error_code\">#{{ error?.code || 'N/A' }}</span>\n <div class=\"sd_waba_container_error_content\">\n <p class=\"sd_waba_text_error_message\">{{ error?.title || error?.message || 'WhatsApp error' }}</p>\n @if (getErrorDetails(error)) {\n <p class=\"sd_waba_text_error_details\">{{ getErrorDetails(error) }}</p>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Text -->\n @if (message?.body?.trim()?.length > 0) {\n <div class=\"sd_waba_text_plain_message\" [innerHTML]=\"message.body.trim() | WhatsAppTextFormatter\"></div>\n }\n\n </div>\n\n <!-- Footer row: timestamp + sent/sending for outbound -->\n <div class=\"sd_waba_container_message_meta\">\n <span class=\"sd_waba_text_message_timestamp\">{{ message?.createdAt | formatEpochTimestamp: 'medium' }}</span>\n @if (!inbound) {\n @if (message?.temp_isSending) {\n <span class=\"sd_waba_icon_status_sending\"></span>\n } @else {\n <span class=\"sd_waba_icon_status_sent\"><svg width=\"11px\" height=\"11px\" viewBox=\"0 0 448 512\"><path fill=\"currentColor\" d=\"M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z\"/></svg></span>\n }\n }\n </div>\n }\n\n <!-- Emoji bar (hover) -->\n @if (!isRestrictedToTemplateReplies) {\n <div class=\"sd_waba_container_message_reactions\" [ngClass]=\"{ 'sd_waba_align_reactions_inbound': inbound, 'sd_waba_align_reactions_outbound': !inbound }\">\n <span class=\"sd_waba_button_message_reaction\">\n <!-- keep your emoji SVG here -->\n <svg viewBox=\"0 0 15 15\" width=\"15\" fill=\"none\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M0 7.5C0 11.6305 3.36946 15 7.5 15C11.6527 15 15 11.6305 15 7.5C15 3.36946 11.6305 0 7.5 0C3.36946 0 0 3.36946 0 7.5ZM10.995 8.69333C11.1128 8.67863 11.2219 8.66503 11.3211 8.65309C11.61 8.63028 11.8076 8.91918 11.6784 9.13965C10.8573 10.6374 9.29116 11.793 7.50455 11.793C5.71794 11.793 4.15181 10.6602 3.33072 9.16246C3.18628 8.91918 3.37634 8.63028 3.66524 8.65309C3.79123 8.66749 3.93521 8.68511 4.09426 8.70457C4.94292 8.80842 6.22074 8.96479 7.48174 8.96479C8.81855 8.96479 10.1378 8.80025 10.995 8.69333ZM5.41405 7.37207C6.05761 7.37207 6.60923 6.72851 6.60923 6.02978C6.60923 5.30348 6.05761 4.6875 5.41405 4.6875C4.77048 4.6875 4.21886 5.33106 4.21886 6.02978C4.20967 6.75609 4.77048 7.37207 5.41405 7.37207ZM10.7807 6.05619C10.7807 6.74114 10.24 7.37201 9.60912 7.37201C8.97825 7.37201 8.4375 6.76818 8.4375 6.05619C8.4375 5.37124 8.97825 4.74037 9.60912 4.74037C10.24 4.74037 10.7807 5.34421 10.7807 6.05619Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n </div>\n }\n </div>\n </div>\n\n <div class=\"sd_waba_clear\"></div>\n</div>\n\n\n<ng-template #referenceMessageTemplate let-message>\n <div class=\"sd_waba_container_reference_message_outer\">\n <div class=\"sd_waba_container_reference_message\" [ngClass]=\"{ 'sd_waba_background_incoming_bgcolor': inbound, 'sd_waba_background_outgoing_bgcolor': !inbound }\">\n <p class=\"sd_waba_reference_message_from\">{{ message?.interactionAttendee?.name }}</p>\n @if (message?.attachments?.length) {\n @for (attachment of message.attachments; track attachment?.id ?? $index) {\n <div>\n @switch (getAttachmentType(attachment)) {\n @case ('image') {\n <img src=\"{{ attachment?.file?.location }}\" alt=\"{{ attachment?.name }}\">\n }\n @case ('video') {\n <i class=\"fa-solid fa-video\"></i> {{ attachment?.name }}\n }\n @case ('audio') {\n <i class=\"fa-solid fa-headphones\"></i> {{ attachment?.name }}\n }\n @default {\n <i class=\"fa-solid fa-file\"></i> {{ attachment?.name }}\n }\n }\n </div>\n }\n }\n\n @if (parseJSON(message?.metadata)?.location) {\n <p>\n <i class=\"fa-solid fa-location-dot\"></i>\n \n {{ parseJSON(message?.metadata)?.location?.name }}, {{ parseJSON(message?.metadata)?.location?.address }}\n </p>\n }\n\n @if (parseJSON(message?.metadata)?.contacts) {\n <p>\n <i class=\"fa-solid fa-circle-user\"></i>\n \n {{ parseJSON(message?.metadata)?.contacts[0]?.name?.formatted_name }}\n </p>\n }\n\n <p>{{ message.body }}</p>\n </div>\n </div>\n</ng-template>\n","import { Injectable } from '@angular/core';\n\nimport { S3Object } from '../graphql/common.model';\nimport { AppSyncGraphqlService } from './appsync-graphql.service';\n\nexport type WhatsappTemplateFile = {\n templateId: string;\n whatsappUrl: string;\n file: S3Object;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number | null;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WhatsAppTemplateFileService {\n constructor(private readonly graphqlService: AppSyncGraphqlService) {}\n\n async GetWhatsappTemplateFile(templateId: string): Promise<WhatsappTemplateFile> {\n const statement = `query GetWhatsappTemplateFile($templateId: ID!) {\n getWhatsappTemplateFile(templateId: $templateId) {\n whatsappUrl\n file {\n key\n bucket\n location\n }\n createdAt\n updatedAt\n deletedAt\n }\n }`;\n const gqlAPIServiceArguments: any = {\n templateId,\n };\n const response = await this.graphqlService.query<{\n getWhatsappTemplateFile: WhatsappTemplateFile;\n }>(statement, gqlAPIServiceArguments);\n return response.data?.getWhatsappTemplateFile as WhatsappTemplateFile;\n }\n}\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\nimport { GoogleMapsConfig } from '../../../app.config';\n\nimport moment from 'moment-timezone';\n\n@Component({\n selector: 'lib-whatsapp-template-preview',\n templateUrl: './whatsapp-template-preview.component.html',\n styleUrl: './whatsapp-template-preview.component.css',\n standalone: false,\n})\nexport class WhatsAppTemplatePreviewComponent implements OnInit {\n @Input()\n selectedMessageTemplate!: any;\n\n @Input()\n bodyTextSegments!: Array<any>;\n\n @Input()\n templateMessageFormValue!: any;\n\n @Output('close')\n closeEv = new EventEmitter<void>();\n\n @Output('submitTemplate')\n submitTemplateEv = new EventEmitter<void>();\n\n templateMessagePreviewText!: string;\n selectedMessageTemplateComponentMap: any = {};\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n if (!this.selectedMessageTemplate) return;\n\n this.templateMessagePreviewText = '';\n for (let component of this.selectedMessageTemplate.components) {\n if (component.type === 'BODY') {\n const bodyParameters = this.templateMessageFormValue.bodyParameters;\n this.bodyTextSegments.forEach((part) => {\n if (part.input) {\n this.templateMessagePreviewText += bodyParameters?.[part.index]?.text || '';\n } else {\n this.templateMessagePreviewText += part.text;\n }\n });\n }\n this.selectedMessageTemplateComponentMap[component.type] = component;\n }\n\n this.cdr.detectChanges();\n }\n\n closePopup(): void {\n this.closeEv.emit();\n }\n\n submitPopup(): void {\n this.submitTemplateEv.emit();\n }\n\n getMapPreview(latitude: string, longitude: string): string {\n return `https://maps.googleapis.com/maps/api/staticmap?center=${latitude},${longitude}&zoom=15&size=400x250&maptype=roadmap&markers=color:red%7Clabel:S%7C${latitude},${longitude}&key=${GoogleMapsConfig.apiKey}`;\n }\n\n getCurrentTime(): number {\n return moment.utc().unix();\n }\n}\n","<div class=\"sd_waba_container_popup_grey_bg sd_waba_container_padding_business\">\n <div class=\"sd_waba_container_popup_grey sd_waba_container_template_preview_popup\">\n <div class=\"sd_waba_container_template_preview_disclaimer\">\n <h3>\n You're about to use the template\n \"<span>{{ selectedMessageTemplate.name }}</span>\"\n </h3>\n <p>Make sure you review the message content before sending.</p>\n </div>\n\n <div class=\"sd_waba_container_template_popup_content\">\n <div class=\"sd_waba_container_template_popup_content_inner\">\n <div class=\"sd_waba_container_template_preview_content\">\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_preview_padding_inner\">\n <div class=\"sd_waba_container_template_preview_message_list\">\n\n <!-- Left side sample message -->\n <div class=\"sd_waba_container_message_item\">\n <div class=\"sd_waba_container_message_image sd_waba_message_image_left\">\n <svg viewBox=\"0 0 212 212\" height=\"28\" width=\"28\" preserveAspectRatio=\"xMidYMid meet\" class=\"xh8yej3 x5yr21d\" version=\"1.1\" x=\"0px\" y=\"0px\" enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\" class=\"background\" d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\"></path>\n <g>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\"></path>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\"></path>\n </g>\n </svg>\n </div>\n <div class=\"sd_waba_container_message_item_content sd_waba_message_left_content\">\n <span class=\"sd_waba_message_arrow_left\"></span>\n <div class=\"sd_waba_container_message_content sd_waba_rounded_top_left\">\n <span class=\"sd_waba_skeleton_line_full\"></span>\n <span class=\"sd_waba_skeleton_line_full sd_waba_skeleton_line_short\"></span>\n </div>\n </div>\n <div class=\"sd_waba_clear\"></div>\n </div>\n\n <!-- Right side template message -->\n <div class=\"sd_waba_container_message_item sd_waba_container_message_item_right\">\n <div class=\"sd_waba_container_message_image sd_waba_message_image_right\">\n <svg viewBox=\"0 0 212 212\" height=\"28\" width=\"28\" preserveAspectRatio=\"xMidYMid meet\" version=\"1.1\" x=\"0px\" y=\"0px\" enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\" d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\" class=\"background\"></path>\n <g>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\"></path>\n <path fill=\"#FFFFFF\" class=\"primary\" d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\"></path>\n </g>\n </svg>\n </div>\n\n <div class=\"sd_waba_container_message_item_content sd_waba_container_template_preview_popup_message_content sd_waba_message_right_content\">\n <span class=\"sd_waba_message_arrow_right\"></span>\n <div class=\"sd_waba_container_message_content sd_waba_dyn_bg_sd\">\n <!-- HEADER -->\n @if (selectedMessageTemplateComponentMap['HEADER']) {\n @switch (selectedMessageTemplateComponentMap['HEADER']?.format) {\n @case ('TEXT') {\n <h3>{{ selectedMessageTemplateComponentMap['HEADER']?.text }}</h3>\n }\n @case ('IMAGE') {\n <div class=\"sd_waba_container_template_image\">\n <img class=\"sd_waba_unselectable\" [src]=\"selectedMessageTemplateComponentMap['HEADER']?.example.header_handle[0]\" alt=\"{{ selectedMessageTemplateComponentMap['HEADER']?.example.header_handle[0] }}\" />\n </div>\n }\n @case ('VIDEO') {\n <div class=\"sd_waba_upload_container_sd\">\n <video class=\"sd_waba_unselectable\" [src]=\"selectedMessageTemplateComponentMap['HEADER']?.example.header_handle[0]\"></video>\n </div>\n }\n @case ('DOCUMENT') {\n <div class=\"sd_waba_upload_container_sd\">\n <a [href]=\"selectedMessageTemplateComponentMap['HEADER']?.example.header_handle[0]\" target=\"_blank\">\n <i class=\"fa-regular fa-file\"></i>\n </a>\n </div>\n }\n @case ('LOCATION') {\n <div class=\"sd_waba_upload_container_sd\">\n <img class=\"sd_waba_unselectable sd_waba_location_preview_image\" [src]=\"getMapPreview(\n templateMessageFormValue?.location?.latitude,\n templateMessageFormValue?.location?.longitude\n )\" alt=\"Location\" />\n <p><b>{{ templateMessageFormValue?.location?.name }}</b></p>\n <p>{{ templateMessageFormValue?.location?.address }}</p>\n </div>\n }\n @default {\n Unsupported header format: {{ selectedMessageTemplateComponentMap['HEADER']?.format }}\n }\n }\n }\n\n <!-- BODY -->\n @if (templateMessagePreviewText.length > 0) {\n <p [innerHTML]=\"templateMessagePreviewText | WhatsAppTextFormatter\"></p>\n }\n\n <!-- FOOTER -->\n @if (selectedMessageTemplateComponentMap['FOOTER']) {\n <div class=\"sd_waba_container_selected_template_form_footer\">\n <div class=\"sd_waba_footer_text_sd\">\n {{ selectedMessageTemplateComponentMap['FOOTER']?.text }}\n </div>\n </div>\n\n <div class=\"sd_waba_message_timestamp_container\">\n <label class=\"sd_waba_message_timestamp_preview\">\n {{ getCurrentTime() | formatEpochTimestamp : 'medium' }}\n </label>\n </div>\n }\n\n <!-- BUTTONS -->\n @if (selectedMessageTemplateComponentMap['BUTTONS']) {\n <div class=\"sd_waba_container_selected_template_form_buttons\">\n @for (button of selectedMessageTemplateComponentMap['BUTTONS']?.buttons ?? []; track $index) {\n @switch (button?.type) {\n @case ('COPY_CODE') {\n <button type=\"button\">\n <i class=\"fa-regular fa-copy\"></i> {{ button?.text }}\n </button>\n }\n @case ('PHONE_NUMBER') {\n <button type=\"button\">\n <i class=\"fa-solid fa-phone\"></i> {{ button?.text }} - {{ button?.phone_number }}\n </button>\n }\n @case ('QUICK_REPLY') {\n <button type=\"button\">\n <i class=\"fa-regular fa-reply\"></i> {{ button?.text }}\n </button>\n }\n @case ('URL') {\n <a [href]=\"button?.url\" target=\"_blank\" class=\"sd_waba_button_web_link\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Go to {{ button?.text }}\n </a>\n }\n @default {\n <button type=\"button\">{{ button?.text }}</button>\n }\n }\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Bottom buttons -->\n <div class=\"sd_waba_container_bottom_buttons\">\n <div class=\"sd_waba_container_selected_template_buttons_right\">\n <ul>\n <li>\n <button type=\"button\" class=\"sd_waba_button_cancel_preview\" (click)=\"closePopup()\">Cancel</button>\n </li>\n <li>\n <button type=\"submit\" class=\"sd_waba_button_submit\" (click)=\"submitPopup()\">Send</button>\n <!-- <button type=\"submit\" class=\"sd_waba_button_submit\" (click)=\"submitPopup()\"\n [ngClass]=\"{ 'button_submit_disabled' : showSubmitLoader }\"\n [disabled]=\"showSubmitLoader\">\n <span *ngIf=\"!showSubmitLoader else showSubmitLoaderTemplate\">Send</span>\n <ng-template #showSubmitLoaderTemplate>\n <span class=\"sd_waba_button_submit_loader\"></span>\n </ng-template>\n </button> -->\n </li>\n </ul>\n </div>\n </div>\n </div>\n\n <div class=\"sd_waba_clear\"></div>\n </div>\n</div>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n OnDestroy,\n Output,\n Renderer2,\n ViewChild,\n} from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { CustomValidators } from '@snugdesk/core';\nimport { GoogleMapsConfig } from '../../../../app.config';\n\ndeclare const google: any;\n\n@Component({\n selector: 'lib-location-input',\n templateUrl: './location-input.component.html',\n styleUrls: ['./location-input.component.css'],\n standalone: false,\n})\nexport class LocationInputComponent implements AfterViewInit, OnDestroy {\n @Output('close')\n closeEv = new EventEmitter<void>();\n\n @Output('submitLocation')\n submitLocationEv = new EventEmitter<{\n latitude: number;\n longitude: number;\n }>();\n\n @ViewChild('mapContainer', { static: false })\n mapContainer!: ElementRef<HTMLDivElement>;\n @ViewChild('searchInput', { static: false })\n searchInput!: ElementRef<HTMLInputElement>;\n\n private autocomplete!: any;\n\n currentLatitude!: number;\n currentLongitude!: number;\n\n map: any;\n primaryMarker: any; // single draggable marker\n resultMarkers: any[] = []; // non-draggable search result markers\n infoWindow: any;\n placesService: any;\n\n selectedLatitude!: number;\n selectedLongitude!: number;\n\n searchLocationForm: FormGroup;\n\n private destroyed = false;\n private mapsScriptLoading?: Promise<void>;\n\n constructor(\n private el: ElementRef,\n private renderer: Renderer2,\n private formBuilder: FormBuilder,\n private snackBar: MatSnackBar\n ) {\n this.searchLocationForm = this.formBuilder.group({\n text: ['', [Validators.required, CustomValidators.whitespace]],\n });\n }\n\n async ngAfterViewInit(): Promise<void> {\n try {\n await this.loadGoogleMapsScriptOnce();\n await this.ensureMapsCoreReady();\n\n // Ensure container has some height so the map renders\n const el = this.mapContainer?.nativeElement;\n if (\n el &&\n (el.offsetHeight || parseFloat(getComputedStyle(el).height || '0')) < 50\n ) {\n el.style.minHeight = '320px';\n }\n\n // Current location\n const position = await this.getCurrentLocation();\n if (this.destroyed) return;\n\n this.currentLatitude = position.coords.latitude;\n this.currentLongitude = position.coords.longitude;\n\n const center = { lat: this.currentLatitude, lng: this.currentLongitude };\n this.setSelected(center.lat, center.lng);\n\n // Map\n this.map = new google.maps.Map(this.mapContainer.nativeElement, {\n center,\n zoom: 15,\n });\n\n // Primary draggable marker\n this.primaryMarker = new google.maps.Marker({\n position: center,\n map: this.map,\n draggable: true,\n title: 'Drag me!',\n });\n\n // Drag -> update selection\n this.primaryMarker.addListener('dragend', (event: any) => {\n if (!event?.latLng) return;\n const { lat, lng } = this.latLngToNumbers(event.latLng);\n this.setSelected(lat, lng);\n });\n\n // Click map -> move primary + select\n this.map.addListener('click', (e: any) => {\n if (!e?.latLng) return;\n const { lat, lng } = this.latLngToNumbers(e.latLng);\n this.primaryMarker.setPosition({ lat, lng });\n this.map.panTo({ lat, lng });\n this.setSelected(lat, lng);\n });\n\n this.infoWindow = new google.maps.InfoWindow();\n\n // PlacesService for Text Search and Details\n if (google?.maps?.places?.PlacesService) {\n this.placesService = new google.maps.places.PlacesService(this.map);\n }\n\n // Autocomplete (no types/country restrictions -> broader results like Google Maps)\n if (\n google?.maps?.places?.Autocomplete &&\n this.searchInput?.nativeElement\n ) {\n this.autocomplete = new google.maps.places.Autocomplete(\n this.searchInput.nativeElement,\n {\n fields: ['place_id', 'geometry', 'name', 'formatted_address'],\n }\n );\n // Do NOT bind to bounds for broader suggestions\n // this.autocomplete.bindTo('bounds', this.map);\n\n this.autocomplete.addListener('place_changed', () => {\n const place = this.autocomplete.getPlace();\n if (!place) return;\n\n const moveTo = (latLng: any, title?: string) => {\n const lat =\n typeof latLng.lat === 'function' ? latLng.lat() : latLng.lat;\n const lng =\n typeof latLng.lng === 'function' ? latLng.lng() : latLng.lng;\n this.primaryMarker.setPosition({ lat, lng });\n this.map.setCenter({ lat, lng });\n this.map.setZoom(16);\n this.setSelected(lat, lng);\n if (this.infoWindow) {\n this.infoWindow.setContent(\n title || place.formatted_address || place.name || ''\n );\n this.infoWindow.open(this.map, this.primaryMarker);\n }\n };\n\n if (place.geometry?.location) {\n moveTo(place.geometry.location, place.name);\n return;\n }\n\n if (place.place_id && this.placesService?.getDetails) {\n this.placesService.getDetails(\n {\n placeId: place.place_id,\n fields: ['geometry', 'name', 'formatted_address'],\n },\n (p: any, status: any) => {\n if (\n status === google.maps.places.PlacesServiceStatus.OK &&\n p?.geometry?.location\n ) {\n moveTo(p.geometry.location, p.name);\n }\n }\n );\n }\n });\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(\n 'Oops! We encountered an error. Please try again.',\n 'Close',\n {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n }\n );\n }\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n }\n\n // --- UI actions ---\n onSearch(evt: Event): void {\n evt?.preventDefault();\n evt?.stopPropagation();\n this.findPlace();\n }\n\n setCurrentLocation(): void {\n if (!this.map || !this.primaryMarker) return;\n\n // Clear only result markers; keep the primary marker\n this.clearResultMarkers();\n\n const myLatLng = { lat: this.currentLatitude, lng: this.currentLongitude };\n this.primaryMarker.setPosition(myLatLng);\n this.setSelected(myLatLng.lat, myLatLng.lng);\n this.map.setCenter(myLatLng);\n }\n\n selectLocation(): void {\n this.submitLocationEv.emit({\n latitude: this.selectedLatitude,\n longitude: this.selectedLongitude,\n });\n }\n\n close(): void {\n this.closeEv.emit();\n }\n\n // --- Search: prefer Text Search, then new searchByText, then findPlaceFromQuery ---\n async findPlace(): Promise<void> {\n if (this.searchLocationForm.invalid || !this.map) return;\n\n const textQuery = (this.searchLocationForm.value.text || '').trim();\n if (!textQuery) return;\n\n try {\n // Clear ONLY result markers before a new search\n this.clearResultMarkers();\n\n // Helpers\n const centerOnLatLng = (lat: number, lng: number, title?: string) => {\n this.primaryMarker.setPosition({ lat, lng });\n this.map.setCenter({ lat, lng });\n this.map.setZoom(16);\n this.setSelected(lat, lng);\n if (title) {\n this.infoWindow?.setContent(title);\n this.infoWindow?.open(this.map, this.primaryMarker);\n }\n };\n\n const addResultMarker = (pos: any, title: string) => {\n const marker = new google.maps.Marker({\n map: this.map,\n position: pos,\n title: title || '',\n });\n this.resultMarkers.push(marker);\n marker.addListener('click', () => {\n const lat = typeof pos.lat === 'function' ? pos.lat() : pos.lat;\n const lng = typeof pos.lng === 'function' ? pos.lng() : pos.lng;\n this.primaryMarker.setPosition({ lat, lng });\n this.map.panTo({ lat, lng });\n this.setSelected(lat, lng);\n this.infoWindow?.setContent(title || '');\n this.infoWindow?.open(this.map, marker);\n });\n };\n\n const tryFindPlaceFromQuery = async (): Promise<void> =>\n new Promise<void>((resolve) => {\n if (!this.placesService?.findPlaceFromQuery) return resolve();\n const req = { query: textQuery, fields: ['name', 'geometry'] };\n this.placesService.findPlaceFromQuery(\n req,\n (results: any[], status: any) => {\n if (\n status === google.maps.places.PlacesServiceStatus.OK &&\n results?.length\n ) {\n const first = results[0];\n if (first.geometry?.location) {\n const lat = first.geometry.location.lat();\n const lng = first.geometry.location.lng();\n centerOnLatLng(lat, lng, first.name);\n }\n for (const place of results) {\n if (!place.geometry?.location) continue;\n addResultMarker(place.geometry.location, place.name || '');\n }\n }\n resolve();\n }\n );\n });\n\n const trySearchByText = async (): Promise<void> => {\n const Place = google?.maps?.places?.Place as any;\n if (!(Place && typeof Place.searchByText === 'function')) {\n await tryFindPlaceFromQuery();\n return;\n }\n const request: any = { textQuery, fields: ['displayName', 'location'] };\n const { places } = await Place.searchByText(request);\n if (places?.length) {\n const first = places[0];\n if (first.location) {\n const { lat, lng } = this.latLngishToNumbers(first.location);\n centerOnLatLng(lat, lng, first.displayName || '');\n }\n for (const p of places) {\n if (!p.location) continue;\n addResultMarker(p.location, p.displayName || '');\n }\n } else {\n await tryFindPlaceFromQuery();\n }\n };\n\n // 1) Prefer Text Search for broad matching (businesses + addresses)\n if (this.placesService?.textSearch) {\n this.placesService.textSearch(\n { query: textQuery },\n async (results: any[], status: any) => {\n if (\n status === google.maps.places.PlacesServiceStatus.OK &&\n results?.length\n ) {\n const first = results[0];\n if (first.geometry?.location) {\n const lat = first.geometry.location.lat();\n const lng = first.geometry.location.lng();\n centerOnLatLng(lat, lng, first.name);\n }\n for (const place of results) {\n if (!place.geometry?.location) continue;\n addResultMarker(place.geometry.location, place.name || '');\n }\n } else {\n // 2) Fallback to new Places API searchByText\n await trySearchByText();\n }\n }\n );\n return;\n }\n\n // If Text Search not available, try new Places API next\n await trySearchByText();\n\n if (!this.resultMarkers.length) {\n this.snackBar.open('No results found for your search.', 'Close', {\n duration: 3500,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open('Search failed. Please try again.', 'Close', {\n duration: 4000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n }\n }\n\n // --- Helpers ---\n private setSelected(lat: number, lng: number): void {\n this.selectedLatitude = lat;\n this.selectedLongitude = lng;\n }\n\n private clearResultMarkers(): void {\n for (const m of this.resultMarkers) {\n try {\n m.setMap(null);\n } catch {}\n }\n this.resultMarkers = [];\n }\n\n private latLngToNumbers(latLng: any): { lat: number; lng: number } {\n return {\n lat: typeof latLng.lat === 'function' ? latLng.lat() : latLng.lat,\n lng: typeof latLng.lng === 'function' ? latLng.lng() : latLng.lng,\n };\n }\n\n private latLngishToNumbers(input: any): { lat: number; lng: number } {\n if (input && typeof input.lat === 'function') {\n return { lat: input.lat(), lng: input.lng() };\n }\n return { lat: input.lat, lng: input.lng };\n }\n\n private async loadGoogleMapsScriptOnce(): Promise<void> {\n // Already loaded?\n if (typeof window !== 'undefined' && (window as any).google?.maps?.Map)\n return;\n if (this.mapsScriptLoading) return this.mapsScriptLoading;\n\n const apiKey = GoogleMapsConfig.apiKey; // from your app.config\n const src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&v=weekly&libraries=places&loading=async`;\n\n this.mapsScriptLoading = new Promise<void>((resolve, reject) => {\n const finishWhenReady = () => {\n const ready =\n (window as any).google?.maps &&\n typeof (window as any).google.maps.Map === 'function';\n if (ready) resolve();\n else setTimeout(finishWhenReady, 50);\n };\n\n // If any Google Maps script tag exists, poll until ready\n if (\n document.querySelector(\n 'script[src^=\"https://maps.googleapis.com/maps/api/js\"]'\n )\n ) {\n finishWhenReady();\n return;\n }\n\n const script = this.renderer.createElement('script');\n script.type = 'text/javascript';\n script.src = src;\n script.async = true;\n script.defer = true;\n script.onload = finishWhenReady;\n script.onerror = () =>\n reject(new Error('Failed to load Google Maps JS API'));\n\n // Append inside this component element (per your preference)\n this.renderer.appendChild(this.el.nativeElement, script);\n });\n\n return this.mapsScriptLoading;\n }\n\n private async ensureMapsCoreReady(): Promise<void> {\n const maxWaitMs = 4000;\n const start = Date.now();\n while (!(google?.maps && typeof google.maps.Map === 'function')) {\n if (Date.now() - start > maxWaitMs) break;\n await new Promise((r) => setTimeout(r, 30));\n }\n if (!(google?.maps && typeof google.maps.Map === 'function')) {\n throw new Error(\n 'Google Maps core not ready (Map constructor unavailable).'\n );\n }\n }\n\n private getCurrentLocation(): Promise<GeolocationPosition> {\n return new Promise((resolve, reject) => {\n if (!navigator.geolocation) {\n reject(new Error('Geolocation is not supported by this browser.'));\n return;\n }\n navigator.geolocation.getCurrentPosition(resolve, reject, {\n enableHighAccuracy: true,\n timeout: 15000,\n });\n });\n }\n}\n","<div class=\"sd_waba_container_popup_grey_bg sd_waba_container_padding_business\">\n <div class=\"sd_waba_container_popup_grey sd_waba_container_template_popup\">\n <div class=\"sd_waba_header_area_top\">\n <h2>Select Location</h2>\n <div class=\"sd_waba_close_right_top\">\n <span title=\"Close\" (click)=\"close()\">\n <svg class=\"svg-inline--fa fa-xmark\" aria-hidden=\"true\" width=\"18px\" focusable=\"false\" viewBox=\"0 0 384 512\">\n <path fill=\"currentColor\"\n d=\"M326.6 166.6L349.3 144 304 98.7l-22.6 22.6L192 210.7l-89.4-89.4L80 98.7 34.7 144l22.6 22.6L146.7 256 57.4 345.4 34.7 368 80 413.3l22.6-22.6L192 301.3l89.4 89.4L304 413.3 349.3 368l-22.6-22.6L237.3 256l89.4-89.4z\">\n </path>\n </svg>\n </span>\n </div>\n </div>\n\n <div class=\"sd_waba_container_search\">\n <form class=\"sd_waba_search_location_form\" [formGroup]=\"searchLocationForm\" (ngSubmit)=\"onSearch($event)\">\n <div class=\"sd_waba_search_area_templates\">\n <button type=\"button\" class=\"sd_waba_search_icon\" title=\"Search\" (click)=\"findPlace()\" (mousedown)=\"$event.preventDefault()\">\n <svg viewBox=\"0 0 20 20\" height=\"18\" width=\"18\" fill=\"none\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4.36653 4.3664C5.36341 3.36953 6.57714 2.87 8.00012 2.87C9.42309 2.87 10.6368 3.36953 11.6337 4.3664C12.6306 5.36329 13.1301 6.57724 13.1301 8.00062C13.1301 8.57523 13.0412 9.11883 12.8624 9.63057C12.6972 10.1038 12.4733 10.5419 12.1909 10.9444L16.5712 15.3247C16.7454 15.4989 16.8385 15.7046 16.8385 15.9375C16.8385 16.1704 16.7454 16.3761 16.5712 16.5503C16.396 16.7254 16.1866 16.8175 15.948 16.8175C15.7095 16.8175 15.5001 16.7254 15.3249 16.5503L10.9448 12.1906C10.5421 12.4731 10.104 12.697 9.63069 12.8623C9.11895 13.041 8.57535 13.13 8.00074 13.13C6.57736 13.13 5.36341 12.6305 4.36653 11.6336C3.36965 10.6367 2.87012 9.42297 2.87012 8C2.87012 6.57702 3.36965 5.36328 4.36653 4.3664ZM8.00012 4.63C7.06198 4.63 6.26877 4.95685 5.61287 5.61275C4.95698 6.26865 4.63012 7.06186 4.63012 8C4.63012 8.93813 4.95698 9.73134 5.61287 10.3872C6.26877 11.0431 7.06198 11.37 8.00012 11.37C8.93826 11.37 9.73146 11.0431 10.3874 10.3872C11.0433 9.73134 11.3701 8.93813 11.3701 8C11.3701 7.06186 11.0433 6.26865 10.3874 5.61275C9.73146 4.95685 8.93826 4.63 8.00012 4.63Z\" fill=\"currentColor\"></path></svg>\n </button>\n <input formControlName=\"text\" type=\"text\" placeholder=\"Search for a location\" #searchInput />\n </div>\n </form>\n <button class=\"sd_waba_current_location_btn\" type=\"button\" (click)=\"setCurrentLocation()\">\n <i class=\"fa-solid fa-location-crosshairs\"></i> Current Location\n </button>\n </div>\n\n <div class=\"sd_waba_container_template_popup_content\">\n <div class=\"sd_waba_container_template_popup_content_inner\">\n <div class=\"sd_waba_container_inner_outer\">\n <div class=\"sd_waba_container_map\">\n <div id=\"map\" #mapContainer></div>\n </div>\n </div>\n </div>\n\n <div class=\"sd_waba_container_bottom_buttons\">\n <div class=\"container_selected_template_buttons\">\n <div class=\"sd_waba_container_submit_btn\">\n <button type=\"button\" class=\"sd_waba_add_btn\" (click)=\"selectLocation()\">\n Add Location\n </button>\n </div>\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { HttpClient } from '@angular/common/http';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { lastValueFrom } from 'rxjs';\n\nimport { CleanDeep, CustomValidators } from '@snugdesk/core';\nimport { GoogleMapsConfig } from '../../../app.config';\nimport { InteractionWidget } from '../../services/interaction-widget.service';\nimport { WhatsAppHelperService } from '../../services/whatsapp-helper.service';\nimport { WhatsAppTemplateFileService } from '../../services/whatsapp-template-file.service';\n\n@Component({\n selector: 'lib-whatsapp-templates',\n templateUrl: './whatsapp-templates.component.html',\n styleUrls: ['./whatsapp-templates.component.css'],\n standalone: false,\n})\nexport class WhatsAppTemplatesComponent implements OnInit {\n @Input('whatsAppInteractionWidget')\n whatsAppInteractionWidget!: InteractionWidget;\n\n @Output('close')\n closeEv = new EventEmitter<void>();\n\n @Output('submitTemplate')\n submitTemplateEv = new EventEmitter<Object>();\n\n showTemplatesLoader: boolean = false;\n messageTemplates: any = [];\n selectedMessageTemplate!: any;\n\n searchQuery: string = '';\n\n templateMessageForm!: FormGroup;\n bodyTextSegments: Array<any> = [];\n\n showLocationPopup: boolean = false;\n showTemplatePreviewPopup: boolean = false;\n\n isFormSubmitted: boolean = false;\n\n get bodyParameters(): FormArray {\n return this.templateMessageForm.get('bodyParameters') as FormArray;\n }\n\n get bodyParameterGroups(): FormGroup[] {\n return this.bodyParameters.controls as FormGroup[];\n }\n\n constructor(private cdr: ChangeDetectorRef, private httpClient: HttpClient, private formBuilder: FormBuilder, private snackBar: MatSnackBar, private waHelperService: WhatsAppHelperService, private whatsappTemplateFileService: WhatsAppTemplateFileService) {\n this.templateMessageForm = this.formBuilder.group({\n bodyParameters: this.formBuilder.array([]),\n });\n }\n\n async ngOnInit(): Promise<void> {\n this.messageTemplates = [];\n\n this.showTemplatesLoader = true;\n try {\n const { businessAccountId, accessToken } = JSON.parse(this.whatsAppInteractionWidget?.configuration || '{}');\n if (!businessAccountId || !accessToken) {\n throw new Error('WhatsApp Business Account not configured');\n }\n\n const res_listMessageTemplates: any = await this.waHelperService.listMessageTemplates(businessAccountId, accessToken);\n // console.debug('res_listMessageTemplates: ', res_listMessageTemplates);\n\n this.messageTemplates = res_listMessageTemplates || [];\n\n // select the first approved template\n for (const template of this.messageTemplates) {\n if (template.status?.trim().toUpperCase() === 'APPROVED') {\n this.setSelectedMessageTemplate(template);\n break;\n }\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch WhatsApp templates`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showTemplatesLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n setSelectedMessageTemplate(template: any): void {\n if (template.status !== 'APPROVED') return;\n\n // reset\n this.isFormSubmitted = false;\n this.templateMessageForm.reset();\n this.bodyTextSegments = [];\n this.bodyParameters.clear();\n\n this.showLocationPopup = false;\n this.showTemplatePreviewPopup = false;\n\n this.selectedMessageTemplate = template;\n this.setMessageTemplateComponents(template.components);\n\n // console.debug('templateMessageForm: ', this.templateMessageForm);\n // console.debug('bodyTextSegments: ', this.bodyTextSegments);\n // console.debug('bodyParameters: ', this.bodyParameters);\n // console.debug('bodyParameterGroups: ', this.bodyParameterGroups);\n this.cdr.detectChanges();\n }\n\n setMessageTemplateComponents(templateComponents: any[]) {\n if (!templateComponents || templateComponents.length === 0) return;\n\n templateComponents.forEach((templateComponent) => {\n switch (templateComponent.type) {\n case 'BODY': {\n this.bodyTextSegments = this.splitTemplateText(templateComponent);\n const bodyTextExamples = templateComponent.example?.body_text?.[0] || [];\n for (let _ of bodyTextExamples) {\n this.bodyParameters.push(\n this.formBuilder.group({\n type: ['body'],\n text: ['', Validators.required],\n })\n );\n }\n break;\n }\n\n case 'HEADER': {\n const headerFormat = templateComponent.format;\n const headerExample = templateComponent.example;\n\n if (['IMAGE', 'VIDEO', 'DOCUMENT'].includes(headerFormat)) {\n const media = headerExample?.header_handle?.[0];\n if (media) {\n if (!this.templateMessageForm.contains('mediaUrl')) {\n this.templateMessageForm.addControl('mediaUrl', this.formBuilder.control(media, CustomValidators.whitespace));\n } else {\n this.templateMessageForm.patchValue({ mediaUrl: media });\n }\n }\n }\n\n if (headerFormat === 'LOCATION') {\n if (!this.templateMessageForm.contains('location')) {\n this.templateMessageForm.addControl(\n 'location',\n this.formBuilder.group({\n name: [''],\n address: [''],\n latitude: ['', Validators.required],\n longitude: ['', Validators.required],\n })\n );\n }\n }\n break;\n }\n\n case 'BUTTONS': {\n const buttons = templateComponent.buttons || [];\n for (const button of buttons) {\n const example = button.example?.[0] || '';\n switch (button.type) {\n case 'COPY_CODE':\n if (example) {\n if (!this.templateMessageForm.contains('couponCode')) {\n this.templateMessageForm.addControl('couponCode', this.formBuilder.control(example, CustomValidators.whitespace));\n } else {\n this.templateMessageForm.patchValue({\n couponCode: example,\n });\n }\n }\n break;\n case 'PHONE_NUMBER':\n this.bodyParameters.push(\n this.formBuilder.group({\n type: ['phone'],\n index: [button.index ?? 0],\n phoneNumber: [example, Validators.required],\n text: [button.text || '', Validators.required],\n })\n );\n break;\n case 'URL':\n this.bodyParameters.push(\n this.formBuilder.group({\n type: ['url'],\n index: [button.index ?? 0],\n url: [example, Validators.required],\n text: [button.text || '', Validators.required],\n })\n );\n break;\n case 'QUICK_REPLY':\n this.bodyParameters.push(\n this.formBuilder.group({\n type: ['quick_reply'],\n index: [button.index ?? 0],\n text: [button.text || '', Validators.required],\n })\n );\n break;\n }\n }\n break;\n }\n }\n });\n }\n\n splitTemplateText(component: any): any[] {\n const regex = /{{(\\d+)}}/g;\n let lastIndex = 0;\n let match: any;\n let inputIndex = 0;\n\n const text = component.text;\n const messageTemplateParts: any[] = [];\n\n while ((match = regex.exec(text)) !== null) {\n const textPart = text.substring(lastIndex, match.index);\n if (textPart) {\n messageTemplateParts.push({ text: textPart, input: false });\n }\n\n messageTemplateParts.push({\n text: '',\n input: true,\n index: inputIndex,\n placeholder: component?.example?.body_text[0][inputIndex],\n });\n\n inputIndex++;\n lastIndex = regex.lastIndex;\n }\n\n const remainingText = text.substring(lastIndex);\n if (remainingText) {\n messageTemplateParts.push({ text: remainingText, input: false });\n }\n\n return messageTemplateParts;\n }\n\n closePopup(): void {\n this.closeEv.emit();\n }\n\n openMessageTemplatePreviewPopup(): void {\n // console.debug('templateMessageForm: ', this.templateMessageForm);\n this.isFormSubmitted = true;\n this.templateMessageForm.markAllAsTouched();\n\n if (this.templateMessageForm.invalid) {\n // console.warn('Invalid form submission: ', this.templateMessageForm);\n return;\n }\n\n this.showTemplatePreviewPopup = true;\n this.cdr.detectChanges();\n }\n\n closeTemplatePreviewPopup(): void {\n this.showTemplatePreviewPopup = false;\n this.cdr.detectChanges();\n }\n\n async handleSubmitTemplatePreviewPopup(): Promise<void> {\n const { mediaUrl, couponCode, location, bodyParameters } = this.templateMessageForm.value;\n\n // Fetch uploaded media URL if applicable\n let resolvedMediaUrl = '';\n if (mediaUrl?.length > 0) {\n const res_getTemplateFile = await this.whatsappTemplateFileService.GetWhatsappTemplateFile(this.selectedMessageTemplate.id);\n // console.debug('res_getTemplateFile:', res_getTemplateFile);\n\n if (!res_getTemplateFile.file?.location) {\n throw new Error('File location not found');\n }\n\n resolvedMediaUrl = res_getTemplateFile.file.location;\n }\n\n // Emit final cleaned payload\n this.submitTemplateEv.emit(\n CleanDeep.clean({\n template: this.selectedMessageTemplate,\n bodyTextSegments: this.bodyTextSegments,\n bodyParameters,\n mediaUrl: resolvedMediaUrl,\n location,\n couponCode,\n })\n );\n }\n\n openLocationPopup(): void {\n this.showLocationPopup = true;\n this.cdr.detectChanges();\n }\n\n closeLocationPopup(): void {\n this.showLocationPopup = false;\n this.cdr.detectChanges();\n }\n\n async handleLocationSelection(event: any): Promise<void> {\n try {\n const geocodeUrl = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${event.latitude},${event.longitude}&key=${GoogleMapsConfig.apiKey}`;\n const res_getGeolocation: any = await lastValueFrom(this.httpClient.get(geocodeUrl));\n\n const locationGroup = this.templateMessageForm.get('location') as FormGroup;\n if (locationGroup) {\n locationGroup.patchValue({\n latitude: event.latitude,\n longitude: event.longitude,\n address: res_getGeolocation.results?.[0]?.formatted_address,\n });\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not get location`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showLocationPopup = false;\n this.cdr.detectChanges();\n }\n }\n\n getMapPreview(latitude: string, longitude: string): string {\n return `https://maps.googleapis.com/maps/api/staticmap?center=${latitude},${longitude}&zoom=15&size=400x250&maptype=roadmap&markers=color:red%7Clabel:S%7C${latitude},${longitude}&key=${GoogleMapsConfig.apiKey}`;\n }\n}\n","<div class=\"sd_waba_container_popup_grey_bg sd_waba_container_padding_business\">\n <div class=\"sd_waba_container_popup_grey sd_waba_container_template_popup\">\n <div class=\"sd_waba_container_template_popup_button_close\">\n <span title=\"Close\" (click)=\"closePopup()\">\n <svg class=\"svg-inline--fa fa-xmark\" aria-hidden=\"true\" width=\"18px\" focusable=\"false\" data-prefix=\"fass\" data-icon=\"xmark\"\n role=\"img\" viewBox=\"0 0 384 512\" data-fa-i2svg=\"\">\n <path fill=\"currentColor\"\n d=\"M326.6 166.6L349.3 144 304 98.7l-22.6 22.6L192 210.7l-89.4-89.4L80 98.7 34.7 144l22.6 22.6L146.7 256 57.4 345.4 34.7 368 80 413.3l22.6-22.6L192 301.3l89.4 89.4L304 413.3 349.3 368l-22.6-22.6L237.3 256l89.4-89.4z\">\n </path>\n </svg>\n </span>\n </div>\n <div class=\"sd_waba_container_template_popup_header\">\n <h2>WhatsApp message templates</h2>\n </div>\n <div class=\"sd_waba_container_template_popup_content\">\n <div class=\"sd_waba_container_template_popup_content_inner\">\n <div class=\"sd_waba_container_inner_outer\">\n<div class=\"sd_waba_left_container_st_content\">\n <div class=\"sd_waba_container_template_search\">\n <span class=\"sd_waba_icon_search\">\n <svg viewBox=\"0 0 20 20\" height=\"18\" width=\"18\" fill=\"none\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4.36653 4.3664C5.36341 3.36953 6.57714 2.87 8.00012 2.87C9.42309 2.87 10.6368 3.36953 11.6337 4.3664C12.6306 5.36329 13.1301 6.57724 13.1301 8.00062C13.1301 8.57523 13.0412 9.11883 12.8624 9.63057C12.6972 10.1038 12.4733 10.5419 12.1909 10.9444L16.5712 15.3247C16.7454 15.4989 16.8385 15.7046 16.8385 15.9375C16.8385 16.1704 16.7454 16.3761 16.5712 16.5503C16.396 16.7254 16.1866 16.8175 15.948 16.8175C15.7095 16.8175 15.5001 16.7254 15.3249 16.5503L10.9448 12.1906C10.5421 12.4731 10.104 12.697 9.63069 12.8623C9.11895 13.041 8.57535 13.13 8.00074 13.13C6.57736 13.13 5.36341 12.6305 4.36653 11.6336C3.36965 10.6367 2.87012 9.42297 2.87012 8C2.87012 6.57702 3.36965 5.36328 4.36653 4.3664ZM8.00012 4.63C7.06198 4.63 6.26877 4.95685 5.61287 5.61275C4.95698 6.26865 4.63012 7.06186 4.63012 8C4.63012 8.93813 4.95698 9.73134 5.61287 10.3872C6.26877 11.0431 7.06198 11.37 8.00012 11.37C8.93826 11.37 9.73146 11.0431 10.3874 10.3872C11.0433 9.73134 11.3701 8.93813 11.3701 8C11.3701 7.06186 11.0433 6.26865 10.3874 5.61275C9.73146 4.95685 8.93826 4.63 8.00012 4.63Z\" fill=\"currentColor\"></path></svg>\n </span>\n <input type=\"text\" placeholder=\"Type to search...\" [(ngModel)]=\"searchQuery\">\n </div>\n @if (showTemplatesLoader) {\n <div class=\"sd_waba_container_template_loader\">\n @for (i of [].constructor(9); track $index) {\n <div class=\"sd_waba_container_skeleton_loader\">\n <ngx-skeleton-loader\n [theme]=\"{ 'width': '250px', 'height': '13px', 'margin': '0px 0px 0px 15px', 'background-color': '#d9d9d9' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n </div>\n }\n </div>\n } @else {\n <div class=\"sd_waba_container_template_list\">\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n @let searchResults = messageTemplates | SearchFilter: 'name': searchQuery.trim();\n @if (!messageTemplates || !searchResults || searchResults?.length === 0) {\n <div class=\"sd_waba_container_no_results\">\n <div class=\"sd_waba_container_no_results_inner\">\n <div class=\"sd_waba_container_icon_no_results\">\n <img src=\"https://assets.snugdesk.com/images/no_result_found.png\" alt=\"No results found\">\n </div>\n <h4>No result found</h4>\n <p>\n {{ messageTemplates?.length > 0 ? \"Try changing your keywords or filters to find what you're looking for!\" : \"Looks like you haven't created any message templates yet.\" }}\n </p>\n </div>\n </div>\n } @else {\n <ul>\n @for (template of searchResults; track template?.id || $index) {\n <li\n [ngClass]=\"{ 'sd_waba_template_selected' : selectedMessageTemplate?.id === template?.id, 'sd_waba_disabled' : template.status !== 'APPROVED' }\"\n (click)=\"setSelectedMessageTemplate(template)\">\n <span class=\"sd_waba_template_icon\">\n <svg viewBox=\"0 0 576 512\" width=\"15px\"><path fill=\"currentColor\" d=\"M144 56c0 13.3-10.7 24-24 24-22.1 0-40 17.9-40 40 0 13.3-10.7 24-24 24s-24-10.7-24-24c0-48.6 39.4-88 88-88 13.3 0 24 10.7 24 24zM32 216c0-13.3 10.7-24 24-24s24 10.7 24 24l0 80c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-80zM56 368c13.3 0 24 10.7 24 24 0 22.1 17.9 40 40 40l122.7 0c2.8 16.8 7.8 32.9 14.8 48L120 480c-48.6 0-88-39.4-88-88 0-13.3 10.7-24 24-24zM480 214c-15.3-3.9-31.4-6-48-6l0-88c0-22.1-17.9-40-40-40-13.3 0-24-10.7-24-24s10.7-24 24-24c48.6 0 88 39.4 88 88l0 94zM296 80l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l80 0c13.3 0 24 10.7 24 24s-10.7 24-24 24zm-8 320a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-80c-8.8 0-16 7.2-16 16l0 48-48 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l48 0 0 48c0 8.8 7.2 16 16 16s16-7.2 16-16l0-48 48 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-48 0 0-48c0-8.8-7.2-16-16-16z\"/></svg>\n </span>\n <span class=\"sd_waba_template_name\" [ngClass]=\"{ 'sd_waba_disabled_text' : template.status !== 'APPROVED' }\">{{\n template.name }}</span>\n @if (template.status !== 'APPROVED') {\n <span class=\"sd_waba_template_status\">\n @switch (template.status) {\n <!-- Approved case intentionally omitted for disabled list item -->\n @case ('IN_APPEAL') {\n <span class=\"sd_waba_status_badge sd_waba_status_in_appeal\">In Appeal</span>\n }\n @case ('PENDING') {\n <span class=\"sd_waba_status_badge sd_waba_status_pending\">Pending</span>\n }\n @case ('REJECTED') {\n <span class=\"sd_waba_status_badge sd_waba_status_rejected\">Rejected</span>\n }\n @case ('PENDING_DELETION') {\n <span class=\"sd_waba_status_badge sd_waba_status_pending_deletion\">Pending Deletion</span>\n }\n @case ('DELETED') {\n <span class=\"sd_waba_status_badge sd_waba_status_deleted\">Deleted</span>\n }\n @case ('DISABLED') {\n <span class=\"sd_waba_status_badge sd_waba_status_disabled\">Disabled</span>\n }\n @case ('PAUSED') {\n <span class=\"sd_waba_status_badge sd_waba_status_paused\">Paused</span>\n }\n @case ('LIMIT_EXCEEDED') {\n <span class=\"sd_waba_status_badge sd_waba_status_limit_exceeded\">Limit Exceeded</span>\n }\n @case ('ARCHIVED') {\n <span class=\"sd_waba_status_badge sd_waba_status_archived\">Archived</span>\n }\n @default {\n <span class=\"sd_waba_status_badge sd_waba_status_default\">{{ template.status }}</span>\n }\n }\n </span>\n }\n\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </div>\n }\n</div>\n<div class=\"sd_waba_right_container_st_content\">\n <div class=\"sd_waba_container_selected_template_header\">\n <h4>\n <i class=\"fa-regular fa-square-dashed-circle-plus\"></i> {{ selectedMessageTemplate?.name }}\n </h4>\n </div>\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_container_selected_template_content\">\n <div class=\"sd_waba_container_selected_template_item\">\n <label>Message language</label>\n <p>{{ selectedMessageTemplate?.language }}</p>\n </div>\n <div class=\"sd_waba_container_selected_template_disclaimer\">\n <span><i class=\"fa-regular fa-circle-exclamation\"></i></span>\n <p>The template might contain advanced elements that won't be visible in the Snugdesk Interface (for\n example call to action links, quick replies or others). Check the final template structure in your\n WhatsApp provider account.</p>\n <div class=\"sd_waba_clear\"></div>\n </div>\n <div class=\"sd_waba_container_selected_template_item\">\n <label>Message preview</label>\n <div class=\"sd_waba_container_selected_template_form\">\n <form [formGroup]=\"templateMessageForm\">\n @for (component of selectedMessageTemplate?.components; track $index) {\n\n <!-- HEADER TEXT -->\n @if (component.type === 'HEADER' && component.format === 'TEXT') {\n <div class=\"sd_waba_container_selected_template_form_header\">\n <h6>{{ component.text }}</h6>\n </div>\n }\n\n <!-- HEADER MEDIA -->\n @if (component.type === 'HEADER' && (component.format === 'IMAGE' || component.format === 'VIDEO' || component.format === 'DOCUMENT')) {\n <div class=\"sd_waba_container_selected_template_form_header\">\n @if (component.format === 'IMAGE') {\n <label>Image Url</label>\n }\n @if (component.format === 'VIDEO') {\n <label>Video Url</label>\n }\n @if (component.format === 'DOCUMENT') {\n <label>Document Url</label>\n }\n <input type=\"text\" formControlName=\"mediaUrl\" class=\"sd_waba_input_media\" title=\"Media URL\" readonly>\n </div>\n }\n\n <!-- HEADER LOCATION -->\n @if (component.type === 'HEADER' && component.format === 'LOCATION') {\n <div class=\"sd_waba_container_selected_template_form_header\" [formGroupName]=\"'location'\">\n <div class=\"sd_waba_container_selected_template_form_header_location\">\n <div>\n <label>Location</label>\n @if (!templateMessageForm.value.location.latitude || !templateMessageForm.value.location.longitude) {\n <button type=\"button\" class=\"sd_waba_button_submit_location\" (click)=\"openLocationPopup()\">\n <i class=\"fa-sharp fa-solid fa-location-dot\"></i> Select Location\n </button>\n } @else {\n <img [src]=\"getMapPreview(templateMessageForm.value.location.latitude, templateMessageForm.value.location.longitude)\"\n alt=\"Location\" width=\"100%\">\n }\n </div>\n <div>\n <label>Name</label>\n <input type=\"text\" formControlName=\"name\" title=\"Name\">\n </div>\n <div>\n <label>Address</label>\n <textarea formControlName=\"address\" title=\"Address\"></textarea>\n </div>\n </div>\n </div>\n }\n\n <!-- BUTTONS -->\n @if (component.type === 'BUTTONS') {\n @for (button of component.buttons; track $index) {\n <!-- COPY_CODE -->\n @if (button.type === 'COPY_CODE' && button.example.length > 0) {\n <label>{{ button.text }}</label>\n <input type=\"text\" formControlName=\"couponCode\" title=\"Coupon code\" readonly>\n }\n\n <!-- PHONE_NUMBER -->\n @if (button.type === 'PHONE_NUMBER') {\n <label>Phone CTA: {{ button.text }}</label>\n @for (ctrl of bodyParameterGroups; track $index) {\n @if (ctrl.value?.type === 'phone' && ctrl.value?.index === button.index) {\n <div [formGroup]=\"ctrl\">\n <input type=\"text\" formControlName=\"phoneNumber\" placeholder=\"Phone number\"\n title=\"Phone number\">\n <input type=\"text\" formControlName=\"text\" placeholder=\"Button text\"\n title=\"Button label\">\n </div>\n }\n }\n }\n\n <!-- URL -->\n @if (button.type === 'URL') {\n <label>URL CTA: {{ button.text }}</label>\n @for (ctrl of bodyParameterGroups; track $index) {\n @if (ctrl.value?.type === 'url' && ctrl.value?.index === button.index) {\n <div [formGroup]=\"ctrl\">\n <input type=\"text\" formControlName=\"url\" placeholder=\"Link URL\" title=\"Link URL\">\n <input type=\"text\" formControlName=\"text\" placeholder=\"Button text\"\n title=\"Button label\">\n </div>\n }\n }\n }\n\n <!-- QUICK_REPLY -->\n @if (button.type === 'QUICK_REPLY') {\n <label>Quick Reply: {{ button.text }}</label>\n @for (ctrl of bodyParameterGroups; track $index) {\n @if (ctrl.value?.type === 'quick_reply' && ctrl.value?.index === button.index) {\n <div [formGroup]=\"ctrl\">\n <input type=\"text\" formControlName=\"text\" placeholder=\"Reply text\" title=\"Quick reply\">\n </div>\n }\n }\n }\n }\n }\n\n <!-- BODY -->\n @if (component.type === 'BODY') {\n <div class=\"sd_waba_container_selected_template_form_body\" formArrayName=\"bodyParameters\">\n @for (segment of bodyTextSegments; track $index; let i = $index) {\n @if (segment.input) {\n <div [formGroupName]=\"segment.index\" class=\"sd_waba_container_selected_template_form_body_input\">\n <input type=\"text\" formControlName=\"text\" placeholder=\"{{ segment.placeholder }}\" title=\"{{ segment.placeholder }}\"\n [ngClass]=\"{'sd_waba_container_selected_template_form_body_input_error': bodyParameterGroups[segment.index]?.get('text')?.invalid && bodyParameterGroups[segment.index]?.get('text')?.touched }\">\n </div>\n } @else {\n <span [innerHTML]=\"segment.text | WhatsAppTextFormatter\"></span>\n }\n }\n </div>\n }\n\n <!-- FOOTER -->\n @if (component.type === 'FOOTER') {\n <div class=\"sd_waba_container_selected_template_form_footer\">\n {{ component.text }}\n </div>\n }\n\n }\n </form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sd_waba_container_bottom_buttons\">\n <div class=\"sd_waba_container_selected_template_buttons\">\n <div class=\"sd_waba_container_selected_template_buttons_left\">\n <!-- <a href=\"https://www.twilio.com/docs/whatsapp/tutorial/send-whatsapp-notification-messages-templates\" target=\"_blank\" rel=\"noopener\">\n Learn more about WhatsApp message templates <i class=\"fa-solid fa-arrow-up-right\"></i>\n </a> -->\n @if (isFormSubmitted && templateMessageForm.invalid) {\n <span class=\"sd_waba_error_message\">*Please fill in all required text fields before submitting the form</span>\n }\n </div>\n <div class=\"sd_waba_container_selected_template_buttons_right\">\n <ul>\n <li>\n <button type=\"button\" class=\"sd_waba_button_cancel_preview\" (click)=\"closePopup()\">Cancel</button>\n </li>\n <li>\n <button type=\"submit\" class=\"sd_waba_button_submit sd_waba_button_preview\" (click)=\"openMessageTemplatePreviewPopup()\">Preview message</button>\n </li>\n <!-- <li><button class=\"sd_waba_button_preview\" (click)=\"generateBodyText()\">Preview message</button></li> -->\n </ul>\n </div>\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n@if (showTemplatePreviewPopup) {\n <lib-whatsapp-template-preview\n [selectedMessageTemplate]=\"selectedMessageTemplate\"\n [bodyTextSegments]=\"bodyTextSegments\" [templateMessageFormValue]=\"templateMessageForm.value\"\n (close)=\"closeTemplatePreviewPopup()\" (submitTemplate)=\"handleSubmitTemplatePreviewPopup()\" />\n}\n@if (showLocationPopup) {\n <lib-location-input (close)=\"closeLocationPopup()\" (submitLocation)=\"handleLocationSelection($event)\">\n </lib-location-input>\n}\n","import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, NgZone, OnChanges, OnDestroy, Output, SimpleChanges, ViewChild } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { lastValueFrom } from 'rxjs';\n\nimport { GoogleMapsConfig } from '../../../app.config';\nimport { ModelSortDirection } from '../../graphql/common.model';\nimport { Entity, EntityService } from '../../services/entity.service';\nimport { EntityConversation, EntityConversationService } from '../../services/entity-conversation.service';\nimport { InteractionService, InteractionChannel, InteractionContext, InteractionDirection, InteractionProvider, InteractionStatus, InteractionMessage, InteractionMessageAttachment, InteractionAttendee } from '../../services/interaction.service';\nimport { InteractionWidget } from '../../services/interaction-widget.service';\nimport { User, UserService } from '../../services/user.service';\n\nimport { WhatsAppHelperService } from '../../services/whatsapp-helper.service';\n\nimport { SnugdeskAuthenticationService, S3HelperService } from '@snugdesk/core';\nimport { CleanDeep, CustomValidators } from '@snugdesk/core';\n\nimport { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';\n\nimport moment from 'moment-timezone';\nimport { parsePhoneNumberFromString } from 'libphonenumber-js';\nimport { sort } from 'sort-nested-json';\nimport { v4 as uuidv4 } from 'uuid';\n\n@Component({\n selector: 'lib-whatsapp-messages',\n templateUrl: './whatsapp-messages.component.html',\n styleUrls: ['./whatsapp-messages.component.css'],\n standalone: false,\n})\nexport class WhatsAppMessagesComponent implements OnChanges, OnDestroy {\n @Input('selectedEntityConversation')\n selectedEntityConversation!: EntityConversation;\n\n @Input('wabaInteractionWidget')\n wabaInteractionWidget!: InteractionWidget;\n\n @Input('wabaPhoneNumbers')\n wabaPhoneNumbers!: any[];\n\n @Input('selectedWABAPhoneNumber')\n selectedWABAPhoneNumber: any;\n\n @Input('isSmallScreen')\n isSmallScreen: boolean;\n\n @Output('close')\n closeEv = new EventEmitter<void>();\n\n @Output('newMessage')\n newMessageEv = new EventEmitter<InteractionMessage>();\n\n @Output('changePhoneNumber')\n changePhoneNumberEv = new EventEmitter<any>();\n\n @ViewChild('scrollboxWhatsAppMessages') scrollbox!: ElementRef;\n @ViewChild('messageInput') messageInput!: ElementRef;\n\n entity!: Entity;\n entityPhoneNumbers: string[] = [];\n private selectedEntityPhoneNumber!: any | undefined;\n\n selectedEntityConversationMessages: any = [];\n private nextToken_entityConversationMessages!: string | undefined;\n private endOfList: boolean = false;\n private interactionMessageByEntityConversationIdSubscription!: any | undefined;\n\n interactionsMap: any = {};\n interactionAttendeesMap: any = {};\n\n selectedInteraction!: any;\n selectedInteractionAttendee!: any;\n\n selectedMessageTemplate!: any;\n\n referenceMessagesMap: any = {};\n selectedReferenceMessage!: any;\n\n showInitLoader: boolean = false;\n showAddEntityLoader: boolean = false;\n showInteractionMessageScrollLoader: boolean = false;\n showSubmitLoader: boolean = false;\n showMarkInteractionAsCompleteLoader: boolean = false;\n showMarkConversationAsBlockedLoader: boolean = false;\n showMarkConversationAsUnblockedLoader: boolean = false;\n showMarkEntityAsBlockedLoader: boolean = false;\n showMarkEntityAsUnblockedLoader: boolean = false;\n\n showTemplatePopup: boolean = false;\n\n showEmojiPicker: boolean = false;\n showContactDetailsPopup: boolean = false;\n\n showLocationPopup: boolean = false;\n showLocationPreviewPopup: boolean = false;\n\n showScrollToBottomButton: boolean = false;\n hasInitialScrollAligned: boolean = false;\n\n countdownInterval: any;\n remainingCountdownTime!: number;\n isRestrictedToTemplateReplies: boolean = false;\n\n selectedLocation: any = {};\n sharedContact: any = undefined;\n\n selectedFile!: any;\n selectedFilePreviewBuffer!: string | ArrayBuffer | null | undefined;\n uploadedFile!: any;\n\n locationForm!: FormGroup;\n textMessageForm!: FormGroup;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private zone: NgZone,\n private formBuilder: FormBuilder,\n private httpClient: HttpClient,\n private snackBar: MatSnackBar,\n private authenticationService: SnugdeskAuthenticationService,\n private s3HelperService: S3HelperService,\n private userService: UserService,\n private entityService: EntityService,\n private entityConversationService: EntityConversationService,\n private interactionService: InteractionService,\n private waHelperService: WhatsAppHelperService\n ) {\n this.textMessageForm = this.formBuilder.group({\n body: ['', [Validators.required, CustomValidators.whitespace]],\n });\n\n this.locationForm = this.formBuilder.group({\n name: [''],\n address: [''],\n longitude: ['', Validators.required],\n latitude: ['', Validators.required],\n });\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['isSmallScreen']) this.cdr.markForCheck();\n\n const change = changes['selectedEntityConversation'];\n if (!change) return;\n\n const { currentValue, previousValue } = change;\n if (!currentValue || currentValue.id === previousValue?.id) return;\n\n this.showInitLoader = true;\n this.resetConversationState();\n this.cdr.markForCheck();\n\n try {\n await this.loadEntityForConversation(currentValue);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not load the entity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.cdr.markForCheck();\n }\n\n try {\n await this.loadMessagesAndInteractions(currentValue);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not load messages`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showInitLoader = false;\n this.alignMessagesToBottom();\n setTimeout(() => {\n this.scrollToBottom();\n }, 500);\n this.cdr.detectChanges();\n }\n }\n\n ngOnDestroy(): void {\n this.interactionMessageByEntityConversationIdSubscription?.unsubscribe();\n if (this.countdownInterval) {\n clearInterval(this.countdownInterval);\n }\n }\n\n async onScrollWhatsappMessageList() {\n if (this.endOfList) return;\n\n this.zone.run(async () => {\n this.showInteractionMessageScrollLoader = true;\n this.cdr.markForCheck();\n\n if (this.selectedEntityConversationMessages?.length > 0 && this.nextToken_entityConversationMessages !== null) {\n try {\n const res_whatsappMessages = await this.fetchEntityConversationMessages(this.selectedEntityConversation.id);\n this.selectedEntityConversationMessages = [...res_whatsappMessages, ...this.selectedEntityConversationMessages];\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not load messages`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showInteractionMessageScrollLoader = false;\n this.cdr.detectChanges();\n }\n }\n });\n }\n\n async onSubmitWhatsappMessage() {\n if (this.isEntityConversationInactive()) return;\n\n this.showSubmitLoader = true;\n try {\n const now = moment.utc().unix();\n const interactionMessageId = uuidv4();\n const interactionMessageAttachmentId = uuidv4();\n\n await this.handleEntityConversation(now);\n if (this.selectedFile) {\n await this.uploadSelectedFile(interactionMessageAttachmentId);\n }\n\n const waMessage: any = await this.prepareWhatsAppMessage();\n // console.debug('Prepared waMessage: ', waMessage);\n\n let interactionMessage = this.prepareInteractionMessage(interactionMessageId, interactionMessageAttachmentId, waMessage, now);\n // console.debug('Prepared interactionMessage: ', interactionMessage);\n\n // Add new message to the list\n this.newMessageEv.emit(interactionMessage);\n this.selectedEntityConversationMessages.push({\n ...interactionMessage,\n temp_isSending: true,\n });\n this.showEmojiPicker = false;\n setTimeout(() => {\n this.scrollbox.nativeElement.scrollTop = Math.max(0, this.scrollbox.nativeElement.scrollHeight - this.scrollbox.nativeElement.offsetHeight);\n }, 500);\n\n const referenceMessage: any = this.selectedReferenceMessage;\n this.resetAllForms();\n\n let waMessageId: string;\n try {\n waMessageId = await this.sendWhatsAppMessage(waMessage, referenceMessage?.externalId);\n } catch (err) {\n console.warn(err);\n const msgMetatdata = this.parseJSON(interactionMessage.metadata);\n interactionMessage.metadata = JSON.stringify({\n ...msgMetatdata,\n errors: [err.error.error || err.error || err],\n });\n }\n interactionMessage = await this.createInteractionMessage(waMessageId, interactionMessage, referenceMessage?.id);\n // console.debug('interactionMessage: ', interactionMessage);\n\n // Remove temp flag\n const index = this.selectedEntityConversationMessages.findIndex((m: any) => m.id === interactionMessageId);\n if (index !== -1) {\n this.selectedEntityConversationMessages[index].metadata = interactionMessage.metadata;\n delete this.selectedEntityConversationMessages[index].temp_isSending;\n }\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not send Whatsapp message`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showSubmitLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n resetAllForms(): void {\n this.textMessageForm.reset();\n this.locationForm.reset();\n this.selectedReferenceMessage = undefined;\n\n this.showTemplatePopup = false;\n this.selectedMessageTemplate = undefined;\n\n this.showLocationPopup = false;\n this.showLocationPreviewPopup = false;\n this.selectedLocation = undefined;\n\n this.selectedFile = undefined;\n this.selectedFilePreviewBuffer = undefined;\n this.uploadedFile = undefined;\n\n const textarea = this.messageInput?.nativeElement;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.rows = 1; // Reset to original row size\n }\n }\n\n setSelectedReferenceMessage(message: any) {\n this.selectedReferenceMessage = message;\n }\n\n removeSelectedReferenceMessage() {\n this.selectedReferenceMessage = undefined;\n }\n\n subscribeToEntityConversationMessages(entityConversationId: string) {\n this.interactionMessageByEntityConversationIdSubscription?.unsubscribe();\n // Add OnInteractionMessageByEntityConversationId subscription\n return this.interactionService.OnInteractionMessageByEntityConversationIdListener(entityConversationId).subscribe(async (event: any) => {\n this.zone.run(async () => {\n const message = event.value.data.OnInteractionMessageByEntityConversationId;\n // console.debug('message: ', message);\n\n // fallback for message attachments\n if (!message.messageAttachments?.items?.length) {\n const attachments = await this.fetchInteractionMessageAttachments(message.id);\n if (attachments?.length) {\n message.messageAttachments = { items: attachments };\n }\n }\n\n // fallback for interaction attendee\n if (message.interactionAttendeeId && !message.interactionAttendee) {\n let interactionAttendee = this.interactionAttendeesMap[message.interactionAttendeeId];\n if (!interactionAttendee) {\n interactionAttendee = await this.interactionService.GetInteractionAttendee(message.interactionAttendeeId);\n }\n message.interactionAttendee = interactionAttendee;\n }\n\n if (message.interactionAttendee?.entityId) {\n this.isRestrictedToTemplateReplies = false;\n this.startCountdownTimer(24 * 60 * 60); // 24 hours in seconds\n\n // Update the selected tenant phone number to the one receiving the new message\n this.selectedWABAPhoneNumber =\n this.wabaPhoneNumbers.find(\n (phoneNumber) =>\n this.cleanPhoneNumber(phoneNumber.display_phone_number) ===\n // this.cleanPhoneNumber(message.tenantAddress)\n this.cleanPhoneNumber(message.endpoint?.address)\n ) || this.wabaPhoneNumbers?.[0];\n }\n\n if (!this.selectedInteraction || this.selectedInteraction.id !== message.interactionId) {\n let interaction = message.interaction;\n if (message.interactionId && !message.interaction) {\n interaction = this.interactionService.GetInteraction(message.interactionId);\n }\n\n this.selectedInteraction = interaction;\n }\n\n const existingMessageIndex = this.selectedEntityConversationMessages.findIndex((msg: any) => msg.id === message.id);\n if (existingMessageIndex === -1) {\n // Add new message to the list\n this.newMessageEv.emit(message);\n this.selectedEntityConversationMessages.push(message);\n setTimeout(() => {\n this.scrollbox.nativeElement.scrollTop = Math.max(0, this.scrollbox.nativeElement.scrollHeight - this.scrollbox.nativeElement.offsetHeight);\n }, 100);\n } else {\n // Update the existing message\n this.selectedEntityConversationMessages[existingMessageIndex] = message;\n }\n\n await this.updateInteractionMap(message.interactionId, message.interaction);\n await this.updateInteractionAttendeeMap(message.interactionAttendeeId, message.interactionAttendee);\n await this.updateInteractionMessageReferenceMessageMap(message.referenceMessageId);\n this.cdr.detectChanges();\n });\n });\n }\n\n async updateInteractionMap(interactionId: string, interaction?: any) {\n // Fetch interaction if not in the map\n if (!this.interactionsMap[interactionId]) {\n try {\n const res_getInteraction = interaction || (await this.interactionService.GetInteraction(interactionId));\n this.interactionsMap[interactionId] = res_getInteraction;\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch Interaction`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n }\n }\n }\n\n // Start Mat menu right popup code\n isPopupOpen = false;\n isPopupClosing = false;\n popupMode: 'endInteraction' | 'blockConversation' | 'unblockConversation' | 'blockSender' | 'unblockSender' | null = null;\n showPopup(popupMode: 'endInteraction' | 'blockConversation' | 'unblockConversation' | 'blockSender' | 'unblockSender') {\n this.isPopupOpen = true;\n this.isPopupClosing = false;\n this.popupMode = popupMode;\n }\n\n requestClosePopup() {\n this.isPopupClosing = true;\n }\n\n onPopupAnimationEnd() {\n if (this.isPopupClosing) {\n this.isPopupOpen = false;\n this.isPopupClosing = false;\n this.popupMode = null;\n }\n }\n\n // End Mat menu right popup code\n async updateInteractionAttendeeMap(attendeeId: string, attendee?: any) {\n // Fetch interaction attendee if not in the map\n if (!this.interactionAttendeesMap[attendeeId]) {\n try {\n const res_getInteractionAttendee = attendee || (await this.interactionService.GetInteractionAttendee(attendeeId));\n this.interactionAttendeesMap[attendeeId] = res_getInteractionAttendee;\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not fetch Interaction Attendee`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n }\n }\n }\n\n async updateInteractionMessageReferenceMessageMap(referenceMessageId: string, entityConversationMessages?: InteractionMessage[]) {\n const refId = referenceMessageId?.trim();\n if (!this.isValidReferenceId(refId) || this.referenceMessagesMap[refId]) {\n return;\n }\n\n const inProvidedMessages = this.findMessageById(entityConversationMessages, refId);\n if (this.cacheReferenceMessage(refId, inProvidedMessages)) {\n return;\n }\n\n const inLoadedMessages = this.findMessageById(this.selectedEntityConversationMessages, refId);\n if (this.cacheReferenceMessage(refId, inLoadedMessages)) {\n return;\n }\n\n try {\n const fetchedMessage = await this.interactionService.GetInteractionMessage(refId);\n this.cacheReferenceMessage(refId, fetchedMessage);\n } catch (err) {\n console.error(err);\n }\n }\n\n parseEntityPhoneNumbers(entity: any): string[] {\n const entityPhoneNumbers: string[] = [];\n\n // Check for primary phone number or phone numbers array\n const primaryPhoneNumber = entity.phoneNumberE164 || entity?.phoneNumber?.e164Number || entity?.phone_numbers?.[0];\n if (primaryPhoneNumber) {\n entityPhoneNumbers.push(primaryPhoneNumber);\n }\n\n // Process customFields if available\n if (Array.isArray(entity?.customFields)) {\n entity.customFields.forEach((field: string) => {\n try {\n const cfJSON = JSON.parse(field);\n Object.keys(cfJSON).forEach((key) => {\n if (key.startsWith('phonenumber') && cfJSON[key]?.e164Number) {\n entityPhoneNumbers.push(cfJSON[key].e164Number);\n }\n });\n } catch (err) {\n console.error('Error parsing custom field: ', err);\n }\n });\n }\n\n /* // Throw error if no phone numbers found\n if (entityPhoneNumbers.length === 0) {\n throw new Error('No phone number found for entity');\n } */\n\n return entityPhoneNumbers;\n }\n\n async fetchEntityConversationMessages(conversationId: string) {\n const scrollBox = document.getElementById('sd_scrollbox_whatsapp_messages');\n const msgCount = !!scrollBox && !!scrollBox.clientHeight && scrollBox.clientHeight > 0 ? Math.ceil(scrollBox.clientHeight / 40) : 25;\n\n const res_listMessagesByEntityConversationId = await this.interactionService.ListInteractionMessagesByEntityConversationId(\n conversationId,\n undefined,\n ModelSortDirection.DESC,\n {\n deletedAt: { attributeExists: false },\n },\n msgCount,\n this.nextToken_entityConversationMessages\n );\n // console.debug('res_listMessagesByEntityConversationId: ', res_listMessagesByEntityConversationId);\n\n this.endOfList = !res_listMessagesByEntityConversationId?.nextToken;\n this.nextToken_entityConversationMessages = res_listMessagesByEntityConversationId?.nextToken;\n\n const entityConversationMessages: any[] = res_listMessagesByEntityConversationId?.items || [];\n for (let message of entityConversationMessages) {\n await this.updateInteractionMap(message.interactionId, message.interaction);\n await this.updateInteractionAttendeeMap(message.interactionAttendeeId, message.interactionAttendee);\n await this.updateInteractionMessageReferenceMessageMap(message.referenceMessageId, entityConversationMessages);\n }\n\n return sort(entityConversationMessages).asc('createdAt');\n }\n\n private async fetchInteractionMessageAttachments(interactionMessageId: any): Promise<InteractionMessageAttachment[]> {\n if (!interactionMessageId) return [];\n\n const res_getInteractionMessageAttachments = await this.interactionService.ListInteractionMessageAttachmentsByInteractionMessageId(interactionMessageId, undefined, ModelSortDirection.ASC, {\n deletedAt: { attributeExists: false },\n });\n\n return res_getInteractionMessageAttachments?.items || [];\n }\n\n async fetchEntityInteractionAttendees(interactionId: string, entityId: string) {\n let entityInteractionAttendees: any[] = [];\n let nextToken_listInteractionAttendeesByInteractionIdAndEntityId!: string | undefined;\n do {\n const res_listInteractionAttendeesByInteractionIdAndEntityId = await this.interactionService.ListInteractionAttendeesByInteractionIdAndEntityId(\n interactionId,\n { eq: entityId },\n undefined,\n {\n deletedAt: { attributeExists: false },\n },\n undefined,\n nextToken_listInteractionAttendeesByInteractionIdAndEntityId\n );\n\n entityInteractionAttendees = [...entityInteractionAttendees, ...res_listInteractionAttendeesByInteractionIdAndEntityId.items];\n nextToken_listInteractionAttendeesByInteractionIdAndEntityId = res_listInteractionAttendeesByInteractionIdAndEntityId.nextToken || undefined;\n } while (nextToken_listInteractionAttendeesByInteractionIdAndEntityId);\n\n return entityInteractionAttendees;\n }\n\n async fetchUserInteractionAttendees(interactionId: string, userId: string) {\n let userInteractionAttendees: any[] = [];\n let nextToken_listInteractionAttendeesByInteractionIdAndUserId!: string | undefined;\n do {\n const res_listInteractionAttendeesByInteractionIdAndUserId = await this.interactionService.ListInteractionAttendeesByInteractionIdAndUserId(\n interactionId,\n { eq: userId },\n undefined,\n {\n deletedAt: { attributeExists: false },\n },\n undefined,\n nextToken_listInteractionAttendeesByInteractionIdAndUserId\n );\n\n userInteractionAttendees = [...userInteractionAttendees, ...res_listInteractionAttendeesByInteractionIdAndUserId.items];\n nextToken_listInteractionAttendeesByInteractionIdAndUserId = res_listInteractionAttendeesByInteractionIdAndUserId.nextToken || undefined;\n } while (nextToken_listInteractionAttendeesByInteractionIdAndUserId);\n\n return userInteractionAttendees;\n }\n\n async getLatestUserInteractionAttendee(interactionId: string, userId: string): Promise<any> {\n // Try to find the last message from the entity in local mesages\n // prettier-ignore\n for (let i = this.selectedEntityConversationMessages.length - 1; i >= 0; i--) {\n const msg = this.selectedEntityConversationMessages[i];\n if (msg.interactionId === interactionId &&\n msg.interactionAttendee?.userId === userId &&\n !msg.deletedAt &&\n !msg.interactionAttendee?.deletedAt) {\n return msg.interactionAttendee;\n }\n }\n\n const userInteractionAttendees: any[] = await this.fetchUserInteractionAttendees(interactionId, userId);\n // console.debug('userInteractionAttendees: ', userInteractionAttendees);\n\n // prettier-ignore\n if (!userInteractionAttendees || userInteractionAttendees.length === 0) {\n return null;\n }\n\n // using the latest entity interaction attendee\n const latestInteractionAttendee: any = sort(userInteractionAttendees).desc('createdAt')[0];\n\n return latestInteractionAttendee;\n }\n\n async getLastEntityInteractionMessage(interactionId: string, entityId: string): Promise<any> {\n // Try to find the last message from the entity in local mesages\n const now: number = moment.utc().unix();\n const twentyFourHoursInSeconds: number = 24 * 60 * 60;\n // prettier-ignore\n for (let i = this.selectedEntityConversationMessages.length - 1; i >= 0; i--) {\n const msg = this.selectedEntityConversationMessages[i];\n if (msg.interactionId === interactionId &&\n msg.interactionAttendee?.entityId === entityId &&\n !msg.deletedAt) {\n return msg;\n }\n\n // If the message is older than 24 hours, stop searching\n const messageAgeInSeconds = now - msg.createdAt;\n if (messageAgeInSeconds >= twentyFourHoursInSeconds) return null;\n }\n\n // if all messages have been already fetched, return null\n if (!this.nextToken_entityConversationMessages) return null;\n\n const entityInteractionAttendees: any = await this.fetchEntityInteractionAttendees(interactionId, entityId);\n // console.debug('entityInteractionAttendees: ', entityInteractionAttendees);\n\n // prettier-ignore\n if (!entityInteractionAttendees || entityInteractionAttendees.length === 0) {\n return null;\n }\n\n // using the latest entity interaction attendee\n const latestEntityAttendee: any = sort(entityInteractionAttendees).desc('createdAt')[0];\n\n // Fetch latest message\n const lastEntityMessages: any = await this.interactionService.ListInteractionMessagesByInteractionAttendeeId(\n latestEntityAttendee.id,\n undefined,\n ModelSortDirection.DESC,\n {\n deletedAt: { attributeExists: false },\n },\n 1\n );\n\n return lastEntityMessages?.items?.[0];\n }\n\n getSelectedPhoneNumberIndex(): number {\n return this.wabaPhoneNumbers.findIndex((phone) => phone.id === this.selectedWABAPhoneNumber?.id);\n }\n\n handleChangeSenderPhoneNumber(phoneNumber: any): void {\n this.selectedWABAPhoneNumber = phoneNumber;\n this.changePhoneNumberEv.emit(phoneNumber);\n }\n\n async handleEntityConversation(now: number) {\n if (!this.selectedEntityConversation) {\n this.selectedEntityConversation = await this.createEntityConversation(now);\n // console.debug('selectedEntityConversation: ', this.selectedEntityConversation);\n\n this.selectedInteraction = await this.createInteraction(now);\n // console.debug('selectedInteraction: ', this.selectedInteraction);\n\n this.selectedInteractionAttendee = await this.createInteractionAttendee(this.selectedInteraction.id, now);\n // console.debug('selectedInteractionAttendee: ', this.selectedInteractionAttendee);\n } else if (!this.selectedInteraction || !!this.selectedInteraction.deletedAt || !!this.selectedInteraction.completedAt || this.selectedInteraction.status === InteractionStatus.DISCONNECTED) {\n this.selectedInteraction = await this.createInteraction(now);\n // console.debug('selectedInteraction: ', this.selectedInteraction);\n\n this.selectedInteractionAttendee = await this.createInteractionAttendee(this.selectedInteraction.id, now);\n // console.debug('selectedInteractionAttendee: ', this.selectedInteractionAttendee);\n } else if (!this.selectedInteractionAttendee) {\n this.selectedInteractionAttendee = await this.createInteractionAttendee(this.selectedInteraction.id, now);\n // console.debug('selectedInteractionAttendee: ', this.selectedInteractionAttendee);\n }\n }\n\n async prepareWhatsAppMessage(): Promise<any> {\n if (this.selectedMessageTemplate) {\n const templateValues: any[] = [];\n\n // prettier-ignore\n const { template, bodyParameters, mediaUrl, couponCode, location } = this.selectedMessageTemplate;\n if (bodyParameters?.length > 0) {\n templateValues.push({\n type: 'body',\n parameters: bodyParameters,\n });\n }\n\n if (mediaUrl) {\n templateValues.push({\n type: 'header_media',\n mediaUrl,\n });\n }\n\n if (couponCode?.length > 0) {\n templateValues.push({\n type: 'coupon_code',\n couponCode,\n });\n }\n\n if (location) {\n templateValues.push({\n type: 'location',\n location,\n });\n }\n\n return CleanDeep.clean({\n template,\n templateValues,\n });\n }\n\n // Fallback: plain message (text/media/location)\n let messageBody: any;\n\n const trimmedBody = (this.textMessageForm.value.body || '').trim();\n\n if (this.selectedFile) {\n messageBody = {\n text: trimmedBody,\n media: {\n type: this.selectedFile.type,\n fileName: this.selectedFile.name || this.uploadedFile.key,\n mediaUrl: this.uploadedFile.location,\n caption: trimmedBody || undefined,\n },\n };\n } else if (this.showLocationPreviewPopup) {\n const name = (this.locationForm.value.name || '').trim();\n const address = (this.locationForm.value.address || '').trim();\n messageBody = {\n name,\n address,\n longitude: this.locationForm.value.longitude,\n latitude: this.locationForm.value.latitude,\n };\n } else {\n messageBody = {\n text: trimmedBody,\n };\n }\n\n return {\n messageBody,\n };\n }\n\n prepareInteractionMessage(interactionMessageId: string, interactionMessageAttachmentId: string, waMessage: any, waMessageTimestamp: number): any {\n const messageMetaData: any = this.selectedMessageTemplate\n ? {\n template: waMessage.template,\n location: waMessage.location,\n }\n : waMessage.messageBody?.longitude && waMessage.messageBody?.latitude\n ? {\n location: waMessage.messageBody,\n }\n : {};\n\n // TODO: Add endpointId as per the tenantAddress\n let message: any = {\n id: interactionMessageId,\n interactionId: this.selectedInteraction.id,\n interactionAttendeeId: this.selectedInteractionAttendee.id,\n interactionAttendee: this.selectedInteractionAttendee,\n entityConversationId: this.selectedEntityConversation.id,\n endpointId: 'TODO',\n metadata: JSON.stringify(CleanDeep.clean(messageMetaData)),\n referenceMessageId: this.selectedReferenceMessage?.id,\n // externalId: waMessage.externalId,\n body: waMessage.messageBody?.text,\n createdAt: waMessageTimestamp,\n updatedAt: waMessageTimestamp,\n };\n\n // If a file was uploaded\n if (this.uploadedFile) {\n const attachment: any = {\n id: interactionMessageAttachmentId,\n interactionId: this.selectedInteraction.id,\n interactionMessageId: interactionMessageId,\n name: this.selectedFile?.name || this.uploadedFile.key,\n size: this.selectedFile?.size,\n type: this.selectedFile.type,\n file: this.uploadedFile,\n createdAt: waMessageTimestamp,\n updatedAt: waMessageTimestamp,\n };\n message.messageAttachments = {\n items: [attachment],\n };\n }\n\n return CleanDeep.clean(message);\n }\n\n async sendWhatsAppMessage(waMessage: any, referenceMessageExternalId?: string) {\n // prettier-ignore\n const { businessAccountId, accessToken } = JSON.parse(this.wabaInteractionWidget.configuration || '{}');\n if (!businessAccountId || !accessToken) {\n throw new Error('WhatsApp Business Account not configured');\n }\n\n const res_sendWhatsAppMessage: any = waMessage.template\n ? await this.waHelperService.sendWhatsAppTemplateMessage(accessToken, this.selectedWABAPhoneNumber.id, this.selectedEntityPhoneNumber, waMessage.template, waMessage.templateValues, referenceMessageExternalId)\n : await this.waHelperService.sendWhatsAppMessage(accessToken, this.selectedWABAPhoneNumber.id, this.selectedEntityPhoneNumber, waMessage.messageBody, referenceMessageExternalId);\n // console.debug('res_sendWhatsAppMessage: ', res_sendWhatsAppMessage);\n\n return res_sendWhatsAppMessage.messages[0].id; // waMessageId from the response\n }\n\n replaceTemplatePlaceholders(template: any, values: any) {\n const hasPlaceholders = /{{\\d+}}/.test(template);\n if (!hasPlaceholders) {\n return template;\n }\n return template.replace(/{{(\\d+)}}/g, (_: string, index: string) => {\n // Convert index to zero-based\n const valueIndex = parseInt(index, 10) - 1;\n // Return the corresponding text from values array\n return values[valueIndex] ? values[valueIndex].text : '';\n });\n }\n\n async createEntityConversation(now: number): Promise<any> {\n const entityConversationId: string = uuidv4();\n const params_createEntityConversation = {\n id: entityConversationId,\n tenantId: this.authenticationService.getTenantId(),\n entityId: this.entity.id,\n entityAddress: this.selectedEntityPhoneNumber,\n interactionChannel: InteractionChannel.SOCIAL_CHAT,\n interactionProvider: InteractionProvider.WHATSAPP,\n lastActivityAt: now,\n isCampaignEngaged: false,\n createdAt: now,\n updatedAt: now,\n };\n\n const res_createEntityConversation = await this.entityConversationService.CreateEntityConversation(params_createEntityConversation);\n // console.debug('res_createEntityConversation: ', res_createEntityConversation);\n\n return {\n ...params_createEntityConversation,\n entity: this.entity,\n };\n }\n\n async createInteraction(now: number) {\n const res_createInteraction = await this.interactionService.CreateInteraction({\n tenantId: this.authenticationService.getTenantId(),\n widgetId: this.wabaInteractionWidget.id,\n endpointId: 'TODO',\n entityId: this.selectedEntityConversation?.entityId,\n entityConversationId: this.selectedEntityConversation.id,\n metadata: JSON.stringify({\n phoneNumber: this.selectedEntityPhoneNumber,\n }),\n channel: InteractionChannel.SOCIAL_CHAT,\n provider: InteractionProvider.WHATSAPP,\n context: InteractionContext.EXTERNAL,\n direction: InteractionDirection.OUT,\n status: InteractionStatus.CONNECTED_TO_AGENT,\n createdAt: now,\n updatedAt: now,\n });\n // console.debug('res_createInteraction: ', res_createInteraction);\n\n return res_createInteraction;\n }\n\n async createInteractionAttendee(interactionId: string, now: number) {\n const res_getUser: User = await this.userService.GetUser(this.authenticationService.getUserId());\n const res_createUserAttendee = await this.interactionService.CreateInteractionAttendee({\n interactionId: interactionId,\n name: res_getUser?.name || 'Attendee',\n userId: this.authenticationService.getUserId(),\n isAdministrator: true,\n userSessionId: this.authenticationService.getUserSessionId(),\n joinedAt: now,\n createdAt: now,\n updatedAt: now,\n });\n // console.debug('res_createUserAttendee: ', res_createUserAttendee);\n\n return res_createUserAttendee;\n }\n\n async createInteractionMessage(waMessageId: string, interactionMessage: any, referenceMessageId?: string) {\n // Ensure subscription is active\n if (!this.interactionMessageByEntityConversationIdSubscription) {\n this.subscribeToEntityConversationMessages(this.selectedEntityConversation.id);\n }\n\n // Build attachments array properly (await needed!)\n const attachments: any[] = [];\n\n if (interactionMessage.messageAttachments?.items?.length > 0) {\n for (const attachment of interactionMessage.messageAttachments.items) {\n const res_createInteractionMessageAttachment = await this.interactionService.CreateInteractionMessageAttachment(attachment);\n // console.debug('res_createInteractionMessageAttachment:', res_createInteractionMessageAttachment);\n attachments.push(res_createInteractionMessageAttachment);\n }\n }\n\n // Prepare payload for main message\n const params_createInteractionMessage: any = CleanDeep.clean({\n ...interactionMessage,\n externalId: waMessageId,\n referenceMessageId: referenceMessageId,\n });\n\n // Remove attachments before sending the message\n delete params_createInteractionMessage.endpoint;\n delete params_createInteractionMessage.entityConversation;\n delete params_createInteractionMessage.interaction;\n delete params_createInteractionMessage.interactionAttendee;\n delete params_createInteractionMessage.messageAttachments;\n\n // console.debug('params_createInteractionMessage: ', params_createInteractionMessage);\n\n // Create interaction message\n const res_createInteractionMessage = await this.interactionService.CreateInteractionMessage(params_createInteractionMessage);\n\n // console.debug('res_createInteractionMessage:', res_createInteractionMessage);\n\n // Return combined result\n return {\n ...res_createInteractionMessage,\n messageAttachments: {\n items: attachments,\n },\n };\n }\n\n async markEntityAsBlocked() {\n this.showMarkEntityAsBlockedLoader = true;\n this.cdr.markForCheck();\n try {\n const now = moment.utc().unix();\n const res_blockEntity = await this.entityService.UpdateEntity({\n id: this.selectedEntityConversation.entityId,\n blockedAt: now,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n updatedAt: this.selectedEntityConversation.updatedAt || now,\n });\n // console.debug('res_blockEntity', res_blockEntity);\n\n this.entity = res_blockEntity;\n this.selectedEntityConversation.entity = res_blockEntity;\n await this.markEntityConversationAsBlocked();\n this.snackBar.open(`Success! Blocked the entity successfully`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-warning'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n\n this.requestClosePopup();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not block the entity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showMarkEntityAsBlockedLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async markEntityAsUnblocked() {\n this.showMarkEntityAsUnblockedLoader = true;\n this.cdr.markForCheck();\n try {\n const now = moment.utc().unix();\n const res_unblockEntity = await this.entityService.UpdateEntity({\n id: this.selectedEntityConversation.entityId,\n blockedAt: null,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n updatedAt: this.selectedEntityConversation.updatedAt || now,\n });\n // console.debug('res_unblockEntity', res_unblockEntity);\n\n this.entity = res_unblockEntity;\n this.selectedEntityConversation.entity = res_unblockEntity;\n await this.markEntityConversationAsUnblocked();\n this.snackBar.open(`Success! Unblocked the entity successfully`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not unblock the entity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showMarkEntityAsUnblockedLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async markInteractionAsDisconnected() {\n this.showMarkInteractionAsCompleteLoader = true;\n this.cdr.markForCheck();\n try {\n const now = moment.utc().unix();\n const res_completeInteraction = await this.interactionService.UpdateInteraction({\n id: this.selectedInteraction.id,\n completedAt: now,\n status: InteractionStatus.DISCONNECTED,\n updatedAt: now,\n });\n // console.debug('res_completeInteraction: ', res_completeInteraction);\n this.selectedEntityConversation.interactions.items[0] = res_completeInteraction;\n\n this.selectedInteraction = undefined;\n this.selectedInteractionAttendee = undefined;\n this.snackBar.open(`Success! Marked Interaction as disconneted`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n\n this.requestClosePopup();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not mark Interaction as disconnected`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showMarkInteractionAsCompleteLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async markEntityConversationAsBlocked() {\n // Mark conversation as blocked means blocking the phone number / source of the conversation\n this.showMarkConversationAsBlockedLoader = true;\n this.cdr.markForCheck();\n try {\n const now = moment.utc().unix();\n const res_blockEntityConversation = await this.entityConversationService.UpdateEntityConversation({\n id: this.selectedEntityConversation.id,\n blockedAt: now,\n updatedAt: this.selectedEntityConversation.updatedAt,\n });\n // console.debug('res_blockEntityConversation: ', res_blockEntityConversation);\n this.selectedEntityConversation.blockedAt = now;\n\n this.snackBar.open(`Success! Blocked the conversation successfully`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-warning'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n\n this.requestClosePopup();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not block the entity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showMarkConversationAsBlockedLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n async markEntityConversationAsUnblocked() {\n // Mark conversation as unblocked means unblocking the phone number / source of the conversation\n this.showMarkConversationAsUnblockedLoader = true;\n this.cdr.markForCheck();\n try {\n const now = moment.utc().unix();\n const res_unblockEntityConversation = await this.entityConversationService.UpdateEntityConversation({\n id: this.selectedEntityConversation.id,\n blockedAt: null,\n updatedAt: now,\n });\n // console.debug('res_unblockEntityConversation: ', res_unblockEntityConversation);\n delete this.selectedEntityConversation.blockedAt;\n\n this.snackBar.open(`Success! Unblocked the conversation successfully`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-success'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n\n this.requestClosePopup();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not unblock the conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showMarkConversationAsUnblockedLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n /****************************** Message Template Functions *********************************/\n\n checkReplyConditions(): boolean {\n const lastMessage = this.selectedEntityConversationMessages?.[this.selectedEntityConversationMessages.length - 1];\n const lastInteractionId = lastMessage?.interactionId;\n const lastInteraction = this.interactionsMap?.[lastInteractionId];\n\n return (\n !!this.selectedEntityConversation?.blockedAt ||\n this.isRestrictedToTemplateReplies ||\n !this.selectedEntityConversationMessages?.length ||\n !lastInteraction ||\n !!lastInteraction.completedAt ||\n lastInteraction.status === 'DISCONNECTED' ||\n this.getCurrentTime() - lastMessage?.createdAt > 24 * 60 * 60\n );\n }\n\n toggleMessageTemplatePopup(): void {\n this.showTemplatePopup = !this.showTemplatePopup;\n this.showEmojiPicker = false;\n if (!this.showTemplatePopup) {\n // Clear the selected message template and related properties\n this.selectedMessageTemplate = undefined;\n this.selectedLocation = undefined;\n }\n\n this.cdr.detectChanges();\n }\n\n handleSelectMessageTemplate(messageTemplate: any): void {\n this.selectedMessageTemplate = messageTemplate;\n this.showTemplatePopup = false;\n this.onSubmitWhatsappMessage();\n this.cdr.detectChanges();\n }\n\n /****************************** Supporting functions **************************************/\n\n autoGrow(event: KeyboardEvent) {\n // Ignore \"Enter\" key but allow \"Shift + Enter\"\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n return;\n }\n\n const textarea = event.target as HTMLTextAreaElement;\n textarea.style.height = 'auto';\n textarea.style.height = textarea.scrollHeight + 'px';\n }\n\n getCurrentTime() {\n return moment.utc().unix();\n }\n\n startCountdownTimer(remainingTime: number): void {\n if (this.countdownInterval) {\n clearInterval(this.countdownInterval);\n }\n\n this.remainingCountdownTime = remainingTime;\n this.zone.run(() => {\n this.countdownInterval = setInterval(() => {\n if (this.remainingCountdownTime > 0) {\n this.remainingCountdownTime--;\n this.cdr.markForCheck();\n } else {\n clearInterval(this.countdownInterval);\n this.isRestrictedToTemplateReplies = true;\n this.cdr.markForCheck();\n }\n }, 1000);\n });\n }\n\n formatTime(seconds: number): string {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const remainingSeconds = seconds % 60;\n\n return `${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${remainingSeconds < 10 ? '0' : ''}${remainingSeconds}`;\n }\n\n parseJSON(raw: any) {\n if (!raw) return undefined;\n if (typeof raw === 'object') return raw;\n try {\n return JSON.parse(String(raw));\n } catch {\n return undefined;\n }\n }\n\n onScroll(): void {\n const { scrollTop, scrollHeight, clientHeight } = this.scrollbox.nativeElement;\n // Check if the user has scrolled up more than 400px from the bottom\n if (scrollTop + clientHeight < scrollHeight - 400) {\n this.showScrollToBottomButton = true;\n } else {\n this.showScrollToBottomButton = false;\n }\n }\n\n scrollToBottom(): void {\n this.scrollbox.nativeElement.scrollTop = this.scrollbox.nativeElement.scrollHeight;\n if (!this.hasInitialScrollAligned) {\n this.hasInitialScrollAligned = true;\n this.cdr.detectChanges();\n }\n }\n\n private alignMessagesToBottom(): void {\n // Wait for the view to render so scrollHeight is accurate, then jump to the bottom once\n requestAnimationFrame(() => {\n if (!this.scrollbox?.nativeElement) {\n // If the view isn't ready yet, try again on the next frame\n this.alignMessagesToBottom();\n return;\n }\n this.scrollbox.nativeElement.scrollTop = this.scrollbox.nativeElement.scrollHeight;\n this.hasInitialScrollAligned = true;\n this.cdr.detectChanges();\n });\n }\n\n onEntityImageError(): void {\n if (!this.entity) return;\n this.entity.image = undefined;\n }\n\n getAttachmentType(attachment: any) {\n if (attachment.type.startsWith('image')) {\n return 'image';\n } else if (attachment.type.startsWith('video')) {\n return 'video';\n } else if (attachment.type.startsWith('audio')) {\n return 'audio';\n } else {\n return 'document';\n }\n }\n\n cleanPhoneNumber(phoneNumber: string): string {\n return phoneNumber?.replace(/\\D/g, '');\n }\n\n toggleEmojiPicker() {\n this.showEmojiPicker = !this.showEmojiPicker;\n }\n\n handleEmojiSelection(event: any) {\n this.textMessageForm.controls['body'].setValue((this.textMessageForm.controls['body'].value || '') + event?.emoji?.native);\n setTimeout(() => {\n (document.getElementById('sd_waba_bodyInput') as HTMLTextAreaElement)?.focus();\n });\n }\n\n openConversationAttachmentOptions() {\n this.showEmojiPicker = false;\n }\n\n openImageUpload() {\n document.getElementById('sd_whatsapp_image_upload-' + this.selectedEntityConversation?.id)?.click();\n this.showEmojiPicker = false;\n }\n\n openAudioUpload() {\n document.getElementById('sd_whatsapp_audio_upload-' + this.selectedEntityConversation?.id)?.click();\n this.showEmojiPicker = false;\n }\n\n openVideoUpload() {\n document.getElementById('sd_whatsapp_video_upload-' + this.selectedEntityConversation?.id)?.click();\n this.showEmojiPicker = false;\n }\n\n openDocumentUpload() {\n document.getElementById('sd_whatsapp_document_upload-' + this.selectedEntityConversation?.id)?.click();\n this.showEmojiPicker = false;\n }\n\n handleFileSelection(event: any) {\n this.selectedFile = undefined;\n this.uploadedFile = undefined;\n this.selectedFilePreviewBuffer = undefined;\n\n const fileSize = event.target.files[0].size;\n if (fileSize > 16 * 1024 * 1024) {\n this.snackBar.open(`Oops! File size larger than 16MB`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n return;\n }\n\n try {\n this.selectedFile = event.target.files[0];\n\n const reader = new FileReader();\n reader.onload = (e) => {\n this.selectedFilePreviewBuffer = e?.target?.result;\n };\n reader.readAsDataURL(this.selectedFile);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! There was an error uploading the file. Please try again`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.messageInput?.nativeElement?.focus();\n }\n }\n\n removeFileSelection() {\n this.selectedFile = undefined;\n this.uploadedFile = undefined;\n this.selectedFilePreviewBuffer = undefined;\n }\n\n openContactDetailPopup(contact: any) {\n this.sharedContact = contact;\n }\n\n closeContactDetailPopup() {\n this.sharedContact = undefined;\n }\n\n async saveContactAsEntity() {\n if (!this.sharedContact) {\n return;\n }\n\n try {\n this.showAddEntityLoader = true;\n\n const parsedPhoneNumber = parsePhoneNumberFromString(this.sharedContact.phones?.[0]?.phone);\n\n const now = moment.utc().unix();\n const params_createEntity: any = CleanDeep.clean({\n id: uuidv4(),\n tenantId: this.authenticationService.getTenantId(),\n name: this.sharedContact.name?.formatted_name,\n isOrganization: false,\n email: this.sharedContact.emails?.[0]?.email,\n phoneNumber: {\n countryCode: parsedPhoneNumber?.country,\n dialCode: parsedPhoneNumber?.countryCallingCode,\n e164Number: parsedPhoneNumber?.format('E.164'),\n internationalNumber: parsedPhoneNumber?.formatInternational(),\n nationalNumber: parsedPhoneNumber?.formatNational(),\n number: parsedPhoneNumber?.nationalNumber,\n },\n createdAt: now,\n updatedAt: now,\n updatedByUserId: this.authenticationService.getUserId(),\n updatedByUserSessionId: this.authenticationService.getUserSessionId(),\n });\n\n const res_createEntity = await this.entityService.CreateEntity(params_createEntity);\n // console.debug('res_createEntity: ', res_createEntity);\n\n // this.openEntityWorkspace(res_createEntity.id, res_createEntity.name);\n this.closeContactDetailPopup();\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not add contact as Entity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showAddEntityLoader = false;\n }\n }\n\n openLocationPopup() {\n this.showLocationPopup = true;\n this.showEmojiPicker = false;\n this.cdr.detectChanges();\n }\n\n closeLocationPopup() {\n this.showLocationPopup = false;\n this.cdr.detectChanges();\n }\n\n async handleLocationSelection(event: any) {\n try {\n this.showLocationPopup = false;\n\n // Set selected location\n this.selectedLocation = {\n latitude: event.latitude,\n longitude: event.longitude,\n };\n\n // Generate geocode location url\n const geocodeUrl = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${event.latitude},${event.longitude}&key=${GoogleMapsConfig.apiKey}`;\n\n // Get geocode location\n const res_getGeolocation: any = await lastValueFrom(this.httpClient.get(geocodeUrl));\n\n this.showLocationPreviewPopup = true;\n this.locationForm.patchValue({\n latitude: event.latitude,\n longitude: event.longitude,\n address: res_getGeolocation.results?.[0]?.formatted_address,\n });\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not get location`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n getMapPreview(latitude: string, longitude: string) {\n return `https://maps.googleapis.com/maps/api/staticmap?center=${latitude},${longitude}&zoom=15&size=400x250&maptype=roadmap&markers=color:red%7Clabel:S%7C${latitude},${longitude}&key=${GoogleMapsConfig.apiKey}`;\n }\n\n closeLocationPreviewPopup() {\n this.showLocationPreviewPopup = false;\n this.selectedLocation = undefined;\n this.cdr.detectChanges();\n }\n\n handleClose() {\n this.closeEv.emit();\n }\n\n /****************************** Helper functions **************************************/\n\n parseIsInbound(message: InteractionMessage): boolean {\n const a = this.parseInteractionAttendee(message);\n return !!a?.entityId;\n }\n\n parseInteractionAttendee(message: InteractionMessage): InteractionAttendee | undefined {\n if (!message?.interactionAttendee) return message?.interactionAttendee as any;\n return this.interactionAttendeesMap?.[message.interactionAttendeeId as any] as any;\n }\n\n private resetConversationState() {\n this.entity = undefined;\n this.entityPhoneNumbers = [];\n this.selectedEntityPhoneNumber = undefined;\n\n this.selectedEntityConversationMessages = [];\n this.nextToken_entityConversationMessages = undefined;\n this.interactionMessageByEntityConversationIdSubscription?.unsubscribe();\n\n this.selectedInteraction = undefined;\n this.selectedInteractionAttendee = undefined;\n this.isRestrictedToTemplateReplies = false;\n this.remainingCountdownTime = 0;\n if (this.countdownInterval) {\n clearInterval(this.countdownInterval);\n }\n\n this.interactionsMap = {};\n this.interactionAttendeesMap = {};\n\n this.referenceMessagesMap = {};\n this.selectedReferenceMessage = undefined;\n this.hasInitialScrollAligned = false;\n\n this.resetAllForms();\n }\n\n private async loadEntityForConversation(entityConversation: EntityConversation) {\n this.entity = entityConversation.entity ?? (await this.entityService.GetEntity(entityConversation.entityId));\n this.entityPhoneNumbers = this.parseEntityPhoneNumbers(this.entity);\n this.selectedEntityPhoneNumber = entityConversation?.entityAddress || this.entityPhoneNumbers?.[0];\n }\n\n private async loadMessagesAndInteractions(entityConversation: EntityConversation) {\n const res_whatsappMessages = await this.fetchEntityConversationMessages(entityConversation.id);\n this.selectedEntityConversationMessages = res_whatsappMessages || [];\n this.interactionMessageByEntityConversationIdSubscription = this.subscribeToEntityConversationMessages(entityConversation.id);\n\n if (!this.selectedEntityConversationMessages?.length) return;\n\n this.updateSelectedPhoneFromLastMessage();\n const latestInteraction: any = entityConversation?.interactions?.items?.[0];\n\n if (latestInteraction && !latestInteraction.deletedAt && !latestInteraction.completedAt) {\n this.selectedInteraction = latestInteraction;\n this.selectedInteractionAttendee = await this.getLatestUserInteractionAttendee(latestInteraction.id, this.authenticationService.getUserId());\n }\n\n if (!latestInteraction || latestInteraction.deletedAt) {\n this.isRestrictedToTemplateReplies = true;\n return;\n }\n\n await this.updateTemplateRestriction(latestInteraction, entityConversation);\n }\n\n private updateSelectedPhoneFromLastMessage() {\n const lastIndex: number = this.selectedEntityConversationMessages.length - 1;\n const lastConversationMessage = this.selectedEntityConversationMessages[lastIndex];\n this.selectedWABAPhoneNumber = this.wabaPhoneNumbers.find((phoneNumber) => this.cleanPhoneNumber(phoneNumber.display_phone_number) === this.cleanPhoneNumber(lastConversationMessage.endpoint?.address)) || this.wabaPhoneNumbers?.[0];\n }\n\n private async updateTemplateRestriction(latestInteraction: any, entityConversation: EntityConversation) {\n const lastEntityMessage: any = await this.getLastEntityInteractionMessage(latestInteraction.id, entityConversation?.entityId);\n if (!lastEntityMessage) {\n this.isRestrictedToTemplateReplies = true;\n return;\n }\n\n const now = moment.utc().unix();\n const twentyFourHoursInSeconds = 24 * 60 * 60;\n const messageAgeInSeconds = now - lastEntityMessage.createdAt;\n\n this.isRestrictedToTemplateReplies = messageAgeInSeconds > twentyFourHoursInSeconds;\n if (!this.isRestrictedToTemplateReplies) {\n this.startCountdownTimer(lastEntityMessage.createdAt + twentyFourHoursInSeconds - now);\n }\n }\n\n private isEntityConversationInactive(): boolean {\n return !!this.entity?.blockedAt || !!this.entity?.deletedAt || !!this.selectedEntityConversation?.blockedAt || !!this.selectedEntityConversation?.deletedAt;\n }\n\n private async uploadSelectedFile(interactionMessageAttachmentId: string) {\n const previewBuffer: string | undefined = this.selectedFilePreviewBuffer as string | undefined;\n const meta = previewBuffer?.split(',')?.[0];\n const extFromPreview = meta?.split(';')[0]?.split('/')[1];\n\n const fileName = this.selectedFile.name || '';\n const lastDotIndex = fileName.lastIndexOf('.');\n const fileExtension = lastDotIndex !== -1 ? fileName.substring(lastDotIndex + 1) : '';\n\n const contentTypeFromFile = this.selectedFile.type;\n const contentTypeFromPreview = meta?.split(':')?.[1]?.split(';')?.[0];\n const contentType = contentTypeFromFile || contentTypeFromPreview;\n\n const s3Config = await this.s3HelperService.getS3Config(this.authenticationService.getToken(), 'ap-south-1');\n\n const fileArrayBuffer = await this.selectedFile.arrayBuffer();\n const params_uploadAttachment = {\n Bucket: 'snugdesk-interaction-attachments',\n Key: fileExtension || extFromPreview ? `${interactionMessageAttachmentId}.${fileExtension || extFromPreview}` : interactionMessageAttachmentId,\n Body: new Uint8Array(fileArrayBuffer),\n ContentType: contentType,\n };\n\n const res_uploadAttachment: any = await this.zone.runOutsideAngular(async () => {\n const client = new S3Client(s3Config);\n const command = new PutObjectCommand(params_uploadAttachment);\n const res = await client.send(command);\n return {\n ...res,\n Key: params_uploadAttachment.Key,\n Bucket: params_uploadAttachment.Bucket,\n Location: `https://${params_uploadAttachment.Bucket}.s3.${s3Config.region}.amazonaws.com/${params_uploadAttachment.Key}`,\n };\n });\n\n this.uploadedFile = {\n key: res_uploadAttachment.key || res_uploadAttachment.Key,\n bucket: res_uploadAttachment.Bucket,\n location: res_uploadAttachment.Location,\n };\n }\n\n private isValidReferenceId(refId?: string): refId is string {\n if (!refId) return false;\n const uuidV4Regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidV4Regex.test(refId);\n }\n\n private findMessageById(messages: InteractionMessage[] | undefined, refId: string): InteractionMessage | undefined {\n return messages?.find((msg: InteractionMessage) => msg?.id === refId);\n }\n\n private cacheReferenceMessage(refId: string, message?: InteractionMessage): boolean {\n if (!message) return false;\n this.referenceMessagesMap[refId] = message;\n return true;\n }\n}\n","<div class=\"sd_waba_container_whatsapp_messages_header\">\n @if (isSmallScreen) {\n <button type=\"button\" class=\"sd_waba_button_close_conversation\" title=\"Back\" (click)=\"handleClose()\">\n <svg height=\"28px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\" d=\"m313-440 224 224-57 56-320-320 320-320 57 56-224 224h487v80H313Z\" />\n </svg>\n </button>\n }\n\n @if (!entity) {\n <div class=\"sd_waba_container_conversation_entity_image\">\n <ngx-skeleton-loader appearance=\"circle\"\n [theme]=\"{ 'background-color': 'rgba(255, 255, 255, 0.2)', 'width': '40px', 'height': '40px', 'margin': '0px' }\"\n animation=\"progress\" />\n </div>\n <div class=\"sd_waba_container_conversation_entity_phone_number\">\n <ngx-skeleton-loader\n [theme]=\"{ 'background-color': 'rgba(255, 255, 255, 0.2)', 'width': '250px', 'height': '20px', 'margin': '0px', 'border-radius': '8px' }\"\n animation=\"progress\" />\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"conversationEntityDetails\"></ng-container>\n }\n</div>\n\n<div class=\"sd_waba_container_conversation_messages_content\">\n <div class=\"sd_waba_container_conversation_messages_content_inner\">\n <div class=\"sd_waba_scrollbox\" id=\"sd_scrollbox_whatsapp_messages\" infiniteScroll\n [style.scrollBehavior]=\"(!hasInitialScrollAligned || showInitLoader) ? 'auto' : 'smooth'\"\n [class.sd_waba_scroll_initializing]=\"!hasInitialScrollAligned && !showInitLoader\" [scrollWindow]=\"false\"\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"500\"\n [infiniteScrollDisabled]=\"showInteractionMessageScrollLoader\" (scrolledUp)=\"onScrollWhatsappMessageList()\"\n (scroll)=\"onScroll()\" #scrollboxWhatsAppMessages>\n <div class=\"sd_waba_scrollbox_content\">\n @if (showInitLoader || showInteractionMessageScrollLoader) {\n <div class=\"sd_waba_container_scroll_loader\">\n <div class=\"sd_waba_scroll_item_loader\"></div>\n </div>\n }\n\n <div class=\"sd_waba_container_conversation_messages_list\">\n @for (message of selectedEntityConversationMessages; track message?.id ?? $index) {\n <lib-whatsapp-message-item [message]=\"message\" [interactionAttendeesMap]=\"interactionAttendeesMap\"\n [referenceMessagesMap]=\"referenceMessagesMap\"\n [isRestrictedToTemplateReplies]=\"isRestrictedToTemplateReplies\"\n (reply)=\"setSelectedReferenceMessage(message)\" />\n }\n @empty {\n <!-- Empty state: shown when no messages exist -->\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n\n@if (showScrollToBottomButton) {\n<button type=\"button\" class=\"sd_waba_button_scroll_to_bottom\" title=\"Scroll to bottom\" (click)=\"scrollToBottom()\">\n <div class=\"sd_waba_square_box\">\n <svg viewBox=\"0 0 30 30\" class=\"sd_waba_arrow_st\" height=\"30\" width=\"30\" preserveAspectRatio=\"xMidYMid meet\" x=\"0px\"\n y=\"0px\">\n <path fill=\"currentColor\" d=\"M11,21.212L17.35,15L11,8.65l1.932-1.932L21.215,15l-8.282,8.282L11,21.212z\"></path>\n </svg>\n </div>\n</button>\n}\n\n<div class=\"sd_waba_container_conversation_message_reply\">\n @if (!!entity?.blockedAt || !!entity?.deletedAt || !!selectedEntityConversation?.blockedAt ||\n !!selectedEntityConversation?.deletedAt) {\n <div class=\"sd_waba_container_coversation_message_reply_inner\">\n <div class=\"sd_waba_container_message_reply_templated\">\n <div class=\"sd_waba_container_message_reply_templated_inner\">\n <div class=\"sd_waba_container_message_reply_templated_error\">\n <p>\n This contact is blocked, so your message can't be sent. Unblock them if you'd like to continue the\n conversation.\n </p>\n </div>\n </div>\n </div>\n </div>\n } @else if (showInitLoader) {\n <div class=\"sd_waba_container_coversation_message_reply_inner\">\n <div class=\"sd_waba_container_message_reply_loader\">\n <div class=\"sd_waba_container_skeleton_loader\">\n <ngx-skeleton-loader\n [theme]=\"{ 'width': '500px', 'height': '40px', 'background-color': '#e0e0e0', 'margin': '0px', 'border-radius': '5px' }\"\n animation=\"progress\">\n </ngx-skeleton-loader>\n </div>\n <div class=\"sd_waba_container_skeleton_loader\">\n <div class=\"sd_waba_container_skeleton_loader_icons\">\n <ngx-skeleton-loader [count]=\"3\" appearance=\"circle\"\n [theme]=\"{ 'width': '30px', 'height': '30px', 'margin': '0px 10px 0px 0px', 'background-color': '#e0e0e0' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n </div>\n <ngx-skeleton-loader\n [theme]=\"{ 'width': '40px', 'height': '40px', 'margin': '0px', 'background-color': 'var(--sd-app-color)', 'border-radius': '10px' }\"\n animation=\"progress\"></ngx-skeleton-loader>\n </div>\n </div>\n </div>\n } @else if (checkReplyConditions() || !selectedInteraction || !selectedEntityConversationMessages ||\n selectedEntityConversationMessages.length === 0) {\n <div class=\"sd_waba_container_coversation_message_reply_inner\">\n <div class=\"sd_waba_container_message_reply_templated\">\n <div class=\"sd_waba_container_message_reply_templated_inner\">\n <div class=\"sd_waba_container_message_reply_templated_information\">\n <p>\n The reply time for this conversation has passed (24 hours). You can now reply using template\n messages approved by WhatsApp. If the customer replies, you'll be able to send regular messages\n again. <a href=\"https://www.twilio.com/docs/whatsapp/tutorial/send-whatsapp-notification-messages-templates\"\n target=\"_blank\" rel=\"noopener\">Learn more <i class=\"fa-solid fa-arrow-up-right\"></i></a>\n </p>\n </div>\n <div class=\"sd_waba_container_message_reply_templated_buttons\">\n <ul>\n @if (this.wabaPhoneNumbers && this.wabaPhoneNumbers.length > 1) {\n <li>\n <button class=\"sd_waba_sim_btn\" [matMenuTriggerFor]=\"whatsAppPhoneNumberOptions\"\n [disabled]=\"showSubmitLoader\">\n <span class=\"sd_waba_sim_select_outer\">{{ getSelectedPhoneNumberIndex() + 1}}</span>\n <svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path stroke=\"#26a884\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 19V5a2 2 0 0 0-2-2h-6.172a2 2 0 0 0-1.414.586L5.586 7.414A2 2 0 0 0 5 8.828V19c0 1.105.893 2 1.997 2h10.004A2 2 0 0 0 19 19z\" />\n </svg>\n </button>\n <mat-menu #whatsAppPhoneNumberOptions=\"matMenu\">\n @for (phoneNumber of wabaPhoneNumbers; track phoneNumber?.id ?? $index; let i = $index) {\n <button type=\"button\" mat-menu-item (click)=\"handleChangeSenderPhoneNumber(phoneNumber)\"\n [ngClass]=\"{ 'item_selected': phoneNumber.id === selectedWABAPhoneNumber?.id }\">\n <div class=\"sd_waba_container_sim_outer\">\n <div class=\"sd_waba_container_sim_selected\">\n <span class=\"sd_waba_sim_round_area\">\n @if (phoneNumber.id === selectedWABAPhoneNumber?.id) {\n <span class=\"sd_waba_sim_tick\">\n <i class=\"fa-solid fa-check\"></i></span>\n }\n </span>\n </div>\n <div class=\"sd_waba_container_sim_icon\">\n <span class=\"sd_waba_sim_count\">{{ i + 1 }}</span>\n <svg width=\"22px\" height=\"22px\" viewBox=\"0 0 24 24\" fill=\"#26a884\">\n <path stroke=\"#26a884\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 19V5a2 2 0 0 0-2-2h-6.172a2 2 0 0 0-1.414.586L5.586 7.414A2 2 0 0 0 5 8.828V19c0 1.105.893 2 1.997 2h10.004A2 2 0 0 0 19 19z\" />\n </svg>\n </div>\n <div class=\"sd_waba_container_sim_number\">\n <div class=\"sd_waba_sim_name\">\n <span\n [ngStyle]=\"{ 'text-decoration': phoneNumber.name_status?.trim().toUpperCase() === 'DECLINED' ? 'line-through' : 'none' }\">\n {{ phoneNumber.verified_name || '' }}\n </span>\n @if (phoneNumber.name_status?.trim().toUpperCase() === 'APPROVED') {\n <span class=\"sd_waba_sim_status\">\n <i class=\"fa-solid fa-badge-check\"></i>\n </span>\n }\n </div>\n <div class=\"sd_waba_sim_number\">\n {{ phoneNumber.display_phone_number }}\n </div>\n </div>\n </div>\n </button>\n }\n </mat-menu>\n </li>\n }\n <li>\n <button class=\"sd_waba_btn_select_template\" (click)=\"toggleMessageTemplatePopup()\">\n Select template\n </button>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n } @else {\n @if (selectedReferenceMessage) {\n <div class=\"sd_waba_container_message_reply_reference\">\n <ng-container [ngTemplateOutlet]=\"referenceMessageTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: selectedReferenceMessage }\"></ng-container>\n <button type=\"button\" title=\"Remove message\" (click)=\"removeSelectedReferenceMessage()\">\n <svg viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" preserveAspectRatio=\"xMidYMid meet\" fill=\"currentColor\"\n enable-background=\"new 0 0 24 24\">\n <path\n d=\"M19.6004 17.2L14.3004 11.9L19.6004 6.60005L17.8004 4.80005L12.5004 10.2L7.20039 4.90005L5.40039 6.60005L10.7004 11.9L5.40039 17.2L7.20039 19L12.5004 13.7L17.8004 19L19.6004 17.2Z\">\n </path>\n </svg>\n </button>\n </div>\n }\n\n <div class=\"sd_waba_container_coversation_message_reply_inner\">\n @if (selectedFile) {\n <div class=\"sd_waba_container_image_upload\">\n <div class=\"sd_waba_btn_right_close\">\n <button type=\"button\" title=\"Remove file\" (click)=\"removeFileSelection()\" [disabled]=\"showSubmitLoader\"><svg\n viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" preserveAspectRatio=\"xMidYMid meet\" fill=\"currentColor\"\n enable-background=\"new 0 0 24 24\">\n <path\n d=\"M19.6004 17.2L14.3004 11.9L19.6004 6.60005L17.8004 4.80005L12.5004 10.2L7.20039 4.90005L5.40039 6.60005L10.7004 11.9L5.40039 17.2L7.20039 19L12.5004 13.7L17.8004 19L19.6004 17.2Z\">\n </path>\n </svg></button>\n </div>\n <div>\n @switch (getAttachmentType(selectedFile)) {\n @case ('image') {\n <div class=\"sd_waba_image_auto\"><img src=\"{{ selectedFilePreviewBuffer }}\" alt=\"{{ selectedFile?.name }}\">\n </div>\n }\n @case ('video') {\n <div class=\"sd_waba_image_auto\"><video width=\"200px\" [src]=\"selectedFilePreviewBuffer\" controls></video></div>\n <p>{{ selectedFile?.name || 'Video' }}</p>\n }\n @case ('audio') {\n <audio [src]=\"selectedFilePreviewBuffer\" controls></audio>\n <p> {{selectedFile?.name || 'Audio' }}</p>\n }\n @default {\n <div class=\"sd_waba_container_pdf\">\n <svg width=\"75px\" viewBox=\"0 0 16 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M2 0C0.9 0 0.01 0.9 0.01 2L0 18C0 19.1 0.89 20 1.99 20H14C15.1 20 16 19.1 16 18V6.83C16 6.3 15.79 5.79 15.41 5.42L10.58 0.59C10.21 0.21 9.7 0 9.17 0H2ZM9 6V1.5L14.5 7H10C9.45 7 9 6.55 9 6ZM4 10C3.44772 10 3 10.4477 3 11C3 11.5523 3.44772 12 4 12H12C12.5523 12 13 11.5523 13 11C13 10.4477 12.5523 10 12 10H4ZM10 15C10 14.4477 9.55228 14 9 14H4C3.44772 14 3 14.4477 3 15C3 15.5523 3.44772 16 4 16H9C9.55228 16 10 15.5523 10 15Z\"\n fill=\"currentColor\"></path>\n </svg>\n </div>\n <p>{{ selectedFile?.name || 'Document' }}</p>\n }\n }\n </div>\n </div>\n }\n @if (showLocationPreviewPopup) {\n <div class=\"sd_waba_location_form\">\n <form [formGroup]=\"locationForm\">\n @if (selectedLocation.latitude || selectedLocation.longitude) {\n <div class=\"sd_waba_locatin_img_st\">\n <img [src]=\"getMapPreview(selectedLocation.latitude, selectedLocation.longitude)\" alt=\"Location\">\n <div class=\"sd_waba_btn_right_close\">\n <button type=\"button\" title=\"Close\" (click)=\"closeLocationPreviewPopup()\"><svg viewBox=\"0 0 24 24\"\n height=\"24\" width=\"24\" preserveAspectRatio=\"xMidYMid meet\" fill=\"currentColor\"\n enable-background=\"new 0 0 24 24\">\n <path\n d=\"M19.6004 17.2L14.3004 11.9L19.6004 6.60005L17.8004 4.80005L12.5004 10.2L7.20039 4.90005L5.40039 6.60005L10.7004 11.9L5.40039 17.2L7.20039 19L12.5004 13.7L17.8004 19L19.6004 17.2Z\">\n </path>\n </svg></button>\n </div>\n </div>\n }\n <div class=\"sd_waba_full_width_form\">\n <div class=\"sd_waba_name_st_location\">\n <label>Name</label>\n <input type=\"text\" class=\"sd_waba_input_location\" formControlName=\"name\" placeholder=\"Name\">\n </div>\n <div class=\"sd_waba_address_send_continer\">\n <div class=\"sd_waba_left_location_ad\">\n <div class=\"sd_waba_address_label\"><label><i class=\"fa-regular fa-location-dot\"></i> Address</label></div>\n <div class=\"sd_waba_address_textarea\">\n <textarea formControlName=\"address\" placeholder=\"Address\"></textarea>\n <input class=\"sd_waba_hidden\" type=\"text\" formControlName=\"longitude\" placeholder=\"Longitude\">\n <input class=\"sd_waba_hidden\" type=\"text\" formControlName=\"latitude\" placeholder=\"Latitude\">\n </div>\n </div>\n <div class=\"sd_waba_btn_right_ad\"><button type=\"submit\" title=\"Send\" class=\"sd_waba_button_submit\"\n (click)=\"onSubmitWhatsappMessage()\" [ngClass]=\"{ 'sd_waba_button_submit_disabled' : showSubmitLoader }\"\n [disabled]=\"showSubmitLoader\">\n <svg viewBox=\"0 0 512 512\" width=\"16px\">\n <path fill=\"currentColor\"\n d=\"M49.9 27.8C15.1 12.7-19.2 50.1-1.2 83.5L68.1 212.2c4.4 8.3 12.6 13.8 21.9 15c0 0 0 0 0 0l176 22c3.4 .4 6 3.3 6 6.7s-2.6 6.3-6 6.7l-176 22s0 0 0 0c-9.3 1.2-17.5 6.8-21.9 15L-1.2 428.5c-18 33.4 16.3 70.8 51.1 55.7L491.8 292.7c32.1-13.9 32.1-59.5 0-73.4L49.9 27.8z\" />\n </svg>\n </button></div>\n </div>\n </div>\n </form>\n </div>\n } @else {\n <div class=\"sd_waba_container_message_reply_form\">\n <form [formGroup]=\"textMessageForm\">\n <textarea title=\"Add a caption...\" rows=\"1\" formControlName=\"body\" id=\"sd_waba_bodyInput\"\n [placeholder]=\"selectedFile ? 'Add a caption...' : 'Reply from Whatsapp...'\"\n [readonly]=\"checkReplyConditions()\" (keydown)=\"autoGrow($event)\"\n (keydown.enter)=\"(textMessageForm.valid || selectedFile) && onSubmitWhatsappMessage()\"\n #messageInput></textarea>\n </form>\n </div>\n <div class=\"sd_waba_container_message_reply_buttons\">\n <div class=\"sd_waba_container_message_reply_buttons_left\">\n <ul>\n <li class=\"test_st\">\n <button type=\"button\" title=\"Attachment options\" [matMenuTriggerFor]=\"conversationAttachmentOptions\"\n (click)=\"openConversationAttachmentOptions()\"\n [disabled]=\"showSubmitLoader || selectedFile || selectedReferenceMessage || checkReplyConditions()\">\n <svg class=\"sd_waba_svg_color_gray svg_x33\"\n [ngClass]=\"{ 'sd_waba_svg_color_gray_disabled': showSubmitLoader || selectedFile || selectedReferenceMessage || checkReplyConditions() }\"\n viewBox=\"0 0 24 24\" width=\"33px\" height=\"33px\" shape-rendering=\"crispEdges\">\n <path fill=\"currentColor\" d=\"M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6V13z\"></path>\n </svg>\n </button>\n <mat-menu #conversationAttachmentOptions=\"matMenu\" class=\"profile-menu\">\n <div class=\"sd_waba_container_attachment_options\">\n <ul>\n <li (click)=\"openImageUpload()\">\n <div class=\"sd_waba_container_attachment_options_item\">\n <div class=\"sd_waba_menu_attachment sd_waba_menu_attachment_img\"><svg width=\"20\" height=\"20\"\n viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M20 14V2C20 0.9 19.1 0 18 0H6C4.9 0 4 0.9 4 2V14C4 15.1 4.9 16 6 16H18C19.1 16 20 15.1 20 14ZM9.4 10.53L11.03 12.71L13.61 9.49C13.81 9.24 14.19 9.24 14.39 9.49L17.35 13.19C17.61 13.52 17.38 14 16.96 14H7C6.59 14 6.35 13.53 6.6 13.2L8.6 10.53C8.8 10.27 9.2 10.27 9.4 10.53ZM0 18V5C0 4.45 0.45 4 1 4C1.55 4 2 4.45 2 5V17C2 17.55 2.45 18 3 18H15C15.55 18 16 18.45 16 19C16 19.55 15.55 20 15 20H2C0.9 20 0 19.1 0 18Z\"\n fill=\"currentColor\"></path>\n </svg></div>\n <div class=\"sd_waba_menu_attachment_name\">Image</div>\n </div>\n </li>\n <li (click)=\"openAudioUpload()\">\n <div class=\"sd_waba_container_attachment_options_item\">\n <div class=\"sd_waba_menu_attachment sd_waba_menu_attachment_audio\"><svg viewBox=\"0 0 24 24\"\n height=\"24\" width=\"24\" class=\"\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M11.999,14.942c2.001,0,3.531-1.53,3.531-3.531V4.35c0-2.001-1.53-3.531-3.531-3.531 S8.469,2.35,8.469,4.35v7.061C8.469,13.412,9.999,14.942,11.999,14.942z M18.237,11.412c0,3.531-2.942,6.002-6.237,6.002 s-6.237-2.471-6.237-6.002H3.761c0,4.001,3.178,7.297,7.061,7.885v3.884h2.354v-3.884c3.884-0.588,7.061-3.884,7.061-7.885 L18.237,11.412z\">\n </path>\n </svg></div>\n <div class=\"sd_waba_menu_attachment_name\">Audio</div>\n </div>\n </li>\n <li (click)=\"openVideoUpload()\">\n <div class=\"sd_waba_container_attachment_options_item\">\n <div class=\"sd_waba_menu_attachment sd_waba_menu_attachment_video\"> <svg fill=\"currentColor\"\n width=\"20px\" height=\"20px\" viewBox=\"0 0 36 36\" version=\"1.1\"\n preserveAspectRatio=\"xMidYMid meet\">\n <path\n d=\"M32.12,10H3.88A1.88,1.88,0,0,0,2,11.88V30.12A1.88,1.88,0,0,0,3.88,32H32.12A1.88,1.88,0,0,0,34,30.12V11.88A1.88,1.88,0,0,0,32.12,10ZM24.18,21.83l-9.77,4.36A1,1,0,0,1,13,25.28V16.56a1,1,0,0,1,1.41-.91L24.18,20A1,1,0,0,1,24.18,21.83Z\"\n class=\"clr-i-solid clr-i-solid-path-1\"></path>\n <path d=\"M30.14,3h0a1,1,0,0,0-1-1h-22a1,1,0,0,0-1,1h0V4h24Z\"\n class=\"clr-i-solid clr-i-solid-path-2\"></path>\n <path d=\"M32.12,7V7a1,1,0,0,0-1-1h-26a1,1,0,0,0-1,1h0V8h28Z\"\n class=\"clr-i-solid clr-i-solid-path-3\"></path>\n <rect x=\"0\" y=\"0\" width=\"8\" height=\"8\" fill-opacity=\"0\" />\n </svg></div>\n <div class=\"sd_waba_menu_attachment_name\"> Video</div>\n </div>\n </li>\n <li (click)=\"openDocumentUpload()\">\n <div class=\"sd_waba_container_attachment_options_item\">\n <div class=\"sd_waba_menu_attachment sd_waba_menu_attachment_document\"><svg height=\"20\"\n viewBox=\"0 0 16 20\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M2 0C0.9 0 0.01 0.9 0.01 2L0 18C0 19.1 0.89 20 1.99 20H14C15.1 20 16 19.1 16 18V6.83C16 6.3 15.79 5.79 15.41 5.42L10.58 0.59C10.21 0.21 9.7 0 9.17 0H2ZM9 6V1.5L14.5 7H10C9.45 7 9 6.55 9 6ZM4 10C3.44772 10 3 10.4477 3 11C3 11.5523 3.44772 12 4 12H12C12.5523 12 13 11.5523 13 11C13 10.4477 12.5523 10 12 10H4ZM10 15C10 14.4477 9.55228 14 9 14H4C3.44772 14 3 14.4477 3 15C3 15.5523 3.44772 16 4 16H9C9.55228 16 10 15.5523 10 15Z\"\n fill=\"currentColor\"></path>\n </svg>\n </div>\n <div class=\"sd_waba_menu_attachment_name\">Document</div>\n </div>\n </li>\n <li (click)=\"openLocationPopup()\">\n <div class=\"sd_waba_container_attachment_options_item\">\n <div class=\"sd_waba_menu_attachment sd_waba_menu_attachment_location\"><svg width=\"20px\"\n height=\"20px\" viewBox=\"-1.5 0 15 15\">\n <path fill=\"currentColor\" fill-rule=\"evenodd\"\n d=\"M574,120 C575.324428,120 580,114.054994 580,110.833333 C580,107.611672 577.313708,105 574,105 C570.686292,105 568,107.611672 568,110.833333 C568,114.054994 572.675572,120 574,120 Z M574,113.333333 C575.420161,113.333333 576.571429,112.214045 576.571429,110.833333 C576.571429,109.452621 575.420161,108.333333 574,108.333333 C572.579839,108.333333 571.428571,109.452621 571.428571,110.833333 C571.428571,112.214045 572.579839,113.333333 574,113.333333 Z\"\n transform=\"translate(-568 -105)\" />\n </svg></div>\n <div class=\"sd_waba_menu_attachment_name\">Location</div>\n </div>\n </li>\n </ul>\n </div>\n </mat-menu>\n <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_image_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\" accept=\"image/*, .jpg, .jpeg, .png, .webp, .gif, .heic, .heif\" title=\"Upload image\"\n (change)=\"handleFileSelection($event)\">\n <!-- <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_audio_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\" accept=\"audio/*, .mp3, .aac, .m4a, .wav, .ogg, .opus, .amr, .flac, .3gpp\" title=\"Upload audio\"\n (change)=\"handleFileSelection($event)\"> -->\n <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_audio_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\" accept=\"audio/mpeg, audio/aac, audio/wav, audio/ogg, audio/opus, audio/amr, audio/flac, audio/3gpp\" title=\"Upload audio\"\n (change)=\"handleFileSelection($event)\">\n <!-- <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_video_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\" accept=\"video/*, .mp4, .3gp, .3gpp, .mov, .mkv, .webm\" title=\"Upload video\"\n (change)=\"handleFileSelection($event)\"> -->\n <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_video_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\" accept=\"video/mp4, video/3gpp, video/quicktime, video/x-matroska, video/webm\" title=\"Upload video\"\n (change)=\"handleFileSelection($event)\">\n <input class=\"sd_waba_hidden\" [id]=\"'sd_whatsapp_document_upload-' + this.selectedEntityConversation?.id\"\n type=\"file\"\n accept=\".pdf, .doc, .docx, .rtf, .odt, .ppt, .pptx, .odp, .xls, .xlsx, .ods, .csv, .txt, .zip, .rar, .7z, .tar, .gz, .vcf\"\n title=\"Upload document\" (change)=\"handleFileSelection($event)\">\n </li>\n <li>\n <button type=\"button\" title=\"Emoji\" (click)=\"toggleEmojiPicker()\"\n [disabled]=\"showSubmitLoader || checkReplyConditions()\">\n <svg class=\"sd_waba_svg_color_gray\"\n [ngClass]=\"{ 'sd_waba_svg_color_gray_disabled': showSubmitLoader || checkReplyConditions() }\"\n viewBox=\"0 0 24 24\" height=\"26px\" width=\"26px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M9.153,11.603c0.795,0,1.439-0.879,1.439-1.962S9.948,7.679,9.153,7.679 S7.714,8.558,7.714,9.641S8.358,11.603,9.153,11.603z M5.949,12.965c-0.026-0.307-0.131,5.218,6.063,5.551 c6.066-0.25,6.066-5.551,6.066-5.551C12,14.381,5.949,12.965,5.949,12.965z M17.312,14.073c0,0-0.669,1.959-5.051,1.959 c-3.505,0-5.388-1.164-5.607-1.959C6.654,14.073,12.566,15.128,17.312,14.073z M11.804,1.011c-6.195,0-10.826,5.022-10.826,11.217 s4.826,10.761,11.021,10.761S23.02,18.423,23.02,12.228C23.021,6.033,17.999,1.011,11.804,1.011z M12,21.354 c-5.273,0-9.381-3.886-9.381-9.159s3.942-9.548,9.215-9.548s9.548,4.275,9.548,9.548C21.381,17.467,17.273,21.354,12,21.354z M15.108,11.603c0.795,0,1.439-0.879,1.439-1.962s-0.644-1.962-1.439-1.962s-1.439,0.879-1.439,1.962S14.313,11.603,15.108,11.603z\">\n </path>\n </svg>\n </button>\n </li>\n <li>\n <button type=\"button\" title=\"Templates\" (click)=\"toggleMessageTemplatePopup()\"\n [disabled]=\"showSubmitLoader || selectedFile || selectedReferenceMessage\">\n <svg class=\"sd_waba_svg_color_gray\"\n [ngClass]=\"{ 'sd_waba_svg_color_gray_disabled': showSubmitLoader || selectedFile || selectedReferenceMessage }\"\n viewBox=\"0 0 576 512\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M104 32H88C39.4 32 0 71.4 0 120v16c0 13.3 10.7 24 24 24s24-10.7 24-24V120c0-22.1 17.9-40 40-40h16c13.3 0 24-10.7 24-24s-10.7-24-24-24zM0 296c0 13.3 10.7 24 24 24s24-10.7 24-24V216c0-13.3-10.7-24-24-24s-24 10.7-24 24v80zm24 56c-13.3 0-24 10.7-24 24v16c0 48.6 39.4 88 88 88h16c13.3 0 24-10.7 24-24s-10.7-24-24-24H88c-22.1 0-40-17.9-40-40V376c0-13.3-10.7-24-24-24zM424 192c13.3 0 24-10.7 24-24V120c0-48.6-39.4-88-88-88H344c-13.3 0-24 10.7-24 24s10.7 24 24 24h16c22.1 0 40 17.9 40 40v48c0 13.3 10.7 24 24 24zM256 456c0-13.3-10.7-24-24-24H184c-13.3 0-24 10.7-24 24s10.7 24 24 24h48c13.3 0 24-10.7 24-24zm8-376c13.3 0 24-10.7 24-24s-10.7-24-24-24H184c-13.3 0-24 10.7-24 24s10.7 24 24 24h80zM432 512a144 144 0 1 0 0-288 144 144 0 1 0 0 288zm16-208v48h48c8.8 0 16 7.2 16 16s-7.2 16-16 16H448v48c0 8.8-7.2 16-16 16s-16-7.2-16-16V384H368c-8.8 0-16-7.2-16-16s7.2-16 16-16h48V304c0-8.8 7.2-16 16-16s16 7.2 16 16z\">\n </path>\n </svg>\n </button>\n </li>\n </ul>\n @if (showEmojiPicker) {\n <emoji-mart (emojiSelect)=\"handleEmojiSelection($event)\" title=\"Choose your emoji\" [showPreview]=\"false\"\n [darkMode]=\"false\" [isNative]=\"true\" [perLine]=\"10\">\n </emoji-mart>\n }\n </div>\n <div class=\"sd_waba_container_message_reply_buttons_right\">\n <ul>\n @if (this.wabaPhoneNumbers && this.wabaPhoneNumbers.length > 1) {\n <li>\n <button class=\"sd_waba_sim_btn\" [matMenuTriggerFor]=\"whatsAppPhoneNumberOptions\"\n [disabled]=\"showSubmitLoader || checkReplyConditions()\">\n <span class=\"sd_waba_sim_select_outer\">{{ getSelectedPhoneNumberIndex() + 1}}</span>\n <svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path stroke=\"#26a884\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 19V5a2 2 0 0 0-2-2h-6.172a2 2 0 0 0-1.414.586L5.586 7.414A2 2 0 0 0 5 8.828V19c0 1.105.893 2 1.997 2h10.004A2 2 0 0 0 19 19z\" />\n </svg>\n </button>\n <mat-menu #whatsAppPhoneNumberOptions=\"matMenu\">\n @for (phoneNumber of wabaPhoneNumbers; track phoneNumber?.id ?? $index; let i = $index) {\n <button mat-menu-item (click)=\"handleChangeSenderPhoneNumber(phoneNumber)\"\n [ngClass]=\"{ 'item_selected': phoneNumber.id === selectedWABAPhoneNumber?.id }\">\n <div class=\"sd_waba_container_sim_outer\">\n <div class=\"sd_waba_container_sim_selected\">\n <span class=\"sd_waba_sim_round_area\">\n @if (phoneNumber.id === selectedWABAPhoneNumber?.id) {\n <span class=\"sd_waba_sim_tick\"><i class=\"fa-solid fa-check\"></i></span>\n }\n </span>\n </div>\n <div class=\"sd_waba_container_sim_icon\">\n <span class=\"sd_waba_sim_count\">{{ i + 1 }}</span>\n <svg width=\"22px\" height=\"22px\" viewBox=\"0 0 24 24\" fill=\"#26a884\">\n <path stroke=\"#26a884\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 19V5a2 2 0 0 0-2-2h-6.172a2 2 0 0 0-1.414.586L5.586 7.414A2 2 0 0 0 5 8.828V19c0 1.105.893 2 1.997 2h10.004A2 2 0 0 0 19 19z\" />\n </svg>\n </div>\n <div class=\"sd_waba_container_sim_number\">\n <div class=\"sd_waba_sim_name\">\n <span\n [ngStyle]=\"{ 'text-decoration': phoneNumber.name_status?.trim().toUpperCase() === 'DECLINED' ? 'line-through' : 'none' }\">\n {{ phoneNumber.verified_name || '' }}\n </span>\n @if (phoneNumber.name_status?.trim().toUpperCase() === 'APPROVED') {\n <span class=\"sd_waba_sim_status\">\n <i class=\"fa-solid fa-badge-check\"></i>\n </span>\n }\n </div>\n <div class=\"sd_waba_sim_number\">\n {{ phoneNumber.display_phone_number }}\n </div>\n </div>\n </div>\n </button>\n }\n </mat-menu>\n </li>\n }\n <li>\n <button type=\"submit\" title=\"Send\" class=\"sd_waba_button_submit\" (click)=\"onSubmitWhatsappMessage()\"\n [disabled]=\"showSubmitLoader || (textMessageForm.invalid && !selectedFile)\">\n <svg viewBox=\"0 0 512 512\" width=\"16px\">\n <path fill=\"currentColor\"\n d=\"M49.9 27.8C15.1 12.7-19.2 50.1-1.2 83.5L68.1 212.2c4.4 8.3 12.6 13.8 21.9 15c0 0 0 0 0 0l176 22c3.4 .4 6 3.3 6 6.7s-2.6 6.3-6 6.7l-176 22s0 0 0 0c-9.3 1.2-17.5 6.8-21.9 15L-1.2 428.5c-18 33.4 16.3 70.8 51.1 55.7L491.8 292.7c32.1-13.9 32.1-59.5 0-73.4L49.9 27.8z\" />\n </svg>\n </button>\n </li>\n </ul>\n </div>\n <div class=\"sd_waba_clear\"></div>\n </div>\n }\n </div>\n }\n</div>\n\n<ng-template #conversationEntityDetails>\n <div class=\"sd_waba_container_conversation_entity_image\">\n @if (entity?.image?.location?.length > 0) {\n <img src=\"{{ entity?.image?.location }}\" alt=\"{{ entity?.name }}\" (error)=\"onEntityImageError()\" />\n }\n @else {\n <ngx-avatars initialsSize=\"2\" [name]=\"entity?.name\" [title]=\"entity?.name\" [round]=\"true\" [size]=\"40\" />\n }\n </div>\n\n <div class=\"sd_waba_container_conversation_entity_phone_number\">\n <div class=\"sd_waba_container_conversation_entity_name\">{{ entity?.name | titlecase }}</div>\n @if (!!entity?.blockedAt || !!entity?.deletedAt || !!selectedEntityConversation?.blockedAt ||\n !!selectedEntityConversation?.deletedAt) {\n <span>(BLOCKED)</span>\n }\n </div>\n\n @if (!!entity && !entity.blockedAt && !entity.deletedAt\n && !!selectedEntityConversation && !selectedEntityConversation.blockedAt && !selectedEntityConversation.deletedAt\n && !!selectedInteraction && !selectedInteraction.completedAt) {\n @if (!!remainingCountdownTime && remainingCountdownTime > 0) {\n <div class=\"sd_waba_container_conversation_timer\">\n <i class=\"fa-regular fa-clock\"></i> {{ formatTime(remainingCountdownTime) }}\n </div>\n }\n }\n\n <div class=\"sd_waba_container_conversation_options\">\n <button class=\"sd_waba_button_conversation_options\" type=\"button\" title=\"Options\" mat-button\n [matMenuTriggerFor]=\"conversationOptions\">\n <svg class=\"sd_waba_icon_options\" viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M12,7c1.104,0,2-0.896,2-2c0-1.105-0.895-2-2-2c-1.104,0-2,0.894-2,2 C10,6.105,10.895,7,12,7z M12,9c-1.104,0-2,0.894-2,2c0,1.104,0.895,2,2,2c1.104,0,2-0.896,2-2C13.999,9.895,13.104,9,12,9z M12,15 c-1.104,0-2,0.894-2,2c0,1.104,0.895,2,2,2c1.104,0,2-0.896,2-2C13.999,15.894,13.104,15,12,15z\">\n </path>\n </svg>\n </button>\n <mat-menu #conversationOptions=\"matMenu\">\n <div class=\"sd_waba_mat_menu_outer\">\n <!-- End Interaction -->\n @if (!!selectedInteraction && !selectedInteraction.completedAt) {\n <button mat-menu-item type=\"button\" (click)=\"showPopup('endInteraction')\">\n @if (showMarkInteractionAsCompleteLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n } @else {\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M40-120v-80h880v80H40Zm120-120q-33 0-56.5-23.5T80-320v-440q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v440q0 33-23.5 56.5T800-240H160Zm0-80h640v-440H160v440Zm0 0v-440 440Zm216-60 104-104 104 104 56-56-104-104 104-104-56-56-104 104-104-104-56 56 104 104-104 104 56 56Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">End Interaction</div>\n </div>\n }\n </button>\n }\n\n <!-- Block Conversation -->\n @if (!selectedEntityConversation?.blockedAt) {\n <button mat-menu-item type=\"button\" (click)=\"showPopup('blockConversation')\">\n @if (showMarkConversationAsBlockedLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n } @else {\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M280-400q-17 0-28.5-11.5T240-440q0-17 11.5-28.5T280-480q17 0 28.5 11.5T320-440q0 17-11.5 28.5T280-400Zm548 154-74-74h46v-480H274l-80-80h606q33 0 56.5 23.5T880-800v480q0 26-14.5 45.5T828-246ZM554-520l-80-80h246v80H554ZM820-28 606-240H240L80-80v-688l-52-52 56-56L876-84l-56 56ZM344-504Zm170-56Zm-234 40q-17 0-28.5-11.5T240-560q0-17 11.5-28.5T280-600q17 0 28.5 11.5T320-560q0 17-11.5 28.5T280-520Zm154-120-34-34v-46h320v80H434Zm-274-48v413l46-45h322L160-688Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Block Conversation</div>\n </div>\n }\n </button>\n }\n\n <!-- Unblock Conversation -->\n @if (!!selectedEntityConversation?.blockedAt) {\n <button mat-menu-item type=\"button\" (click)=\"showPopup('unblockConversation')\">\n @if (showMarkConversationAsUnblockedLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n } @else {\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd sd_waba_btn_unblock\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M280-400q17 0 28.5-11.5T320-440q0-17-11.5-28.5T280-480q-17 0-28.5 11.5T240-440q0 17 11.5 28.5T280-400Zm0-120q17 0 28.5-11.5T320-560q0-17-11.5-28.5T280-600q-17 0-28.5 11.5T240-560q0 17 11.5 28.5T280-520Zm0-120q17 0 28.5-11.5T320-680q0-17-11.5-28.5T280-720q-17 0-28.5 11.5T240-680q0 17 11.5 28.5T280-640Zm120 240h200v-80H400v80Zm0-120h320v-80H400v80Zm0-120h320v-80H400v80ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Unblock Conversation</div>\n </div>\n }\n </button>\n }\n\n <!-- Block Sender -->\n @if (!entity?.blockedAt) {\n <button mat-menu-item type=\"button\" (click)=\"showPopup('blockSender')\">\n @if (showMarkEntityAsBlockedLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n } @else {\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M791-55 686-160H160v-112q0-34 17.5-62.5T224-378q45-23 91.5-37t94.5-21L55-791l57-57 736 736-57 57ZM240-240h366L486-360h-6q-56 0-111 13.5T260-306q-9 5-14.5 14t-5.5 20v32Zm496-138q29 14 46 42.5t18 61.5L666-408q18 7 35.5 14t34.5 16ZM568-506l-59-59q23-9 37-29.5t14-45.5q0-33-23.5-56.5T480-720q-25 0-45.5 14T405-669l-59-59q23-34 58-53t76-19q66 0 113 47t47 113q0 41-19 76t-53 58Zm38 266H240h366ZM457-617Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Block Sender</div>\n </div>\n }\n </button>\n }\n\n <!-- Unblock Sender -->\n @if (!!entity?.blockedAt) {\n <button mat-menu-item type=\"button\" (click)=\"showPopup('unblockSender')\">\n @if (showMarkEntityAsUnblockedLoader) {\n <span class=\"sd_waba_button_submit_loader\"></span>\n } @else {\n <div class=\"sd_waba_btn_content_outer sd_waba_btn_block_sd sd_waba_btn_unblock\">\n <div class=\"sd_waba_icon_ares_sd\">\n <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\">\n <path fill=\"currentColor\"\n d=\"M480-480q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM160-160v-112q0-34 17.5-62.5T224-378q62-31 126-46.5T480-440q66 0 130 15.5T736-378q29 15 46.5 43.5T800-272v112H160Zm80-80h480v-32q0-11-5.5-20T700-306q-54-27-109-40.5T480-360q-56 0-111 13.5T260-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T560-640q0-33-23.5-56.5T480-720q-33 0-56.5 23.5T400-640q0 33 23.5 56.5T480-560Zm0-80Zm0 400Z\" />\n </svg>\n </div>\n <div class=\"sd_waba_btn_name_sd\">Unblock Sender</div>\n </div>\n }\n </button>\n }\n </div>\n </mat-menu>\n </div>\n</ng-template>\n\n<ng-template #referenceMessageTemplate let-message>\n @let isInbound = parseIsInbound(message);\n <div class=\"sd_waba_container_reference_message_outer\">\n <div class=\"sd_waba_container_reference_message\"\n [ngClass]=\"{ 'sd_waba_background_incoming_bgcolor': isInbound, 'sd_waba_background_outgoing_bgcolor': !isInbound }\">\n <p class=\"sd_waba_reference_message_from\">{{ message?.interactionAttendee?.name }}</p>\n @if (message?.attachments?.length) {\n @for (attachment of message.attachments; track attachment?.id ?? $index) {\n <div>\n @switch (getAttachmentType(attachment)) {\n @case ('image') {\n <img src=\"{{ attachment?.file?.location }}\" alt=\"{{ attachment?.name }}\">\n }\n @case ('video') {\n <i class=\"fa-solid fa-video\"></i> {{ attachment?.name }}\n }\n @case ('audio') {\n <i class=\"fa-solid fa-headphones\"></i> {{ attachment?.name }}\n }\n @default {\n <i class=\"fa-solid fa-file\"></i> {{ attachment?.name }}\n }\n }\n </div>\n }\n }\n @if (parseJSON(message?.metadata)?.location) {\n <p>\n <i class=\"fa-solid fa-location-dot\"></i>\n \n {{ parseJSON(message?.metadata)?.location?.name }}, {{ parseJSON(message?.metadata)?.location?.address }}\n </p>\n }\n @if (parseJSON(message?.metadata)?.contacts) {\n <p>\n <i class=\"fa-solid fa-circle-user\"></i>\n \n {{ parseJSON(message?.metadata)?.contacts[0]?.name?.formatted_name }}\n </p>\n }\n <p>{{ message.body }}</p>\n </div>\n </div>\n</ng-template>\n\n@if (sharedContact) {\n<div class=\"sd_waba_container_popup_grey_bg sd_waba_container_padding\">\n <div class=\"sd_waba_container_popup_grey\">\n <div class=\"sd_waba_view_container_wizard\">\n <div class=\"sd_waba_wizard_header_area_top\">\n <h2>View contact</h2>\n </div>\n <div class=\"sd_waba_container_outer_wizard\">\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_contact_view_inner\">\n @if (sharedContact.phones && sharedContact.phones.length > 0) {\n @for (phone of sharedContact.phones; track phone?.phone ?? $index) {\n <div class=\"sd_waba_contact_outer_area\">\n <div class=\"sd_waba_contact_icon\">\n <!-- SVG omitted for brevity; unchanged -->\n <svg viewBox=\"0 0 212 212\" height=\"49\" width=\"49\" preserveAspectRatio=\"xMidYMid meet\" class=\"\"\n version=\"1.1\" x=\"0px\" y=\"0px\" enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\" class=\"primary\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\" class=\"primary\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_name_st\">{{ sharedContact.name.prefix }} {{ sharedContact.name.formatted_name\n }} {{ sharedContact.name.suffix }}</div>\n <div class=\"sd_waba_contact_number_st\">{{ phone.phone }}</div>\n </div>\n </div>\n }\n }\n\n @if (sharedContact.emails && sharedContact.emails.length > 0) {\n @for (email of sharedContact.emails; track email?.email ?? $index) {\n <div class=\"sd_waba_contact_outer_area_rpt\">\n <div class=\"sd_waba_contact_icon\">\n <div class=\"sd_waba_contact_icon2\">\n <svg width=\"15px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M176 56l0 40 160 0 0-40c0-4.4-3.6-8-8-8L184 48c-4.4 0-8 3.6-8 8zM128 96l0-40c0-30.9 25.1-56 56-56L328 0c30.9 0 56 25.1 56 56l0 40 64 0c35.3 0 64 28.7 64 64l0 120 0 136c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 280 0 160c0-35.3 28.7-64 64-64l64 0zM48 304l0 112c0 8.8 7.2 16 16 16l384 0c8.8 0 16-7.2 16-16l0-112-144 0 0 16c0 17.7-14.3 32-32 32l-64 0c-17.7 0-32-14.3-32-32l0-16L48 304zm144-48l128 0 144 0 0-96c0-8.8-7.2-16-16-16l-88 0-208 0-88 0c-8.8 0-16 7.2-16 16l0 96 144 0z\" />\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_number_st\">\n <div class=\"sd_waba_name_type\">{{ email.type }}:</div>\n <div class=\"sd_waba_name_details\"> {{ email.email }}</div>\n </div>\n </div>\n </div>\n }\n }\n\n @if (sharedContact.birthday) {\n <div class=\"sd_waba_contact_outer_area_rpt\">\n <div class=\"sd_waba_contact_icon\">\n <div class=\"sd_waba_contact_icon2\">\n <svg width=\"17px\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\"\n d=\"M86.4 5.5L61.8 47.6C58 54.1 56 61.6 56 69.2L56 72c0 22.1 17.9 40 40 40s40-17.9 40-40l0-2.8c0-7.6-2-15-5.8-21.6L105.6 5.5C103.6 2.1 100 0 96 0s-7.6 2.1-9.6 5.5zm128 0L189.8 47.6c-3.8 6.5-5.8 14-5.8 21.6l0 2.8c0 22.1 17.9 40 40 40s40-17.9 40-40l0-2.8c0-7.6-2-15-5.8-21.6L233.6 5.5C231.6 2.1 228 0 224 0s-7.6 2.1-9.6 5.5zM317.8 47.6c-3.8 6.5-5.8 14-5.8 21.6l0 2.8c0 22.1 17.9 40 40 40s40-17.9 40-40l0-2.8c0-7.6-2-15-5.8-21.6L361.6 5.5C359.6 2.1 356 0 352 0s-7.6 2.1-9.6 5.5L317.8 47.6zM128 176c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 48c-35.3 0-64 28.7-64 64l0 71c8.3 5.2 18.1 9 28.8 9c13.5 0 27.2-6.1 38.4-13.4c5.4-3.5 9.9-7.1 13-9.7c1.5-1.3 2.7-2.4 3.5-3.1c.4-.4 .7-.6 .8-.8l.1-.1s0 0 0 0s0 0 0 0s0 0 0 0s0 0 0 0c3.1-3.2 7.4-4.9 11.9-4.8s8.6 2.1 11.6 5.4c0 0 0 0 0 0s0 0 0 0l.1 .1c.1 .1 .4 .4 .7 .7c.7 .7 1.7 1.7 3.1 3c2.8 2.6 6.8 6.1 11.8 9.5c10.2 7.1 23 13.1 36.3 13.1s26.1-6 36.3-13.1c5-3.5 9-6.9 11.8-9.5c1.4-1.3 2.4-2.3 3.1-3c.3-.3 .6-.6 .7-.7l.1-.1c3-3.5 7.4-5.4 12-5.4s9 2 12 5.4l.1 .1c.1 .1 .4 .4 .7 .7c.7 .7 1.7 1.7 3.1 3c2.8 2.6 6.8 6.1 11.8 9.5c10.2 7.1 23 13.1 36.3 13.1s26.1-6 36.3-13.1c5-3.5 9-6.9 11.8-9.5c1.4-1.3 2.4-2.3 3.1-3c.3-.3 .6-.6 .7-.7l.1-.1c2.9-3.4 7.1-5.3 11.6-5.4s8.7 1.6 11.9 4.8c0 0 0 0 0 0s0 0 0 0s0 0 0 0l.1 .1c.2 .2 .4 .4 .8 .8c.8 .7 1.9 1.8 3.5 3.1c3.1 2.6 7.5 6.2 13 9.7c11.2 7.3 24.9 13.4 38.4 13.4c10.7 0 20.5-3.9 28.8-9l0-71c0-35.3-28.7-64-64-64l0-48c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 48-64 0 0-48c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 48-64 0 0-48zM448 394.6c-8.5 3.3-18.2 5.4-28.8 5.4c-22.5 0-42.4-9.9-55.8-18.6c-4.1-2.7-7.8-5.4-10.9-7.8c-2.8 2.4-6.1 5-9.8 7.5C329.8 390 310.6 400 288 400s-41.8-10-54.6-18.9c-3.5-2.4-6.7-4.9-9.4-7.2c-2.7 2.3-5.9 4.7-9.4 7.2C201.8 390 182.6 400 160 400s-41.8-10-54.6-18.9c-3.7-2.6-7-5.2-9.8-7.5c-3.1 2.4-6.8 5.1-10.9 7.8C71.2 390.1 51.3 400 28.8 400c-10.6 0-20.3-2.2-28.8-5.4L0 480c0 17.7 14.3 32 32 32l384 0c17.7 0 32-14.3 32-32l0-85.4z\" />\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_number_st\">\n <div class=\"sd_waba_name_type\">Birthday:</div>\n <div class=\"sd_waba_name_details\"> {{ sharedContact.birthday }}</div>\n </div>\n </div>\n </div>\n }\n\n @if (sharedContact.org) {\n <div class=\"sd_waba_contact_outer_area_rpt\">\n <div class=\"sd_waba_contact_icon\">\n <div class=\"sd_waba_contact_icon2\">\n <svg width=\"18px\" viewBox=\"0 0 16 16\" version=\"1.1\">\n <path fill=\"currentColor\"\n d=\"M14 15v-11h-3v-3h-9v14h-2v1h7v-3h2v3h7v-1h-2zM6 11h-2v-2h2v2zM6 8h-2v-2h2v2zM6 5h-2v-2h2v2zM9 11h-2v-2h2v2zM9 8h-2v-2h2v2zM9 5h-2v-2h2v2zM13 11h-2v-2h2v2zM13 8h-2v-2h2v2z\">\n </path>\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_number_st\">\n <div class=\"sd_waba_name_type\">COMPANY:</div>\n <div class=\"sd_waba_name_details\">{{ sharedContact.org.company }} {{ sharedContact.org.department }}\n {{\n sharedContact.org.title }}</div>\n </div>\n </div>\n </div>\n }\n\n @if (sharedContact.urls && sharedContact.urls.length > 0) {\n @for (url of sharedContact.urls; track url?.url ?? $index) {\n <div class=\"sd_waba_contact_outer_area_rpt\">\n <div class=\"sd_waba_contact_icon\">\n <div class=\"sd_waba_contact_icon2\">\n <svg width=\"18px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M55.7 199.7L96 240l48 0 48 48 0 64 32 32 0 64 64 0 0-48 64-64 0-80-128 0-32-32 0-32 80 0 0-32-32-32 0-16 32-32 0-31.4c-5.3-.4-10.6-.6-16-.6C160.6 48 80.3 112.2 55.7 199.7zM464 256c0-36.9-9.6-71.5-26.4-101.6L400 192l0 80 63.4 0c.4-5.3 .6-10.6 .6-16zM0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256z\" />\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_number_st\">\n <div class=\"sd_waba_name_type\">{{ url.type }}:</div>\n <div class=\"sd_waba_name_details\"><span>{{ url.url }}</span></div>\n </div>\n </div>\n </div>\n }\n }\n\n @if (sharedContact.addresses && sharedContact.addresses.length > 0) {\n @for (address of sharedContact.addresses; track address?.id ?? $index) {\n <div class=\"sd_waba_contact_outer_area_rpt\">\n <div class=\"sd_waba_contact_icon\">\n <div class=\"sd_waba_contact_icon2\">\n <svg width=\"15px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M176 56l0 40 160 0 0-40c0-4.4-3.6-8-8-8L184 48c-4.4 0-8 3.6-8 8zM128 96l0-40c0-30.9 25.1-56 56-56L328 0c30.9 0 56 25.1 56 56l0 40 64 0c35.3 0 64 28.7 64 64l0 120 0 136c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 280 0 160c0-35.3 28.7-64 64-64l64 0zM48 304l0 112c0 8.8 7.2 16 16 16l384 0c8.8 0 16-7.2 16-16l0-112-144 0 0 16c0 17.7-14.3 32-32 32l-64 0c-17.7 0-32-14.3-32-32l0-16L48 304zm144-48l128 0 144 0 0-96c0-8.8-7.2-16-16-16l-88 0-208 0-88 0c-8.8 0-16 7.2-16 16l0 96 144 0z\" />\n </svg>\n </div>\n </div>\n <div class=\"sd_waba_contact_details\">\n <div class=\"sd_waba_contact_number_st\">\n <div class=\"sd_waba_name_type\">ADDRESS:</div>\n <div class=\"sd_waba_name_details\"> {{ address.city }} {{ address.country }}\n {{ address.country_code }}\n {{ address.state }} {{ address.street }} {{ address.type }} {{ address.zip }}</div>\n </div>\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"sd_waba_container_bottom_wizard\">\n <div class=\"sd_waba_container_settings_buttons\">\n <ul>\n <li><button class=\"sd_waba_button_cancel\" (click)=\"closeContactDetailPopup()\">Close</button></li>\n <li><button class=\"sd_waba_button_submit\" (click)=\"saveContactAsEntity()\">Save contact</button></li>\n </ul>\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n\n@if (showTemplatePopup) {\n<lib-whatsapp-templates [whatsAppInteractionWidget]=\"wabaInteractionWidget\" (close)=\"toggleMessageTemplatePopup()\"\n (submitTemplate)=\"handleSelectMessageTemplate($event)\"></lib-whatsapp-templates>\n}\n\n@if (showLocationPopup) {\n<lib-location-input (close)=\"closeLocationPopup()\" (submitLocation)=\"handleLocationSelection($event)\">\n</lib-location-input>\n}\n\n@if (isPopupOpen) {\n<div class=\"sd_waba_container_popup_grey_bg\" [ngClass]=\"{ 'sd_waba_fade_out': isPopupClosing }\"\n (animationend)=\"onPopupAnimationEnd()\">\n\n <div class=\"sd_waba_container_popup_alert\" [ngClass]=\"{ 'sd_waba_scale_out': isPopupClosing }\">\n <div class=\"sd_waba_container_popup_grey_inner\" [ngClass]=\"{ 'sd_waba_scale_out': isPopupClosing }\">\n <span class=\"sd_waba_icon_delete\">\n @switch (popupMode) {\n @case ('blockConversation') {\n <svg height=\"26px\" viewBox=\"0 -960 960 960\" width=\"26px\">\n <path fill=\"currentColor\" d=\"M280-400q-17 0-28.5-11.5T240-440q0-17 11.5-28.5T280-480q17 0 28.5 11.5T320-440q0 17-11.5 28.5T280-400Zm548 154-74-74h46v-480H274l-80-80h606q33 0 56.5 23.5T880-800v480q0 26-14.5 45.5T828-246ZM554-520l-80-80h246v80H554ZM820-28 606-240H240L80-80v-688l-52-52 56-56L876-84l-56 56ZM344-504Zm170-56Zm-234 40q-17 0-28.5-11.5T240-560q0-17 11.5-28.5T280-600q17 0 28.5 11.5T320-560q0 17-11.5 28.5T280-520Zm154-120-34-34v-46h320v80H434Zm-274-48v413l46-45h322L160-688Z\" />\n </svg>\n }\n @case ('unblockConversation') {\n <svg height=\"26px\" viewBox=\"0 -960 960 960\" width=\"26px\" class=\"sd_waba_success_icon_color\">\n <path fill=\"currentColor\" d=\"M280-400q17 0 28.5-11.5T320-440q0-17-11.5-28.5T280-480q-17 0-28.5 11.5T240-440q0 17 11.5 28.5T280-400Zm0-120q17 0 28.5-11.5T320-560q0-17-11.5-28.5T280-600q-17 0-28.5 11.5T240-560q0 17 11.5 28.5T280-520Zm0-120q17 0 28.5-11.5T320-680q0-17-11.5-28.5T280-720q-17 0-28.5 11.5T240-680q0 17 11.5 28.5T280-640Zm120 240h200v-80H400v80Zm0-120h320v-80H400v80Zm0-120h320v-80H400v80ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z\"></path>\n </svg>\n }\n @case ('blockSender') {\n <svg height=\"28px\" viewBox=\"0 -960 960 960\" width=\"28px\">\n <path fill=\"currentColor\" d=\"M791-55 686-160H160v-112q0-34 17.5-62.5T224-378q45-23 91.5-37t94.5-21L55-791l57-57 736 736-57 57ZM240-240h366L486-360h-6q-56 0-111 13.5T260-306q-9 5-14.5 14t-5.5 20v32Zm496-138q29 14 46 42.5t18 61.5L666-408q18 7 35.5 14t34.5 16ZM568-506l-59-59q23-9 37-29.5t14-45.5q0-33-23.5-56.5T480-720q-25 0-45.5 14T405-669l-59-59q23-34 58-53t76-19q66 0 113 47t47 113q0 41-19 76t-53 58Zm38 266H240h366ZM457-617Z\" />\n </svg>\n }\n @case ('unblockSender') {\n <svg height=\"28px\" viewBox=\"0 -960 960 960\" width=\"28px\" class=\"sd_waba_success_icon_color\"><path fill=\"currentColor\" d=\"M480-480q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM160-160v-112q0-34 17.5-62.5T224-378q62-31 126-46.5T480-440q66 0 130 15.5T736-378q29 15 46.5 43.5T800-272v112H160Zm80-80h480v-32q0-11-5.5-20T700-306q-54-27-109-40.5T480-360q-56 0-111 13.5T260-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T560-640q0-33-23.5-56.5T480-720q-33 0-56.5 23.5T400-640q0 33 23.5 56.5T480-560Zm0-80Zm0 400Z\"></path></svg>\n }\n @default {\n <svg width=\"30px\" height=\"30px\" viewBox=\"0 -960 960 960\">\n <path fill=\"currentColor\" d=\"M40-120v-80h880v80H40Zm120-120q-33 0-56.5-23.5T80-320v-440q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v440q0 33-23.5 56.5T800-240H160Zm0-80h640v-440H160v440Zm0 0v-440 440Zm216-60 104-104 104 104 56-56-104-104 104-104-56-56-104 104-104-104-56 56 104 104-104 104 56 56Z\" />\n </svg>\n }\n }\n </span>\n @switch (popupMode) {\n @case ('blockConversation') {\n <h2>Block conversation with {{ entity?.name || 'this contact' }}?</h2>\n <p>Are you sure you want to block this conversation? You will stop receiving messages until it is unblocked.</p>\n }\n @case ('unblockConversation') {\n <h2>Unblock conversation with {{ entity?.name || 'this contact' }}?</h2>\n <p>This will allow messages from this conversation to come through again.</p>\n }\n @case ('blockSender') {\n <h2>Block {{ entity?.name || 'this contact' }}?</h2>\n <p>Blocking the sender stops messages from this contact across conversations until you unblock them.</p>\n }\n @case ('unblockSender') {\n <h2>Unblock {{ entity?.name || 'this contact' }}?</h2>\n <p>Unblocking the sender will allow messages from this contact to come through again.</p>\n }\n @default {\n <h2>End Interaction with {{ entity?.name || 'this contact' }}?</h2>\n <p>Are you sure you want to continue? A new interaction starts when you send or receive a message.</p>\n }\n }\n\n <div class=\"sd_waba_container_popup_grey_buttons\">\n <ul>\n <li>\n <button type=\"button\" class=\"sd_waba_button_cancel\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"requestClosePopup()\">\n Cancel\n </button>\n </li>\n <li>\n @switch (popupMode) {\n @case ('blockConversation') {\n <button type=\"button\" class=\"sd_waba_button_delete_submit\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"markEntityConversationAsBlocked()\">\n <span>Block</span>\n </button>\n }\n @case ('unblockConversation') {\n <button type=\"button\" class=\"sd_waba_button_delete_submit\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"markEntityConversationAsUnblocked()\">\n <span>Unblock</span>\n </button>\n }\n @case ('blockSender') {\n <button type=\"button\" class=\"sd_waba_button_delete_submit\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"markEntityAsBlocked()\">\n <span>Block</span>\n </button>\n }\n @case ('unblockSender') {\n <button type=\"button\" class=\"sd_waba_button_delete_submit\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"markEntityAsUnblocked()\">\n <span>Unblock</span>\n </button>\n }\n @default {\n <button type=\"button\" class=\"sd_waba_button_delete_submit\"\n [disabled]=\"showMarkConversationAsBlockedLoader || showMarkConversationAsUnblockedLoader || showMarkEntityAsBlockedLoader || showMarkEntityAsUnblockedLoader || showMarkInteractionAsCompleteLoader\"\n (click)=\"markInteractionAsDisconnected()\">\n <span>End</span>\n </button>\n }\n }\n </li>\n </ul>\n <div class=\"sd_waba_clear\"></div>\n </div>\n </div>\n </div>\n</div>\n}\n","import { AfterViewInit, ElementRef, Component, HostListener, Input, OnInit, ViewChild, ChangeDetectorRef, OnChanges, SimpleChanges } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\nimport { EntityConversationService } from './services/entity-conversation.service';\nimport { InteractionMessage } from './services/interaction.service';\nimport { WhatsAppAccountService } from './services/whatsapp-account.service';\nimport { WhatsAppHelperService } from './services/whatsapp-helper.service';\n\nimport moment from 'moment-timezone';\n\nexport class CustomError extends Error {\n constructor(status: number, message: string) {\n super(message);\n this.name = 'SnugdeskCustomError';\n }\n}\n\n@Component({\n selector: 'snugdesk-whatsapp-widget',\n templateUrl: './whatsapp-widget.component.html',\n styleUrls: ['./whatsapp-widget.component.css'],\n standalone: false,\n})\nexport class WhatsAppWidgetComponent implements OnInit, AfterViewInit, OnChanges {\n @Input('token')\n token!: string;\n\n @Input('tenantId')\n tenantId!: string;\n\n @Input('userId')\n userId!: string;\n\n @Input('baseColor')\n baseColor?: string; // --sd-app-color\n\n @ViewChild('mainContainer')\n mainContainerRef!: ElementRef;\n\n isSmallScreen: boolean = false;\n containerDimensions: { width: number; height: number } = {\n width: 1000,\n height: 1000,\n };\n\n error!: CustomError | null;\n\n showInitLoader: boolean = true;\n\n wabaInteractionWidget!: any;\n wabaPhoneNumbers!: any[];\n selectedWABAPhoneNumber!: any;\n\n selectedConversation!: any;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elRef: ElementRef,\n private authenticationService: SnugdeskAuthenticationService,\n private entityConversationService: EntityConversationService,\n private whatsAppAccountService: WhatsAppAccountService,\n private waHelperService: WhatsAppHelperService,\n private snackBar: MatSnackBar\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.showInitLoader = true;\n try {\n // Authenticate\n const res_auth = await this.authenticationService.authenticate(this.token, this.tenantId, this.userId);\n // console.debug('res_auth: ', res_auth);\n\n if (!res_auth) throw new CustomError(403, 'Authentication failed');\n\n // Fetch WhatsApp Account\n this.wabaInteractionWidget = await this.whatsAppAccountService.getWhatsAppAccountByTenantId(this.tenantId);\n // console.debug('Fetched WhatsApp Account: ', this.wabaInteractionWidget);\n\n if (!this.wabaInteractionWidget) throw new CustomError(409, 'WhatsApp account not found');\n\n // Fetch WhatsApp phone numbers\n const { businessAccountId, accessToken } = JSON.parse(this.wabaInteractionWidget.configuration || '{}');\n if (!businessAccountId || !accessToken) {\n throw new CustomError(409, 'WhatsApp account not configured');\n }\n\n const res_listPhoneNumbers: any[] = await this.waHelperService.listPhoneNumbers(businessAccountId, accessToken);\n // console.debug('res_listPhoneNumbers: ', res_listPhoneNumbers);\n\n // this.wabaPhoneNumbers = res_listPhoneNumbers;\n this.wabaPhoneNumbers = res_listPhoneNumbers?.filter((phoneNumber: any) => phoneNumber.health_status?.can_send_message === 'AVAILABLE');\n // console.debug('Fetched WhatsApp Phone Numbers: ', this.wabaPhoneNumbers);\n\n if (!this.wabaPhoneNumbers?.length) {\n throw new CustomError(409, 'No active WhatsApp Phone Numbers found');\n }\n\n this.selectedWABAPhoneNumber = this.wabaPhoneNumbers[0];\n } catch (err: any) {\n console.error(err);\n this.error = err;\n this.snackBar.open(`Oops! ${err instanceof CustomError ? this.error?.message : 'An unexpected error occurred'}`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.showInitLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n ngAfterViewInit() {\n this.checkContainerDimensions();\n this.cdr.detectChanges();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['baseColor']) {\n const newColor = changes['baseColor'].currentValue;\n if (newColor && /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(newColor)) {\n this.applyColorTheme(newColor);\n this.cdr.detectChanges();\n }\n }\n }\n\n @HostListener('window:resize')\n onResize() {\n this.checkContainerDimensions();\n this.cdr.detectChanges();\n }\n\n private checkContainerDimensions() {\n const width = this.mainContainerRef?.nativeElement?.offsetWidth || null;\n const height = this.mainContainerRef?.nativeElement?.offsetHeight || null;\n if (!width || !height) return;\n\n this.isSmallScreen = width <= 768;\n this.containerDimensions = { width, height };\n }\n\n private applyColorTheme(baseColor: string): void {\n const darkColor = this.adjustColor(baseColor, -25);\n const lighterColor = this.adjustColor(baseColor, 25);\n const lightColor = this.adjustColor(baseColor, 90);\n\n const host = this.elRef.nativeElement;\n host.style.setProperty('--sd-app-color', baseColor);\n host.style.setProperty('--sd-app-color-dark', darkColor);\n host.style.setProperty('--sd-app-color-lighter', lighterColor);\n host.style.setProperty('--sd-app-color-light', lightColor);\n }\n\n private adjustColor(hex: string, percent: number): string {\n // normalize #RGB to #RRGGBB\n if (/^#([a-f\\d])([a-f\\d])([a-f\\d])$/i.test(hex)) {\n hex = hex.replace(/^#([a-f\\d])([a-f\\d])([a-f\\d])$/i, (_, r, g, b) => `#${r}${r}${g}${g}${b}${b}`);\n }\n\n let r = parseInt(hex.slice(1, 3), 16);\n let g = parseInt(hex.slice(3, 5), 16);\n let b = parseInt(hex.slice(5, 7), 16);\n\n // clamp percent to [-100, 100]\n const t = Math.max(-100, Math.min(100, percent)) / 100;\n\n const mix = (c: number) =>\n t < 0\n ? c * (1 + t) // darken toward 0 (black)\n : c + (255 - c) * t; // lighten toward 255 (white)\n\n r = Math.round(Math.min(255, Math.max(0, mix(r))));\n g = Math.round(Math.min(255, Math.max(0, mix(g))));\n b = Math.round(Math.min(255, Math.max(0, mix(b))));\n\n return `#${this.toHex(r)}${this.toHex(g)}${this.toHex(b)}`;\n }\n\n private toHex(value: number): string {\n const hex = Math.round(value).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }\n\n async handleSelectConversation(conversation: any): Promise<void> {\n const previouslySelectedConversation = this.selectedConversation;\n this.selectedConversation = conversation;\n\n if (conversation && previouslySelectedConversation && previouslySelectedConversation.id === conversation.id) return;\n\n const now = moment.utc().unix();\n\n // update previous conversation\n if (previouslySelectedConversation) {\n try {\n const res_updatePreviouslySelectedEntityConversation = await this.entityConversationService.UpdateEntityConversation({\n id: previouslySelectedConversation.id,\n lastActivityAt: now,\n updatedAt: previouslySelectedConversation.updatedAt,\n });\n // console.debug('res_updatePreviouslySelectedEntityConversation: ', res_updatePreviouslySelectedEntityConversation);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not update last activity for previous conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n previouslySelectedConversation.lastActivityAt = now;\n this.cdr.detectChanges();\n }\n }\n\n // update selected conversation\n if (this.selectedConversation && this.selectedConversation.lastActivityAt && this.selectedConversation.lastActivityAt < now - 1) {\n try {\n const res_updateSelectedEntityConversation = await this.entityConversationService.UpdateEntityConversation({\n id: this.selectedConversation.id,\n lastActivityAt: now,\n updatedAt: this.selectedConversation.updatedAt,\n });\n // console.debug('res_updateSelectedEntityConversation: ', res_updateSelectedEntityConversation);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not update last activity for selected conversation`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.selectedConversation.lastActivityAt = now;\n this.cdr.detectChanges();\n }\n }\n }\n\n async handleCloseSelectedConversation(): Promise<void> {\n const previousSelectedConversation = { ...this.selectedConversation };\n this.selectedConversation = undefined;\n this.cdr.detectChanges();\n\n if (!previousSelectedConversation) return;\n\n try {\n const now = moment.utc().unix();\n const res_updateEntityConversation = await this.entityConversationService.UpdateEntityConversation({\n id: previousSelectedConversation.id,\n lastActivityAt: now,\n updatedAt: previousSelectedConversation.updatedAt,\n });\n // console.debug('res_updateEntityConversation', res_updateEntityConversation);\n } catch (err) {\n console.error(err);\n this.snackBar.open(`Oops! Could not update last activity`, 'Close', {\n duration: 5000,\n panelClass: ['snackbar-error'],\n horizontalPosition: 'center',\n verticalPosition: 'top',\n });\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n handleNewMessage(interactionMessage: InteractionMessage) {\n // console.debug('Got new message: ', interactionMessage);\n if (!this.selectedConversation) return;\n\n this.selectedConversation = {\n ...this.selectedConversation,\n messages: {\n items: [interactionMessage],\n },\n };\n this.cdr.detectChanges();\n }\n\n handleChangeWhatsAppPhoneNumber(phoneNumber: any): void {\n this.selectedWABAPhoneNumber = phoneNumber;\n this.cdr.detectChanges();\n }\n}\n","<div class=\"sd_waba_container_whatsapp_widget\" #mainContainer>\n @if (showInitLoader) {\n <sd-app-loader></sd-app-loader>\n } @else if (error) {\n <sd-app-error [error]=\"error\"></sd-app-error>\n } @else {\n <div class=\"sd_waba_container_conversations_whatsapp\">\n <div class=\"sd_waba_container_conversations_whatsapp_inner\">\n <div [hidden]=\"isSmallScreen && !!selectedConversation\" [ngClass]=\"{\n 'sd_waba_container_conversations_whatsapp_left': !isSmallScreen,\n 'sd_waba_container_conversations_whatsapp_left_full_width': isSmallScreen\n }\">\n <lib-whatsapp-conversations [selectedConversation]=\"selectedConversation\"\n [containerDimensions]=\"containerDimensions\" (selectConversation)=\"handleSelectConversation($event)\">\n </lib-whatsapp-conversations>\n </div>\n <div [ngClass]=\"{\n 'sd_waba_container_conversations_whatsapp_right': !isSmallScreen,\n 'sd_waba_container_conversations_whatsapp_right_full_width': isSmallScreen\n }\">\n @if (selectedConversation) {\n <lib-whatsapp-messages [isSmallScreen]=\"isSmallScreen\" [wabaInteractionWidget]=\"wabaInteractionWidget\"\n [wabaPhoneNumbers]=\"wabaPhoneNumbers\" [selectedEntityConversation]=\"selectedConversation\"\n [selectedWABAPhoneNumber]=\"selectedWABAPhoneNumber\" (newMessage)=\"handleNewMessage($event)\"\n (changePhoneNumber)=\"handleChangeWhatsAppPhoneNumber($event)\" (close)=\"handleCloseSelectedConversation()\" />\n } @else {\n <div class=\"sd_waba_new_conve_message_outer_area\">\n <div class=\"sd_waba_scrollbox\">\n <div class=\"sd_waba_scrollbox_content\">\n <div class=\"sd_waba_container_new_conv_inner\">\n <div class=\"sd_waba_conve_new_images\"></div>\n <h2>No conversation selected</h2>\n <p>\n Select an existing conversation from the list, or click here to start one.\n </p>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSelectModule } from '@angular/material/select';\n\nimport { SnugdeskCoreModule, CustomPipesModule } from '@snugdesk/core';\nimport { provideAppSyncConfig } from './services/appsync-graphql.service';\nimport { defaultAppSyncConfig } from './config/appsync.config';\n\nimport { WhatsAppContactCreateComponent } from './components/whatsapp-contact-create/whatsapp-contact-create.component';\nimport { WhatsAppContactListComponent } from './components/whatsapp-contact-list/whatsapp-contact-list.component';\nimport { WhatsAppWidgetComponent } from './whatsapp-widget.component';\nimport { WhatsAppConversationsComponent } from './components/whatsapp-conversations/whatsapp-conversations.component';\nimport { WhatsAppMessagesComponent } from './components/whatsapp-messages/whatsapp-messages.component';\nimport { WhatsAppMessageItemComponent } from './components/whatsapp-message-item/whatsapp-message-item.component';\nimport { WhatsAppTemplatesComponent } from './components/whatsapp-templates/whatsapp-templates.component';\nimport { WhatsAppTemplatePreviewComponent } from './components/whatsapp-template-preview/whatsapp-template-preview.component';\n\nimport { PhoneInputComponent } from './shared/form-controls/phone-input/phone-input.component';\nimport { LocationInputComponent } from './shared/form-controls/location-input/location-input.component';\n\nimport { WhatsAppTextFormatterPipe } from './shared/pipes/whatsapp-text-formatter.pipe';\n\nimport { AvatarModule } from 'ngx-avatars';\nimport { InfiniteScrollDirective } from 'ngx-infinite-scroll';\nimport { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';\nimport { PickerModule } from '@ctrl/ngx-emoji-mart';\n\n@NgModule({\n declarations: [\n WhatsAppWidgetComponent,\n WhatsAppContactCreateComponent,\n WhatsAppConversationsComponent,\n WhatsAppContactListComponent,\n WhatsAppMessagesComponent,\n WhatsAppMessageItemComponent,\n WhatsAppTemplatesComponent,\n WhatsAppTemplatePreviewComponent,\n WhatsAppTextFormatterPipe,\n LocationInputComponent,\n PhoneInputComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n // ReactiveFormsModule.withConfig({ warnOnNgModelWithFormControl: 'never' }),\n NgTemplateOutlet,\n MatNativeDateModule,\n MatButtonModule,\n MatCheckboxModule,\n MatDatepickerModule,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatMenuModule,\n MatRadioModule,\n MatSelectModule,\n SnugdeskCoreModule,\n CustomPipesModule,\n AvatarModule,\n InfiniteScrollDirective,\n NgxSkeletonLoaderModule,\n PickerModule,\n ],\n exports: [WhatsAppWidgetComponent, WhatsAppTextFormatterPipe],\n providers: [provideAppSyncConfig(defaultAppSyncConfig)],\n})\nexport class WhatsAppWidgetModule {}\n","/*\n * Public API Surface of whatsapp-widget\n */\n\nexport * from './lib/whatsapp-widget.module';\nexport * from './lib/whatsapp-widget.component';\n\nexport * from './lib/components/whatsapp-contact-create/whatsapp-contact-create.component';\nexport * from './lib/components/whatsapp-contact-list/whatsapp-contact-list.component';\nexport * from './lib/components/whatsapp-conversations/whatsapp-conversations.component';\nexport * from './lib/components/whatsapp-message-item/whatsapp-message-item.component';\nexport * from './lib/components/whatsapp-messages/whatsapp-messages.component';\nexport * from './lib/components/whatsapp-template-preview/whatsapp-template-preview.component';\nexport * from './lib/components/whatsapp-templates/whatsapp-templates.component';\n\nexport * from './lib/shared/form-controls/phone-input/phone-input.component';\nexport * from './lib/shared/form-controls/location-input/location-input.component';\nexport * from './lib/shared/pipes/whatsapp-text-formatter.pipe';\n\nexport * from './lib/services/appsync-graphql.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.AppSyncGraphqlService","i2","i4","i6","i3.EntityService","i5","i7","i8.PhoneInputComponent","i2.EntityService","i9.WhatsAppContactCreateComponent","i1.AppSyncGraphqlService","i1.InteractionWidgetService","uuidv4","i3.EntityConversationService","i8","i9","i10","i11.WhatsAppContactListComponent","i12.WhatsAppTextFormatterPipe","i3","i5.WhatsAppTextFormatterPipe","i2.WhatsAppTextFormatterPipe","i4.WhatsAppHelperService","i5.WhatsAppTemplateFileService","i8.WhatsAppTemplatePreviewComponent","i9.LocationInputComponent","i11.WhatsAppTextFormatterPipe","i5.UserService","i6.EntityService","i7.EntityConversationService","i8.InteractionService","i9.WhatsAppHelperService","i12","i13","i14","i15","i17.WhatsAppMessageItemComponent","i18.WhatsAppTemplatesComponent","i19.LocationInputComponent","i2.EntityConversationService","i3.WhatsAppAccountService","i7.WhatsAppConversationsComponent","i8.WhatsAppMessagesComponent"],"mappings":"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"}
|