From f6dc55999de6bf57250af69ab3fa24ad7b4c5ebd Mon Sep 17 00:00:00 2001 From: Ivan Sekovanikj Date: Fri, 14 Aug 2026 16:36:36 +0200 Subject: [PATCH] fix: provide a sensible way to disable sync limit --- package/src/components/Chat/Chat.tsx | 7 +++---- package/src/components/Chat/__tests__/Chat.test.tsx | 12 ++++++++++++ package/src/store/OfflineDB.ts | 13 +++++++++++-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/package/src/components/Chat/Chat.tsx b/package/src/components/Chat/Chat.tsx index 00608eb4df..7eb6228cf3 100644 --- a/package/src/components/Chat/Chat.tsx +++ b/package/src/components/Chat/Chat.tsx @@ -59,15 +59,14 @@ export type ChatProps = Pick & * channels; inactive channels are hydrated on their next explicit query. The * last-sync timestamp is still advanced so the same payload is not retried. * - * Defaults to {@link DEFAULT_MAX_SYNC_EVENTS_LIMIT} (250). Pass a larger number - * to raise the cap, or any non-positive value (e.g. `0`) for no limit — i.e. - * replay every event (the historical behavior). + * Defaults to {@link DEFAULT_MAX_SYNC_EVENTS_LIMIT} (250). Pass `false` to + * disable the limit entirely (replay every event — the historical behavior). * * Only relevant when `enableOfflineSupport` is enabled. * * @default 250 */ - maxSyncEventsLimit?: number; + maxSyncEventsLimit?: number | false; /** * When true, multipart uploads use the SDK's native upload adapter when available. * When false, uploads stay on the default axios adapter. diff --git a/package/src/components/Chat/__tests__/Chat.test.tsx b/package/src/components/Chat/__tests__/Chat.test.tsx index 3890af3cef..4d6a43ad29 100644 --- a/package/src/components/Chat/__tests__/Chat.test.tsx +++ b/package/src/components/Chat/__tests__/Chat.test.tsx @@ -355,4 +355,16 @@ describe('TranslationContext', () => { ); expect(DEFAULT_MAX_SYNC_EVENTS_LIMIT).toBe(250); }); + + it('disables the sync event limit when maxSyncEventsLimit is false', async () => { + const chatClientWithUser = await getTestClientWithUser({ id: 'testID' }); + + render(); + + await waitFor(() => { + expect(chatClientWithUser.offlineDb).toBeDefined(); + }); + // `false` opts out: the client stores no limit (undefined), so replay always runs. + expect(chatClientWithUser.offlineDb!.syncManager.syncMaxEventCount).toBeUndefined(); + }); }); diff --git a/package/src/store/OfflineDB.ts b/package/src/store/OfflineDB.ts index bbe18eb87f..d0d6a408fc 100644 --- a/package/src/store/OfflineDB.ts +++ b/package/src/store/OfflineDB.ts @@ -12,8 +12,17 @@ import * as api from './apis'; import { SqliteClient } from './SqliteClient'; export class OfflineDB extends AbstractOfflineDB { - constructor({ client, maxSyncEventsLimit }: { client: StreamChat; maxSyncEventsLimit?: number }) { - super({ client, syncMaxEventCount: maxSyncEventsLimit }); + constructor({ + client, + maxSyncEventsLimit, + }: { + client: StreamChat; + maxSyncEventsLimit?: number | false; + }) { + super({ + client, + syncMaxEventCount: maxSyncEventsLimit === false ? undefined : maxSyncEventsLimit, + }); } upsertCidsForQuery = api.upsertCidsForQuery;