Paginate responses to pinned polls (#8025)

* Paginate responses to pinned polls

Signed-off-by: Robin Townsend <robin@robin.town>

* Test that pinned polls display paginated responses

Signed-off-by: Robin Townsend <robin@robin.town>
pull/21833/head
Robin 2022-03-10 13:14:34 -05:00 committed by GitHub
parent e96d9157a9
commit 3608fdb2ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 9 deletions

View File

@ -80,18 +80,22 @@ export default class PinnedEventTile extends React.Component<IProps> {
await Promise.all(
[M_POLL_RESPONSE.name, M_POLL_RESPONSE.altName, M_POLL_END.name, M_POLL_END.altName]
.map(async eventType => {
const { events } = await this.context.relations(
roomId, eventId, RelationType.Reference, eventType,
);
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);
relations.setTargetEvent(this.props.event);
events.forEach(event => relations.addEvent(event));
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) {

View File

@ -234,11 +234,16 @@ describe("<PinnedMessagesCard />", () => {
});
// Make the responses available
cli.relations.mockImplementation((roomId, eventId, relationType, eventType) => {
cli.relations.mockImplementation((roomId, eventId, relationType, eventType, { from }) => {
if (eventId === poll.getId() && relationType === RelationType.Reference) {
switch (eventType) {
case M_POLL_RESPONSE.name: return { events: responses };
case M_POLL_END.name: return { events: [end] };
case M_POLL_RESPONSE.name:
// Paginate the results, for added challenge
return (from === "page2") ?
{ events: responses.slice(2) } :
{ events: responses.slice(0, 2), nextBatch: "page2" };
case M_POLL_END.name:
return { events: [end] };
}
}
return { events: [] };