Skip to content

Commit 557ba70

Browse files
committed
Reset current activity before previous remote start
1 parent dd98ba9 commit 557ba70

3 files changed

Lines changed: 133 additions & 0 deletions

File tree

src/components/NotifyCompRemoteBar/NotifyCompRemoteBar.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ export function NotifyCompRemoteBar({ competitionId }: NotifyCompRemoteBarProps)
4444
const runSwitch = (direction: 'previous' | 'next') => {
4545
const group = direction === 'previous' ? remote.previousGroup : remote.nextGroup;
4646

47+
if (direction === 'previous') {
48+
void remote.switchToPreviousGroup();
49+
return;
50+
}
51+
4752
if (direction === 'next' && group && !confirmNextGroup(group.name)) {
4853
return;
4954
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import { renderHook, act } from '@testing-library/react';
2+
import { useNotifyCompRemoteActivities } from '@/hooks/useNotifyCompRemoteActivities';
3+
import { useNotifyCompRemoteAuth } from '@/providers/NotifyCompRemoteAuthProvider';
4+
import { useWCIF } from '@/providers/WCIFProvider';
5+
import { useCompetitionRemoteControl } from './useCompetitionRemoteControl';
6+
7+
jest.mock('@/hooks/useNotifyCompRemoteActivities', () => ({
8+
useNotifyCompRemoteActivities: jest.fn(),
9+
}));
10+
jest.mock('@/providers/NotifyCompRemoteAuthProvider', () => ({
11+
useNotifyCompRemoteAuth: jest.fn(),
12+
}));
13+
jest.mock('@/providers/WCIFProvider', () => ({
14+
useWCIF: jest.fn(),
15+
}));
16+
17+
const activity = ({
18+
activityCode,
19+
id,
20+
name,
21+
startTime,
22+
}: {
23+
activityCode: string;
24+
id: number;
25+
name: string;
26+
startTime: string;
27+
}) => ({
28+
activityCode,
29+
childActivities: [],
30+
endTime: '2026-06-01T10:10:00Z',
31+
extensions: [],
32+
id,
33+
name,
34+
startTime,
35+
});
36+
37+
const wcif = {
38+
schedule: {
39+
venues: [
40+
{
41+
rooms: [
42+
{
43+
activities: [
44+
activity({
45+
activityCode: '333-r1-g1',
46+
id: 101,
47+
name: '3x3x3 Cube, Round 1, Group 1',
48+
startTime: '2026-06-01T10:00:00Z',
49+
}),
50+
activity({
51+
activityCode: '222-r1-g1',
52+
id: 102,
53+
name: '2x2x2 Cube, Round 1, Group 1',
54+
startTime: '2026-06-01T10:20:00Z',
55+
}),
56+
],
57+
id: 1,
58+
name: 'Stage 1',
59+
},
60+
],
61+
},
62+
],
63+
},
64+
};
65+
66+
describe('useCompetitionRemoteControl', () => {
67+
it('stops and resets the current group before starting the previous group', async () => {
68+
const resetActivities = jest.fn().mockResolvedValue(undefined);
69+
const startActivities = jest.fn().mockResolvedValue(undefined);
70+
const stopActivities = jest.fn().mockResolvedValue(undefined);
71+
72+
jest.mocked(useWCIF).mockReturnValue({ wcif } as unknown as ReturnType<typeof useWCIF>);
73+
jest.mocked(useNotifyCompRemoteAuth).mockReturnValue({
74+
isAuthenticatedForCompetition: () => true,
75+
} as unknown as ReturnType<typeof useNotifyCompRemoteAuth>);
76+
jest.mocked(useNotifyCompRemoteActivities).mockReturnValue({
77+
activities: [
78+
{
79+
activityId: 101,
80+
endTime: '2026-06-01T10:09:00Z',
81+
startTime: '2026-06-01T10:01:00Z',
82+
},
83+
{
84+
activityId: 102,
85+
endTime: null,
86+
startTime: '2026-06-01T10:21:00Z',
87+
},
88+
],
89+
resetActivities,
90+
startActivities,
91+
stopActivities,
92+
} as unknown as ReturnType<typeof useNotifyCompRemoteActivities>);
93+
94+
const { result } = renderHook(() =>
95+
useCompetitionRemoteControl({ competitionId: 'ExampleComp2026' }),
96+
);
97+
98+
await act(async () => {
99+
await result.current.switchToPreviousGroup();
100+
});
101+
102+
expect(stopActivities).toHaveBeenCalledWith([102]);
103+
expect(resetActivities).toHaveBeenCalledWith([102]);
104+
expect(startActivities).toHaveBeenCalledWith([101]);
105+
expect(stopActivities.mock.invocationCallOrder[0]).toBeLessThan(
106+
resetActivities.mock.invocationCallOrder[0],
107+
);
108+
expect(resetActivities.mock.invocationCallOrder[0]).toBeLessThan(
109+
startActivities.mock.invocationCallOrder[0],
110+
);
111+
});
112+
});

src/hooks/useCompetitionRemoteControl/useCompetitionRemoteControl.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,21 @@ export function useCompetitionRemoteControl({
7777
await remote.startActivities(activityIdsForGroup(group));
7878
};
7979

80+
const switchToPreviousGroup = async () => {
81+
if (!previousGroup) {
82+
return;
83+
}
84+
85+
const currentActivityIds = activeGroups.flatMap(activityIdsForGroup);
86+
87+
if (currentActivityIds.length > 0) {
88+
await remote.stopActivities(currentActivityIds);
89+
await remote.resetActivities(currentActivityIds);
90+
}
91+
92+
await remote.startActivities(activityIdsForGroup(previousGroup));
93+
};
94+
8095
return {
8196
...remote,
8297
activeGroups,
@@ -89,6 +104,7 @@ export function useCompetitionRemoteControl({
89104
scheduledActivities,
90105
startGroup,
91106
stopGroup,
107+
switchToPreviousGroup,
92108
switchToGroup,
93109
};
94110
}

0 commit comments

Comments
 (0)