use Poll model with relations API in poll rendering (#9877)
* wip * remove dupe * use poll model relations in all cases * update mpollbody tests to use poll instance * update poll fetching login in pinned messages card * add pinned polls to room polls state * add spinner while relations are still loading * handle no poll in end poll dialog * strict errors * strict fix * more strict fix
This commit is contained in:
parent
b45b933a65
commit
544baa30ed
9 changed files with 350 additions and 670 deletions
|
@ -19,8 +19,6 @@ import React from "react";
|
|||
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
|
||||
import { Relations } from "matrix-js-sdk/src/models/relations";
|
||||
import { EventType, RelationType } from "matrix-js-sdk/src/@types/event";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
import { M_POLL_START, M_POLL_RESPONSE, M_POLL_END } from "matrix-js-sdk/src/@types/polls";
|
||||
|
||||
import dis from "../../../dispatcher/dispatcher";
|
||||
import { Action } from "../../../dispatcher/actions";
|
||||
|
@ -69,47 +67,6 @@ export default class PinnedEventTile extends React.Component<IProps> {
|
|||
}
|
||||
};
|
||||
|
||||
public async componentDidMount(): Promise<void> {
|
||||
// Fetch poll responses
|
||||
if (M_POLL_START.matches(this.props.event.getType())) {
|
||||
const eventId = this.props.event.getId();
|
||||
const roomId = this.props.event.getRoomId();
|
||||
const room = this.context.getRoom(roomId);
|
||||
|
||||
try {
|
||||
await Promise.all(
|
||||
[M_POLL_RESPONSE.name, M_POLL_RESPONSE.altName, M_POLL_END.name, M_POLL_END.altName].map(
|
||||
async (eventType): Promise<void> => {
|
||||
const relations = new Relations(RelationType.Reference, eventType, room);
|
||||
relations.setTargetEvent(this.props.event);
|
||||
|
||||
if (!this.relations.has(RelationType.Reference)) {
|
||||
this.relations.set(RelationType.Reference, new Map<string, Relations>());
|
||||
}
|
||||
this.relations.get(RelationType.Reference).set(eventType, relations);
|
||||
|
||||
let nextBatch: string | undefined;
|
||||
do {
|
||||
const page = await this.context.relations(
|
||||
roomId,
|
||||
eventId,
|
||||
RelationType.Reference,
|
||||
eventType,
|
||||
{ from: nextBatch },
|
||||
);
|
||||
nextBatch = page.nextBatch;
|
||||
page.events.forEach((event) => relations.addEvent(event));
|
||||
} while (nextBatch);
|
||||
},
|
||||
),
|
||||
);
|
||||
} catch (err) {
|
||||
logger.error(`Error fetching responses to pinned poll ${eventId} in room ${roomId}`);
|
||||
logger.error(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public render(): JSX.Element {
|
||||
const sender = this.props.event.getSender();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue