From 5eae68d237ee0a2ad9f337904e5e7906745fa2fe Mon Sep 17 00:00:00 2001 From: HeavyGee <133152184+heavygee@users.noreply.github.com> Date: Wed, 29 Jul 2026 03:06:05 +0100 Subject: [PATCH] fix(web): share picker titles match sidebar (name before summary) (#1219) The /share route used a local getSessionTitle that preferred summary.text over metadata.name, so Android share-target rows disagreed with the session sidebar. Reuse @/lib/sessionTitle and lock the precedence with a unit test. Closes tiann/hapi#1218 once upstream PR lands after dogfood. Co-authored-by: Cursor --- web/src/lib/sessionTitle.test.ts | 38 ++++++++++++++++++++++++++++++++ web/src/routes/share/index.tsx | 8 +------ 2 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 web/src/lib/sessionTitle.test.ts diff --git a/web/src/lib/sessionTitle.test.ts b/web/src/lib/sessionTitle.test.ts new file mode 100644 index 00000000..6316369d --- /dev/null +++ b/web/src/lib/sessionTitle.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, it } from 'vitest' +import { getSessionTitle } from './sessionTitle' + +describe('getSessionTitle', () => { + it('prefers metadata.name over summary.text (sidebar / share picker parity)', () => { + expect(getSessionTitle({ + id: 'abcdef0123456789', + metadata: { + name: 'hub runner version governance', + summary: { text: 'HAPI Skill Lookup' }, + path: '/tmp/share-title-parity', + }, + })).toBe('hub runner version governance') + }) + + it('falls back to summary when name is absent', () => { + expect(getSessionTitle({ + id: 'abcdef0123456789', + metadata: { + summary: { text: 'HAPI Skill Lookup' }, + path: '/tmp/share-title-parity', + }, + })).toBe('HAPI Skill Lookup') + }) + + it('falls back to the last path segment when name and summary are absent', () => { + expect(getSessionTitle({ + id: 'abcdef0123456789', + metadata: { + path: '/tmp/share-title-parity', + }, + })).toBe('share-title-parity') + }) + + it('falls back to a short id when metadata is empty', () => { + expect(getSessionTitle({ id: 'abcdef0123456789' })).toBe('abcdef01') + }) +}) diff --git a/web/src/routes/share/index.tsx b/web/src/routes/share/index.tsx index 4dd859a0..741ac082 100644 --- a/web/src/routes/share/index.tsx +++ b/web/src/routes/share/index.tsx @@ -10,6 +10,7 @@ import { type ShareTransferPayload, } from '@/lib/shareTransfer' import { setSharePendingTransfer } from '@/lib/sharePendingState' +import { getSessionTitle } from '@/lib/sessionTitle' import type { SessionSummary } from '@/types/api' type LoadState = @@ -29,13 +30,6 @@ function formatBytes(n: number): string { return `${(n / (1024 * 1024)).toFixed(1)} MB` } -function getSessionTitle(session: SessionSummary): string { - return session.metadata?.summary?.text - ?? session.metadata?.name - ?? session.metadata?.path - ?? session.id.slice(0, 8) -} - function SharePreview(props: { payload: ShareTransferPayload }) { const { payload } = props const { t } = useTranslation()