@@ -50,14 +50,18 @@ const hasSearchParams = (params: HeritageSearchParams): boolean =>
5050 params . region !== null ||
5151 params . category !== null ||
5252 params . year_inscribed_from !== null ||
53- params . year_inscribed_to !== null ;
53+ params . year_inscribed_to !== null ||
54+ params . is_endangered === true ||
55+ params . criteria . length > 0 ;
5456
5557const toDraftValues = ( params : HeritageSearchParams ) : SearchValues => ( {
5658 region : params . region ?? "" ,
5759 category : params . category ?? "" ,
5860 keyword : params . search_query ?? "" ,
5961 yearInscribedFrom : params . year_inscribed_from !== null ? String ( params . year_inscribed_from ) : "" ,
6062 yearInscribedTo : params . year_inscribed_to !== null ? String ( params . year_inscribed_to ) : "" ,
63+ isEndangered : params . is_endangered === true ,
64+ criteria : params . criteria ,
6165} ) ;
6266
6367const toSearchParams = ( draft : SearchValues ) : HeritageSearchParams => ( {
@@ -67,6 +71,8 @@ const toSearchParams = (draft: SearchValues): HeritageSearchParams => ({
6771 category : draft . category || null ,
6872 year_inscribed_from : draft . yearInscribedFrom ? Number ( draft . yearInscribedFrom ) : null ,
6973 year_inscribed_to : draft . yearInscribedTo ? Number ( draft . yearInscribedTo ) : null ,
74+ is_endangered : draft . isEndangered ? true : null ,
75+ criteria : draft . criteria ,
7076 current_page : 1 ,
7177} ) ;
7278
@@ -76,8 +82,19 @@ const mergeDraft = (currentDraft: SearchValues, partial: Partial<SearchValues>):
7682 keyword : partial . keyword ?? currentDraft . keyword ,
7783 yearInscribedFrom : partial . yearInscribedFrom ?? currentDraft . yearInscribedFrom ,
7884 yearInscribedTo : partial . yearInscribedTo ?? currentDraft . yearInscribedTo ,
85+ isEndangered : partial . isEndangered ?? currentDraft . isEndangered ,
86+ criteria : partial . criteria ?? currentDraft . criteria ,
7987} ) ;
8088
89+ // 現在の URL に lang=ja があれば、遷移先 search にも持たせる (en はデフォルトなので付けない)
90+ const preserveLang = ( nextSearch : string , currentSearch : string ) : string => {
91+ const currentLang = new URLSearchParams ( currentSearch ) . get ( "lang" ) ;
92+ if ( currentLang !== "ja" ) return nextSearch ;
93+ const params = new URLSearchParams ( nextSearch . startsWith ( "?" ) ? nextSearch . slice ( 1 ) : nextSearch ) ;
94+ params . set ( "lang" , "ja" ) ;
95+ return `?${ params . toString ( ) } ` ;
96+ } ;
97+
8198function useHeritageSearchDraft ( params : HeritageSearchParams ) {
8299 const [ draft , setDraft ] = React . useState < SearchValues > ( ( ) => toDraftValues ( params ) ) ;
83100
@@ -121,9 +138,10 @@ export function SearchHeritageResultsContainer(): React.ReactElement {
121138
122139 const handleClickItem = React . useCallback (
123140 ( id : number ) => {
124- navigate ( `/heritages/${ id } ` ) ;
141+ const search = preserveLang ( "" , location . search ) ;
142+ navigate ( `/heritages/${ id } ${ search } ` ) ;
125143 } ,
126- [ navigate ] ,
144+ [ navigate , location . search ] ,
127145 ) ;
128146
129147 const handlePageChange = React . useCallback (
@@ -133,7 +151,7 @@ export function SearchHeritageResultsContainer(): React.ReactElement {
133151 current_page : page ,
134152 } ;
135153
136- const search = serializeHeritageSearchParams ( nextParams ) ;
154+ const search = preserveLang ( serializeHeritageSearchParams ( nextParams ) , location . search ) ;
137155
138156 navigate (
139157 {
@@ -143,14 +161,14 @@ export function SearchHeritageResultsContainer(): React.ReactElement {
143161 { replace : false } ,
144162 ) ;
145163 } ,
146- [ navigate , location . pathname , params ] ,
164+ [ navigate , location . pathname , location . search , params ] ,
147165 ) ;
148166
149167 const handleSubmit = React . useCallback (
150168 ( partial : Partial < SearchValues > ) => {
151169 const nextDraft = mergeDraft ( draft , partial ) ;
152170 const nextParams = toSearchParams ( nextDraft ) ;
153- const search = serializeHeritageSearchParams ( nextParams ) ;
171+ const search = preserveLang ( serializeHeritageSearchParams ( nextParams ) , location . search ) ;
154172
155173 navigate (
156174 {
@@ -162,13 +180,14 @@ export function SearchHeritageResultsContainer(): React.ReactElement {
162180
163181 setDraft ( nextDraft ) ;
164182 } ,
165- [ draft , navigate , setDraft ] ,
183+ [ draft , navigate , setDraft , location . search ] ,
166184 ) ;
167185
168186 // Hooks must be called at the top level before any early returns.
169187 const handleBackToAllSites = React . useCallback ( ( ) => {
170- navigate ( "/heritages" , { replace : true } ) ;
171- } , [ navigate ] ) ;
188+ const search = preserveLang ( "" , location . search ) ;
189+ navigate ( `/heritages${ search } ` , { replace : true } ) ;
190+ } , [ navigate , location . search ] ) ;
172191
173192 const header = (
174193 < HeritageSubHeader value = { draft } onChange = { handleChange } onSubmit = { handleSubmit } />
0 commit comments