1
1
import template from './message-list.html!text' ;
2
2
3
- export default function tocMessageList ( network , $ionicScrollDelegate ) {
3
+ export default function tocMessageList ( network , state , R ,
4
+ $ionicScrollDelegate ) {
4
5
return {
5
6
restrict : 'E' ,
6
7
template : template ,
@@ -21,47 +22,66 @@ export default function tocMessageList(network, $ionicScrollDelegate) {
21
22
}
22
23
23
24
$ionicScrollDelegate . scrollBottom ( true ) ;
25
+
26
+ let messages = messagesCursor . get ( ) ;
27
+
28
+ R . pipe (
29
+ R . values ,
30
+ //FIXME: figure out why R.not doesnt work here
31
+ // R.filter(R.pipe(R.prop('isRead'), R.not),
32
+ R . filter ( R . pipe ( R . prop ( 'isRead' ) , ( bool ) => ! bool ) ) ,
33
+ R . forEach ( ( message ) => state . save (
34
+ messagesCursor ,
35
+ [ message . messageInfo . id , 'isRead' ] ,
36
+ true
37
+ ) )
38
+ ) ( messages ) ;
24
39
} ) ;
25
40
} ,
26
41
controllerAs : 'messageList' ,
27
42
controller : function MessageListController ( $scope , $state , identity ,
28
- contacts , network , R ) {
43
+ contacts , $interval ) {
29
44
let channelsCursor = network . NETWORK_CURSORS . synchronized
30
45
. select ( 'channels' ) ;
46
+
31
47
let contactsCursor = contacts . CONTACTS_CURSORS . synchronized ;
32
48
let identityCursor = identity . IDENTITY_CURSORS . synchronized ;
33
49
34
- let messagesCursor = channelsCursor . select ( [
35
- $scope . channelId ,
36
- 'messages'
37
- ] ) ;
50
+ let messagesCursor = network . NETWORK_CURSORS . synchronized
51
+ . select ( [ 'channels' , $scope . channelId , 'messages' ] ) ;
38
52
39
53
this . contacts = contactsCursor . get ( ) ;
40
54
this . userInfo = identityCursor . get ( [ 'userInfo' ] ) ;
41
55
42
56
let getMessageList = function getMessageList ( messages ) {
43
57
return R . pipe (
44
58
R . values ,
45
- R . map ( ( message ) => message . messageInfo ) ,
46
59
R . sort ( ( message1 , message2 ) => {
47
- if ( message1 . logicalClock === message2 . logicalClock ) {
48
- return message1 . id > message2 . id ? 1 : - 1 ;
60
+ if ( message1 . messageInfo . logicalClock ===
61
+ message2 . messageInfo . logicalClock ) {
62
+ return message1 . messageInfo . id > message2 . messageInfo . id ?
63
+ 1 : - 1 ;
49
64
}
50
65
51
- return message1 . logicalClock > message2 . logicalClock ? 1 : - 1 ;
66
+ return message1 . messageInfo . logicalClock >
67
+ message2 . messageInfo . logicalClock ?
68
+ 1 : - 1 ;
52
69
} ) ,
53
70
R . reduce ( ( groupedMessages , message ) => {
71
+ let messageVm = message . messageInfo ;
72
+ messageVm . isRead = message . isRead ;
73
+
54
74
if ( groupedMessages . length === 0 ) {
55
- groupedMessages . push ( [ message ] ) ;
75
+ groupedMessages . push ( [ messageVm ] ) ;
56
76
return groupedMessages ;
57
77
}
58
78
59
79
let latestGroup = groupedMessages [ groupedMessages . length - 1 ] ;
60
80
61
- if ( latestGroup [ 0 ] . sender === message . sender ) {
62
- latestGroup . push ( message ) ;
81
+ if ( latestGroup [ 0 ] . sender === messageVm . sender ) {
82
+ latestGroup . push ( messageVm ) ;
63
83
} else {
64
- groupedMessages . push ( [ message ] ) ;
84
+ groupedMessages . push ( [ messageVm ] ) ;
65
85
}
66
86
67
87
return groupedMessages ;
@@ -74,6 +94,42 @@ export default function tocMessageList(network, $ionicScrollDelegate) {
74
94
messagesCursor . on ( 'update' , ( ) => {
75
95
this . groupedMessages = getMessageList ( messagesCursor . get ( ) ) ;
76
96
} ) ;
97
+
98
+ //TODO: write a more performant version of this
99
+ $interval ( ( ) => {
100
+ let scrollView = $ionicScrollDelegate . getScrollView ( ) ;
101
+
102
+ if ( scrollView . __scrollTop !== scrollView . __maxScrollTop ) {
103
+ if ( ! channelsCursor . get ( [ $scope . channelId , 'viewingLatest' ] ) ) {
104
+ return ;
105
+ }
106
+
107
+ return state . save (
108
+ channelsCursor ,
109
+ [ $scope . channelId , 'viewingLatest' ] ,
110
+ false
111
+ ) ;
112
+ }
113
+
114
+ let messages = messagesCursor . get ( ) ;
115
+
116
+ R . pipe (
117
+ R . values ,
118
+ //FIXME: figure out why R.not doesnt work here
119
+ // R.filter(R.pipe(R.prop('isRead'), R.not),
120
+ R . filter ( R . pipe ( R . prop ( 'isRead' ) , ( bool ) => ! bool ) ) ,
121
+ R . forEach ( ( message ) => state . save (
122
+ messagesCursor ,
123
+ [ message . messageInfo . id , 'isRead' ] ,
124
+ true
125
+ ) )
126
+ ) ( messages ) ;
127
+
128
+ if ( channelsCursor . get ( [ $scope . channelId , 'viewingLatest' ] ) ) {
129
+ return ;
130
+ }
131
+ state . save ( channelsCursor , [ $scope . channelId , 'viewingLatest' ] , true ) ;
132
+ } , 3000 ) ;
77
133
}
78
134
} ;
79
135
}
0 commit comments