UNPKG

@cometchat/chat-uikit-angular

Version:

Ready-to-use Chat UI Components for Angular (JavaScript/Web)

592 lines 93.5 kB
import { ChangeDetectionStrategy, Component, Input, } from "@angular/core"; import { CometChat } from "@cometchat/chat-sdk-javascript"; import { OutgoingCallConfiguration, CometChatSoundManager, CometChatUIKitCalls, CallScreenConfiguration, CallLogsStyle, StorageUtils, } from "@cometchat/uikit-shared"; import { AvatarStyle, CallscreenStyle, DateStyle, ListItemStyle, } from "@cometchat/uikit-elements"; import { localize, CometChatUIKitConstants, fontHelper, DatePatterns, CometChatCallEvents, TitleAlignment, States, } from "@cometchat/uikit-resources"; import { CallLogUtils } from "../../../Shared/Utils/CallLogUtils"; import * as i0 from "@angular/core"; import * as i1 from "../../../CometChatTheme.service"; import * as i2 from "../../../CometChatList/cometchat-list.component"; import * as i3 from "../../CometChatOngoingCall/cometchat-ongoing-call/cometchat-ongoing-call.component"; import * as i4 from "../../CometChatOutgoingCall/cometchat-outgoing-call/cometchat-outgoing-call.component"; import * as i5 from "@angular/common"; export class CometchatCallLogsComponent { constructor(elementRef, ref, themeService) { this.elementRef = elementRef; this.ref = ref; this.themeService = themeService; this.title = localize("CALLS"); this.titleAlignment = TitleAlignment.left; this.emptyStateText = localize("NO_CALLS_FOUND"); this.errorStateText = localize("SOMETHING_WRONG"); this.loadingIconURL = "assets/Spinner.svg"; this.infoIconUrl = "assets/InfoIcon.svg"; this.missedAudioCallIconUrl = "assets/missedAudioCallIconUrl.svg"; this.missedVideoCallIconUrl = "assets/missedVideoCallIconUrl.svg"; this.outgoingAudioCallIconUrl = "assets/outgoingAudioCallIconUrl.svg"; this.outgoingVideoCallIconUrl = "assets/outgoingVideoCallIconUrl.svg"; this.incomingAudioCallIconUrl = "assets/incomingAudioCallIconUrl.svg"; this.incomingVideoCallIconUrl = "assets/incomingVideoCallIconUrl.svg"; this.onError = (error) => { console.log(error); }; this.datePattern = DatePatterns.time; this.DateSeparatorPattern = DatePatterns.DayDate; this.callLogsStyle = { width: "100%", height: "100%", }; this.avatarStyle = { borderRadius: "16px", width: "32px", height: "32px", }; this.hideSeparator = false; this.dateSeparatorStyle = { height: "", width: "", }; this.outgoingCallConfiguration = new OutgoingCallConfiguration({}); this.hideError = false; this.showSectionHeader = true; this.showMoreInfo = false; this.sectionHeaderField = "initiatedAt"; this.backdropStyle = {}; this.dateStyle = {}; this.listItemStyle = {}; this.ongoingCallConfiguration = new CallScreenConfiguration({}); this.state = States.loading; this.listStyle = {}; this.sessionId = ""; this.callLogsListenerId = "calllogscalling" + new Date().getTime(); this.ongoingCallStyle = {}; this.showOngoingCall = false; this.limit = 30; this.callsList = []; this.callsListenerId = "callsList_" + new Date().getTime(); this.loggedInUser = null; this.authToken = ""; this.showOutgoingCallscreen = false; this.onScrolledToBottom = null; this.outgoingCallStyle = { width: "360px", height: "581px", titleTextFont: "700 22px Inter", titleTextColor: "RGB(20, 20, 20)", subtitleTextFont: "400 15px Inter", subtitleTextColor: "RGBA(20, 20, 20, 0.58)", borderRadius: "8px", }; this.fetchNextCallLogsList = () => { this.onScrolledToBottom = null; this.state = States.loading; this.ref.detectChanges(); this.callsRequest.fetchNext() .then((callList) => { if (callList?.length > 0) { this.onScrolledToBottom = this.fetchNextCallLogsList; this.ref.detectChanges(); } if (callList.length <= 0 && this.callsList?.length <= 0) { this.state = States.empty; this.ref.detectChanges(); } else { this.state = States.loaded; this.callsList = [...this.callsList, ...callList]; if (this.callsList.length < 1) { this.state = States.empty; this.ref.detectChanges(); } this.ref.detectChanges(); } }) .catch((error) => { if (this.onError) { this.onError(error); this.state = States.error; this.ref.detectChanges(); } this.state = States.error; this.ref.detectChanges(); }); }; this.handleInfoClick = (call) => { this.selectedOrActiveCallLogObject = call; this.ref.detectChanges(); if (this.onInfoClick) { this.onInfoClick(call); } }; this.getActiveCall = (call) => { if (call.getSessionID() !== undefined && call.getSessionID() === this.selectedOrActiveCallLogObject?.getSessionID()) { return true; } else { return false; } }; this.getSectionHeader = (call, index) => { if (this.callsList && this.callsList.length > 0 && index === 0) { return this.callsList[0]["initiatedAt"]; } if (this.callsList && this.callsList.length > 0 && index > 0 && CallLogUtils.isDateDifferent(this.callsList[index - 1]["initiatedAt"], this.callsList[index]["initiatedAt"])) { return call.getInitiatedAt(); } }; this.onListItemClickCall = (call) => { let receiverID = call.getReceiver().uid; let callType = call?.type; let receiverType = call?.receiverType; if (this.loggedInUser?.getUid() === call?.getInitiator()?.getUid()) { receiverID = call.getReceiver()?.uid; } else { receiverID = call.getInitiator()?.uid; } let localCallObj = new CometChat.Call(receiverID, callType, receiverType); if (receiverType == CometChat.RECEIVER_TYPE.USER) { CometChat.initiateCall(localCallObj) .then((outGoingCall) => { this.cometchatCallObject = outGoingCall; this.showOutgoingCallscreen = true; this.ref.detectChanges(); }) .catch((error) => { if (this.onError) { this.onError(error); } }); } }; this.cancelOutgoingCall = () => { CometChatSoundManager.pause(); CometChat.rejectCall(this.cometchatCallObject.getSessionId(), CometChatUIKitConstants.calls.cancelled) .then((call) => { this.showOutgoingCallscreen = false; CometChatCallEvents.ccCallRejected.next(call); this.cometchatCallObject = null; this.ref.detectChanges(); }) .catch((error) => { if (this.onError) { this.onError(error); } }); this.showOutgoingCallscreen = false; this.ref.detectChanges(); }; this.callLogStyle = () => { return { height: this.callLogsStyle.height, width: this.callLogsStyle.width, background: this.callLogsStyle.background, border: this.callLogsStyle.border, borderRadius: this.callLogsStyle.borderRadius, }; }; this.subtitleStyle = () => { return { font: this.callLogsStyle.callStatusTextFont, color: this.callLogsStyle.callStatusTextColor, }; }; this.infoButtonStyle = () => { return { height: "24px", width: "24px", border: "none", borderRadius: "0", background: "transparent", buttonIconTint: this.callLogsStyle.infoIconTint, }; }; this.setOngoingCallStyle = () => { let defaultStyle = new CallscreenStyle({ maxHeight: "100%", maxWidth: "100%", border: "none", borderRadius: "0", background: "#1c2226", minHeight: "400px", minWidth: "400px", minimizeIconTint: this.themeService.theme.palette.getAccent900(), maximizeIconTint: this.themeService.theme.palette.getAccent900(), }); this.ongoingCallStyle = { ...defaultStyle, ...this.ongoingCallStyle }; }; this.state = States.loading; } ngOnInit() { this.setThemeStyle(); this.attachListeners(); CometChat.getLoggedinUser() .then((user) => { this.loggedInUser = user; this.authToken = this.loggedInUser.getAuthToken(); this.callsRequest = this.getRequestBuilder(); this.fetchNextCallLogsList(); }) .catch((error) => { if (this.onError) { this.onError(error); } }); } attachListeners() { CometChat.addCallListener(this.callLogsListenerId, new CometChat.CallListener({ onIncomingCallReceived: (call) => { this.cometchatCallObject = call; this.ref.detectChanges(); }, onIncomingCallCancelled: (call) => { this.cometchatCallObject = null; this.ref.detectChanges(); }, onOutgoingCallRejected: (call) => { if (this.cometchatCallObject && this.cometchatCallObject.getSessionId() == call.getSessionId()) { this.cometchatCallObject = null; this.showOutgoingCallscreen = false; this.ref.detectChanges(); } }, onOutgoingCallAccepted: (call) => { if (this.cometchatCallObject && this.cometchatCallObject.getSessionId() == call.getSessionId()) { this.cometchatCallObject = call; this.openOngoingCallScreen(call); } }, onCallEndedMessageReceived: (call) => { this.cometchatCallObject = null; this.ref.detectChanges(); }, })); } ngOnDestroy() { this.callsRequest = null; this.removeListener(); this.ref.detach(); } removeListener() { CometChat.removeCallListener(this.callLogsListenerId); } getSubtitle(call) { return CallLogUtils.getCallStatusWithType(call, this.loggedInUser); } getCallerName(call) { if (this.loggedInUser?.getUid() === call?.getInitiator()?.getUid()) { return call?.getReceiver()?.getName(); } return call.getInitiator()?.getName(); } getAvatarUrl(call) { if (this.loggedInUser?.getUid() === call?.getInitiator()?.getUid()) { return call?.receiver?.avatar || call?.receiver?.icon; } return call.initiator?.avatar || call?.initiator?.icon; } getRequestBuilder() { if (this.callLogRequestBuilder) { return this.callLogRequestBuilder?.build(); } else { return new CometChatUIKitCalls.CallLogRequestBuilder() .setLimit(this.limit) .setCallCategory("call") .setAuthToken(this.authToken) .build(); } } getCallTypeIcon(call) { const missedCall = CallLogUtils.isMissedCall(call, this.loggedInUser); const callType = call.getType(); let icon; if (missedCall) { if (callType === CometChat.CALL_TYPE.AUDIO) { icon = this.missedAudioCallIconUrl; } else { icon = this.missedVideoCallIconUrl; } } else if (call.getInitiator().getUid() === this.loggedInUser.getUid()) { if (callType === CometChat.CALL_TYPE.AUDIO) { icon = this.outgoingAudioCallIconUrl; } else { icon = this.outgoingVideoCallIconUrl; } } else { if (callType === CometChat.CALL_TYPE.AUDIO) { icon = this.incomingAudioCallIconUrl; } else { icon = this.incomingVideoCallIconUrl; } } return icon; } setThemeStyle() { this.setAvatarStyle(); this.setDateStyle(); this.setCallLogsStyle(); this.listStyle = { titleTextFont: this.callLogsStyle.titleFont, titleTextColor: this.callLogsStyle.titleColor, emptyStateTextFont: this.callLogsStyle.emptyStateTextFont, emptyStateTextColor: this.callLogsStyle.emptyStateTextColor, errorStateTextFont: this.callLogsStyle.errorStateTextFont, errorStateTextColor: this.callLogsStyle.errorStateTextColor, loadingIconTint: this.callLogsStyle.loadingIconTint, separatorColor: this.callLogsStyle.dateSeparatorTextColor, sectionHeaderTextColor: this.callLogsStyle.dateSeparatorTextColor || "rgba(20, 20, 20, 0.46)", sectionHeaderTextFont: this.callLogsStyle.dateSeparatorTextFont, }; } setAvatarStyle() { let defaultStyle = new AvatarStyle({ borderRadius: "24px", width: "36px", height: "36px", border: "none", backgroundColor: this.themeService.theme.palette.getAccent700(), nameTextColor: this.themeService.theme.palette.getAccent900(), backgroundSize: "cover", nameTextFont: fontHelper(this.themeService.theme.typography.subtitle1), outerViewBorderSpacing: "", }); this.avatarStyle = { ...defaultStyle, ...this.avatarStyle }; } setDateStyle() { let defaultStyle = new DateStyle({ textFont: fontHelper(this.themeService.theme.typography.caption2), textColor: this.themeService.theme.palette.getAccent600(), background: "transparent", }); this.dateStyle = { ...defaultStyle, ...this.dateStyle }; } getListItemStyle(call) { let defaultStyle = new ListItemStyle({ height: "45px", width: "100%", background: this.themeService.theme.palette.getBackground(), activeBackground: this.themeService.theme.palette.getAccent100(), borderRadius: "0", titleFont: fontHelper(this.themeService.theme.typography.title2), // titleColor: this.isMissedCall(call, this.loggedInUser!) titleColor: CallLogUtils.isMissedCall(call, this.loggedInUser) ? this.themeService.theme.palette.getError() : this.themeService.theme.palette.getAccent(), border: "none", separatorColor: this.themeService.theme.palette.getAccent200(), padding: "10px", hoverBackground: this.themeService.theme.palette.getAccent50(), }); return { ...defaultStyle, ...this.listItemStyle }; } setCallLogsStyle() { let defaultStyle = new CallLogsStyle({ background: this.themeService.theme.palette.getBackground(), border: `1px solid ${this.themeService.theme.palette.getAccent50()}`, titleFont: fontHelper(this.themeService.theme.typography.title1), titleColor: this.themeService.theme.palette.getAccent(), emptyStateTextFont: fontHelper(this.themeService.theme.typography.title1), emptyStateTextColor: this.themeService.theme.palette.getAccent600(), errorStateTextFont: fontHelper(this.themeService.theme.typography.title1), errorStateTextColor: this.themeService.theme.palette.getAccent600(), loadingIconTint: this.themeService.theme.palette.getAccent600(), dateSeparatorTextColor: this.themeService.theme.palette.getAccent600(), dateTextColor: this.themeService.theme.palette.getAccent600(), dateTextFont: fontHelper(this.themeService.theme.typography.subtitle2), missedCallIconTint: this.themeService.theme.palette.getAccent600(), borderRadius: "", infoIconTint: this.themeService.theme.palette.getPrimary(), outgoingCallIconTint: this.themeService.theme.palette.getAccent600(), incomingCallIconTint: this.themeService.theme.palette.getAccent600(), callStatusTextFont: fontHelper(this.themeService.theme.typography.subtitle2), callStatusTextColor: this.themeService.theme.palette.getAccent600(), dateSeparatorTextFont: fontHelper(this.themeService.theme.typography.subtitle2), }); this.callLogsStyle = { ...defaultStyle, ...this.callLogsStyle }; } getCallBuilder() { let audioOnlyCall = this.activeCall?.getType() == CometChatUIKitConstants.MessageTypes.audio ? true : false; const callSettings = new CometChatUIKitCalls.CallSettingsBuilder() .enableDefaultLayout(true) .setIsAudioOnlyCall(audioOnlyCall) .setCallListener(new CometChatUIKitCalls.OngoingCallListener({ onCallEnded: () => { StorageUtils.setItem(CometChatUIKitConstants.calls.activecall, null); if (this.cometchatCallObject?.getReceiverType() == CometChatUIKitConstants.MessageReceiverType.user) { CometChatUIKitCalls.endSession(); CometChat.clearActiveCall(); this.closeCallScreen(); } }, onCallEndButtonPressed: () => { StorageUtils.setItem(CometChatUIKitConstants.calls.activecall, null); if (this.cometchatCallObject?.getReceiverType() == CometChatUIKitConstants.MessageReceiverType.user) { CometChat.endCall(this.sessionId) .then((call) => { CometChatUIKitCalls.endSession(); CometChatCallEvents.ccCallEnded.next(call); this.closeCallScreen(); }) .catch((err) => { if (this.onError) { this.onError(err); } }); } else { this.closeCallScreen(); } }, onError: (error) => { if (this.onError) { this.onError(error); } }, })) .build(); return callSettings; } closeCallScreen() { this.cometchatCallObject = null; this.showOngoingCall = false; this.sessionId = ""; this.showOutgoingCallscreen = false; this.cometchatCallObject = null; this.ref.detectChanges(); } openOngoingCallScreen(call) { this.showOutgoingCallscreen = false; this.cometchatCallObject = call; this.sessionId = call.getSessionId(); this.showOngoingCall = true; this.ref.detectChanges(); } getDirectionIconStyle(call) { let tint; const missedCall = CallLogUtils.isMissedCall(call, this.loggedInUser); if (missedCall) { tint = this.callLogsStyle.missedCallIconTint || this.themeService.theme.palette.getAccent600(); } else if (call.getInitiator().getUid() === this.loggedInUser?.getUid()) { tint = this.callLogsStyle.outgoingCallIconTint || this.themeService.theme.palette.getAccent600(); } else { tint = this.callLogsStyle.incomingCallIconTint || this.themeService.theme.palette.getAccent600(); } return { height: "18px", width: "18px", border: "none", borderRadius: "0", background: "transparent", iconTint: tint, }; } } CometchatCallLogsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometchatCallLogsComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.CometChatThemeService }], target: i0.ɵɵFactoryTarget.Component }); CometchatCallLogsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: CometchatCallLogsComponent, selector: "cometchat-call-logs", inputs: { title: "title", titleAlignment: "titleAlignment", listItemView: "listItemView", subtitleView: "subtitleView", tailView: "tailView", menu: "menu", emptyStateView: "emptyStateView", errorStateView: "errorStateView", emptyStateText: "emptyStateText", errorStateText: "errorStateText", loadingStateView: "loadingStateView", loadingIconURL: "loadingIconURL", infoIconUrl: "infoIconUrl", missedAudioCallIconUrl: "missedAudioCallIconUrl", missedVideoCallIconUrl: "missedVideoCallIconUrl", outgoingAudioCallIconUrl: "outgoingAudioCallIconUrl", outgoingVideoCallIconUrl: "outgoingVideoCallIconUrl", incomingAudioCallIconUrl: "incomingAudioCallIconUrl", incomingVideoCallIconUrl: "incomingVideoCallIconUrl", callLogRequestBuilder: "callLogRequestBuilder", cometchatCallObject: "cometchatCallObject", onItemClick: "onItemClick", onInfoClick: "onInfoClick", onError: "onError", activeCall: "activeCall", datePattern: "datePattern", DateSeparatorPattern: "DateSeparatorPattern", callLogsStyle: "callLogsStyle", avatarStyle: "avatarStyle", hideSeparator: "hideSeparator", dateSeparatorStyle: "dateSeparatorStyle", outgoingCallConfiguration: "outgoingCallConfiguration", hideError: "hideError", showSectionHeader: "showSectionHeader", showMoreInfo: "showMoreInfo", sectionHeaderField: "sectionHeaderField", backdropStyle: "backdropStyle", dateStyle: "dateStyle", listItemStyle: "listItemStyle", ongoingCallConfiguration: "ongoingCallConfiguration" }, ngImport: i0, template: "<div class=\"cc-call-logs\" [ngStyle]=\"callLogStyle()\">\n <div class=\"cc-menus\" *ngIf=\"menu\">\n <ng-container *ngTemplateOutlet=\"menu\">\n </ng-container>\n </div>\n <cometchat-list [hideSearch]=\"true\" [listItemView]=\"listItemView ? listItemView : listItem\"\n [onScrolledToBottom]=\"onScrolledToBottom\" [list]=\"callsList\" [hideError]=\"hideError\" [title]=\"title\"\n [emptyStateText]=\"emptyStateText\" [loadingIconURL]=\"loadingIconURL\" [titleAlignment]=\"titleAlignment\"\n [loadingStateView]=\"loadingStateView\" [emptyStateView]=\"emptyStateView\" [sectionHeaderField]=\"sectionHeaderField\"\n [showSectionHeader]=\"showSectionHeader\" [errorStateView]=\"errorStateView\" [errorStateText]=\"errorStateText\"\n [listStyle]=\"listStyle\" [state]=\"state\" [getSectionHeader]=\"getSectionHeader!\">\n </cometchat-list>\n\n <ng-template #listItem let-call>\n\n <cometchat-list-item [title]=\"getCallerName(call)\" [avatarURL]=\"getAvatarUrl(call)\"\n [avatarName]=\"getCallerName(call)\" [listItemStyle]=\"getListItemStyle(call)\" [avatarStyle]=\"avatarStyle\"\n [hideSeparator]=\"hideSeparator\" (cc-listitem-clicked)=\"onListItemClickCall(call)\"\n [isActive]=\"getActiveCall(call)\">\n <div slot=\"subtitleView\" class=\"cc-call-logs__subtitle-view\" *ngIf=\"subtitleView;else groupSubtitle\">\n <ng-container *ngTemplateOutlet=\"subtitleView\">\n </ng-container>\n </div>\n <ng-template #groupSubtitle>\n <div slot=\"subtitleView\" [ngStyle]=\"subtitleStyle()\" class=\"cc-call-logs__subtitle-view\">\n <div class=\"cc-call__icon\">\n <cometchat-icon [iconStyle]=\"getDirectionIconStyle(call)\" [URL]=\"getCallTypeIcon(call)\"></cometchat-icon>\n </div>\n <div class=\"cc-call__type\">\n {{getSubtitle(call)}}\n </div>\n </div>\n </ng-template>\n <div slot=\"tailView\" class=\"cc-call-logs__tail-view\" *ngIf=\"tailView;else defaultTailView\">\n <ng-container *ngTemplateOutlet=\"tailView\">\n </ng-container>\n </div>\n <ng-template #defaultTailView>\n <div slot=\"tailView\" [ngStyle]=\"subtitleStyle()\" class=\"cc-call-logs__subtitle-view\">\n <div class=\"tail__view\">\n <div class=\"cc-call-logs__date\">\n <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.initiatedAt\"\n [pattern]=\"datePattern\"></cometchat-date>\n <cometchat-button *ngIf=\"showMoreInfo\" [iconURL]=\"infoIconUrl\" class=\"cc-details__close-button\"\n [buttonStyle]=\"infoButtonStyle()\" (cc-button-clicked)=\"handleInfoClick(call)\"></cometchat-button>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n </cometchat-list-item>\n\n </ng-template>\n\n\n</div>\n\n<cometchat-ongoing-call *ngIf=\"showOngoingCall\" [maximizeIconURL]=\"ongoingCallConfiguration.maximizeIconURL\"\n [minimizeIconURL]=\"ongoingCallConfiguration.minimizeIconURL\" [sessionID]=\"sessionId\"\n [callSettingsBuilder]=\"getCallBuilder()!\"></cometchat-ongoing-call>\n\n<cometchat-backdrop *ngIf=\"showOutgoingCallscreen\" [backdropStyle]=\"backdropStyle\">\n\n <cometchat-outgoing-call [customSoundForCalls]=\"outgoingCallConfiguration.customSoundForCalls\"\n [onError]=\"outgoingCallConfiguration.onError\"\n [disableSoundForCalls]=\"outgoingCallConfiguration.disableSoundForCalls\"\n [avatarStyle]=\"outgoingCallConfiguration.avatarStyle\" [customView]=\"outgoingCallConfiguration.customView\"\n [declineButtonIconURL]=\"outgoingCallConfiguration.declineButtonIconURL\"\n [onCloseClicked]=\"outgoingCallConfiguration.onCloseClicked || cancelOutgoingCall\"\n [outgoingCallStyle]=\"outgoingCallConfiguration.outgoingCallStyle || outgoingCallStyle\"\n [call]=\"cometchatCallObject!\"></cometchat-outgoing-call>\n</cometchat-backdrop>", styles: [".cc-call-logs{height:100%;width:100%;box-sizing:border-box;padding-bottom:24px}.cc-call-logs__tail-view{position:relative}.cc-call-logs__date{display:flex;gap:3px}.cc-menus{position:absolute;right:12px;top:6px}.cc-call-logs__subtitle-view{display:flex;align-items:center;justify-content:flex-start;gap:6px}\n"], components: [{ type: i2.CometchatListComponent, selector: "cometchat-list", inputs: ["listItemView", "onScrolledToBottom", "onScrolledToTop", "list", "onSearch", "getSectionHeader", "searchText", "searchIconURL", "listStyle", "searchPlaceholderText", "hideSearch", "hideError", "title", "titleAlignment", "errorStateView", "loadingStateView", "emptyStateView", "state", "errorStateText", "emptyStateText", "loadingIconURL", "showSectionHeader", "sectionHeaderField", "DateSeparatorPattern", "dateSeparatorStyle"] }, { type: i3.CometChatOngoingCallComponent, selector: "cometchat-ongoing-call", inputs: ["ongoingCallStyle", "resizeIconHoverText", "sessionID", "minimizeIconURL", "maximizeIconURL", "callSettingsBuilder", "callWorkflow", "onError"] }, { type: i4.CometChatOutgoingCallComponent, selector: "cometchat-outgoing-call", inputs: ["call", "declineButtonText", "declineButtonIconURL", "customView", "onError", "disableSoundForCalls", "customSoundForCalls", "avatarStyle", "outgoingCallStyle", "onCloseClicked"] }], directives: [{ type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometchatCallLogsComponent, decorators: [{ type: Component, args: [{ selector: "cometchat-call-logs", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cc-call-logs\" [ngStyle]=\"callLogStyle()\">\n <div class=\"cc-menus\" *ngIf=\"menu\">\n <ng-container *ngTemplateOutlet=\"menu\">\n </ng-container>\n </div>\n <cometchat-list [hideSearch]=\"true\" [listItemView]=\"listItemView ? listItemView : listItem\"\n [onScrolledToBottom]=\"onScrolledToBottom\" [list]=\"callsList\" [hideError]=\"hideError\" [title]=\"title\"\n [emptyStateText]=\"emptyStateText\" [loadingIconURL]=\"loadingIconURL\" [titleAlignment]=\"titleAlignment\"\n [loadingStateView]=\"loadingStateView\" [emptyStateView]=\"emptyStateView\" [sectionHeaderField]=\"sectionHeaderField\"\n [showSectionHeader]=\"showSectionHeader\" [errorStateView]=\"errorStateView\" [errorStateText]=\"errorStateText\"\n [listStyle]=\"listStyle\" [state]=\"state\" [getSectionHeader]=\"getSectionHeader!\">\n </cometchat-list>\n\n <ng-template #listItem let-call>\n\n <cometchat-list-item [title]=\"getCallerName(call)\" [avatarURL]=\"getAvatarUrl(call)\"\n [avatarName]=\"getCallerName(call)\" [listItemStyle]=\"getListItemStyle(call)\" [avatarStyle]=\"avatarStyle\"\n [hideSeparator]=\"hideSeparator\" (cc-listitem-clicked)=\"onListItemClickCall(call)\"\n [isActive]=\"getActiveCall(call)\">\n <div slot=\"subtitleView\" class=\"cc-call-logs__subtitle-view\" *ngIf=\"subtitleView;else groupSubtitle\">\n <ng-container *ngTemplateOutlet=\"subtitleView\">\n </ng-container>\n </div>\n <ng-template #groupSubtitle>\n <div slot=\"subtitleView\" [ngStyle]=\"subtitleStyle()\" class=\"cc-call-logs__subtitle-view\">\n <div class=\"cc-call__icon\">\n <cometchat-icon [iconStyle]=\"getDirectionIconStyle(call)\" [URL]=\"getCallTypeIcon(call)\"></cometchat-icon>\n </div>\n <div class=\"cc-call__type\">\n {{getSubtitle(call)}}\n </div>\n </div>\n </ng-template>\n <div slot=\"tailView\" class=\"cc-call-logs__tail-view\" *ngIf=\"tailView;else defaultTailView\">\n <ng-container *ngTemplateOutlet=\"tailView\">\n </ng-container>\n </div>\n <ng-template #defaultTailView>\n <div slot=\"tailView\" [ngStyle]=\"subtitleStyle()\" class=\"cc-call-logs__subtitle-view\">\n <div class=\"tail__view\">\n <div class=\"cc-call-logs__date\">\n <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.initiatedAt\"\n [pattern]=\"datePattern\"></cometchat-date>\n <cometchat-button *ngIf=\"showMoreInfo\" [iconURL]=\"infoIconUrl\" class=\"cc-details__close-button\"\n [buttonStyle]=\"infoButtonStyle()\" (cc-button-clicked)=\"handleInfoClick(call)\"></cometchat-button>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n </cometchat-list-item>\n\n </ng-template>\n\n\n</div>\n\n<cometchat-ongoing-call *ngIf=\"showOngoingCall\" [maximizeIconURL]=\"ongoingCallConfiguration.maximizeIconURL\"\n [minimizeIconURL]=\"ongoingCallConfiguration.minimizeIconURL\" [sessionID]=\"sessionId\"\n [callSettingsBuilder]=\"getCallBuilder()!\"></cometchat-ongoing-call>\n\n<cometchat-backdrop *ngIf=\"showOutgoingCallscreen\" [backdropStyle]=\"backdropStyle\">\n\n <cometchat-outgoing-call [customSoundForCalls]=\"outgoingCallConfiguration.customSoundForCalls\"\n [onError]=\"outgoingCallConfiguration.onError\"\n [disableSoundForCalls]=\"outgoingCallConfiguration.disableSoundForCalls\"\n [avatarStyle]=\"outgoingCallConfiguration.avatarStyle\" [customView]=\"outgoingCallConfiguration.customView\"\n [declineButtonIconURL]=\"outgoingCallConfiguration.declineButtonIconURL\"\n [onCloseClicked]=\"outgoingCallConfiguration.onCloseClicked || cancelOutgoingCall\"\n [outgoingCallStyle]=\"outgoingCallConfiguration.outgoingCallStyle || outgoingCallStyle\"\n [call]=\"cometchatCallObject!\"></cometchat-outgoing-call>\n</cometchat-backdrop>", styles: [".cc-call-logs{height:100%;width:100%;box-sizing:border-box;padding-bottom:24px}.cc-call-logs__tail-view{position:relative}.cc-call-logs__date{display:flex;gap:3px}.cc-menus{position:absolute;right:12px;top:6px}.cc-call-logs__subtitle-view{display:flex;align-items:center;justify-content:flex-start;gap:6px}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.CometChatThemeService }]; }, propDecorators: { title: [{ type: Input }], titleAlignment: [{ type: Input }], listItemView: [{ type: Input }], subtitleView: [{ type: Input }], tailView: [{ type: Input }], menu: [{ type: Input }], emptyStateView: [{ type: Input }], errorStateView: [{ type: Input }], emptyStateText: [{ type: Input }], errorStateText: [{ type: Input }], loadingStateView: [{ type: Input }], loadingIconURL: [{ type: Input }], infoIconUrl: [{ type: Input }], missedAudioCallIconUrl: [{ type: Input }], missedVideoCallIconUrl: [{ type: Input }], outgoingAudioCallIconUrl: [{ type: Input }], outgoingVideoCallIconUrl: [{ type: Input }], incomingAudioCallIconUrl: [{ type: Input }], incomingVideoCallIconUrl: [{ type: Input }], callLogRequestBuilder: [{ type: Input }], cometchatCallObject: [{ type: Input }], onItemClick: [{ type: Input }], onInfoClick: [{ type: Input }], onError: [{ type: Input }], activeCall: [{ type: Input }], datePattern: [{ type: Input }], DateSeparatorPattern: [{ type: Input }], callLogsStyle: [{ type: Input }], avatarStyle: [{ type: Input }], hideSeparator: [{ type: Input }], dateSeparatorStyle: [{ type: Input }], outgoingCallConfiguration: [{ type: Input }], hideError: [{ type: Input }], showSectionHeader: [{ type: Input }], showMoreInfo: [{ type: Input }], sectionHeaderField: [{ type: Input }], backdropStyle: [{ type: Input }], dateStyle: [{ type: Input }], listItemStyle: [{ type: Input }], ongoingCallConfiguration: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tZXRjaGF0LWNhbGwtbG9ncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXVpa2l0LWFuZ3VsYXIvc3JjL0NhbGxzL0NvbWV0Q2hhdENhbGxMb2dzL2NvbWV0Y2hhdC1jYWxsLWxvZ3MvY29tZXRjaGF0LWNhbGwtbG9ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXVpa2l0LWFuZ3VsYXIvc3JjL0NhbGxzL0NvbWV0Q2hhdENhbGxMb2dzL2NvbWV0Y2hhdC1jYWxsLWxvZ3MvY29tZXRjaGF0LWNhbGwtbG9ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxLQUFLLEdBS04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTNELE9BQU8sRUFFTCx5QkFBeUIsRUFDekIscUJBQXFCLEVBRXJCLG1CQUFtQixFQUNuQix1QkFBdUIsRUFDdkIsYUFBYSxFQUNiLFlBQVksR0FDYixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxXQUFXLEVBRVgsZUFBZSxFQUNmLFNBQVMsRUFDVCxhQUFhLEdBQ2QsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEVBQ0wsUUFBUSxFQUNSLHVCQUF1QixFQUN2QixVQUFVLEVBQ1YsWUFBWSxFQUNaLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsTUFBTSxHQUNQLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7Ozs7O0FBUWxFLE1BQU0sT0FBTywwQkFBMEI7SUF3R3JDLFlBQ1UsVUFBc0IsRUFDdEIsR0FBc0IsRUFDdEIsWUFBbUM7UUFGbkMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtR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