From 36752bf401bc62364268dcc2b964cee4873ad8a7 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 14:34:31 +0000 Subject: [PATCH] Show About you inside General settings The profile had its own settings tab although it is a few rows of personal details. It now sits as one card under Account in General, hides itself while empty, and the separate tab is gone. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_017gHYZ4c9Twex73v4ZasmMJ --- apps/web/e2e/helpers.ts | 1 - apps/web/e2e/user-profile-edit.spec.ts | 4 +- apps/web/e2e/user-profile.spec.ts | 8 +- .../src/components/UserProfileSettings.tsx | 77 +++++++++---------- apps/web/src/locales/de/messages.po | 6 +- apps/web/src/locales/en/messages.po | 6 +- apps/web/src/locales/es/messages.po | 6 +- apps/web/src/locales/hi/messages.po | 6 +- apps/web/src/locales/ko/messages.po | 6 +- apps/web/src/locales/pt-BR/messages.po | 6 +- apps/web/src/locales/ru/messages.po | 6 +- apps/web/src/locales/tr/messages.po | 6 +- apps/web/src/locales/zh-CN/messages.po | 6 +- apps/web/src/pages/AccountSettingsOverlay.tsx | 3 + apps/web/src/pages/SettingsOverlay.tsx | 5 -- 15 files changed, 55 insertions(+), 97 deletions(-) diff --git a/apps/web/e2e/helpers.ts b/apps/web/e2e/helpers.ts index edc646d..84f94c4 100644 --- a/apps/web/e2e/helpers.ts +++ b/apps/web/e2e/helpers.ts @@ -245,7 +245,6 @@ export async function openUserSettings( | "integrations" | "models" | "memory" - | "profile" | "voice" | "notifications" | "usage" diff --git a/apps/web/e2e/user-profile-edit.spec.ts b/apps/web/e2e/user-profile-edit.spec.ts index 612ab13..8d25c39 100644 --- a/apps/web/e2e/user-profile-edit.spec.ts +++ b/apps/web/e2e/user-profile-edit.spec.ts @@ -1,5 +1,5 @@ /** - * E2E: Settings → About you edits a fact in place: its wording, category and the spaces it + * E2E: Settings → General → About you edits a fact in place: its wording, category and the spaces it * shows in. */ import { expect, test } from "@playwright/test"; @@ -15,7 +15,7 @@ test("a fact's wording, category and spaces are edited in place", async ({ page addFacts: [{ category: "preferences", value: "Prefers tea" }], }); - const settings = await openUserSettings(page, "profile"); + const settings = await openUserSettings(page); const profile = settings.getByTestId("user-profile-settings"); const tea = profile.getByTestId("user-fact").filter({ hasText: "Prefers tea" }); await tea.getByRole("button", { name: "Edit" }).click(); diff --git a/apps/web/e2e/user-profile.spec.ts b/apps/web/e2e/user-profile.spec.ts index da47b22..8d5840e 100644 --- a/apps/web/e2e/user-profile.spec.ts +++ b/apps/web/e2e/user-profile.spec.ts @@ -1,6 +1,6 @@ /** * E2E: onboarding fills the user profile without asking (time zone, locale and language from - * the browser) and records the focus answer as a fact; Settings → About you shows every fact + * the browser) and records the focus answer as a fact; Settings → General → About you shows every fact * with its origin, confirms a pending one, and forgets one or all of them. */ import { expect, test } from "@playwright/test"; @@ -58,8 +58,8 @@ test("onboarding feeds the profile; facts can be confirmed and forgotten", async addFacts: [{ category: "health", value: "Allergic to peanuts", source: "onboarding" }], }); - const settings = await openUserSettings(page, "profile"); - await expect(settings).toHaveAttribute("data-settings-section", "profile"); + const settings = await openUserSettings(page); + await expect(settings).toHaveAttribute("data-settings-section", "general"); const profile = settings.getByTestId("user-profile-settings"); await expect(profile.getByTestId("profile-field-timeZone")).toContainText("Europe/Vienna"); await expect(profile.getByTestId("profile-field-language")).toContainText("English"); @@ -99,6 +99,6 @@ test("onboarding feeds the profile; facts can be confirmed and forgotten", async await profile.getByRole("button", { name: "Forget everything" }).click(); await page.getByRole("alertdialog").getByRole("button", { name: "Forget", exact: true }).click(); - await expect(profile).toContainText("Nothing yet"); + await expect(profile).toHaveCount(0); expect(await rpc<{ facts: unknown[] }>(page, "profile/get", null)).toMatchObject({ facts: [] }); }); diff --git a/apps/web/src/components/UserProfileSettings.tsx b/apps/web/src/components/UserProfileSettings.tsx index 3811a9a..33ce9da 100644 --- a/apps/web/src/components/UserProfileSettings.tsx +++ b/apps/web/src/components/UserProfileSettings.tsx @@ -151,54 +151,51 @@ export function UserProfileSettings() { ); + if (!error && (!state || (fields.length === 0 && groups.length === 0))) return null; + return ( -
+
+

+ About you +

{error ? (

{error}

) : null} - {state && fields.length === 0 && groups.length === 0 ? ( -

- Nothing yet -

- ) : null} {fields.length > 0 ? ( -
-
    - {fields.map(({ field, value }) => ( - - deleteButton( - describedBy, - () => void apply(() => rpc.profile.update(CLEARED_PROFILE_FIELD[field])), - ) - } - /> - ))} -
-
+
    + {fields.map(({ field, value }) => ( + + deleteButton( + describedBy, + () => void apply(() => rpc.profile.update(CLEARED_PROFILE_FIELD[field])), + ) + } + /> + ))} +
) : null} {groups.map((group) => ( -
-

+
+

{categoryLabels[group.category]} -

-
    +

+
    {group.facts.map((fact) => fact.id === editingId ? ( -
+
))} {fields.length > 0 || groups.length > 0 ? (