@cometchat/chat-uikit-angular
Version:
Ready-to-use Chat UI Components for Angular (JavaScript/Web)
681 lines • 105 kB
JavaScript
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { CometChat } from '@cometchat/chat-sdk-javascript';
import { GroupsStyle } from "@cometchat/uikit-shared";
import { AvatarStyle, ListItemStyle } from '@cometchat/uikit-elements';
import { localize, CometChatGroupEvents, States, TitleAlignment, SelectionMode, CometChatUIKitConstants, fontHelper } from '@cometchat/uikit-resources';
import { CometChatException } from '../../Shared/Utils/ComeChatException';
import * as i0 from "@angular/core";
import * as i1 from "../../CometChatTheme.service";
import * as i2 from "../../CometChatList/cometchat-list.component";
import * as i3 from "@angular/common";
/**
*
* CometChatGroups is a wrapper component which consists of CometChatListBaseComponent and CometChatGroupListComponent.
*
* @version 1.0.0
* @author CometChatTeam
* @copyright © 2022 CometChat Inc.
*
*/
export class CometChatGroupsComponent {
constructor(ref, themeService) {
this.ref = ref;
this.themeService = themeService;
this.hideSeparator = false;
this.selectionMode = SelectionMode.none;
this.searchPlaceholder = localize("SEARCH");
this.hideError = false;
this.searchIconURL = "assets/search.svg";
this.hideSearch = false;
this.title = localize("GROUPS");
this.onError = (error) => {
console.log(error);
};
this.loadingIconURL = "assets/Spinner.svg";
this.privateGroupIcon = "assets/Private.svg";
/**
* @deprecated
*
* This property is deprecated as of version 4.3.7 due to newer property 'passwordGroupIcon'. It will be removed in subsequent versions.
*/
this.protectedGroupIcon = "assets/Locked.svg";
this.passwordGroupIcon = undefined;
this.emptyStateText = localize("NO_GROUPS_FOUND");
this.errorStateText = localize("SOMETHING_WRONG");
this.titleAlignment = TitleAlignment.left;
this.selectionmodeEnum = SelectionMode;
this.state = States.loading;
this.statusIndicatorStyle = {
height: "12px",
width: "12px",
borderRadius: "16px"
};
this.avatarStyle = {
borderRadius: "16px",
width: "32px",
height: "32px",
};
this.groupsStyle = {
width: "100%",
height: "100%",
separatorColor: "rgb(222 222 222 / 46%)"
};
this.listItemStyle = {};
this.listStyle = {};
this.limit = 30;
this.searchKeyword = "";
this.groupsList = [];
this.groupsListenerId = "groupsList_" + new Date().getTime();
this.loggedInUser = null;
this.statusColor = {
private: "",
password: "#F7A500",
public: ""
};
this.firstReload = false;
this.connectionListenerId = "connection_" + new Date().getTime();
this.onScrolledToBottom = null;
this.checkboxStyle = {
height: "24px",
width: "24px",
border: "none",
borderRadius: "4px",
checkedBackgroundColor: "#2196F3",
uncheckedBackgroundColor: "#ccc"
};
/**
* @param {CometChat.Group} group
*/
this.getGroupIcon = (group) => {
let status;
if (group) {
switch (group.getType()) {
case CometChatUIKitConstants.GroupTypes.password:
status = this.passwordGroupIcon || this.protectedGroupIcon;
break;
case CometChatUIKitConstants.GroupTypes.private:
status = this.privateGroupIcon;
break;
default:
status = null;
break;
}
}
return status;
};
this.findGroupIndex = (groupToFind) => {
let groupIndex = this.groupsList.findIndex((g, k) => g.getGuid() === groupToFind.getGuid());
return groupIndex;
};
this.fetchNextGroupList = (state = States.loading) => {
this.onScrolledToBottom = null;
this.state = state;
this.ref.detectChanges();
if (this.requestBuilder && this.requestBuilder?.pagination && (this.requestBuilder.pagination?.current_page == 0 || this.requestBuilder.pagination?.current_page != this.requestBuilder.pagination.total_pages)) {
this.onScrolledToBottom = this.fetchNextGroupList;
try {
this.requestBuilder.fetchNext().then((groupList) => {
if ((groupList.length <= 0 && this.groupsList?.length <= 0) || (groupList.length === 0 && this.groupsList?.length <= 0)) {
this.state = States.empty;
this.ref.detectChanges();
}
else {
if (state == States.loaded) {
this.groupsList = [...groupList];
}
else {
this.groupsList = [...this.groupsList, ...groupList];
}
this.state = States.loaded;
this.ref.detectChanges();
}
if (this.firstReload) {
this.attachConnectionListeners();
this.firstReload = false;
}
}, (error) => {
if (this.onError) {
this.onError(CometChatException(error));
}
this.state = States.error;
this.ref.detectChanges();
}).catch((error) => {
if (this.onError) {
this.onError(error);
}
if (this.groupsList?.length <= 0) {
this.state = States.error;
this.ref.detectChanges();
}
});
}
catch (error) {
if (this.onError) {
this.onError(CometChatException(error));
}
this.state = States.error;
this.ref.detectChanges();
}
}
else {
this.state = States.loaded;
this.ref.detectChanges();
}
};
/**
* @param {CometChat.Group} group
*/
this.onClick = (group) => {
if (this.onItemClick) {
this.onItemClick(group);
}
};
/**
* @param {CometChat.Group} group
*/
this.getMemberCount = (group) => {
return group.getMembersCount() > 1 ? group.getMembersCount() + " " + localize("MEMBERS") : group.getMembersCount() + " " + localize("MEMBER");
};
/**
* @param {CometChat.Group} group
*/
this.getActiveGroup = (group) => {
if (this.selectionMode == SelectionMode.none || !this.selectionMode) {
if (group.getGuid() == this.activeGroup?.getGuid()) {
return true;
}
else {
return false;
}
}
else {
return false;
}
};
/**
* @param {string} key
*/
this.onSearch = (key) => {
try {
this.searchKeyword = key;
clearTimeout(this.timeout);
this.timeout = setTimeout(() => {
this.setRequestBuilder();
this.groupsList = [];
this.ref.detectChanges();
this.fetchNextGroupList();
}, 500);
}
catch (error) {
if (this.onError) {
this.onError(CometChatException(error));
}
}
};
this.groupStyle = () => {
return {
height: this.groupsStyle.height,
width: this.groupsStyle.width,
background: this.groupsStyle.background,
border: this.groupsStyle.border,
borderRadius: this.groupsStyle.borderRadius
};
};
this.subtitleStyle = () => {
return {
font: this.groupsStyle.subTitleTextFont,
color: this.groupsStyle.subTitleTextColor
};
};
this.state = States.loading;
}
ngOnChanges(changes) {
}
ngOnInit() {
this.firstReload = true;
this.onScrolledToBottom = this.fetchNextGroupList;
this.setThemeStyle();
this.subscribeToEvents();
CometChat.getLoggedinUser().then((user) => {
this.setRequestBuilder();
this.fetchNextGroupList();
this.loggedInUser = user;
}).catch((error) => {
if (this.onError) {
this.onError(error);
}
});
this.state = States.loading;
this.attachListeners();
}
onGroupSelected(group, event) {
let selected = event?.detail?.checked;
if (this.onSelect) {
this.onSelect(group, selected);
}
}
// subscribe to global events
subscribeToEvents() {
this.ccGroupDeleted = CometChatGroupEvents.ccGroupDeleted.subscribe((group) => {
this.removeGroup(group);
if (this.activeGroup && group.getGuid() == this.activeGroup.getGuid()) {
this.activeGroup = null;
this.ref.detectChanges();
}
});
this.ccGroupCreated = CometChatGroupEvents.ccGroupCreated.subscribe((group) => {
this.addGroup(group);
if (!this.activeGroup) {
this.activeGroup = group;
}
});
this.ccGroupMemberAdded = CometChatGroupEvents.ccGroupMemberAdded.subscribe((item) => {
if (this.activeGroup && this.activeGroup.getGuid() == item?.userAddedIn.getGuid()) {
this.activeGroup == item?.userAddedIn;
this.ref.detectChanges();
}
this.updateGroup(item?.userAddedIn);
});
this.ccGroupMemberBanned = CometChatGroupEvents.ccGroupMemberBanned.subscribe((item) => {
if (this.activeGroup && this.activeGroup.getGuid() == item?.kickedFrom.getGuid()) {
this.activeGroup == item?.kickedFrom;
this.ref.detectChanges();
}
this.updateGroup(item?.kickedFrom);
});
this.ccGroupMemberJoined = CometChatGroupEvents.ccGroupMemberJoined.subscribe((item) => {
if (this.activeGroup && this.activeGroup.getGuid() == item?.joinedGroup.getGuid()) {
this.activeGroup == item?.joinedGroup;
this.ref.detectChanges();
}
this.updateGroup(item?.joinedGroup);
});
this.ccGroupMemberKicked = CometChatGroupEvents.ccGroupMemberKicked.subscribe((item) => {
if (this.activeGroup && this.activeGroup.getGuid() == item?.kickedFrom.getGuid()) {
this.activeGroup == item?.kickedFrom;
this.ref.detectChanges();
}
this.updateGroup(item?.kickedFrom);
});
this.ccOwnershipChanged = CometChatGroupEvents.ccOwnershipChanged.subscribe((item) => {
if (this.activeGroup && this.activeGroup.getGuid() == item?.group.getGuid()) {
this.activeGroup == item?.group;
this.ref.detectChanges();
}
this.updateGroup(item?.group);
});
this.ccGroupLeft = CometChatGroupEvents.ccGroupLeft.subscribe((item) => {
if (item.leftGroup.getType() == CometChatUIKitConstants.GroupTypes.private) {
this.removeGroup(item.leftGroup);
}
else {
this.updateGroup(item.leftGroup);
}
});
}
// unsubscribe to subscribed events.
unsubscribeToEvents() {
this.ccGroupMemberAdded?.unsubscribe();
this.ccGroupMemberBanned?.unsubscribe();
this.ccGroupMemberJoined?.unsubscribe();
this.ccGroupMemberKicked?.unsubscribe();
this.ccOwnershipChanged?.unsubscribe();
this.ccGroupLeft?.unsubscribe();
}
ngOnDestroy() {
this.unsubscribeToEvents();
this.groupsRequest = null;
this.ref.detach();
this.removeListener();
}
/**
* @param {CometChat.Group} group
*/
updateGroup(group) {
let groupsList = [...this.groupsList];
//search for group
let groupKey = groupsList.findIndex((g, k) => g.getGuid() === group.getGuid());
if (groupKey > -1) {
groupsList.splice(groupKey, 1, group);
this.groupsList = groupsList;
this.ref.detectChanges();
}
}
fetchNewUsers() {
this.setRequestBuilder();
let state = this.firstReload ? States.loading : States.loaded;
this.fetchNextGroupList(state);
}
attachConnectionListeners() {
CometChat.addConnectionListener(this.connectionListenerId, new CometChat.ConnectionListener({
onConnected: () => {
console.log("ConnectionListener =>connected");
this.fetchNewUsers();
},
inConnecting: () => {
console.log("ConnectionListener => In connecting");
},
onDisconnected: () => {
console.log("ConnectionListener => On Disconnected");
}
}));
}
attachListeners() {
CometChat.addGroupListener(this.groupsListenerId, new CometChat.GroupListener({
onGroupMemberScopeChanged: (message, changedUser, newScope, oldScope, changedGroup) => {
const groupIndex = this.findGroupIndex(changedGroup);
if (groupIndex > -1) {
let groupsList = [...this.groupsList];
const groupFound = groupsList[groupIndex];
if (changedUser.getUid() == this.loggedInUser?.getUid()) {
groupFound.setScope(newScope);
this.ref.detectChanges();
}
groupsList.splice(groupIndex, 1, groupFound);
this.groupsList = groupsList;
}
},
onGroupMemberKicked: (message, kickedUser, kickedBy, kickedFrom) => {
const groupIndex = this.findGroupIndex(kickedFrom);
if (groupIndex > -1) {
let groupsList = [...this.groupsList];
let groupFound = groupsList[groupIndex];
if (kickedUser.getUid() === this.loggedInUser?.getUid()) {
groupFound.setHasJoined(false);
}
groupFound.setMembersCount(kickedFrom.getMembersCount());
groupsList.splice(groupIndex, 1, groupFound);
this.groupsList = groupsList;
this.ref.detectChanges();
}
},
onGroupMemberBanned: (message, bannedUser, bannedBy, bannedFrom) => {
const groupIndex = this.findGroupIndex(bannedFrom);
if (groupIndex > -1) {
let groupsList = [...this.groupsList];
let groupFound = groupsList[groupIndex];
if (bannedUser.getUid() === this.loggedInUser?.getUid()) {
this.removeGroup(bannedFrom);
return;
}
groupFound.setMembersCount(bannedFrom.getMembersCount());
groupsList.splice(groupIndex, 1, groupFound);
this.groupsList = groupsList;
this.ref.detectChanges();
}
},
onGroupMemberUnbanned: (message, unbannedUser, unbannedBy, unbannedFrom) => {
const groupIndex = this.findGroupIndex(unbannedFrom);
if (groupIndex > -1) {
let groupsList = [...this.groupsList];
let groupFound = groupsList[groupIndex];
if (unbannedUser.getUid() === this.loggedInUser?.getUid()) {
groupFound.setHasJoined(false);
}
groupsList.splice(groupIndex, 1, groupFound);
this.groupsList = groupsList;
}
else {
this.addGroup(unbannedFrom);
}
this.ref.detectChanges();
},
onMemberAddedToGroup: (message, userAdded, userAddedBy, userAddedIn) => {
if (this.searchKeyword)
return;
const groupIndex = this.findGroupIndex(userAddedIn);
if (groupIndex > -1) {
let groupsList = [...this.groupsList];
let groupFound = groupsList[groupIndex];
if (userAdded.getUid() === this.loggedInUser?.getUid()) {
groupFound.setHasJoined(true);
}
groupFound.setMembersCount(userAddedIn.getMembersCount());
groupsList.splice(groupIndex, 1, groupFound);
this.groupsList = groupsList;
}
else {
userAddedIn.setHasJoined(true);
this.addGroup(userAddedIn);
}
this.ref.detectChanges();
},
onGroupMemberLeft: (message, leavingUser, group) => {
const groupIndex = this.findGroupIndex(group);
if (groupIndex > -1) {
let groupsList = [...this.groupsList];
let groupFound = groupsList[groupIndex];
if (leavingUser.getUid() === this.loggedInUser?.getUid()) {
groupFound.setHasJoined(false);
}
groupFound.setMembersCount(group.getMembersCount());
groupsList.splice(groupIndex, 1, groupFound);
this.groupsList = groupsList;
this.ref.detectChanges();
}
},
onGroupMemberJoined: (message, joinedUser, joinedGroup) => {
const groupIndex = this.findGroupIndex(joinedGroup);
if (groupIndex > -1) {
let groupsList = [...this.groupsList];
let groupFound = groupsList[groupIndex];
if (joinedUser.getUid() === this.loggedInUser?.getUid()) {
groupFound.setHasJoined(true);
}
groupFound.setMembersCount(joinedGroup.getMembersCount());
groupsList.splice(groupIndex, 1, groupFound);
this.groupsList = groupsList;
this.ref.detectChanges();
}
},
}));
}
removeListener() {
CometChat.removeGroupListener(this.groupsListenerId);
CometChat.removeConnectionListener(this.connectionListenerId);
}
/**
* @param {CometChat.Group} group
*/
getStatusIndicatorColor(group) {
return this.statusColor[group?.getType()];
}
setRequestBuilder() {
if (!this.groupsRequestBuilder) {
this.groupsRequestBuilder = new CometChat.GroupsRequestBuilder()
.setLimit(this.limit)
.setSearchKeyword(this.searchKeyword);
}
if (this.searchRequestBuilder) {
this.requestBuilder = this.searchRequestBuilder.build();
}
this.requestBuilder = this.groupsRequestBuilder.setSearchKeyword(this.searchKeyword).build();
}
/**
* @param {CometChat.Group} group
*/
removeGroup(group) {
let groupsList = [...this.groupsList];
//search for group
let groupKey = groupsList.findIndex((g, k) => g.getGuid() === group.getGuid());
if (groupKey > -1) {
groupsList.splice(groupKey, 1);
this.groupsList = groupsList;
this.ref.detectChanges();
}
}
/**
* addGroup
* @param group
*/
addGroup(group) {
this.groupsList.unshift(group);
this.ref.detectChanges();
}
setThemeStyle() {
this.setGroupsStyle();
this.setListItemStyle();
this.setAvatarStyle();
this.setStatusStyle();
this.statusColor.private = this.groupsStyle.privateGroupIconBackground ?? this.themeService.theme.palette.getSuccess();
this.statusColor.password = this.groupsStyle.passwordGroupIconBackground ?? "#F7A500";
this.listStyle = {
titleTextFont: this.groupsStyle.titleTextFont,
titleTextColor: this.groupsStyle.titleTextColor,
emptyStateTextFont: this.groupsStyle.emptyStateTextFont,
emptyStateTextColor: this.groupsStyle.emptyStateTextColor,
errorStateTextFont: this.groupsStyle.errorStateTextFont,
errorStateTextColor: this.groupsStyle.errorStateTextColor,
loadingIconTint: this.groupsStyle.loadingIconTint,
separatorColor: this.groupsStyle.separatorColor,
searchIconTint: this.groupsStyle.searchIconTint,
searchBorder: this.groupsStyle.searchBorder,
searchBorderRadius: this.groupsStyle.searchBorderRadius,
searchBackground: this.groupsStyle.searchBackground,
searchPlaceholderTextFont: this.groupsStyle.searchPlaceholderTextFont,
searchPlaceholderTextColor: this.groupsStyle.searchPlaceholderTextColor,
searchTextFont: this.groupsStyle.searchTextFont,
searchTextColor: this.groupsStyle.searchTextColor,
};
}
setListItemStyle() {
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.themeService.theme.palette.getAccent(),
border: "none",
separatorColor: this.themeService.theme.palette.getAccent200(),
hoverBackground: this.themeService.theme.palette.getAccent50()
});
this.listItemStyle = { ...defaultStyle, ...this.listItemStyle };
}
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 };
}
setStatusStyle() {
let defaultStyle = {
height: "12px",
width: "12px",
border: "none",
borderRadius: "24px",
};
this.statusIndicatorStyle = { ...defaultStyle, ...this.statusIndicatorStyle };
}
setGroupsStyle() {
let defaultStyle = new GroupsStyle({
subTitleTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
subTitleTextColor: this.themeService.theme.palette.getAccent600(),
background: this.themeService.theme.palette.getBackground(),
border: `1px solid ${this.themeService.theme.palette.getAccent50()}`,
titleTextFont: fontHelper(this.themeService.theme.typography.title1),
titleTextColor: 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(),
separatorColor: this.themeService.theme.palette.getAccent400(),
privateGroupIconBackground: this.themeService.theme.palette.getSuccess(),
passwordGroupIconBackground: "RGB(247, 165, 0)",
searchIconTint: this.themeService.theme.palette.getAccent600(),
searchPlaceholderTextColor: this.themeService.theme.palette.getAccent600(),
searchBackground: this.themeService.theme.palette.getAccent100(),
searchPlaceholderTextFont: fontHelper(this.themeService.theme.typography.text3),
searchTextColor: this.themeService.theme.palette.getAccent600(),
searchTextFont: fontHelper(this.themeService.theme.typography.text3)
});
this.groupsStyle = { ...defaultStyle, ...this.groupsStyle };
this.checkboxStyle = {
height: "24px",
width: "24px",
border: "none",
borderRadius: "4px",
checkedBackgroundColor: this.themeService.theme.palette.getPrimary(),
uncheckedBackgroundColor: this.themeService.theme.palette.getAccent400()
};
}
}
CometChatGroupsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatGroupsComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.CometChatThemeService }], target: i0.ɵɵFactoryTarget.Component });
CometChatGroupsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: CometChatGroupsComponent, selector: "cometchat-groups", inputs: { groupsRequestBuilder: "groupsRequestBuilder", searchRequestBuilder: "searchRequestBuilder", subtitleView: "subtitleView", listItemView: "listItemView", menu: "menu", options: "options", activeGroup: "activeGroup", hideSeparator: "hideSeparator", selectionMode: "selectionMode", searchPlaceholder: "searchPlaceholder", hideError: "hideError", searchIconURL: "searchIconURL", hideSearch: "hideSearch", title: "title", onError: "onError", onSelect: "onSelect", emptyStateView: "emptyStateView", errorStateView: "errorStateView", loadingIconURL: "loadingIconURL", privateGroupIcon: "privateGroupIcon", protectedGroupIcon: "protectedGroupIcon", passwordGroupIcon: "passwordGroupIcon", loadingStateView: "loadingStateView", emptyStateText: "emptyStateText", errorStateText: "errorStateText", titleAlignment: "titleAlignment", statusIndicatorStyle: "statusIndicatorStyle", avatarStyle: "avatarStyle", groupsStyle: "groupsStyle", listItemStyle: "listItemStyle", onItemClick: "onItemClick" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cc-groups\" [ngStyle]=\"groupStyle()\">\n <div class=\"cc-menus\" *ngIf=\"menu\">\n\n <ng-container *ngTemplateOutlet=\"menu\">\n </ng-container>\n\n</div>\n <cometchat-list [listItemView]=\"listItemView ? listItemView : listItem\" [onScrolledToBottom]=\"onScrolledToBottom\" [onSearch]=\"onSearch\"\n [list]=\"groupsList\" [searchText]=\"searchKeyword\" [searchPlaceholderText]=\"searchPlaceholder\"\n [searchIconURL]=\"searchIconURL\" [hideSearch]=\"hideSearch\" [hideError]=\"hideError\" [title]=\"title\"\n [emptyStateText]=\"emptyStateText\" [loadingIconURL]=\"loadingIconURL\"\n [titleAlignment]=\"titleAlignment\" [loadingStateView]=\"loadingStateView\" [emptyStateView]=\"emptyStateView\"\n [errorStateText]=\"errorStateText\" [errorStateView]=\"errorStateView\" [listStyle]=\"listStyle\" [state]=\"state\">\n </cometchat-list>\n <ng-template #listItem let-group>\n <cometchat-list-item [title]=\"group?.name\" [avatarURL]=\"group?.icon\" [avatarName]=\"group?.name\"\n [listItemStyle]=\"listItemStyle\" [avatarStyle]=\"avatarStyle\" [statusIndicatorStyle]=\"statusIndicatorStyle\"\n [statusIndicatorColor]=\"getStatusIndicatorColor(group)\" [statusIndicatorIcon]=\"getGroupIcon(group)\" [hideSeparator]=\"hideSeparator\" (cc-listitem-clicked)=\"onClick(group)\" [isActive]=\"getActiveGroup(group)\">\n <div slot=\"subtitleView\" class=\"cc-groups__subtitle-view\" *ngIf=\"subtitleView;else groupSubtitle\">\n <ng-container *ngTemplateOutlet=\"subtitleView;context:{ $implicit: group }\">\n </ng-container>\n </div>\n <ng-template #groupSubtitle>\n <div slot=\"subtitleView\" [ngStyle]=\"subtitleStyle()\" class=\"cc-groups__subtitle-view\"> {{getMemberCount(group)}} </div>\n </ng-template>\n\n <div slot=\"menuView\" class=\"cc-groups__options\" *ngIf=\"options\">\n <cometchat-menu-list [data]=\"options(group)\">\n\n </cometchat-menu-list>\n </div>\n <div slot=\"tailView\" *ngIf=\"selectionMode != selectionmodeEnum.none\" class=\"cc-groups__tail-view\">\n <ng-container *ngTemplateOutlet=\"tailView\">\n </ng-container>\n </div>\n </cometchat-list-item>\n <ng-template #tailView>\n <div *ngIf=\"selectionMode == selectionmodeEnum.single\">\n <cometchat-radio-button (cc-radio-button-changed)=\"onGroupSelected(group,$event)\"></cometchat-radio-button>\n\n </div>\n <div *ngIf=\"selectionMode == selectionmodeEnum.multiple\">\n <cometchat-checkbox [checkboxStyle]=\"checkboxStyle\" (cc-checkbox-changed)=\"onGroupSelected(group,$event)\"></cometchat-checkbox>\n\n </div>\n </ng-template>\n </ng-template>\n</div>", styles: [".cc-groups{height:100%;width:100%;box-sizing:border-box}.cc-groups__tail-view{position:relative}.cc-menus{position:absolute;right:12px;top: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"] }], directives: [{ type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatGroupsComponent, decorators: [{
type: Component,
args: [{ selector: "cometchat-groups", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cc-groups\" [ngStyle]=\"groupStyle()\">\n <div class=\"cc-menus\" *ngIf=\"menu\">\n\n <ng-container *ngTemplateOutlet=\"menu\">\n </ng-container>\n\n</div>\n <cometchat-list [listItemView]=\"listItemView ? listItemView : listItem\" [onScrolledToBottom]=\"onScrolledToBottom\" [onSearch]=\"onSearch\"\n [list]=\"groupsList\" [searchText]=\"searchKeyword\" [searchPlaceholderText]=\"searchPlaceholder\"\n [searchIconURL]=\"searchIconURL\" [hideSearch]=\"hideSearch\" [hideError]=\"hideError\" [title]=\"title\"\n [emptyStateText]=\"emptyStateText\" [loadingIconURL]=\"loadingIconURL\"\n [titleAlignment]=\"titleAlignment\" [loadingStateView]=\"loadingStateView\" [emptyStateView]=\"emptyStateView\"\n [errorStateText]=\"errorStateText\" [errorStateView]=\"errorStateView\" [listStyle]=\"listStyle\" [state]=\"state\">\n </cometchat-list>\n <ng-template #listItem let-group>\n <cometchat-list-item [title]=\"group?.name\" [avatarURL]=\"group?.icon\" [avatarName]=\"group?.name\"\n [listItemStyle]=\"listItemStyle\" [avatarStyle]=\"avatarStyle\" [statusIndicatorStyle]=\"statusIndicatorStyle\"\n [statusIndicatorColor]=\"getStatusIndicatorColor(group)\" [statusIndicatorIcon]=\"getGroupIcon(group)\" [hideSeparator]=\"hideSeparator\" (cc-listitem-clicked)=\"onClick(group)\" [isActive]=\"getActiveGroup(group)\">\n <div slot=\"subtitleView\" class=\"cc-groups__subtitle-view\" *ngIf=\"subtitleView;else groupSubtitle\">\n <ng-container *ngTemplateOutlet=\"subtitleView;context:{ $implicit: group }\">\n </ng-container>\n </div>\n <ng-template #groupSubtitle>\n <div slot=\"subtitleView\" [ngStyle]=\"subtitleStyle()\" class=\"cc-groups__subtitle-view\"> {{getMemberCount(group)}} </div>\n </ng-template>\n\n <div slot=\"menuView\" class=\"cc-groups__options\" *ngIf=\"options\">\n <cometchat-menu-list [data]=\"options(group)\">\n\n </cometchat-menu-list>\n </div>\n <div slot=\"tailView\" *ngIf=\"selectionMode != selectionmodeEnum.none\" class=\"cc-groups__tail-view\">\n <ng-container *ngTemplateOutlet=\"tailView\">\n </ng-container>\n </div>\n </cometchat-list-item>\n <ng-template #tailView>\n <div *ngIf=\"selectionMode == selectionmodeEnum.single\">\n <cometchat-radio-button (cc-radio-button-changed)=\"onGroupSelected(group,$event)\"></cometchat-radio-button>\n\n </div>\n <div *ngIf=\"selectionMode == selectionmodeEnum.multiple\">\n <cometchat-checkbox [checkboxStyle]=\"checkboxStyle\" (cc-checkbox-changed)=\"onGroupSelected(group,$event)\"></cometchat-checkbox>\n\n </div>\n </ng-template>\n </ng-template>\n</div>", styles: [".cc-groups{height:100%;width:100%;box-sizing:border-box}.cc-groups__tail-view{position:relative}.cc-menus{position:absolute;right:12px;top:6px}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.CometChatThemeService }]; }, propDecorators: { groupsRequestBuilder: [{
type: Input
}], searchRequestBuilder: [{
type: Input
}], subtitleView: [{
type: Input
}], listItemView: [{
type: Input
}], menu: [{
type: Input
}], options: [{
type: Input
}], activeGroup: [{
type: Input
}], hideSeparator: [{
type: Input
}], selectionMode: [{
type: Input
}], searchPlaceholder: [{
type: Input
}], hideError: [{
type: Input
}], searchIconURL: [{
type: Input
}], hideSearch: [{
type: Input
}], title: [{
type: Input
}], onError: [{
type: Input
}], onSelect: [{
type: Input
}], emptyStateView: [{
type: Input
}], errorStateView: [{
type: Input
}], loadingIconURL: [{
type: Input
}], privateGroupIcon: [{
type: Input
}], protectedGroupIcon: [{
type: Input
}], passwordGroupIcon: [{
type: Input
}], loadingStateView: [{
type: Input
}], emptyStateText: [{
type: Input
}], errorStateText: [{
type: Input
}], titleAlignment: [{
type: Input
}], statusIndicatorStyle: [{
type: Input
}], avatarStyle: [{
type: Input
}], groupsStyle: [{
type: Input
}], listItemStyle: [{
type: Input
}], onItemClick: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tZXRjaGF0LWdyb3Vwcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXVpa2l0LWFuZ3VsYXIvc3JjL0NvbWV0Q2hhdEdyb3Vwcy9jb21ldGNoYXQtZ3JvdXBzL2NvbWV0Y2hhdC1ncm91cHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC11aWtpdC1hbmd1bGFyL3NyYy9Db21ldENoYXRHcm91cHMvY29tZXRjaGF0LWdyb3Vwcy9jb21ldGNoYXQtZ3JvdXBzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBaUQsTUFBTSxlQUFlLENBQUM7QUFDNUksT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQXdCLE1BQU0seUJBQXlCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFdBQVcsRUFBaUIsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFHckYsT0FBTyxFQUFtQixRQUFRLEVBQUUsb0JBQW9CLEVBQStDLE1BQU0sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFxRCx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6USxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7Ozs7QUFDMUU7Ozs7Ozs7O0VBUUU7QUFPRixNQUFNLE9BQU8sd0JBQXdCO0lBc0ZuQyxZQUFvQixHQUFzQixFQUFVLFlBQW1DO1FBQW5FLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQXVCO1FBOUU5RSxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQixrQkFBYSxHQUFrQixhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ2xELHNCQUFpQixHQUFX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