Add workspace title display preference

This commit is contained in:
Mohamed Boudra
2026-06-20 19:44:30 +07:00
parent 0718e7c914
commit 68bbc75df1
12 changed files with 155 additions and 17 deletions
@@ -38,6 +38,7 @@ import {
type ServiceUrlBehavior,
type Settings,
type SettingsDeps,
type WorkspaceTitleSource,
} from "./storage";
export {
@@ -67,6 +68,7 @@ export type {
ServiceUrlBehavior,
Settings,
SettingsDeps,
WorkspaceTitleSource,
};
const productionDeps: SettingsDeps = {
@@ -172,6 +174,9 @@ export function useSettings(): UseSettingsReturn {
if (updates.syntaxTheme !== undefined) {
appUpdates.syntaxTheme = updates.syntaxTheme;
}
if (updates.workspaceTitleSource !== undefined) {
appUpdates.workspaceTitleSource = updates.workspaceTitleSource;
}
const promises: Promise<void>[] = [];
if (Object.keys(appUpdates).length > 0) {
promises.push(appSettings.updateSettings(appUpdates));
@@ -61,6 +61,14 @@ describe("loadAppSettingsFromStorage", () => {
expect(result.language).toBe("system");
});
it("defaults workspace title source to title when storage is empty", async () => {
const deps = makeDeps();
const result = await loadAppSettingsFromStorage(deps);
expect(result.workspaceTitleSource).toBe("title");
});
it("loads configured terminal scrollback lines from app settings", async () => {
const deps = makeDeps({
storage: createInMemoryKeyValueStorage({
@@ -73,6 +81,30 @@ describe("loadAppSettingsFromStorage", () => {
expect(result.terminalScrollbackLines).toBe(42_000);
});
it("loads configured workspace title source from app settings", async () => {
const deps = makeDeps({
storage: createInMemoryKeyValueStorage({
[APP_SETTINGS_KEY]: JSON.stringify({ workspaceTitleSource: "branch" }),
}),
});
const result = await loadAppSettingsFromStorage(deps);
expect(result.workspaceTitleSource).toBe("branch");
});
it("drops an unknown workspace title source back to title", async () => {
const deps = makeDeps({
storage: createInMemoryKeyValueStorage({
[APP_SETTINGS_KEY]: JSON.stringify({ workspaceTitleSource: "directory" }),
}),
});
const result = await loadAppSettingsFromStorage(deps);
expect(result.workspaceTitleSource).toBe("title");
});
it("normalizes terminal scrollback lines from storage", async () => {
const deps = makeDeps({
storage: createInMemoryKeyValueStorage({
@@ -11,9 +11,11 @@ const LEGACY_SETTINGS_KEY = "@paseo:settings";
export type SendBehavior = "interrupt" | "queue";
export type ReleaseChannel = "stable" | "beta";
export type ServiceUrlBehavior = "ask" | "in-app" | "external";
export type WorkspaceTitleSource = "title" | "branch";
const VALID_THEMES = new Set<string>([...Object.keys(THEME_TO_UNISTYLES), "auto"]);
const VALID_SERVICE_URL_BEHAVIORS = new Set<ServiceUrlBehavior>(["ask", "in-app", "external"]);
const VALID_WORKSPACE_TITLE_SOURCES = new Set<WorkspaceTitleSource>(["title", "branch"]);
export const DEFAULT_TERMINAL_SCROLLBACK_LINES = 10_000;
export const MIN_TERMINAL_SCROLLBACK_LINES = 0;
export const MAX_TERMINAL_SCROLLBACK_LINES = 1_000_000;
@@ -36,6 +38,7 @@ export interface AppSettings {
uiFontSize: number; // clamped px, default 16
codeFontSize: number; // clamped px, default 12
syntaxTheme: SyntaxThemeId; // default "one"
workspaceTitleSource: WorkspaceTitleSource;
}
export interface Settings extends AppSettings {
@@ -54,6 +57,7 @@ export const DEFAULT_CLIENT_SETTINGS: AppSettings = {
uiFontSize: DEFAULT_UI_FONT_SIZE,
codeFontSize: DEFAULT_CODE_FONT_SIZE,
syntaxTheme: "one",
workspaceTitleSource: "title",
};
export const DEFAULT_APP_SETTINGS: Settings = {
@@ -194,6 +198,12 @@ function pickAppSettings(stored: Partial<AppSettings>): Partial<AppSettings> {
if (typeof stored.syntaxTheme === "string" && isSyntaxThemeId(stored.syntaxTheme)) {
result.syntaxTheme = stored.syntaxTheme;
}
if (
typeof stored.workspaceTitleSource === "string" &&
VALID_WORKSPACE_TITLE_SOURCES.has(stored.workspaceTitleSource)
) {
result.workspaceTitleSource = stored.workspaceTitleSource;
}
return result;
}