import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; import { Http } from '@angular/http'; import { Subject } from 'rxjs/Subject'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { FuseUtils } from '../../../../core/fuseUtils'; @Injectable() export class ChatService implements Resolve { contacts: any[]; chats: any[]; user: any; onChatSelected = new BehaviorSubject(null); onContactSelected = new BehaviorSubject(null); onChatsUpdated = new Subject(); onUserUpdated = new Subject(); onLeftSidenavViewChanged = new Subject(); onRightSidenavViewChanged = new Subject(); constructor(private http: Http) { } /** * Get chat * @param contactId * @returns {Promise} */ getChat(contactId) { const chatItem = this.user.chatList.find((item) => { return item.contactId === contactId; }); /** * Create new chat, if it's not created yet. */ if ( !chatItem ) { this.createNewChat(contactId).then((newChats) => { this.getChat(contactId); }); return; } return new Promise((resolve, reject) => { this.http.get('api/chat-chats/' + chatItem.id) .subscribe(response => { const chat = response.json().data; const chatContact = this.contacts.find((contact) => { return contact.id === contactId; }); const chatData = { chatId : chat.id, dialog : chat.dialog, contact: chatContact }; this.onChatSelected.next({...chatData}); }, reject); }); } /** * Create New Chat * @param contactId * @returns {Promise} */ createNewChat(contactId) { return new Promise((resolve, reject) => { const contact = this.contacts.find((item) => { return item.id === contactId; }); const chatId = FuseUtils.generateGUID(); const chat = { id : chatId, dialog: [] }; const chatListItem = { contactId : contactId, id : chatId, lastMessageTime: '2017-02-18T10:30:18.931Z', name : contact.name, unread : null }; /** * Add new chat list item to the user's chat list */ this.user.chatList.push(chatListItem); /** * Post the created chat */ this.http.post('api/chat-chats', {...chat}) .subscribe(response => { /** * Post the new the user data */ this.http.post('api/chat-user/' + this.user.id, this.user) .subscribe(newUserData => { /** * Update the user data from server */ this.getUser().then(updatedUser => { this.onUserUpdated.next(updatedUser); resolve(updatedUser); }); }); }, reject); }); } /** * Select Contact * @param contact */ selectContact(contact) { this.onContactSelected.next(contact); } /** * Set user status * @param status */ setUserStatus(status) { this.user.status = status; } /** * Update user data * @param userData */ updateUserData(userData) { this.http.post('api/chat-user/' + this.user.id, userData) .subscribe(response => { this.user = userData; } ); } /** * Update the chat dialog * @param chatId * @param dialog * @returns {Promise} */ updateDialog(chatId, dialog): Promise { return new Promise((resolve, reject) => { const newData = { id : chatId, dialog: dialog }; this.http.post('api/chat-chats/' + chatId, newData) .subscribe(updatedChat => { resolve(updatedChat); }, reject); }); } /** * The Chat App Main Resolver * @param {ActivatedRouteSnapshot} route * @param {RouterStateSnapshot} state * @returns {Observable | Promise | any} */ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | any { return new Promise((resolve, reject) => { Promise.all([ this.getContacts(), this.getChats(), this.getUser() ]).then( ([contacts, chats, user]) => { this.contacts = contacts; this.chats = chats; this.user = user; resolve(); }, reject ); }); } /** * Get Contacts * @returns {Promise} */ getContacts(): Promise { return new Promise((resolve, reject) => { this.http.get('api/chat-contacts') .subscribe(response => { resolve(response.json().data); }, reject); }); } /** * Get Chats * @returns {Promise} */ getChats(): Promise { return new Promise((resolve, reject) => { this.http.get('api/chat-chats') .subscribe(response => { resolve(response.json().data); }, reject); }); } /** * Get User * @returns {Promise} */ getUser(): Promise { return new Promise((resolve, reject) => { this.http.get('api/chat-user') .subscribe(response => { resolve(response.json().data[0]); }, reject); }); } }