Skip to content

Commit de68ac9

Browse files
committed
persist and restore per-tab mode state in TabBar component and tabsSlice
1 parent 70af97e commit de68ac9

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

gui/src/components/TabBar/TabBar.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
removeTab,
1212
setActiveTab,
1313
setTabs,
14+
setTabMode,
1415
setTabModel,
1516
} from "../../redux/slices/tabsSlice";
1617
import { AppDispatch, RootState } from "../../redux/store";
@@ -19,6 +20,7 @@ import { varWithFallback } from "../../styles/theme";
1920
import { useAuth } from "../../context/Auth";
2021
import { selectSelectedChatModel } from "../../redux/slices/configSlice";
2122
import { updateSelectedModelByRole } from "../../redux/thunks/updateSelectedModelByRole";
23+
import { setMode } from "../../redux/slices/sessionSlice";
2224

2325
// Haven't set up theme colors for tabs yet
2426
// Will keep it simple and choose from existing ones. Comments show vars we could use
@@ -144,9 +146,9 @@ export const TabBar = React.forwardRef<HTMLDivElement>((_, ref) => {
144146
const tabs = useSelector((state: RootState) => state.tabs.tabs);
145147
const selectedModel = useAppSelector(selectSelectedChatModel);
146148
const { selectedProfile } = useAuth();
149+
const mode = useAppSelector((state: RootState) => state.session.mode);
147150
const activeTab = tabs.find((tab) => tab.isActive);
148151
const activeTabId = activeTab?.id;
149-
const activeTabModel = activeTab?.modelTitle;
150152

151153
// Simple UUID generator for our needs
152154
const generateId = useCallback(() => {
@@ -172,7 +174,14 @@ export const TabBar = React.forwardRef<HTMLDivElement>((_, ref) => {
172174
setTabModel({ id: activeTabId, modelTitle: selectedModel.title }),
173175
);
174176
}
175-
}, [activeTabId, selectedModel?.title, dispatch]);
177+
}, [activeTabId, selectedModel?.title, mode, dispatch]);
178+
179+
// Persist the currently selected mode into the active tab
180+
useEffect(() => {
181+
if (activeTabId && mode) {
182+
dispatch(setTabMode({ id: activeTabId, mode }));
183+
}
184+
}, [activeTabId, mode, dispatch]);
176185

177186
const handleNewTab = async () => {
178187
// Save current session before creating new one
@@ -191,6 +200,7 @@ export const TabBar = React.forwardRef<HTMLDivElement>((_, ref) => {
191200
isActive: true,
192201
sessionId: undefined,
193202
modelTitle: selectedModel?.title,
203+
mode,
194204
}),
195205
);
196206
};
@@ -216,6 +226,12 @@ export const TabBar = React.forwardRef<HTMLDivElement>((_, ref) => {
216226
}
217227

218228
dispatch(setActiveTab(id));
229+
230+
// restore mode for this tab (if set)
231+
if (targetTab.mode) {
232+
dispatch(setMode(targetTab.mode));
233+
}
234+
219235
// restore model for this tab
220236
if (targetTab.modelTitle && selectedProfile) {
221237
void dispatch(

gui/src/redux/slices/tabsSlice.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { PayloadAction, createSlice } from "@reduxjs/toolkit";
2+
import { MessageModes } from "core";
23

34
export interface Tab {
45
id: string;
56
title: string;
67
isActive: boolean;
78
sessionId?: string;
89
modelTitle?: string; // store per-tab model
10+
mode?: MessageModes; // store per-tab mode ('chat' | 'plan' | 'agent')
911
}
1012

1113
interface TabsState {
@@ -19,6 +21,7 @@ const initialState: TabsState = {
1921
title: "Chat 1",
2022
isActive: true,
2123
modelTitle: undefined,
24+
mode: "chat",
2225
},
2326
],
2427
};
@@ -49,6 +52,16 @@ export const tabsSlice = createSlice({
4952
tab.id === id ? { ...tab, modelTitle } : tab,
5053
);
5154
},
55+
// Set the mode for a specific tab
56+
setTabMode: (
57+
state,
58+
action: PayloadAction<{ id: string; mode: MessageModes }>,
59+
) => {
60+
const { id, mode } = action.payload;
61+
state.tabs = state.tabs.map((tab) =>
62+
tab.id === id ? { ...tab, mode } : tab,
63+
);
64+
},
5265
addTab: (state, action: PayloadAction<Tab>) => {
5366
state.tabs = state.tabs
5467
.map((tab) => ({
@@ -145,6 +158,7 @@ export const {
145158
setTabs,
146159
updateTab,
147160
setTabModel,
161+
setTabMode,
148162
addTab,
149163
removeTab,
150164
setActiveTab,

0 commit comments

Comments
 (0)