Skip to content

Commit 944d1c2

Browse files
authored
fix: propagate stopTimerRefreshBoundaryMs to all reminder timers on ReminderManager config update (#1568)
1 parent 1a3f4c4 commit 944d1c2

File tree

2 files changed

+42
-8
lines changed

2 files changed

+42
-8
lines changed

src/reminders/ReminderManager.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Reminder } from './Reminder';
2+
import { DEFAULT_STOP_REFRESH_BOUNDARY_MS } from './ReminderTimer';
23
import { StateStore } from '../store';
34
import { ReminderPaginator } from '../pagination';
45
import { WithSubscriptions } from '../utils/WithSubscriptions';
@@ -26,6 +27,7 @@ export const DEFAULT_REMINDER_MANAGER_CONFIG: ReminderManagerConfig = {
2627
8 * oneHour,
2728
oneDay,
2829
],
30+
stopTimerRefreshBoundaryMs: DEFAULT_STOP_REFRESH_BOUNDARY_MS,
2931
};
3032

3133
const isReminderExistsError = (error: Error) =>
@@ -51,12 +53,12 @@ export type ReminderManagerState = {
5153

5254
export type ReminderManagerConfig = {
5355
scheduledOffsetsMs: number[];
54-
stopTimerRefreshBoundaryMs?: number;
56+
stopTimerRefreshBoundaryMs: number;
5557
};
5658

5759
export type ReminderManagerOptions = {
5860
client: StreamChat;
59-
config?: ReminderManagerConfig;
61+
config?: Partial<ReminderManagerConfig>;
6062
};
6163

6264
export class ReminderManager extends WithSubscriptions {
@@ -71,13 +73,25 @@ export class ReminderManager extends WithSubscriptions {
7173
this.configState = new StateStore({
7274
scheduledOffsetsMs:
7375
config?.scheduledOffsetsMs ?? DEFAULT_REMINDER_MANAGER_CONFIG.scheduledOffsetsMs,
76+
stopTimerRefreshBoundaryMs:
77+
config?.stopTimerRefreshBoundaryMs ??
78+
DEFAULT_REMINDER_MANAGER_CONFIG.stopTimerRefreshBoundaryMs,
7479
});
7580
this.state = new StateStore({ reminders: new Map<MessageId, Reminder>() });
7681
this.paginator = new ReminderPaginator(client);
7782
}
7883

7984
// Config API START //
8085
updateConfig(config: Partial<ReminderManagerConfig>) {
86+
if (
87+
typeof config.stopTimerRefreshBoundaryMs === 'number' &&
88+
config.stopTimerRefreshBoundaryMs !== this.stopTimerRefreshBoundaryMs
89+
) {
90+
this.reminders.forEach((reminder) => {
91+
reminder.timer.stopRefreshBoundaryMs =
92+
config?.stopTimerRefreshBoundaryMs as number;
93+
});
94+
}
8195
this.configState.partialNext(config);
8296
}
8397

test/unit/reminders/ReminderManager.test.ts

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ import {
55
Reminder,
66
ReminderManager,
77
ReminderResponse,
8-
ReminderTimer,
8+
ReminderState,
99
StreamChat,
1010
} from '../../../src';
1111
import { describe, expect, it, vi } from 'vitest';
1212
import { PaginationQueryReturnValue } from '../../../src/pagination';
13-
import { sleep } from '../../../src/utils';
1413

1514
const baseData = {
1615
channel_cid: 'channel_cid',
@@ -71,19 +70,40 @@ describe('ReminderManager', () => {
7170
const manager = new ReminderManager({ client, config });
7271
// @ts-expect-error accessing private property
7372
expect(manager.client).toBe(client);
74-
expect(manager.configState.getLatestValue()).toEqual(config);
73+
expect(manager.configState.getLatestValue()).toEqual({
74+
...DEFAULT_REMINDER_MANAGER_CONFIG,
75+
...config,
76+
});
7577
expect(manager.state.getLatestValue()).toEqual({ reminders: new Map() });
7678
});
7779
});
7880

7981
describe('config state API', () => {
80-
it('updates config object', () => {
82+
it('updates scheduledOffsetsMs', () => {
8183
const client = new StreamChat('api-key');
8284
const manager = new ReminderManager({ client });
8385
const config = { scheduledOffsetsMs: [1, 2, 3] };
8486
manager.updateConfig(config);
8587
expect(manager.scheduledOffsetsMs).toEqual(config.scheduledOffsetsMs);
8688
});
89+
90+
it('updates stopTimerRefreshBoundaryMs for every timer', () => {
91+
const client = new StreamChat('api-key');
92+
const manager = new ReminderManager({ client });
93+
const scheduleOffsetMs = 62 * 1000;
94+
const reminderResponse = generateReminderResponse({ scheduleOffsetMs });
95+
manager.upsertToState({ data: reminderResponse });
96+
97+
expect(manager.stopTimerRefreshBoundaryMs).toBe(DEFAULT_STOP_REFRESH_BOUNDARY_MS);
98+
const config = { stopTimerRefreshBoundaryMs: 1 };
99+
manager.updateConfig(config);
100+
expect(manager.stopTimerRefreshBoundaryMs).toEqual(
101+
config.stopTimerRefreshBoundaryMs,
102+
);
103+
expect(
104+
manager.reminders.get(reminderResponse.message_id)?.timer.stopRefreshBoundaryMs,
105+
).toBe(1);
106+
});
87107
});
88108

89109
describe('state API', () => {
@@ -305,10 +325,10 @@ describe('ReminderManager', () => {
305325
const remindAtDate = new Date('1970-01-01');
306326
const { timeLeftMs, ...state } = manager.reminders
307327
.get(reminderResponse.message_id)
308-
?.state.getLatestValue();
328+
?.state.getLatestValue() as ReminderState;
309329
expect({
310330
...state,
311-
timeLeftMs: Math.round(timeLeftMs / 1000),
331+
timeLeftMs: Math.round((timeLeftMs ?? 0) / 1000),
312332
}).toEqual({
313333
...reminderResponse,
314334
created_at: new Date(reminderResponse.created_at),

0 commit comments

Comments
 (0)