From 4426a8831cb7e51d5c62f5749b95ab1938d3760f Mon Sep 17 00:00:00 2001 From: Application-drop-up Date: Wed, 29 Apr 2026 22:38:46 +0900 Subject: [PATCH 1/3] refactor: inline LocaleContextType in createContext call Drop the named LocaleContextType alias and pass the shape directly to createContext, keeping the .tsx file free of named type declarations. Co-Authored-By: Claude Opus 4.7 (1M context) --- client/src/shared/locale/LocaleProvider.tsx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/client/src/shared/locale/LocaleProvider.tsx b/client/src/shared/locale/LocaleProvider.tsx index 6c067e9..cda8a53 100644 --- a/client/src/shared/locale/LocaleProvider.tsx +++ b/client/src/shared/locale/LocaleProvider.tsx @@ -3,13 +3,14 @@ import type { ReactNode } from "react"; import { useSearchParams } from "react-router-dom"; import { LOCALES, type Locale } from "../../domain/criteria.ts"; -type LocaleContextType = { - locale: Locale; - setLocale: (locale: Locale) => void; - toggleLocale: () => void; -}; - -const LocaleContext = createContext(undefined); +const LocaleContext = createContext< + | { + locale: Locale; + setLocale: (locale: Locale) => void; + toggleLocale: () => void; + } + | undefined +>(undefined); const isLocale = (value: string): value is Locale => LOCALES.some((l) => l === value); From 66a0effd81c2739f3df79c5c02e5474688948bc4 Mon Sep 17 00:00:00 2001 From: Application-drop-up Date: Wed, 29 Apr 2026 22:39:01 +0900 Subject: [PATCH 2/3] refactor: consume locale via context in heritage detail Drop the URL-derived locale plumbing in WorldHeritageDetailContainer and the locale/toggleLocale props on HeritageDetailLayout, HeritageHero, and HeritageOverViewSection. Each component now reads locale from useLocale(), so the container only forwards item and the detail tree no longer prop-drills locale state. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../heritage-detail/HeritageDetailLayout.tsx | 15 ++++-------- .../heritage-detail/HeritageHero.tsx | 5 ++-- .../HeritageOverviewSection.tsx | 10 +++----- .../world-heritage-detail-container.tsx | 24 +++---------------- 4 files changed, 13 insertions(+), 41 deletions(-) diff --git a/client/src/app/features/top/components/heritage-detail/HeritageDetailLayout.tsx b/client/src/app/features/top/components/heritage-detail/HeritageDetailLayout.tsx index 8772818..f3739fa 100644 --- a/client/src/app/features/top/components/heritage-detail/HeritageDetailLayout.tsx +++ b/client/src/app/features/top/components/heritage-detail/HeritageDetailLayout.tsx @@ -1,7 +1,6 @@ import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import type { WorldHeritageDetailVm, SearchValues } from "../../../../../domain/types.ts"; -import type { Locale } from "../../../../../domain/criteria"; import { HeritageSubHeader } from "../HeritageSubHeader.tsx"; import { HeritageHero } from "./HeritageHero"; import { HeritageOverViewSection } from "./HeritageOverviewSection"; @@ -11,6 +10,7 @@ import { DetailHeritageMap } from "@features/top/components/heritage-detail/Deta import { textType } from "@shared/styles/typography"; import { useSetBreadcrumbLabel } from "@features/breadcrumbs/BreadCrumbHooks.ts"; import { BreadcrumbList } from "@shared/components/BreadcrumbList.tsx"; +import { useLocale } from "@shared/locale/LocaleHooks.ts"; const DEFAULT_SEARCH: SearchValues = { region: "", @@ -93,18 +93,11 @@ function KeyExamInfo({ item }: { item: WorldHeritageDetailVm }) { ); } -export function HeritageDetailLayout({ - item, - locale, - toggleLocale, -}: { - item: WorldHeritageDetailVm; - locale: Locale; - toggleLocale: () => void; -}) { +export function HeritageDetailLayout({ item }: { item: WorldHeritageDetailVm }) { const [search, setSearch] = useState(DEFAULT_SEARCH); const setLabel = useSetBreadcrumbLabel(); const navigate = useNavigate(); + const { locale, toggleLocale } = useLocale(); const handleSubmit = (q: Partial) => { const next = { ...search, ...q }; @@ -145,7 +138,7 @@ export function HeritageDetailLayout({ {/* Hero image */} - + {/* Key exam info: always visible */} diff --git a/client/src/app/features/top/components/heritage-detail/HeritageHero.tsx b/client/src/app/features/top/components/heritage-detail/HeritageHero.tsx index c1f8528..011afff 100644 --- a/client/src/app/features/top/components/heritage-detail/HeritageHero.tsx +++ b/client/src/app/features/top/components/heritage-detail/HeritageHero.tsx @@ -1,7 +1,8 @@ import type { WorldHeritageDetailVm, WorldHeritageImageVm } from "../../../../../domain/types.ts"; -import type { Locale } from "../../../../../domain/criteria.ts"; +import { useLocale } from "@shared/locale/LocaleHooks.ts"; -export function HeritageHero({ item, locale }: { item: WorldHeritageDetailVm; locale: Locale }) { +export function HeritageHero({ item }: { item: WorldHeritageDetailVm }) { + const { locale } = useLocale(); const primaryImage: WorldHeritageImageVm | undefined = item.images.find((img) => img.isPrimary) ?? item.images[0]; diff --git a/client/src/app/features/top/components/heritage-detail/HeritageOverviewSection.tsx b/client/src/app/features/top/components/heritage-detail/HeritageOverviewSection.tsx index bde618b..bf54f38 100644 --- a/client/src/app/features/top/components/heritage-detail/HeritageOverviewSection.tsx +++ b/client/src/app/features/top/components/heritage-detail/HeritageOverviewSection.tsx @@ -1,13 +1,9 @@ import type { WorldHeritageDetailVm } from "../../../../../domain/types.ts"; import { textType } from "@shared/styles/typography.ts"; +import { useLocale } from "@shared/locale/LocaleHooks.ts"; -export function HeritageOverViewSection({ - item, - locale, -}: { - item: WorldHeritageDetailVm; - locale: string; -}) { +export function HeritageOverViewSection({ item }: { item: WorldHeritageDetailVm }) { + const { locale } = useLocale(); return (
(); const navigate = useNavigate(); - const [searchParams, setSearchParams] = useSearchParams(); - const locale = useMemo(() => resolveLocale(searchParams.get("lang")), [searchParams]); - - const toggleLanguageLocation = () => { - const theOther = locale === "ja" ? "en" : "ja"; - setSearchParams((prev) => { - const nowLocal = new URLSearchParams(prev); - nowLocal.set("lang", theOther); - - return nowLocal; - }); - }; useEffect(() => { if (!id) navigate("/heritages", { replace: true }); @@ -61,5 +43,5 @@ export function WorldHeritageDetailContainer() { ); } - return ; + return ; } From 7ee99a005ef8da293847d042393d2241fc5ddc7d Mon Sep 17 00:00:00 2001 From: Application-drop-up Date: Thu, 30 Apr 2026 08:19:40 +0900 Subject: [PATCH 3/3] fix: drop residual locale prop on HeritageOverViewSection call The earlier consumer migration removed the locale prop from HeritageOverViewSection but left the call site still passing it, breaking the CI typecheck. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../top/components/heritage-detail/HeritageDetailLayout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/app/features/top/components/heritage-detail/HeritageDetailLayout.tsx b/client/src/app/features/top/components/heritage-detail/HeritageDetailLayout.tsx index f3739fa..7302450 100644 --- a/client/src/app/features/top/components/heritage-detail/HeritageDetailLayout.tsx +++ b/client/src/app/features/top/components/heritage-detail/HeritageDetailLayout.tsx @@ -152,7 +152,7 @@ export function HeritageDetailLayout({ item }: { item: WorldHeritageDetailVm })
{/* Left: Overview → Gallery */}
- +