w-aura/src/init.tsx
2025-07-28 22:30:37 +00:00

133 lines
4.0 KiB
TypeScript
Executable File

import React from "react";
import i18next from "i18next";
import ReactPostprocessor from "i18next-react-postprocessor";
import { BrowserRouter } from "react-router-dom";
import { I18nextProvider, initReactI18next } from "react-i18next";
import { Provider } from "react-redux";
import { store } from "./store";
import { AuthProvider } from "./auth";
import { ApiContext, createApi } from "./api";
import { LegalContext, buildLegal } from "./legal";
import {
buildResources,
fallbackLng,
getDefaultLocaleByLanguage,
getTranslationsJSON,
language,
setLanguage,
} from "./locales";
import App from "./components/App";
import metricService from "./services/metric/metricService";
import "core-js/actual";
import { pdfjs } from "react-pdf";
import HeadData from "./utils/Helmet";
import Clarity from '@microsoft/clarity';
import { InitializationProvider } from "./initialization";
import { getSourceByPathname } from "./utils/source.utils";
import { parseQueryParams } from "./services/url";
import { actions } from "./store";
pdfjs.GlobalWorkerOptions.workerSrc = `https://unpkg.com/pdfjs-dist@${pdfjs.version}/legacy/build/pdf.worker.min.js`;
const environments = import.meta.env;
const init = async () => {
// Parse UTM parameters from URL at initialization
const utm = parseQueryParams();
console.log('UTM parameters parsed at init:', utm);
if (Object.keys(utm).length > 0) {
console.log('Dispatching UTM update:', utm);
store.dispatch(actions.utm.update(utm));
}
await setLanguage();
const api = createApi();
const [translationsResponse, elementsResponse, configResponse] =
await Promise.all([
api.getTranslations(null),
api.getElements({ locale: language }),
api.getAppConfig({ bundleId: "auraweb" }),
]);
console.time('translations-loading');
const translationsPlacement = await getTranslationsJSON(language);
console.timeEnd('translations-loading');
const resources = buildResources(translationsResponse, translationsPlacement);
const legal = buildLegal(elementsResponse);
const config = configResponse.data;
const i18nextInstance = i18next.createInstance();
const options = {
resources,
fallbackLng,
postProcess: [`reactPostprocessor`],
lng: getDefaultLocaleByLanguage(language),
interpolation: {
format: function (value: any, format: any, _lng: any) {
if (format === 'uppercase') return value?.toUpperCase();
// if (value instanceof Date) return moment(value).format(format);
return value;
}
}
};
await i18nextInstance
.use(initReactI18next)
.use(new ReactPostprocessor())
.init(options);
const isProduction = environments.MODE === "production";
// SCRIPTS TO HEAD
const smartLook = () => {
if (!config.smartlook_manage) return;
const script = document.createElement("script");
script.setAttribute("src", "/metrics/smartlook.js");
document.head.appendChild(script);
};
metricService.initMetric();
// metricService.initMetricAB();
if (isProduction) {
smartLook();
}
const projectId = "pez69dq3lh"
Clarity.init(projectId);
const source = getSourceByPathname()
const pixels = await api.getPixels({
domain: window.location.hostname,
source,
locale: getDefaultLocaleByLanguage(language),
});
localStorage.setItem('fb_pixels', JSON.stringify(pixels?.data?.fb || []));
return (
<React.Fragment>
{!!pixels?.data?.fb?.length && <HeadData pixels={pixels.data.fb} />}
<I18nextProvider i18n={i18nextInstance}>
<Provider store={store}>
<BrowserRouter>
<ApiContext.Provider value={api}>
<AuthProvider>
<LegalContext.Provider value={legal}>
<InitializationProvider>
<App />
</InitializationProvider>
</LegalContext.Provider>
</AuthProvider>
</ApiContext.Provider>
</BrowserRouter>
</Provider>
</I18nextProvider>
</React.Fragment>
);
};
export default init;