@@ -24,6 +24,7 @@ import { TypedEventEmitter } from "./typed-event-emitter";
24
24
25
25
export enum PollEvent {
26
26
New = "Poll.new" ,
27
+ End = "Poll.end" ,
27
28
Update = "Poll.update" ,
28
29
Responses = "Poll.Responses" ,
29
30
Destroy = "Poll.Destroy" ,
@@ -32,7 +33,7 @@ export enum PollEvent {
32
33
export type PollEventHandlerMap = {
33
34
[ PollEvent . Update ] : ( event : MatrixEvent , poll : Poll ) => void ;
34
35
[ PollEvent . Destroy ] : ( pollIdentifier : string ) => void ;
35
- [ PollEvent . Destroy ] : ( pollIdentifier : string ) => void ;
36
+ [ PollEvent . End ] : ( ) => void ;
36
37
[ PollEvent . Responses ] : ( responses : Relations ) => void ;
37
38
} ;
38
39
@@ -51,7 +52,7 @@ export class Poll extends TypedEventEmitter<Exclude<PollEvent, PollEvent.New>, P
51
52
private pollEvent : PollStartEvent | undefined ;
52
53
private fetchingResponsesPromise : null | Promise < void > = null ;
53
54
private responses : null | Relations = null ;
54
- private closeEvent : MatrixEvent | undefined ;
55
+ private endEvent : MatrixEvent | undefined ;
55
56
56
57
public constructor ( private rootEvent : MatrixEvent , private matrixClient : MatrixClient ) {
57
58
super ( ) ;
@@ -65,7 +66,7 @@ export class Poll extends TypedEventEmitter<Exclude<PollEvent, PollEvent.New>, P
65
66
66
67
public get isEnded ( ) : boolean {
67
68
// @TODO (kerrya) should be false while responses are loading?
68
- return ! ! this . closeEvent ;
69
+ return ! ! this . endEvent ;
69
70
}
70
71
71
72
public setPollInstance ( event : MatrixEvent ) : void {
@@ -96,6 +97,33 @@ export class Poll extends TypedEventEmitter<Exclude<PollEvent, PollEvent.New>, P
96
97
return this . responses ! ;
97
98
}
98
99
100
+ public onNewRelation ( event : MatrixEvent ) : void {
101
+ if ( M_POLL_END . matches ( event . getType ( ) ) ) {
102
+ this . endEvent = event ;
103
+ this . emit ( PollEvent . End ) ;
104
+ }
105
+
106
+ // wait for poll to be initialised
107
+ // @TODO (kerrya) races here?
108
+ if ( ! this . responses ) {
109
+ return ;
110
+ }
111
+
112
+ if ( event . isDecryptionFailure ( ) ) {
113
+ // undecryptableRelationsCount++
114
+ return ;
115
+ }
116
+ const pollCloseTimestamp = this . endEvent ?. getTs ( ) || Number . MAX_SAFE_INTEGER ;
117
+ if (
118
+ M_POLL_RESPONSE . matches ( event . getType ( ) ) &&
119
+ // response made before poll closed
120
+ event . getTs ( ) <= pollCloseTimestamp
121
+ ) {
122
+ this . responses . addEvent ( event ) ;
123
+ }
124
+
125
+ }
126
+
99
127
private async fetchResponses ( ) : Promise < void > {
100
128
this . fetchingResponsesPromise = new Promise < void > ( ( ) => { } ) ;
101
129
@@ -116,8 +144,8 @@ export class Poll extends TypedEventEmitter<Exclude<PollEvent, PollEvent.New>, P
116
144
const responses = new Relations ( 'm.reference' , M_POLL_RESPONSE . name , this . matrixClient ) ;
117
145
let undecryptableRelationsCount = 0 ;
118
146
119
- const pollCloseEvent = allRelations . events . find ( event => M_POLL_END . matches ( event . getType ( ) ) ) ;
120
- const pollCloseTimestamp = pollCloseEvent ?. getTs ( ) || Number . MAX_SAFE_INTEGER ;
147
+ const pollEndEvent = allRelations . events . find ( event => M_POLL_END . matches ( event . getType ( ) ) ) ;
148
+ const pollCloseTimestamp = pollEndEvent ?. getTs ( ) || Number . MAX_SAFE_INTEGER ;
121
149
122
150
allRelations . events . forEach ( event => {
123
151
if ( event . isDecryptionFailure ( ) ) {
@@ -135,8 +163,9 @@ export class Poll extends TypedEventEmitter<Exclude<PollEvent, PollEvent.New>, P
135
163
136
164
console . log ( 'hhh' , 'relations!!' , responses ) ;
137
165
166
+
138
167
this . responses = responses ;
139
- this . closeEvent = pollCloseEvent ;
168
+ this . endEvent = pollEndEvent ;
140
169
this . emit ( PollEvent . Responses , this . responses ) ;
141
170
}
142
171
}
0 commit comments