Skip to content

Commit bb494f0

Browse files
authored
Merge pull request #226 from CivicDataLab/225-fix-language-selection-drop-down
Fix language selection on reload
2 parents d882662 + e0b49bd commit bb494f0

File tree

1 file changed

+35
-56
lines changed

1 file changed

+35
-56
lines changed
Lines changed: 35 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, { useEffect, useState } from 'react';
22
import Script from 'next/script';
33
import { IconWorld } from '@tabler/icons-react';
44
import { Select } from 'opub-ui';
@@ -15,49 +15,65 @@ const languages = [
1515
export function TranslateDropdown({
1616
prefLangCookie,
1717
}: {
18-
prefLangCookie: string;
18+
prefLangCookie: Promise<string> | string;
1919
}) {
20-
const [langCookie, setLangCookie] = React.useState(
21-
decodeURIComponent(prefLangCookie)
22-
);
20+
const [selectedLang, setSelectedLang] = useState('en');
21+
22+
// Function to safely extract language from cookie
23+
const getLangFromCookie = (cookie: string) => {
24+
try {
25+
const decoded = decodeURIComponent(cookie || '/en/');
26+
const parts = decoded.split('/');
27+
return parts.length > 2 ? parts[2] : 'en';
28+
} catch (error) {
29+
return 'en';
30+
}
31+
};
2332

24-
const includedLanguages = languages.map((lang) => lang.value).join(',');
33+
useEffect(() => {
34+
if (prefLangCookie instanceof Promise) {
35+
prefLangCookie
36+
.then((cookie) => setSelectedLang(getLangFromCookie(cookie)))
37+
.catch((err) => console.error('Failed to fetch lang cookie:', err));
38+
} else {
39+
setSelectedLang(getLangFromCookie(prefLangCookie));
40+
}
41+
}, [prefLangCookie]);
2542

2643
const googleTranslateElementInit = () => {
2744
new (window as any).google.translate.TranslateElement(
2845
{
2946
pageLanguage: 'en',
30-
includedLanguages,
47+
includedLanguages: languages.map((lang) => lang.value).join(','),
3148
defaultLanguage: 'en',
3249
},
3350
'google_translate_element'
3451
);
3552
};
3653

37-
React.useEffect(() => {
54+
useEffect(() => {
3855
(window as any).googleTranslateElementInit = googleTranslateElementInit;
39-
40-
if (langCookie.split('/')[2] === 'en') {
41-
changeLang('en');
42-
}
43-
});
56+
}, []);
4457

4558
const changeLang = (value: string) => {
46-
const lang = '/en/' + value;
47-
setLangCookie(lang);
59+
setSelectedLang(value); // Update state
60+
61+
// Update Google Translate dropdown
4862
const element = document.querySelector(
4963
'.goog-te-combo'
5064
) as HTMLSelectElement;
51-
element.value = value;
52-
element.dispatchEvent(new Event('change'));
65+
if (element) {
66+
element.value = value;
67+
element.dispatchEvent(new Event('change'));
68+
}
5369
};
5470

5571
return (
5672
<div>
5773
<div id="google_translate_element" className="invisible h-px w-px"></div>
5874

5975
<Select
60-
name={'lang-select'}
76+
name="lang-select"
6177
className={`notranslate ${styles.langSelectContainer}`}
6278
options={languages}
6379
label={
@@ -66,51 +82,14 @@ export function TranslateDropdown({
6682
</div>
6783
}
6884
labelInline
69-
value={langCookie.split('/')[2]}
85+
value={selectedLang}
7086
onChange={changeLang}
7187
/>
7288

73-
{/* <TransparentSelector
74-
onChange={changeLang}
75-
value={langCookie.split('/')[2]}
76-
label={<IconWorld color="white" size={'16px'} />}
77-
/> */}
78-
7989
<Script
8090
src="https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"
8191
strategy="afterInteractive"
8292
/>
8393
</div>
8494
);
8595
}
86-
87-
// const TransparentSelector = ({
88-
// onChange,
89-
// value,
90-
// label,
91-
// }: {
92-
// onChange: any;
93-
// value: string;
94-
// label?: any | null;
95-
// }) => {
96-
// return (
97-
// <div
98-
// className={`notranslate ${styles.transparentSelector}`}
99-
// tabIndex={0}
100-
// // onFocus={() => document.querySelector('select')?.focus()}
101-
// >
102-
// {label}
103-
// <select
104-
// onChange={(e) => onChange(e.target.value)}
105-
// value={value}
106-
// tabIndex={-1}
107-
// >
108-
// {languages.map((it) => (
109-
// <option value={it.value} key={it.value}>
110-
// {it.label}
111-
// </option>
112-
// ))}
113-
// </select>
114-
// </div>
115-
// );
116-
// };

0 commit comments

Comments
 (0)