import { TwakeMuiThemeProvider } from '@linagora/twake-mui' import { Suspense, useEffect } from 'react' import { Route, Routes } from 'react-router-dom' import { push } from 'redux-first-history' import { HistoryRouter as Router } from 'redux-first-history/rr6' import './App.styl' import { useAppDispatch, useAppSelector } from './app/hooks' import { history } from './app/store' import { default as CalendarLayout } from './components/Calendar/CalendarLayout' import { Error as ErrorPage } from './components/Error/Error' import { ErrorSnackbar } from './components/Error/ErrorSnackbar' import { Loading } from './components/Loading/Loading' import { AVAILABLE_LANGUAGES } from './features/Settings/constants' import { default as HandleLogin } from './features/User/HandleLogin' import { CallbackResume } from './features/User/LoginCallback' import { useInitializeApp } from './features/User/useInitializeApp' import { WebSocketGate } from './websocket/WebSocketGate' import { enGB, fr as frLocale, ru as ruLocale, vi as viLocale } from 'date-fns/locale' import I18n from 'twake-i18n' import en from './locales/en.json' import fr from './locales/fr.json' import ru from './locales/ru.json' import vi from './locales/vi.json' const locale = { en, fr, ru, vi } const dateLocales = { en: enGB, fr: frLocale, ru: ruLocale, vi: viLocale } const SUPPORTED_LANGUAGES = AVAILABLE_LANGUAGES.map(lang => lang.code) type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number] const isValidLanguage = ( lang: string | null | undefined ): lang is SupportedLanguage => { return !!lang && SUPPORTED_LANGUAGES.includes(lang as SupportedLanguage) } function App(): JSX.Element { const error = useAppSelector(state => state.user.error) const appLoading = useAppSelector(state => state.loading.isLoading) const userLanguage = useAppSelector(state => state.user.coreConfig.language) const settingsLanguage = useAppSelector(state => state.settings.language) const savedLang = localStorage.getItem('lang') const defaultLang = window.LANG const lang = [userLanguage, settingsLanguage, savedLang, defaultLang].find( l => !!l && isValidLanguage(l) ) || 'en' const dispatch = useAppDispatch() useEffect(() => { if (error) { dispatch(push('/error')) } }, [error, dispatch]) useInitializeApp() return ( locale[lang]} lang={lang} locales={dateLocales} > }> } /> } /> } /> } /> {appLoading && } ) } export default App