Skip to content

Commit 4dec432

Browse files
language param context
1 parent 7ed830e commit 4dec432

File tree

2 files changed

+61
-10
lines changed

2 files changed

+61
-10
lines changed

src/client/App.tsx

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import React, { useEffect, useRef } from 'react'
2-
import { Outlet, useLocation, useParams } from 'react-router-dom'
1+
import React, { createContext, useContext, useEffect, useRef, useState } from 'react'
2+
import { Outlet, useLocation, useNavigate, useParams } from 'react-router-dom'
33
import { SnackbarProvider } from 'notistack'
44
import { initShibbolethPinger } from 'unfuck-spa-shibboleth-session'
55
import { ThemeProvider } from '@mui/material/styles'
@@ -18,7 +18,11 @@ import useCurrentUser from './hooks/useCurrentUser'
1818
import { EmbeddedProvider, useIsEmbedded } from './contexts/EmbeddedContext'
1919
import { Feedback } from './components/Feedback'
2020
import { AnalyticsProvider } from './stores/analytics'
21+
import { useTranslation } from 'react-i18next'
2122

23+
function useQuery() {
24+
return new URLSearchParams(useLocation().search);
25+
}
2226
const hasAccess = (user: User | null | undefined, courseId?: string) => {
2327
if (!user) return false
2428
if (user.isAdmin) return true
@@ -70,18 +74,67 @@ const AdminLoggedInAsBanner = () => {
7074
/>
7175
)
7276
}
77+
const LanguageContext = createContext({});
78+
79+
export function LanguageProvider({ children }) {
80+
const location = useLocation();
81+
const navigate = useNavigate();
82+
const [lang, setLangState] = useState('fi'); // default
83+
84+
// Sync context state to URL
85+
const setLang = (newLang) => {
86+
setLangState(newLang);
87+
const searchParams = new URLSearchParams(location.search);
88+
searchParams.set('lang', newLang);
89+
navigate(`${location.pathname}?${searchParams.toString()}`, { replace: true });
90+
};
91+
92+
// Read URL param on initial load
93+
useEffect(() => {
94+
const searchParams = new URLSearchParams(location.search);
95+
const urlLang = searchParams.get('lang');
96+
if (urlLang) {
97+
setLangState(urlLang);
98+
}
99+
}, [location.search]);
73100

101+
return (
102+
<LanguageContext.Provider value={{ lang, setLang }}>
103+
{children}
104+
</LanguageContext.Provider>
105+
);
106+
}
107+
108+
export function useLanguage() {
109+
return useContext(LanguageContext);
110+
}
74111
const App = () => {
75112
const theme = useTheme()
76113
const { courseId } = useParams()
77114
const location = useLocation()
78-
115+
const query = useQuery()
116+
const langParam = query.get('lang')
117+
const { t, i18n } = useTranslation()
118+
const { language } = i18n
119+
const languages = ['fi', 'sv', 'en']
79120
const { user, isLoading } = useCurrentUser()
80-
121+
81122
useEffect(() => {
82123
initShibbolethPinger()
83124
}, [])
125+
useEffect(() => {
126+
if (!langParam && user && user.language && languages.includes(user.language)) {
127+
i18n.changeLanguage(user.language)
128+
129+
}
130+
}, [user, i18n])
131+
useEffect(() => {
132+
if(langParam && languages.includes(langParam)){
84133

134+
i18n.changeLanguage(langParam)
135+
}
136+
137+
}, [langParam])
85138
const onNoAccessPage = location.pathname.includes('/noaccess')
86139

87140
if (isLoading && !onNoAccessPage) return null
@@ -94,6 +147,7 @@ const App = () => {
94147
if (!user && !onNoAccessPage) return null
95148

96149
return (
150+
<LanguageProvider>
97151
<ThemeProvider theme={theme}>
98152
<CssBaseline />
99153
<LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={fi}>
@@ -106,6 +160,7 @@ const App = () => {
106160
</SnackbarProvider>
107161
</LocalizationProvider>
108162
</ThemeProvider>
163+
</LanguageProvider>
109164
)
110165
}
111166

src/client/components/NavBar/index.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,8 @@ const NavBar = () => {
3737
const languages = ['fi', 'sv', 'en']
3838

3939
const { user, isLoading } = useCurrentUser()
40-
41-
useEffect(() => {
42-
if (user && user.language && languages.includes(user.language)) i18n.changeLanguage(user.language)
43-
}, [user, i18n])
44-
45-
const handleLanguageChange = (newLanguage: string) => {
40+
// will be changed to use url to change language and moved up to app since language is global
41+
const handleLanguageChange = (newLanguage: string) => {
4642
i18n.changeLanguage(newLanguage)
4743
setOpenLanguageSelect(false)
4844
}

0 commit comments

Comments
 (0)