mirror of https://github.com/vector-im/riot-web
Fix regression with TimelinePanel props updates not taking effect (#9608)
* Fix regression with TimelinePanel props updates not taking effect * Add testpull/28788/head^2
parent
a8e15ebe60
commit
8b8d24c24c
|
@ -309,8 +309,8 @@ class TimelinePanel extends React.Component<IProps, IState> {
|
||||||
this.initTimeline(this.props);
|
this.initTimeline(this.props);
|
||||||
}
|
}
|
||||||
|
|
||||||
public componentDidUpdate(newProps) {
|
public componentDidUpdate(prevProps) {
|
||||||
if (newProps.timelineSet !== this.props.timelineSet) {
|
if (prevProps.timelineSet !== this.props.timelineSet) {
|
||||||
// throw new Error("changing timelineSet on a TimelinePanel is not supported");
|
// throw new Error("changing timelineSet on a TimelinePanel is not supported");
|
||||||
|
|
||||||
// regrettably, this does happen; in particular, when joining a
|
// regrettably, this does happen; in particular, when joining a
|
||||||
|
@ -325,13 +325,13 @@ class TimelinePanel extends React.Component<IProps, IState> {
|
||||||
logger.warn("Replacing timelineSet on a TimelinePanel - confusion may ensue");
|
logger.warn("Replacing timelineSet on a TimelinePanel - confusion may ensue");
|
||||||
}
|
}
|
||||||
|
|
||||||
const differentEventId = newProps.eventId != this.props.eventId;
|
const differentEventId = prevProps.eventId != this.props.eventId;
|
||||||
const differentHighlightedEventId = newProps.highlightedEventId != this.props.highlightedEventId;
|
const differentHighlightedEventId = prevProps.highlightedEventId != this.props.highlightedEventId;
|
||||||
const differentAvoidJump = newProps.eventScrollIntoView && !this.props.eventScrollIntoView;
|
const differentAvoidJump = prevProps.eventScrollIntoView && !this.props.eventScrollIntoView;
|
||||||
if (differentEventId || differentHighlightedEventId || differentAvoidJump) {
|
if (differentEventId || differentHighlightedEventId || differentAvoidJump) {
|
||||||
logger.log(`TimelinePanel switching to eventId ${newProps.eventId} (was ${this.props.eventId}), ` +
|
logger.log(`TimelinePanel switching to eventId ${this.props.eventId} (was ${prevProps.eventId}), ` +
|
||||||
`scrollIntoView: ${newProps.eventScrollIntoView} (was ${this.props.eventScrollIntoView})`);
|
`scrollIntoView: ${this.props.eventScrollIntoView} (was ${prevProps.eventScrollIntoView})`);
|
||||||
this.initTimeline(newProps);
|
this.initTimeline(this.props);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ const newReceipt = (eventId: string, userId: string, readTs: number, fullyReadTs
|
||||||
return new MatrixEvent({ content: receiptContent, type: EventType.Receipt });
|
return new MatrixEvent({ content: receiptContent, type: EventType.Receipt });
|
||||||
};
|
};
|
||||||
|
|
||||||
const renderPanel = (room: Room, events: MatrixEvent[]): RenderResult => {
|
const getProps = (room: Room, events: MatrixEvent[]): TimelinePanel["props"] => {
|
||||||
const timelineSet = { room: room as Room } as EventTimelineSet;
|
const timelineSet = { room: room as Room } as EventTimelineSet;
|
||||||
const timeline = new EventTimeline(timelineSet);
|
const timeline = new EventTimeline(timelineSet);
|
||||||
events.forEach((event) => timeline.addEvent(event, true));
|
events.forEach((event) => timeline.addEvent(event, true));
|
||||||
|
@ -54,13 +54,16 @@ const renderPanel = (room: Room, events: MatrixEvent[]): RenderResult => {
|
||||||
timelineSet.getPendingEvents = () => events;
|
timelineSet.getPendingEvents = () => events;
|
||||||
timelineSet.room.getEventReadUpTo = () => events[1].getId();
|
timelineSet.room.getEventReadUpTo = () => events[1].getId();
|
||||||
|
|
||||||
return render(
|
return {
|
||||||
<TimelinePanel
|
timelineSet,
|
||||||
timelineSet={timelineSet}
|
manageReadReceipts: true,
|
||||||
manageReadReceipts
|
sendReadReceiptOnLoad: true,
|
||||||
sendReadReceiptOnLoad
|
};
|
||||||
/>,
|
};
|
||||||
);
|
|
||||||
|
const renderPanel = (room: Room, events: MatrixEvent[]): RenderResult => {
|
||||||
|
const props = getProps(room, events);
|
||||||
|
return render(<TimelinePanel {...props} />);
|
||||||
};
|
};
|
||||||
|
|
||||||
const mockEvents = (room: Room, count = 2): MatrixEvent[] => {
|
const mockEvents = (room: Room, count = 2): MatrixEvent[] => {
|
||||||
|
@ -172,4 +175,21 @@ describe('TimelinePanel', () => {
|
||||||
expect(client.setRoomReadMarkers).toHaveBeenCalledWith(room.roomId, "", undefined, events[0]);
|
expect(client.setRoomReadMarkers).toHaveBeenCalledWith(room.roomId, "", undefined, events[0]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should scroll event into view when props.eventId changes", () => {
|
||||||
|
const client = MatrixClientPeg.get();
|
||||||
|
const room = mkRoom(client, "roomId");
|
||||||
|
const events = mockEvents(room);
|
||||||
|
|
||||||
|
const props = {
|
||||||
|
...getProps(room, events),
|
||||||
|
onEventScrolledIntoView: jest.fn(),
|
||||||
|
};
|
||||||
|
|
||||||
|
const { rerender } = render(<TimelinePanel {...props} />);
|
||||||
|
expect(props.onEventScrolledIntoView).toHaveBeenCalledWith(undefined);
|
||||||
|
props.eventId = events[1].getId();
|
||||||
|
rerender(<TimelinePanel {...props} />);
|
||||||
|
expect(props.onEventScrolledIntoView).toHaveBeenCalledWith(events[1].getId());
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue