Skip to content

Commit 486232b

Browse files
authored
Merge pull request #301 from zigzagdev/refactor/use-locale-context-in-detail
Refactor/use locale context in detail
2 parents f688549 + 7ee99a0 commit 486232b

5 files changed

Lines changed: 24 additions & 51 deletions

File tree

client/src/app/features/top/components/heritage-detail/HeritageDetailLayout.tsx

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { useState, useEffect } from "react";
22
import { useNavigate } from "react-router-dom";
33
import type { WorldHeritageDetailVm, SearchValues } from "../../../../../domain/types.ts";
4-
import type { Locale } from "../../../../../domain/criteria";
54
import { HeritageSubHeader } from "../HeritageSubHeader.tsx";
65
import { HeritageHero } from "./HeritageHero";
76
import { HeritageOverViewSection } from "./HeritageOverviewSection";
@@ -11,6 +10,7 @@ import { DetailHeritageMap } from "@features/top/components/heritage-detail/Deta
1110
import { textType } from "@shared/styles/typography";
1211
import { useSetBreadcrumbLabel } from "@features/breadcrumbs/BreadCrumbHooks.ts";
1312
import { BreadcrumbList } from "@shared/components/BreadcrumbList.tsx";
13+
import { useLocale } from "@shared/locale/LocaleHooks.ts";
1414

1515
const DEFAULT_SEARCH: SearchValues = {
1616
region: "",
@@ -93,18 +93,11 @@ function KeyExamInfo({ item }: { item: WorldHeritageDetailVm }) {
9393
);
9494
}
9595

96-
export function HeritageDetailLayout({
97-
item,
98-
locale,
99-
toggleLocale,
100-
}: {
101-
item: WorldHeritageDetailVm;
102-
locale: Locale;
103-
toggleLocale: () => void;
104-
}) {
96+
export function HeritageDetailLayout({ item }: { item: WorldHeritageDetailVm }) {
10597
const [search, setSearch] = useState<SearchValues>(DEFAULT_SEARCH);
10698
const setLabel = useSetBreadcrumbLabel();
10799
const navigate = useNavigate();
100+
const { locale, toggleLocale } = useLocale();
108101

109102
const handleSubmit = (q: Partial<SearchValues>) => {
110103
const next = { ...search, ...q };
@@ -145,7 +138,7 @@ export function HeritageDetailLayout({
145138
</div>
146139

147140
{/* Hero image */}
148-
<HeritageHero item={item} locale={locale} />
141+
<HeritageHero item={item} />
149142

150143
{/* Key exam info: always visible */}
151144
<KeyExamInfo item={item} />
@@ -159,7 +152,7 @@ export function HeritageDetailLayout({
159152
<div className="grid gap-6 lg:gap-8 lg:grid-cols-[minmax(0,1fr)_360px] lg:items-start">
160153
{/* Left: Overview → Gallery */}
161154
<div className="space-y-8" id="content">
162-
<HeritageOverViewSection item={item} locale={locale} />
155+
<HeritageOverViewSection item={item} />
163156
<HeritageGallery images={item.images} />
164157
</div>
165158

client/src/app/features/top/components/heritage-detail/HeritageHero.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type { WorldHeritageDetailVm, WorldHeritageImageVm } from "../../../../../domain/types.ts";
2-
import type { Locale } from "../../../../../domain/criteria.ts";
2+
import { useLocale } from "@shared/locale/LocaleHooks.ts";
33

4-
export function HeritageHero({ item, locale }: { item: WorldHeritageDetailVm; locale: Locale }) {
4+
export function HeritageHero({ item }: { item: WorldHeritageDetailVm }) {
5+
const { locale } = useLocale();
56
const primaryImage: WorldHeritageImageVm | undefined =
67
item.images.find((img) => img.isPrimary) ?? item.images[0];
78

client/src/app/features/top/components/heritage-detail/HeritageOverviewSection.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
import type { WorldHeritageDetailVm } from "../../../../../domain/types.ts";
22
import { textType } from "@shared/styles/typography.ts";
3+
import { useLocale } from "@shared/locale/LocaleHooks.ts";
34

4-
export function HeritageOverViewSection({
5-
item,
6-
locale,
7-
}: {
8-
item: WorldHeritageDetailVm;
9-
locale: string;
10-
}) {
5+
export function HeritageOverViewSection({ item }: { item: WorldHeritageDetailVm }) {
6+
const { locale } = useLocale();
117
return (
128
<section
139
id="overview"

client/src/app/features/top/containers/world-heritage-detail-container.tsx

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,12 @@
1-
import { useEffect, useMemo, useContext } from "react";
2-
import { useParams, useSearchParams, useNavigate } from "react-router-dom";
1+
import { useEffect, useContext } from "react";
2+
import { useParams, useNavigate } from "react-router-dom";
33
import { useWorldHeritageDetail } from "../hooks/use-world-heritage-detail";
44
import { HeritageDetailLayout } from "../components/heritage-detail/HeritageDetailLayout";
5-
import { LOCALES, type Locale } from "../../../../domain/criteria";
65
import BreadcrumbContext from "@features/breadcrumbs/BreadCrumbProvider";
76

8-
function resolveLocale(raw: string | null): Locale {
9-
if (!raw) return "en";
10-
return (LOCALES as readonly string[]).includes(raw) ? (raw as Locale) : "en";
11-
}
12-
137
export function WorldHeritageDetailContainer() {
148
const { id } = useParams<{ id: string }>();
159
const navigate = useNavigate();
16-
const [searchParams, setSearchParams] = useSearchParams();
17-
const locale = useMemo(() => resolveLocale(searchParams.get("lang")), [searchParams]);
18-
19-
const toggleLanguageLocation = () => {
20-
const theOther = locale === "ja" ? "en" : "ja";
21-
setSearchParams((prev) => {
22-
const nowLocal = new URLSearchParams(prev);
23-
nowLocal.set("lang", theOther);
24-
25-
return nowLocal;
26-
});
27-
};
2810

2911
useEffect(() => {
3012
if (!id) navigate("/heritages", { replace: true });
@@ -61,5 +43,5 @@ export function WorldHeritageDetailContainer() {
6143
);
6244
}
6345

64-
return <HeritageDetailLayout item={item} locale={locale} toggleLocale={toggleLanguageLocation} />;
46+
return <HeritageDetailLayout item={item} />;
6547
}

client/src/shared/locale/LocaleProvider.tsx

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import React, { createContext, useCallback, useMemo } from "react";
22
import type { ReactNode } from "react";
33
import { useSearchParams } from "react-router-dom";
4-
import { LOCALES, type Locale } from "../../../domain/criteria.ts";
5-
6-
type LocaleContextType = {
7-
locale: Locale;
8-
setLocale: (locale: Locale) => void;
9-
toggleLocale: () => void;
10-
};
11-
12-
const LocaleContext = createContext<LocaleContextType | undefined>(undefined);
4+
import { LOCALES, type Locale } from "../../domain/criteria.ts";
5+
6+
const LocaleContext = createContext<
7+
| {
8+
locale: Locale;
9+
setLocale: (locale: Locale) => void;
10+
toggleLocale: () => void;
11+
}
12+
| undefined
13+
>(undefined);
1314

1415
const isLocale = (value: string): value is Locale => LOCALES.some((l) => l === value);
1516

0 commit comments

Comments
 (0)