mirror of
https://github.com/richard-loafle/fuse-angular.git
synced 2025-04-03 15:11:37 +00:00
138 lines
3.6 KiB
TypeScript
138 lines
3.6 KiB
TypeScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
|
|
import { Subject, takeUntil } from 'rxjs';
|
|
import { Chat, Profile } from 'app/modules/admin/apps/chat/chat.types';
|
|
import { ChatService } from 'app/modules/admin/apps/chat/chat.service';
|
|
|
|
@Component({
|
|
selector : 'chat-chats',
|
|
templateUrl : './chats.component.html',
|
|
encapsulation : ViewEncapsulation.None,
|
|
changeDetection: ChangeDetectionStrategy.OnPush
|
|
})
|
|
export class ChatsComponent implements OnInit, OnDestroy
|
|
{
|
|
chats: Chat[];
|
|
drawerComponent: 'profile' | 'new-chat';
|
|
drawerOpened: boolean = false;
|
|
filteredChats: Chat[];
|
|
profile: Profile;
|
|
selectedChat: Chat;
|
|
private _unsubscribeAll: Subject<any> = new Subject<any>();
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
constructor(
|
|
private _chatService: ChatService,
|
|
private _changeDetectorRef: ChangeDetectorRef
|
|
)
|
|
{
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Lifecycle hooks
|
|
// -----------------------------------------------------------------------------------------------------
|
|
|
|
/**
|
|
* On init
|
|
*/
|
|
ngOnInit(): void
|
|
{
|
|
// Chats
|
|
this._chatService.chats$
|
|
.pipe(takeUntil(this._unsubscribeAll))
|
|
.subscribe((chats: Chat[]) => {
|
|
this.chats = this.filteredChats = chats;
|
|
|
|
// Mark for check
|
|
this._changeDetectorRef.markForCheck();
|
|
});
|
|
|
|
// Profile
|
|
this._chatService.profile$
|
|
.pipe(takeUntil(this._unsubscribeAll))
|
|
.subscribe((profile: Profile) => {
|
|
this.profile = profile;
|
|
|
|
// Mark for check
|
|
this._changeDetectorRef.markForCheck();
|
|
});
|
|
|
|
// Selected chat
|
|
this._chatService.chat$
|
|
.pipe(takeUntil(this._unsubscribeAll))
|
|
.subscribe((chat: Chat) => {
|
|
this.selectedChat = chat;
|
|
|
|
// Mark for check
|
|
this._changeDetectorRef.markForCheck();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* On destroy
|
|
*/
|
|
ngOnDestroy(): void
|
|
{
|
|
// Unsubscribe from all subscriptions
|
|
this._unsubscribeAll.next(null);
|
|
this._unsubscribeAll.complete();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Public methods
|
|
// -----------------------------------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Filter the chats
|
|
*
|
|
* @param query
|
|
*/
|
|
filterChats(query: string): void
|
|
{
|
|
// Reset the filter
|
|
if ( !query )
|
|
{
|
|
this.filteredChats = this.chats;
|
|
return;
|
|
}
|
|
|
|
this.filteredChats = this.chats.filter(chat => chat.contact.name.toLowerCase().includes(query.toLowerCase()));
|
|
}
|
|
|
|
/**
|
|
* Open the new chat sidebar
|
|
*/
|
|
openNewChat(): void
|
|
{
|
|
this.drawerComponent = 'new-chat';
|
|
this.drawerOpened = true;
|
|
|
|
// Mark for check
|
|
this._changeDetectorRef.markForCheck();
|
|
}
|
|
|
|
/**
|
|
* Open the profile sidebar
|
|
*/
|
|
openProfile(): void
|
|
{
|
|
this.drawerComponent = 'profile';
|
|
this.drawerOpened = true;
|
|
|
|
// Mark for check
|
|
this._changeDetectorRef.markForCheck();
|
|
}
|
|
|
|
/**
|
|
* Track by function for ngFor loops
|
|
*
|
|
* @param index
|
|
* @param item
|
|
*/
|
|
trackByFn(index: number, item: any): any
|
|
{
|
|
return item.id || index;
|
|
}
|
|
}
|