@cometchat/chat-uikit-angular
Version:
Ready-to-use Chat UI Components for Angular (JavaScript/Web)
592 lines • 93.5 kB
JavaScript
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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