extract conversation timeline hook

This commit is contained in:
Jack Kingsman
2026-03-09 19:12:26 -07:00
parent 56e5e0d278
commit ae0ef90fe2
4 changed files with 499 additions and 417 deletions
@@ -392,4 +392,65 @@ describe('useConversationMessages forward pagination', () => {
expect(result.current.messages).toHaveLength(1);
expect(result.current.messages[0].text).toBe('latest-msg');
});
it('preserves around-loaded messages when the jump target is cleared in the same conversation', async () => {
const conv: Conversation = { type: 'channel', id: 'ch1', name: 'Channel' };
const aroundMessages = [
createMessage({
id: 4,
conversation_key: 'ch1',
text: 'older-context',
sender_timestamp: 1700000004,
received_at: 1700000004,
}),
createMessage({
id: 5,
conversation_key: 'ch1',
text: 'target-message',
sender_timestamp: 1700000005,
received_at: 1700000005,
}),
createMessage({
id: 6,
conversation_key: 'ch1',
text: 'newer-context',
sender_timestamp: 1700000006,
received_at: 1700000006,
}),
];
mockGetMessagesAround.mockResolvedValueOnce({
messages: aroundMessages,
has_older: true,
has_newer: true,
});
const { result, rerender } = renderHook<
ReturnType<typeof useConversationMessages>,
{ conv: Conversation; target: number | null }
>(({ conv, target }) => useConversationMessages(conv, target), {
initialProps: { conv, target: 5 },
});
await waitFor(() => expect(result.current.messagesLoading).toBe(false));
expect(result.current.messages.map((message) => message.text)).toEqual([
'older-context',
'target-message',
'newer-context',
]);
expect(mockGetMessages).not.toHaveBeenCalled();
rerender({ conv, target: null });
await waitFor(() =>
expect(result.current.messages.map((message) => message.text)).toEqual([
'older-context',
'target-message',
'newer-context',
])
);
expect(mockGetMessages).not.toHaveBeenCalled();
expect(result.current.hasNewerMessages).toBe(true);
});
});