@@ -8,7 +8,6 @@ import { fi } from 'date-fns/locale'
8
8
import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3'
9
9
import { Box , Button , CssBaseline , Snackbar } from '@mui/material'
10
10
import { AppContext } from './contexts/AppContext'
11
-
12
11
import { PUBLIC_URL } from '../config'
13
12
import type { User } from './types'
14
13
import useTheme from './theme'
@@ -19,10 +18,10 @@ import { EmbeddedProvider, useIsEmbedded } from './contexts/EmbeddedContext'
19
18
import { Feedback } from './components/Feedback'
20
19
import { AnalyticsProvider } from './stores/analytics'
21
20
import { useTranslation } from 'react-i18next'
21
+ import { useUpdateUrlLang } from './hooks/useUpdateUrlLang.tsx'
22
+
23
+
22
24
23
- function useQuery ( ) {
24
- return new URLSearchParams ( useLocation ( ) . search ) ;
25
- }
26
25
const hasAccess = ( user : User | null | undefined , courseId ?: string ) => {
27
26
if ( ! user ) return false
28
27
if ( user . isAdmin ) return true
@@ -74,72 +73,13 @@ const AdminLoggedInAsBanner = () => {
74
73
/>
75
74
)
76
75
}
77
- const LanguageContext = createContext ( { } ) ;
78
-
79
- export function LanguageProvider ( { children } ) {
80
- const location = useLocation ( ) ;
81
- const query = useQuery ( )
82
- const navigate = useNavigate ( ) ;
83
- const languages = [ 'fi' , 'sv' , 'en' ]
84
- const { t, i18n } = useTranslation ( )
85
- const { user, isLoading } = useCurrentUser ( )
86
-
87
- const [ lang , setLanguageState ] = useState ( localStorage . getItem ( 'lang' ) )
88
- const langParam = query . get ( 'lang' )
89
- console . log ( 'language is: ' + lang )
90
- useEffect ( ( ) => {
91
- const updatedLangFromLocal = localStorage . getItem ( 'lang' )
92
-
93
- //use users language as a default if there is no lang url
94
- if ( ! langParam && ! updatedLangFromLocal && user && user . language && languages . includes ( user . language ) ) {
95
- console . log ( "using default users language" )
96
- setLang ( user . language )
97
- }
98
- // If there is a lang url, then update the lang state to match it
99
- else if ( langParam ) {
100
- console . log ( "lang parameter based update" )
101
- setLang ( langParam )
102
- }
103
- else if ( ! langParam && updatedLangFromLocal )
104
- {
105
- console . log ( "using local storage language" )
106
- //there is a case where if there are two redirects after another even the useState gets wiped
107
- // so lets use the local storage (example: see how admin page)
108
- setLang ( updatedLangFromLocal )
109
- }
110
- } , [ location . pathname ] )
111
-
112
-
113
- // sets both the url and the local lang state to match the newlang if the newLang is supported
114
- const setLang = ( newLang ) => {
115
- if ( ! languages . includes ( newLang ) ) {
116
- console . log ( "aborted lang update" )
117
- return
118
- }
119
- localStorage . setItem ( 'lang' , newLang )
120
- setLanguageState ( newLang )
121
- i18n . changeLanguage ( newLang )
122
- const searchParams = new URLSearchParams ( location . search ) ;
123
- searchParams . set ( 'lang' , newLang ) ;
124
- navigate ( `${ location . pathname } ?${ searchParams . toString ( ) } ` , { replace : true } ) ;
125
- } ;
126
76
127
- return (
128
- < LanguageContext . Provider value = { { lang, setLang } } >
129
- { children }
130
- </ LanguageContext . Provider >
131
- ) ;
132
- }
133
77
134
- export function useLanguage ( ) {
135
- return useContext ( LanguageContext ) ;
136
- }
137
78
const App = ( ) => {
79
+ const urlUpdater = useUpdateUrlLang ( ) //DONT REMOVE, the hook creates 2 useEffects to keep the url param synced with user language changes
138
80
const theme = useTheme ( )
139
81
const { courseId } = useParams ( )
140
82
const location = useLocation ( )
141
- const query = useQuery ( )
142
- const langParam = query . get ( 'lang' )
143
83
const { user, isLoading } = useCurrentUser ( )
144
84
145
85
useEffect ( ( ) => {
@@ -157,7 +97,6 @@ const App = () => {
157
97
if ( ! user && ! onNoAccessPage ) return null
158
98
159
99
return (
160
- < LanguageProvider >
161
100
< ThemeProvider theme = { theme } >
162
101
< CssBaseline />
163
102
< LocalizationProvider dateAdapter = { AdapterDateFns } adapterLocale = { fi } >
@@ -170,7 +109,6 @@ const App = () => {
170
109
</ SnackbarProvider >
171
110
</ LocalizationProvider >
172
111
</ ThemeProvider >
173
- </ LanguageProvider >
174
112
)
175
113
}
176
114
0 commit comments