diff --git a/src/app/chat-thread/chat-thread.component.html b/src/app/chat-thread/chat-thread.component.html
index aa3a7ab..c3120f9 100644
--- a/src/app/chat-thread/chat-thread.component.html
+++ b/src/app/chat-thread/chat-thread.component.html
@@ -6,6 +6,7 @@
{{thread.lastMessage.text}}
diff --git a/src/app/chat-thread/chat-thread.component.ts b/src/app/chat-thread/chat-thread.component.ts
index 9d9db81..c17a46a 100644
--- a/src/app/chat-thread/chat-thread.component.ts
+++ b/src/app/chat-thread/chat-thread.component.ts
@@ -16,6 +16,7 @@ import { Thread } from '../thread/thread.model';
})
export class ChatThreadComponent implements OnInit {
@Input() thread: Thread;
+ @Input() unread: any;
selected = false;
constructor(public threadsService: ThreadsService) {
diff --git a/src/app/chat-threads/chat-threads.component.html b/src/app/chat-threads/chat-threads.component.html
index 10b1d5b..3d8b831 100644
--- a/src/app/chat-threads/chat-threads.component.html
+++ b/src/app/chat-threads/chat-threads.component.html
@@ -4,7 +4,7 @@
+ [thread]="thread" [unread]="unreadThread[thread.id]">
diff --git a/src/app/chat-threads/chat-threads.component.ts b/src/app/chat-threads/chat-threads.component.ts
index c1b6cda..9f9bbf4 100644
--- a/src/app/chat-threads/chat-threads.component.ts
+++ b/src/app/chat-threads/chat-threads.component.ts
@@ -3,19 +3,53 @@ import {
OnInit,
Inject
} from '@angular/core';
+import * as _ from 'lodash';
import { Observable } from 'rxjs';
import { Thread } from '../thread/thread.model';
+import { Message } from '../message/message.model';
import { ThreadsService } from './../thread/threads.service';
+import { MessagesService } from './../message/messages.service';
@Component({
selector: 'chat-threads',
templateUrl: './chat-threads.component.html',
styleUrls: ['./chat-threads.component.css']
})
-export class ChatThreadsComponent {
+export class ChatThreadsComponent implements OnInit {
threads: Observable;
+ unreadThread: any;
- constructor(public threadsService: ThreadsService) {
+ constructor(public threadsService: ThreadsService, public messagesService: MessagesService) {
this.threads = threadsService.orderedThreads;
}
+
+ ngOnInit() {
+ this.messagesService.messages
+ .combineLatest(
+ this.threadsService.currentThread,
+ (messages: Message[], currentThread: Thread) =>
+ [currentThread, messages] )
+
+ .subscribe(([currentThread, messages]: [Thread, Message[]]) => {
+ this.unreadThread = {};
+ _.reduce(
+ messages,
+ (sum: number, m: Message) => {
+ const messageIsInCurrentThread: boolean = m.thread &&
+ currentThread &&
+ (currentThread.id === m.thread.id);
+ if (m && !m.isRead && !messageIsInCurrentThread) {
+ sum = sum + 1;
+ let cid = m.thread.id;
+ if (this.unreadThread[cid]) {
+ this.unreadThread[cid].sum = this.unreadThread[cid].sum + 1;
+ } else {
+ this.unreadThread[cid] = { sum : 1 };
+ }
+ }
+ return sum;
+ },
+ 0);
+ });
+ }
}
diff --git a/src/app/message/messages.service.ts b/src/app/message/messages.service.ts
index 7024fd1..0da98a9 100644
--- a/src/app/message/messages.service.ts
+++ b/src/app/message/messages.service.ts
@@ -4,6 +4,8 @@ import { User } from '../user/user.model';
import { Thread } from '../thread/thread.model';
import { Message } from '../message/message.model';
+import * as _ from 'lodash';
+
const initialMessages: Message[] = [];
interface IMessagesOperation extends Function {
@@ -26,6 +28,8 @@ export class MessagesService {
// action streams
create: Subject = new Subject();
markThreadAsRead: Subject = new Subject();
+ remove: Subject = new Subject();
+ removeThreadMessages: Subject = new Subject();
constructor() {
this.messages = this.updates
@@ -84,6 +88,26 @@ export class MessagesService {
})
.subscribe(this.updates);
+ // Remove all messages from particular thread
+ this.removeThreadMessages
+ .map( (thread: Thread) => {
+ return (messages: any) => {
+ _.remove(messages, (el: any) => {
+ return el.id === thread.id
+ });
+ return messages;
+ };
+ })
+ .subscribe(this.updates);
+
+ // Remove all messages from message stream
+ this.remove
+ .map( function(): IMessagesOperation {
+ return (messages: Message[]) => {
+ return messages = [];
+ };
+ })
+ .subscribe(this.updates);
}
// an imperative function call to this action stream
@@ -91,6 +115,14 @@ export class MessagesService {
this.newMessages.next(message);
}
+ removeAllMessages() {
+ this.remove.next();
+ }
+
+ removeAllThreadMessages(thread: Thread) {
+ this.removeThreadMessages.next(thread);
+ }
+
messagesForThreadUser(thread: Thread, user: User): Observable {
return this.newMessages
.filter((message: Message) => {