Newer
Older
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/no-var-requires */
declare let __PIWIK_TRACKER_URL__: string
declare let __PIWIK_SITEID__: number
import { ThemeProvider } from '@material-ui/core'
import * as Sentry from '@sentry/react'
import { BrowserTracing } from '@sentry/tracing'
import CozyClient, { Client, CozyProvider } from 'cozy-client'
import { isFlagshipApp } from 'cozy-device-helper'
import { handleOAuthResponse } from 'cozy-harvest-lib/dist/helpers/oauth'
import { WebviewIntentProvider } from 'cozy-intent'
import { I18n, initTranslation } from 'cozy-ui/transpiled/react/I18n'
import schema from 'doctypes'
import { createHashHistory } from 'history'
import { memoize } from 'lodash'
import React from 'react'
import { createRoot } from 'react-dom/client'
import { HashRouter } from 'react-router-dom'
import EnvironmentService from 'services/environment.service'
import { setupStore } from 'store/store'
import MatomoTracker from 'utils/matomoTracker'
import manifest from '../../../manifest.webapp'
import '../../styles/index.scss'
const setupApp = memoize(() => {
const history = createHashHistory()
const container: any = document.querySelector('[role=application]')
const data = JSON.parse(container.dataset.cozy)
const protocol = window.location.protocol
const cozyUrl = `${protocol}//${data.domain}`
const locale = 'fr'
const polyglot = initTranslation(locale, lang => require(`locales/${lang}`))
const client: Client = new CozyClient({
uri: cozyUrl,
token: data.token,
appMetadata: {
slug: manifest.name,
version: manifest.version,
},
schema,
})
const envService = new EnvironmentService()
const isLocal = envService.isLocal()
const development = envService.isDev()
appName: data.app.name,
appEditor: data.app.editor,
cozyClient: client,
iconPath: data.app.icon,
lang: data.locale,
replaceTitleOnMobile: false,
appSlug: data.app.slug,
appNamePrefix: data.app.prefix,
if (window.Piwik) {
Piwik.getTracker()
tracker = new MatomoTracker({
cozyUrl: cozyUrl,
url: __PIWIK_TRACKER_URL__,
siteId: __PIWIK_SITEID__,
history: history,
phpFilename: 'matomo.php',
})
}
!isLocal &&
Sentry.init({
dsn: __SENTRY_DSN__,
integrations: [new BrowserTracing()],
// Set tracesSampleRate to 1.0 to capture 100%
// of transactions for performance monitoring.
// We recommend adjusting this value in production
// Set to 0 for local development
tracesSampleRate: 1.0,
// Custom settings below
release: client.appMetadata.version,
environment: development ? 'development' : 'production',
// cast because init is somehow missing dsn property
} as Sentry.BrowserOptions)
return { container, store, client, locale, polyglot, history, tracker }
})
const init = () => {
const { container, store, client, locale, polyglot, history, tracker } =
setupApp()
const root = createRoot(container)
root.render(
<WebviewIntentProvider setBarContext={cozyBar.setWebviewContext}>
<Provider store={store}>
<CozyProvider client={client}>
<I18n lang={locale} polyglot={polyglot}>
<HashRouter {...history}>
<ThemeProvider theme={theme}>
<App tracker={tracker} />
</ThemeProvider>
</HashRouter>
</I18n>
</CozyProvider>
</Provider>
</WebviewIntentProvider>
// initial rendering of the application
document.addEventListener('DOMContentLoaded', () => init())
// excludes Chrome, Edge, and all Android browsers that include the Safari name in their user agent
const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent)
if (!isSafari && 'serviceWorker' in navigator) {
window.addEventListener('load', function () {
navigator.serviceWorker
.register('/serviceWorker.js')
.then(reg => console.log('service worker registered', reg.scope))
.catch(error => {
const errorMessage = `service worker not registered: ${JSON.stringify(
error
)}`
logApp.error(errorMessage)
Sentry.captureException(errorMessage)
})
if (module.hot) {
init()
module.hot.accept()