@@ -17,6 +17,10 @@ limitations under the License.
17
17
18
18
import React from "react" ;
19
19
import { MatrixEvent } from "matrix-js-sdk/src/models/event" ;
20
+ import { Relations } from "matrix-js-sdk/src/models/relations" ;
21
+ import { EventType , RelationType } from "matrix-js-sdk/src/@types/event" ;
22
+ import { logger } from "matrix-js-sdk/src/logger" ;
23
+ import { M_POLL_START , M_POLL_RESPONSE , M_POLL_END } from "matrix-events-sdk" ;
20
24
21
25
import dis from "../../../dispatcher/dispatcher" ;
22
26
import { Action } from "../../../dispatcher/actions" ;
@@ -52,6 +56,51 @@ export default class PinnedEventTile extends React.Component<IProps> {
52
56
} ) ;
53
57
} ;
54
58
59
+ // For event types like polls that use relations, we fetch those manually on
60
+ // mount and store them here, exposing them through getRelationsForEvent
61
+ private relations = new Map < string , Map < string , Relations > > ( ) ;
62
+ private getRelationsForEvent = (
63
+ eventId : string ,
64
+ relationType : RelationType | string ,
65
+ eventType : EventType | string ,
66
+ ) : Relations => {
67
+ if ( eventId === this . props . event . getId ( ) ) {
68
+ return this . relations . get ( relationType ) ?. get ( eventType ) ;
69
+ }
70
+ } ;
71
+
72
+ async componentDidMount ( ) {
73
+ // Fetch poll responses
74
+ if ( M_POLL_START . matches ( this . props . event . getType ( ) ) ) {
75
+ const eventId = this . props . event . getId ( ) ;
76
+ const roomId = this . props . event . getRoomId ( ) ;
77
+ const room = this . context . getRoom ( roomId ) ;
78
+
79
+ try {
80
+ await Promise . all (
81
+ [ M_POLL_RESPONSE . name , M_POLL_RESPONSE . altName , M_POLL_END . name , M_POLL_END . altName ]
82
+ . map ( async eventType => {
83
+ const { events } = await this . context . relations (
84
+ roomId , eventId , RelationType . Reference , eventType ,
85
+ ) ;
86
+
87
+ const relations = new Relations ( RelationType . Reference , eventType , room ) ;
88
+ if ( ! this . relations . has ( RelationType . Reference ) ) {
89
+ this . relations . set ( RelationType . Reference , new Map < string , Relations > ( ) ) ;
90
+ }
91
+ this . relations . get ( RelationType . Reference ) . set ( eventType , relations ) ;
92
+
93
+ relations . setTargetEvent ( this . props . event ) ;
94
+ events . forEach ( event => relations . addEvent ( event ) ) ;
95
+ } ) ,
96
+ ) ;
97
+ } catch ( err ) {
98
+ logger . error ( `Error fetching responses to pinned poll ${ eventId } in room ${ roomId } ` ) ;
99
+ logger . error ( err ) ;
100
+ }
101
+ }
102
+ }
103
+
55
104
render ( ) {
56
105
const sender = this . props . event . getSender ( ) ;
57
106
@@ -84,6 +133,7 @@ export default class PinnedEventTile extends React.Component<IProps> {
84
133
< div className = "mx_PinnedEventTile_message" >
85
134
< MessageEvent
86
135
mxEvent = { this . props . event }
136
+ getRelationsForEvent = { this . getRelationsForEvent }
87
137
// @ts -ignore - complaining that className is invalid when it's not
88
138
className = "mx_PinnedEventTile_body"
89
139
maxImageHeight = { 150 }
0 commit comments