Skip to content
This repository was archived by the owner on Aug 6, 2026. It is now read-only.

Commit 1f12e79

Browse files
Merging af3479b into trunk-temp/pr-3998/7a5558bf-ac91-4037-b315-396f9d2e0e63
2 parents 5f3a754 + af3479b commit 1f12e79

2 files changed

Lines changed: 51 additions & 18 deletions

File tree

apps/mobile/src/features/tasks/stores/messagingModeStore.test.ts

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { beforeEach, describe, expect, it } from "vitest";
22
import {
33
type MessagingMode,
4+
migrateMessagingModeState,
45
useMessagingModeStore,
56
} from "./messagingModeStore";
67

@@ -28,12 +29,15 @@ describe("messagingModeStore", () => {
2829
);
2930
});
3031

31-
it("falls back to the global default when a task has no override", () => {
32-
useMessagingModeStore.getState().setDefaultMode("queue");
33-
expect(useMessagingModeStore.getState().getEffectiveMode("t1")).toBe(
34-
"queue",
35-
);
36-
});
32+
it.each(["queue", "steer"] as const)(
33+
"falls back to the global default (%s) when a task has no override",
34+
(mode) => {
35+
useMessagingModeStore.getState().setDefaultMode(mode);
36+
expect(useMessagingModeStore.getState().getEffectiveMode("t1")).toBe(
37+
mode,
38+
);
39+
},
40+
);
3741

3842
it("prefers a per-task override over the global default", () => {
3943
useMessagingModeStore.getState().setMode("t1", "queue");
@@ -53,6 +57,8 @@ describe("messagingModeStore", () => {
5357
);
5458
});
5559

60+
// Exercises the migration through the persisted store's wired `migrate`
61+
// option, complementing the direct unit tests below.
5662
describe("migration", () => {
5763
it.each([
5864
{
@@ -91,3 +97,27 @@ describe("messagingModeStore", () => {
9197
});
9298
});
9399
});
100+
101+
describe("migrateMessagingModeState", () => {
102+
it("moves v0 installs to steer while keeping per-task overrides", () => {
103+
const migrated = migrateMessagingModeState(
104+
{ modesByTaskId: { t1: "queue" }, defaultMode: "queue" },
105+
0,
106+
);
107+
expect(migrated).toEqual({
108+
modesByTaskId: { t1: "queue" },
109+
defaultMode: "steer",
110+
});
111+
});
112+
113+
it("leaves already-migrated state untouched", () => {
114+
const state = { modesByTaskId: {}, defaultMode: "queue" as const };
115+
expect(migrateMessagingModeState(state, 1)).toEqual(state);
116+
});
117+
118+
it("tolerates missing persisted state", () => {
119+
expect(migrateMessagingModeState(undefined, 0)).toEqual({
120+
defaultMode: "steer",
121+
});
122+
});
123+
});

apps/mobile/src/features/tasks/stores/messagingModeStore.ts

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,20 @@ interface MessagingModeState {
1313
getEffectiveMode: (taskId: string | undefined) => MessagingMode;
1414
}
1515

16+
/**
17+
* Mobile sessions are all cloud, where steer is stable, so the default moved to
18+
* steer. Existing installs persisted "queue" under v0 and would keep it, so v1
19+
* rehydrates them to steer. Per-task overrides are untouched; an explicit
20+
* "queue" default is indistinguishable from the old default, so it is reset too.
21+
*/
22+
export function migrateMessagingModeState(
23+
persisted: unknown,
24+
version: number,
25+
): Partial<MessagingModeState> {
26+
const state = (persisted ?? {}) as Partial<MessagingModeState>;
27+
return version < 1 ? { ...state, defaultMode: "steer" } : state;
28+
}
29+
1630
export const useMessagingModeStore = create<MessagingModeState>()(
1731
persist(
1832
(set, get) => ({
@@ -35,18 +49,7 @@ export const useMessagingModeStore = create<MessagingModeState>()(
3549
name: "messaging-mode-storage",
3650
storage: createJSONStorage(() => AsyncStorage),
3751
version: 1,
38-
// Pre-v1 installs persisted the old "queue" default, so flip them to the
39-
// new "steer" default once. Per-task overrides are left untouched.
40-
migrate: (persisted, version) => {
41-
const state = persisted as Pick<
42-
MessagingModeState,
43-
"modesByTaskId" | "defaultMode"
44-
>;
45-
if (version < 1 && state.defaultMode === "queue") {
46-
return { ...state, defaultMode: "steer" };
47-
}
48-
return state;
49-
},
52+
migrate: migrateMessagingModeState,
5053
partialize: (state) => ({
5154
modesByTaskId: state.modesByTaskId,
5255
defaultMode: state.defaultMode,

0 commit comments

Comments
 (0)