Skip to content

Commit b8a07f5

Browse files
committed
feat: hide feedback column in local mode
Feedback data in local mode stays in SQLite and doesn't flow to the cloud backend, making thumbs up/down misleading. Detect local mode via checkIsLocalMode() and filter out the feedback column, handlers, and modal from both MessageLog and Overview pages.
1 parent fd7a177 commit b8a07f5

File tree

4 files changed

+80
-20
lines changed

4 files changed

+80
-20
lines changed

packages/frontend/src/pages/MessageLog.tsx

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
For,
99
on,
1010
onCleanup,
11+
onMount,
1112
Show,
1213
type Component,
1314
} from 'solid-js';
@@ -31,6 +32,7 @@ import {
3132
import { createCursorPagination } from '../services/cursor-pagination.js';
3233
import { preloadModelDisplayNames } from '../services/model-display.js';
3334
import { PROVIDERS } from '../services/providers.js';
35+
import { checkIsLocalMode } from '../services/setup-status.js';
3436
import { pingCount } from '../services/sse.js';
3537
import '../styles/overview.css';
3638

@@ -45,6 +47,12 @@ const MessageLog: Component = () => {
4547
const params = useParams<{ agentName: string }>();
4648
const navigate = useNavigate();
4749
preloadModelDisplayNames();
50+
const [isLocal, setIsLocal] = createSignal(false);
51+
onMount(() => {
52+
checkIsLocalMode().then(setIsLocal);
53+
});
54+
const columns = () =>
55+
isLocal() ? DETAILED_COLUMNS.filter((c) => c !== 'feedback') : DETAILED_COLUMNS;
4856
const [providerFilter, setProviderFilter] = createSignal('');
4957
const [costMin, setCostMin] = createSignal('');
5058
const [costMax, setCostMax] = createSignal('');
@@ -430,14 +438,16 @@ const MessageLog: Component = () => {
430438
</div>
431439
<div class="data-table-scroll">
432440
<MessageTable
433-
items={applyFeedbackOverrides(data()?.items ?? [])}
434-
columns={DETAILED_COLUMNS}
441+
items={
442+
isLocal() ? (data()?.items ?? []) : applyFeedbackOverrides(data()?.items ?? [])
443+
}
444+
columns={columns()}
435445
agentName={params.agentName}
436446
customProviderName={customProviderName}
437447
onFallbackErrorClick={scrollToFallbackSuccess}
438-
onFeedbackLike={handleFeedbackLike}
439-
onFeedbackDislike={handleFeedbackDislike}
440-
onFeedbackClear={handleFeedbackClear}
448+
onFeedbackLike={isLocal() ? undefined : handleFeedbackLike}
449+
onFeedbackDislike={isLocal() ? undefined : handleFeedbackDislike}
450+
onFeedbackClear={isLocal() ? undefined : handleFeedbackClear}
441451
rowIdPrefix="msg-"
442452
showHeaderTooltips
443453
expandable
@@ -465,11 +475,13 @@ const MessageLog: Component = () => {
465475
onClose={() => setSetupOpen(false)}
466476
/>
467477

468-
<FeedbackModal
469-
open={feedbackModalOpen()}
470-
onClose={() => setFeedbackModalOpen(false)}
471-
onSubmit={handleFeedbackSubmit}
472-
/>
478+
<Show when={!isLocal()}>
479+
<FeedbackModal
480+
open={feedbackModalOpen()}
481+
onClose={() => setFeedbackModalOpen(false)}
482+
onSubmit={handleFeedbackSubmit}
483+
/>
484+
</Show>
473485
</div>
474486
);
475487
};

packages/frontend/src/pages/Overview.tsx

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
createMemo,
66
createResource,
77
createSignal,
8+
onMount,
89
Show,
910
type Component,
1011
} from 'solid-js';
@@ -32,6 +33,7 @@ import {
3233
} from '../services/api.js';
3334
import { preloadModelDisplayNames } from '../services/model-display.js';
3435
import { isRecentlyCreated } from '../services/recent-agents.js';
36+
import { checkIsLocalMode } from '../services/setup-status.js';
3537
import { pingCount } from '../services/sse.js';
3638
import '../styles/overview.css';
3739

@@ -79,6 +81,12 @@ const Overview: Component = () => {
7981
const location = useLocation<{ newApiKey?: string }>();
8082
const navigate = useNavigate();
8183
preloadModelDisplayNames();
84+
const [isLocal, setIsLocal] = createSignal(false);
85+
onMount(() => {
86+
checkIsLocalMode().then(setIsLocal);
87+
});
88+
const columns = () =>
89+
isLocal() ? COMPACT_COLUMNS.filter((c) => c !== 'feedback') : COMPACT_COLUMNS;
8290
const RANGE_STORAGE_KEY = 'manifest_chart_range';
8391
const VALID_RANGES = new Set(['24h', '7d', '30d']);
8492
const savedRange = localStorage.getItem(RANGE_STORAGE_KEY);
@@ -349,13 +357,17 @@ const Overview: Component = () => {
349357
</A>
350358
</div>
351359
<MessageTable
352-
items={applyFeedbackOverrides(d().recent_activity?.slice(0, 5) ?? [])}
353-
columns={COMPACT_COLUMNS}
360+
items={
361+
isLocal()
362+
? (d().recent_activity?.slice(0, 5) ?? [])
363+
: applyFeedbackOverrides(d().recent_activity?.slice(0, 5) ?? [])
364+
}
365+
columns={columns()}
354366
agentName={params.agentName}
355367
customProviderName={customProviderName}
356-
onFeedbackLike={handleFeedbackLike}
357-
onFeedbackDislike={handleFeedbackDislike}
358-
onFeedbackClear={handleFeedbackClear}
368+
onFeedbackLike={isLocal() ? undefined : handleFeedbackLike}
369+
onFeedbackDislike={isLocal() ? undefined : handleFeedbackDislike}
370+
onFeedbackClear={isLocal() ? undefined : handleFeedbackClear}
359371
/>
360372
</div>
361373

@@ -391,11 +403,13 @@ const Overview: Component = () => {
391403
}}
392404
/>
393405

394-
<FeedbackModal
395-
open={feedbackModalOpen()}
396-
onClose={() => setFeedbackModalOpen(false)}
397-
onSubmit={handleFeedbackSubmit}
398-
/>
406+
<Show when={!isLocal()}>
407+
<FeedbackModal
408+
open={feedbackModalOpen()}
409+
onClose={() => setFeedbackModalOpen(false)}
410+
onSubmit={handleFeedbackSubmit}
411+
/>
412+
</Show>
399413
</div>
400414
);
401415
};

packages/frontend/tests/pages/MessageLog.test.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ vi.mock("../../src/services/formatters.js", () => ({
4848
customProviderColor: vi.fn(() => '#6366f1'),
4949
}));
5050

51+
const mockCheckIsLocalMode = vi.fn(() => Promise.resolve(false));
52+
vi.mock("../../src/services/setup-status.js", () => ({
53+
checkIsLocalMode: () => mockCheckIsLocalMode(),
54+
}));
55+
5156
vi.mock("../../src/components/SetupModal.jsx", () => ({
5257
default: (props: any) => (
5358
<div data-testid="setup-modal" data-open={props.open ? "true" : "false"} data-agent={props.agentName ?? ""}>
@@ -944,5 +949,17 @@ describe("MessageLog", () => {
944949
const modal = container.querySelector('[data-testid="feedback-modal"]');
945950
expect(modal?.getAttribute("data-open")).toBe("false");
946951
});
952+
953+
it("hides feedback column and modal in local mode", async () => {
954+
mockCheckIsLocalMode.mockResolvedValue(true);
955+
mockGetMessages.mockResolvedValue(messagesData);
956+
const { container } = render(() => <MessageLog />);
957+
await vi.waitFor(() => {
958+
expect(container.querySelector(".data-table")).not.toBeNull();
959+
});
960+
expect(container.querySelector(".feedback-btn")).toBeNull();
961+
expect(container.querySelector('[data-testid="feedback-modal"]')).toBeNull();
962+
mockCheckIsLocalMode.mockResolvedValue(false);
963+
});
947964
});
948965
});

packages/frontend/tests/pages/Overview.test.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ vi.mock("../../src/services/formatters.js", () => ({
4545
customProviderColor: vi.fn(() => '#6366f1'),
4646
}));
4747

48+
const mockCheckIsLocalMode = vi.fn(() => Promise.resolve(false));
49+
vi.mock("../../src/services/setup-status.js", () => ({
50+
checkIsLocalMode: () => mockCheckIsLocalMode(),
51+
}));
52+
4853
vi.mock("../../src/components/CostChart.jsx", () => ({
4954
default: () => <div data-testid="cost-chart" />,
5055
}));
@@ -863,5 +868,17 @@ describe("Overview", () => {
863868
fireEvent.click(submitBtn);
864869
expect(mockSetMessageFeedback).toHaveBeenCalledWith("msg-12345678", { rating: "dislike", tags: ["Too slow"], details: "test" });
865870
});
871+
872+
it("hides feedback column and modal in local mode", async () => {
873+
mockCheckIsLocalMode.mockResolvedValue(true);
874+
mockGetOverview.mockResolvedValue(overviewData);
875+
const { container } = render(() => <Overview />);
876+
await vi.waitFor(() => {
877+
expect(container.querySelector(".data-table")).not.toBeNull();
878+
});
879+
expect(container.querySelector(".feedback-btn")).toBeNull();
880+
expect(container.querySelector('[data-testid="feedback-modal"]')).toBeNull();
881+
mockCheckIsLocalMode.mockResolvedValue(false);
882+
});
866883
});
867884
});

0 commit comments

Comments
 (0)