feat: add usage onboarding survey overlay (#388)

* feat: add usage-survey feedback types and gating function

Claude-Session: https://claude.ai/code/session_01KAC9Lbx8AmebAnj9WQZXHp

* feat: add onboarding usage-survey i18n strings to all locales

Relabels three ambiguous feedback.usageTypes values (personal/team_internal/
business_workflow) and adds a new onboarding namespace (4 keys) across the
reference locale and all 20 translations, so the tree compiles at every
commit instead of only after both locale groups land.

Claude-Session: https://claude.ai/code/session_01KAC9Lbx8AmebAnj9WQZXHp

* feat: add UsageSurveyOverlay component

* feat: mount UsageSurveyOverlay inside AuthGuard

Claude-Session: https://claude.ai/code/session_01KAC9Lbx8AmebAnj9WQZXHp

* fix: use text-start instead of text-left for RTL support in UsageSurveyOverlay

* refactor: drop redundant usage-type field from the admin feedback dialog

Claude-Session: https://claude.ai/code/session_01KAC9Lbx8AmebAnj9WQZXHp

* feat: accept onboarding source and survey id in the feedback route

Claude-Session: https://claude.ai/code/session_01KAC9Lbx8AmebAnj9WQZXHp

* test: cover the onboarding source in the feedback route integration test

Claude-Session: https://claude.ai/code/session_01KAC9Lbx8AmebAnj9WQZXHp

* chore: remove orphaned usageTypeLabel i18n key

* refactor: derive feedback source/survey_id enums from a single source of truth

* perf: skip the settings fetch in UsageSurveyOverlay for non-admin users
This commit is contained in:
SnapOtter
2026-07-02 00:02:24 +08:00
committed by GitHub
parent 9052da27f3
commit a0d1c70172
31 changed files with 674 additions and 168 deletions
+61 -1
View File
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { shouldShowInstallFeedbackCard } from "@/lib/feedback";
import { shouldShowInstallFeedbackCard, shouldShowUsageSurvey } from "@/lib/feedback";
const NOW = new Date("2026-01-15T00:00:00Z").getTime();
@@ -90,3 +90,63 @@ describe("shouldShowInstallFeedbackCard", () => {
).toBe(true);
});
});
describe("shouldShowUsageSurvey", () => {
it("shows only for admins after analytics config is loaded and enabled", () => {
expect(
shouldShowUsageSurvey({
settings: {},
role: "admin",
analyticsConfigLoaded: true,
analyticsEnabled: true,
}),
).toBe(true);
expect(
shouldShowUsageSurvey({
settings: {},
role: "user",
analyticsConfigLoaded: true,
analyticsEnabled: true,
}),
).toBe(false);
expect(
shouldShowUsageSurvey({
settings: {},
role: "admin",
analyticsConfigLoaded: false,
analyticsEnabled: true,
}),
).toBe(false);
expect(
shouldShowUsageSurvey({
settings: {},
role: "admin",
analyticsConfigLoaded: true,
analyticsEnabled: false,
}),
).toBe(false);
});
it("stays hidden after answering or permanently dismissing", () => {
expect(
shouldShowUsageSurvey({
settings: { "onboarding.usageSurvey.answeredAt": "2026-01-14T00:00:00Z" },
role: "admin",
analyticsConfigLoaded: true,
analyticsEnabled: true,
}),
).toBe(false);
expect(
shouldShowUsageSurvey({
settings: { "onboarding.usageSurvey.dismissedAt": "2026-01-14T00:00:00Z" },
role: "admin",
analyticsConfigLoaded: true,
analyticsEnabled: true,
}),
).toBe(false);
});
});