import "/src/styles/app.scss" import {StrictMode, useEffect, useState} from 'react' import {createRoot} from 'react-dom/client' import {useApi} from "/src/hooks/api.js" import {useConstants} from "/src/hooks/constants.js" import {useUtils} from "/src/hooks/utils.js" import Preloader from "/src/components/loaders/Preloader.jsx" import DataProvider, {useData} from "/src/providers/DataProvider.jsx" import LanguageProvider from "/src/providers/LanguageProvider.jsx" import ViewportProvider from "/src/providers/ViewportProvider.jsx" import ThemeProvider from "/src/providers/ThemeProvider.jsx" import LocationProvider from "/src/providers/LocationProvider.jsx" import FeedbacksProvider from "/src/providers/FeedbacksProvider.jsx" import InputProvider from "/src/providers/InputProvider.jsx" import NavigationProvider from "/src/providers/NavigationProvider.jsx" import Portfolio from "/src/components/Portfolio.jsx" /** Initialization Script... **/ let container = null document.addEventListener('DOMContentLoaded', function(event) { if(container) return container = document.getElementById('root') createRoot(document.getElementById('root')).render() }) /** * This is the main app component. It wraps the content of the app with AppEssentialsWrapper and AppCapabilitiesWrapper. * @return {JSX.Element} * @constructor */ const App = () => { return ( ) } /** * This stack will wrap the entire app - these are considered essential components for the app booting up. * @param children * @return {JSX.Element} * @constructor */ const AppEssentialsWrapper = ({children}) => { const api = useApi() const utils = useUtils() const constants = useConstants() const [settings, setSettings] = useState() useEffect(() => { if (window.location.pathname !== utils.file.BASE_URL) window.history.pushState({}, '', utils.file.BASE_URL) utils.file.loadJSON("/data/settings.json").then(response => { _applyDeveloperSettings(response) setSettings(response) const consoleMessageForDevelopers = response?.consoleMessageForDevelopers if(consoleMessageForDevelopers) { const primaryColor = utils.css.getRootSCSSVariable('--bs-primary') utils.log.info(consoleMessageForDevelopers.title, consoleMessageForDevelopers.items, primaryColor) } }) api.analytics.reportVisit().then(() => {}) }, []) const _applyDeveloperSettings = (settings) => { const developerSettings = settings?.developerSettings const debugMode = developerSettings?.debugMode const fakeEmailRequests = developerSettings?.fakeEmailRequests const stayOnThePreloaderScreen = developerSettings?.stayOnThePreloaderScreen if(constants.PRODUCTION_MODE) return settings if(debugMode) { settings.preloaderSettings.enabled = stayOnThePreloaderScreen settings.templateSettings.backgroundStyle = "plain" utils.storage.setWindowVariable("suspendAnimations", true) utils.log.warn("DataProvider", "Debug Mode is enabled, so transitions and animated content—such as the preloader screen, background animations, and role text typing—will be skipped. You can disable it manually on settings.json or by running the app on PROD_MODE, which disables it by default.") } if(fakeEmailRequests) { utils.storage.setWindowVariable("fakeEmailRequests", true) utils.log.warn("DataProvider", "Fake email requests are enabled. This is only for development purposes and will be disabled automatically in production.") } if(stayOnThePreloaderScreen) { utils.storage.setWindowVariable("stayOnThePreloaderScreen", true) utils.log.warn("DataProvider", "Preloader screen will be displayed indefinitely because the developer flag 'stayOnThePreloaderScreen' is on. This is only for development purposes and will be disabled automatically in production.") } } return ( {settings && ( {children} )} ) } /** * This stack will wrap the app capabilities - these will be initialized after the app has booted up and loaded its essential components. * @param children * @return {JSX.Element} * @constructor */ const AppCapabilitiesWrapper = ({ children }) => { const data = useData() const [selectedThemeId, setSelectedThemeId] = useState(null) const appSettings = data.getSettings() const appStrings = data.getStrings() const appSections = data.getSections() const appCategories = data.getCategories() const supportedLanguages = appSettings["supportedLanguages"] const supportedThemes = appSettings["supportedThemes"] const defaultLanguageId = appSettings["templateSettings"].defaultLanguageId const defaultThemeId = appSettings["templateSettings"].defaultThemeId const animatedCursorEnabled = appSettings["templateSettings"].animatedCursorEnabled const showSpinnerOnThemeChange = appSettings["templateSettings"].showSpinnerOnThemeChange return ( {children} ) }