From d5144307b8cec630974239e19a1dc928b2bb43b9 Mon Sep 17 00:00:00 2001 From: jlightner Date: Tue, 31 Mar 2026 05:04:05 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20Key=20moment=20search=20results=20now?= =?UTF-8?q?=20link=20to=20parent=20technique=20page=20with=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - "frontend/src/api/public-client.ts" - "frontend/src/pages/SearchResults.tsx" - "frontend/src/pages/TechniquePage.tsx" GSD-Task: S01/T02 --- frontend/src/api/public-client.ts | 1 + frontend/src/pages/SearchResults.tsx | 13 ++++++++++++- frontend/src/pages/TechniquePage.tsx | 14 +++++++++++++- frontend/tsconfig.app.tsbuildinfo | 2 +- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/frontend/src/api/public-client.ts b/frontend/src/api/public-client.ts index 80c6cdb..5fd03b7 100644 --- a/frontend/src/api/public-client.ts +++ b/frontend/src/api/public-client.ts @@ -17,6 +17,7 @@ export interface SearchResultItem { creator_slug: string; topic_category: string; topic_tags: string[]; + technique_page_slug?: string; } export interface SearchResponse { diff --git a/frontend/src/pages/SearchResults.tsx b/frontend/src/pages/SearchResults.tsx index b33a2f0..9199a3a 100644 --- a/frontend/src/pages/SearchResults.tsx +++ b/frontend/src/pages/SearchResults.tsx @@ -142,10 +142,21 @@ export default function SearchResults() { ); } +function getSearchResultLink(item: SearchResultItem): string { + if (item.type === "key_moment") { + if (item.technique_page_slug) { + return `/techniques/${item.technique_page_slug}#km-${item.slug || item.title}`; + } + // Graceful fallback — re-search instead of 404 + return `/search?q=${encodeURIComponent(item.title)}`; + } + return `/techniques/${item.slug}`; +} + function SearchResultCard({ item }: { item: SearchResultItem }) { return (
diff --git a/frontend/src/pages/TechniquePage.tsx b/frontend/src/pages/TechniquePage.tsx index 7e8395a..842fe40 100644 --- a/frontend/src/pages/TechniquePage.tsx +++ b/frontend/src/pages/TechniquePage.tsx @@ -156,6 +156,18 @@ export default function TechniquePage() { }; }, [slug, selectedVersion]); + // Scroll to key moment if URL has a #km- hash fragment + useEffect(() => { + if (!technique) return; + const hash = window.location.hash; + if (hash.startsWith("#km-")) { + const el = document.getElementById(hash.slice(1)); + if (el) { + el.scrollIntoView({ behavior: "smooth", block: "start" }); + } + } + }, [technique]); + if (loading) { return
Loading technique…
; } @@ -418,7 +430,7 @@ export default function TechniquePage() {

Key Moments

    {technique.key_moments.map((km) => ( -
  1. +
  2. {km.title}

    {km.video_filename && ( diff --git a/frontend/tsconfig.app.tsbuildinfo b/frontend/tsconfig.app.tsbuildinfo index f4a3120..7db0d54 100644 --- a/frontend/tsconfig.app.tsbuildinfo +++ b/frontend/tsconfig.app.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/App.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/api/client.ts","./src/api/public-client.ts","./src/components/AdminDropdown.tsx","./src/components/AppFooter.tsx","./src/components/ModeToggle.tsx","./src/components/ReportIssueModal.tsx","./src/components/StatusBadge.tsx","./src/pages/AdminPipeline.tsx","./src/pages/AdminReports.tsx","./src/pages/CreatorDetail.tsx","./src/pages/CreatorsBrowse.tsx","./src/pages/Home.tsx","./src/pages/MomentDetail.tsx","./src/pages/ReviewQueue.tsx","./src/pages/SearchResults.tsx","./src/pages/TechniquePage.tsx","./src/pages/TopicsBrowse.tsx"],"version":"5.6.3"} \ No newline at end of file +{"root":["./src/App.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/api/public-client.ts","./src/components/AdminDropdown.tsx","./src/components/AppFooter.tsx","./src/components/CategoryIcons.tsx","./src/components/CopyLinkButton.tsx","./src/components/CreatorAvatar.tsx","./src/components/ReportIssueModal.tsx","./src/pages/AdminPipeline.tsx","./src/pages/AdminReports.tsx","./src/pages/CreatorDetail.tsx","./src/pages/CreatorsBrowse.tsx","./src/pages/Home.tsx","./src/pages/SearchResults.tsx","./src/pages/TechniquePage.tsx","./src/pages/TopicsBrowse.tsx"],"version":"5.6.3"} \ No newline at end of file