@vlian/framework 1.1.1 → 1.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -1
- package/dist/analytics/index.cjs +24 -0
- package/dist/analytics/index.cjs.map +1 -0
- package/dist/analytics/index.d.ts +2 -0
- package/dist/analytics/index.js +3 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics.umd.js +2406 -0
- package/dist/analytics.umd.js.map +1 -0
- package/dist/components/LocaleSwitch.cjs +118 -0
- package/dist/components/LocaleSwitch.cjs.map +1 -0
- package/dist/components/LocaleSwitch.d.ts +21 -0
- package/dist/components/LocaleSwitch.js +103 -0
- package/dist/components/LocaleSwitch.js.map +1 -0
- package/dist/components/ThemeSwitch.cjs +117 -0
- package/dist/components/ThemeSwitch.cjs.map +1 -0
- package/dist/components/ThemeSwitch.d.ts +20 -0
- package/dist/components/ThemeSwitch.js +102 -0
- package/dist/components/ThemeSwitch.js.map +1 -0
- package/dist/components/index.cjs +16 -0
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.ts +5 -2
- package/dist/components/index.js +2 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/persistence.cjs +60 -0
- package/dist/components/persistence.cjs.map +1 -0
- package/dist/components/persistence.d.ts +12 -0
- package/dist/components/persistence.js +39 -0
- package/dist/components/persistence.js.map +1 -0
- package/dist/core/Test.d.ts +0 -1
- package/dist/core/app/AppContext.cjs +36 -30
- package/dist/core/app/AppContext.cjs.map +1 -1
- package/dist/core/app/AppContext.d.ts +9 -6
- package/dist/core/app/AppContext.js +36 -30
- package/dist/core/app/AppContext.js.map +1 -1
- package/dist/core/app/AppContext.types.d.ts +9 -10
- package/dist/core/app/AppContext.types.js.map +1 -1
- package/dist/core/app/BasicLayout.cjs +57 -22
- package/dist/core/app/BasicLayout.cjs.map +1 -1
- package/dist/core/app/BasicLayout.d.ts +7 -5
- package/dist/core/app/BasicLayout.js +57 -22
- package/dist/core/app/BasicLayout.js.map +1 -1
- package/dist/core/app/DefaultApp.cjs +104 -153
- package/dist/core/app/DefaultApp.cjs.map +1 -1
- package/dist/core/app/DefaultApp.d.ts +0 -21
- package/dist/core/app/DefaultApp.js +104 -153
- package/dist/core/app/DefaultApp.js.map +1 -1
- package/dist/core/app/index.d.ts +0 -1
- package/dist/core/config/AppConfig.cjs.map +1 -1
- package/dist/core/config/AppConfig.d.ts +3 -4
- package/dist/core/config/AppConfig.js.map +1 -1
- package/dist/core/config/ConfigLoader.cjs +90 -8
- package/dist/core/config/ConfigLoader.cjs.map +1 -1
- package/dist/core/config/ConfigLoader.d.ts +20 -5
- package/dist/core/config/ConfigLoader.js +90 -8
- package/dist/core/config/ConfigLoader.js.map +1 -1
- package/dist/core/config/ConfigValidator.d.ts +0 -1
- package/dist/core/config/index.d.ts +0 -1
- package/dist/core/dev/DevTools.cjs +141 -287
- package/dist/core/dev/DevTools.cjs.map +1 -1
- package/dist/core/dev/DevTools.d.ts +1 -32
- package/dist/core/dev/DevTools.js +143 -296
- package/dist/core/dev/DevTools.js.map +1 -1
- package/dist/core/error/ErrorBoundary.cjs +95 -23
- package/dist/core/error/ErrorBoundary.cjs.map +1 -1
- package/dist/core/error/ErrorBoundary.d.ts +7 -9
- package/dist/core/error/ErrorBoundary.js +96 -24
- package/dist/core/error/ErrorBoundary.js.map +1 -1
- package/dist/core/error/ErrorHandler.cjs +277 -0
- package/dist/core/error/ErrorHandler.cjs.map +1 -0
- package/dist/core/error/ErrorHandler.d.ts +171 -0
- package/dist/core/error/ErrorHandler.js +261 -0
- package/dist/core/error/ErrorHandler.js.map +1 -0
- package/dist/core/error/index.cjs +10 -0
- package/dist/core/error/index.cjs.map +1 -1
- package/dist/core/error/index.d.ts +2 -1
- package/dist/core/error/index.js +1 -0
- package/dist/core/error/index.js.map +1 -1
- package/dist/core/event/AppEventBus.d.ts +0 -1
- package/dist/core/event/frameworkEvents.d.ts +0 -1
- package/dist/core/event/hooks.d.ts +0 -1
- package/dist/core/event/index.d.ts +0 -1
- package/dist/core/event/types.d.ts +0 -1
- package/dist/core/event/useEventBus.d.ts +0 -1
- package/dist/core/index.cjs +2 -0
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.d.ts +0 -1
- package/dist/core/initialization/index.d.ts +0 -1
- package/dist/core/initialization/initialization.d.ts +0 -1
- package/dist/core/initialization/initializationErrorState.d.ts +0 -1
- package/dist/core/kernel/defaultAdapters.cjs +185 -0
- package/dist/core/kernel/defaultAdapters.cjs.map +1 -0
- package/dist/core/kernel/defaultAdapters.d.ts +2 -0
- package/dist/core/kernel/defaultAdapters.js +175 -0
- package/dist/core/kernel/defaultAdapters.js.map +1 -0
- package/dist/core/kernel/errors.cjs +71 -0
- package/dist/core/kernel/errors.cjs.map +1 -0
- package/dist/core/kernel/errors.d.ts +18 -0
- package/dist/core/kernel/errors.js +53 -0
- package/dist/core/kernel/errors.js.map +1 -0
- package/dist/core/kernel/index.cjs +22 -0
- package/dist/core/kernel/index.cjs.map +1 -0
- package/dist/core/kernel/index.d.ts +3 -0
- package/dist/core/kernel/index.js +4 -0
- package/dist/core/kernel/index.js.map +1 -0
- package/dist/core/kernel/startKernel.cjs +203 -0
- package/dist/core/kernel/startKernel.cjs.map +1 -0
- package/dist/core/kernel/startKernel.d.ts +2 -0
- package/dist/core/kernel/startKernel.js +193 -0
- package/dist/core/kernel/startKernel.js.map +1 -0
- package/dist/core/kernel/types.cjs +6 -0
- package/dist/core/kernel/types.cjs.map +1 -0
- package/dist/core/kernel/types.d.ts +114 -0
- package/dist/core/kernel/types.js +3 -0
- package/dist/core/kernel/types.js.map +1 -0
- package/dist/core/middleware.d.ts +0 -1
- package/dist/core/plugin/PluginEventBus.d.ts +0 -1
- package/dist/core/plugin/PluginSandbox.d.ts +0 -1
- package/dist/core/plugin.cjs +1 -1
- package/dist/core/plugin.cjs.map +1 -1
- package/dist/core/plugin.d.ts +0 -1
- package/dist/core/plugin.js +1 -1
- package/dist/core/plugin.js.map +1 -1
- package/dist/core/router/RouterManager.d.ts +0 -1
- package/dist/core/router/adapter/AdapterManager.d.ts +0 -1
- package/dist/core/router/adapter/index.d.ts +0 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.d.ts +0 -1
- package/dist/core/router/adapter/react-router/index.d.ts +0 -1
- package/dist/core/router/adapter/types.cjs.map +1 -1
- package/dist/core/router/adapter/types.d.ts +1 -2
- package/dist/core/router/adapter/types.js.map +1 -1
- package/dist/core/router/dev/RouterDevTools.cjs +148 -296
- package/dist/core/router/dev/RouterDevTools.cjs.map +1 -1
- package/dist/core/router/dev/RouterDevTools.d.ts +1 -6
- package/dist/core/router/dev/RouterDevTools.js +149 -301
- package/dist/core/router/dev/RouterDevTools.js.map +1 -1
- package/dist/core/router/dev/index.d.ts +0 -1
- package/dist/core/router/dynamic/DynamicRouteManager.d.ts +0 -1
- package/dist/core/router/dynamic/index.d.ts +0 -1
- package/dist/core/router/errors/RouterError.d.ts +0 -1
- package/dist/core/router/errors/index.d.ts +0 -1
- package/dist/core/router/index.d.ts +0 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.d.ts +0 -1
- package/dist/core/router/lifecycle/index.d.ts +0 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.d.ts +0 -1
- package/dist/core/router/middleware/auth.d.ts +0 -1
- package/dist/core/router/middleware/index.d.ts +0 -1
- package/dist/core/router/middleware/types.d.ts +0 -1
- package/dist/core/router/monitoring/RouterMonitoring.d.ts +0 -1
- package/dist/core/router/monitoring/index.d.ts +0 -1
- package/dist/core/router/navigation/RouterNavigation.d.ts +0 -1
- package/dist/core/router/navigation/index.d.ts +0 -1
- package/dist/core/router/performance/RouteCache.d.ts +0 -1
- package/dist/core/router/performance/RoutePreloader.d.ts +0 -1
- package/dist/core/router/performance/index.d.ts +0 -1
- package/dist/core/router/plugin/RouterPluginManager.d.ts +0 -1
- package/dist/core/router/plugin/index.d.ts +0 -1
- package/dist/core/router/plugin/types.d.ts +0 -1
- package/dist/core/router/types.d.ts +1 -2
- package/dist/core/router/types.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +90 -103
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.d.ts +0 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js +91 -104
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.cjs +13 -4
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.d.ts +0 -1
- package/dist/core/router/utils/adapters/react-router/transform.js +13 -4
- package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
- package/dist/core/router/utils/transform.cjs +1 -1
- package/dist/core/router/utils/transform.cjs.map +1 -1
- package/dist/core/router/utils/transform.d.ts +0 -1
- package/dist/core/router/utils/transform.js +1 -1
- package/dist/core/router/utils/transform.js.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.d.ts +0 -1
- package/dist/core/router/validation/index.d.ts +0 -1
- package/dist/core/router/validation/schema.d.ts +0 -1
- package/dist/core/router/version/RouteVersionManager.d.ts +0 -1
- package/dist/core/router/version/index.d.ts +0 -1
- package/dist/core/splash/SplashScreen.cjs +101 -15
- package/dist/core/splash/SplashScreen.cjs.map +1 -1
- package/dist/core/splash/SplashScreen.d.ts +0 -1
- package/dist/core/splash/SplashScreen.js +101 -15
- package/dist/core/splash/SplashScreen.js.map +1 -1
- package/dist/core/splash/index.d.ts +0 -1
- package/dist/core/splash/splashScreenUtils.d.ts +0 -1
- package/dist/core/startup/AppInstance.d.ts +0 -1
- package/dist/core/startup/environment.d.ts +0 -1
- package/dist/core/startup/index.d.ts +0 -1
- package/dist/core/startup/initializeServices.cjs +69 -24
- package/dist/core/startup/initializeServices.cjs.map +1 -1
- package/dist/core/startup/initializeServices.d.ts +9 -3
- package/dist/core/startup/initializeServices.js +73 -26
- package/dist/core/startup/initializeServices.js.map +1 -1
- package/dist/core/startup/performanceTracker.d.ts +0 -1
- package/dist/core/startup/renderApp.cjs +110 -69
- package/dist/core/startup/renderApp.cjs.map +1 -1
- package/dist/core/startup/renderApp.d.ts +2 -3
- package/dist/core/startup/renderApp.js +111 -70
- package/dist/core/startup/renderApp.js.map +1 -1
- package/dist/core/startup/startApp.cjs +123 -11
- package/dist/core/startup/startApp.cjs.map +1 -1
- package/dist/core/startup/startApp.d.ts +0 -1
- package/dist/core/startup/startApp.js +123 -11
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/core/types.d.ts +34 -21
- package/dist/core/types.js.map +1 -1
- package/dist/core/ui-adapter/adapters.cjs +45 -0
- package/dist/core/ui-adapter/adapters.cjs.map +1 -0
- package/dist/core/ui-adapter/adapters.d.ts +4 -0
- package/dist/core/ui-adapter/adapters.js +27 -0
- package/dist/core/ui-adapter/adapters.js.map +1 -0
- package/dist/core/ui-adapter/index.cjs +21 -0
- package/dist/core/ui-adapter/index.cjs.map +1 -0
- package/dist/core/ui-adapter/index.d.ts +2 -0
- package/dist/core/ui-adapter/index.js +3 -0
- package/dist/core/ui-adapter/index.js.map +1 -0
- package/dist/core/ui-adapter/types.cjs +6 -0
- package/dist/core/ui-adapter/types.cjs.map +1 -0
- package/dist/core/ui-adapter/types.d.ts +24 -0
- package/dist/core/ui-adapter/types.js +3 -0
- package/dist/core/ui-adapter/types.js.map +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/index.umd.d.ts +0 -1
- package/dist/index.umd.js +33004 -38475
- package/dist/index.umd.js.map +1 -1
- package/dist/library/index.d.ts +0 -1
- package/dist/library/locale/index.d.ts +0 -1
- package/dist/library/locale/langs/en-us/index.d.ts +0 -1
- package/dist/library/locale/langs/zh-cn/index.d.ts +0 -1
- package/dist/library/locale/types.d.ts +0 -1
- package/dist/library/storage/cache.d.ts +0 -1
- package/dist/library/storage/encryption.d.ts +0 -1
- package/dist/library/storage/index.d.ts +0 -1
- package/dist/request/adapter/RequestAdapter.d.ts +0 -1
- package/dist/request/adapter/axiosAdapter.d.ts +0 -1
- package/dist/request/adapter/fetchAdapter.d.ts +0 -1
- package/dist/request/adapter/index.d.ts +0 -1
- package/dist/request/adapter/kyAdapter.d.ts +0 -1
- package/dist/request/adapter/undiciAdapter.d.ts +0 -1
- package/dist/request/core/RequestClient.d.ts +0 -1
- package/dist/request/core/index.d.ts +0 -1
- package/dist/request/index.d.ts +0 -1
- package/dist/request/plugin/RequestPlugin.d.ts +0 -1
- package/dist/request/plugin/cache.d.ts +0 -1
- package/dist/request/plugin/csrfPlugin.d.ts +0 -1
- package/dist/request/plugin/index.d.ts +0 -1
- package/dist/request/plugin/monitoring.d.ts +0 -1
- package/dist/request/plugin/queue.d.ts +0 -1
- package/dist/request/plugin/retry.d.ts +0 -1
- package/dist/request/plugin/validation.d.ts +0 -1
- package/dist/request/runtime/RequestContext.d.ts +0 -1
- package/dist/request/runtime/index.d.ts +0 -1
- package/dist/request/types.d.ts +0 -1
- package/dist/request/utils/RequestQueueManager.d.ts +0 -1
- package/dist/request/utils/dependencyCheck.d.ts +0 -1
- package/dist/request/utils/index.d.ts +0 -1
- package/dist/request.umd.js +5392 -0
- package/dist/request.umd.js.map +1 -0
- package/dist/state/StateManager.d.ts +0 -1
- package/dist/state/adapters/AdapterFactory.d.ts +0 -1
- package/dist/state/adapters/DefaultAdapter.d.ts +0 -1
- package/dist/state/adapters/ReduxAdapter.d.ts +0 -1
- package/dist/state/adapters/ZustandAdapter.d.ts +0 -1
- package/dist/state/adapters/index.d.ts +0 -1
- package/dist/state/adapters/types.d.ts +0 -1
- package/dist/state/core/DerivedStateInstance.d.ts +0 -1
- package/dist/state/core/StateInstance.d.ts +0 -1
- package/dist/state/core/StateRegistry.d.ts +0 -1
- package/dist/state/core/StateScope.d.ts +0 -1
- package/dist/state/core/index.d.ts +0 -1
- package/dist/state/index.d.ts +0 -1
- package/dist/state/types.d.ts +0 -1
- package/dist/state.umd.js +1414 -0
- package/dist/state.umd.js.map +1 -0
- package/dist/types.d.ts +0 -1
- package/dist/utils/analytics.d.ts +0 -1
- package/dist/utils/configSecurity.d.ts +0 -1
- package/dist/utils/csrf.d.ts +0 -1
- package/dist/utils/errors/ErrorCodes.d.ts +0 -1
- package/dist/utils/errors.cjs +44 -1
- package/dist/utils/errors.cjs.map +1 -1
- package/dist/utils/errors.d.ts +5 -1
- package/dist/utils/errors.js +44 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.types.d.ts +0 -1
- package/dist/utils/monitoring.d.ts +0 -1
- package/dist/utils/performance.d.ts +0 -1
- package/dist/utils/resourceLoader.d.ts +0 -1
- package/dist/utils/runtimeSecurity.d.ts +0 -1
- package/dist/utils/security.d.ts +0 -1
- package/dist/utils/traceId.d.ts +0 -1
- package/dist/utils/validation.d.ts +0 -1
- package/package.json +57 -8
- package/dist/components/index.d.ts.map +0 -1
- package/dist/core/Test.d.ts.map +0 -1
- package/dist/core/app/AppContext.d.ts.map +0 -1
- package/dist/core/app/AppContext.types.d.ts.map +0 -1
- package/dist/core/app/BasicLayout.d.ts.map +0 -1
- package/dist/core/app/DefaultApp.d.ts.map +0 -1
- package/dist/core/app/index.d.ts.map +0 -1
- package/dist/core/config/AppConfig.d.ts.map +0 -1
- package/dist/core/config/ConfigLoader.d.ts.map +0 -1
- package/dist/core/config/ConfigValidator.d.ts.map +0 -1
- package/dist/core/config/index.d.ts.map +0 -1
- package/dist/core/dev/DevTools.d.ts.map +0 -1
- package/dist/core/error/ErrorBoundary.d.ts.map +0 -1
- package/dist/core/error/index.d.ts.map +0 -1
- package/dist/core/event/AppEventBus.d.ts.map +0 -1
- package/dist/core/event/frameworkEvents.d.ts.map +0 -1
- package/dist/core/event/hooks.d.ts.map +0 -1
- package/dist/core/event/index.d.ts.map +0 -1
- package/dist/core/event/types.d.ts.map +0 -1
- package/dist/core/event/useEventBus.d.ts.map +0 -1
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/initialization/InitializationErrorThrower.d.ts.map +0 -1
- package/dist/core/initialization/index.d.ts.map +0 -1
- package/dist/core/initialization/initialization.d.ts.map +0 -1
- package/dist/core/initialization/initializationErrorState.d.ts.map +0 -1
- package/dist/core/middleware.d.ts.map +0 -1
- package/dist/core/plugin/PluginEventBus.d.ts.map +0 -1
- package/dist/core/plugin/PluginSandbox.d.ts.map +0 -1
- package/dist/core/plugin.d.ts.map +0 -1
- package/dist/core/router/RouterManager.d.ts.map +0 -1
- package/dist/core/router/adapter/AdapterManager.d.ts.map +0 -1
- package/dist/core/router/adapter/index.d.ts.map +0 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.d.ts.map +0 -1
- package/dist/core/router/adapter/react-router/index.d.ts.map +0 -1
- package/dist/core/router/adapter/types.d.ts.map +0 -1
- package/dist/core/router/dev/RouterDevTools.d.ts.map +0 -1
- package/dist/core/router/dev/index.d.ts.map +0 -1
- package/dist/core/router/dynamic/DynamicRouteManager.d.ts.map +0 -1
- package/dist/core/router/dynamic/index.d.ts.map +0 -1
- package/dist/core/router/errors/RouterError.d.ts.map +0 -1
- package/dist/core/router/errors/index.d.ts.map +0 -1
- package/dist/core/router/index.d.ts.map +0 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.d.ts.map +0 -1
- package/dist/core/router/lifecycle/index.d.ts.map +0 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.d.ts.map +0 -1
- package/dist/core/router/middleware/auth.d.ts.map +0 -1
- package/dist/core/router/middleware/index.d.ts.map +0 -1
- package/dist/core/router/middleware/types.d.ts.map +0 -1
- package/dist/core/router/monitoring/RouterMonitoring.d.ts.map +0 -1
- package/dist/core/router/monitoring/index.d.ts.map +0 -1
- package/dist/core/router/navigation/RouterNavigation.d.ts.map +0 -1
- package/dist/core/router/navigation/index.d.ts.map +0 -1
- package/dist/core/router/performance/RouteCache.d.ts.map +0 -1
- package/dist/core/router/performance/RoutePreloader.d.ts.map +0 -1
- package/dist/core/router/performance/index.d.ts.map +0 -1
- package/dist/core/router/plugin/RouterPluginManager.d.ts.map +0 -1
- package/dist/core/router/plugin/index.d.ts.map +0 -1
- package/dist/core/router/plugin/types.d.ts.map +0 -1
- package/dist/core/router/types.d.ts.map +0 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.d.ts.map +0 -1
- package/dist/core/router/utils/adapters/react-router/transform.d.ts.map +0 -1
- package/dist/core/router/utils/transform.d.ts.map +0 -1
- package/dist/core/router/validation/RouterConfigValidator.d.ts.map +0 -1
- package/dist/core/router/validation/index.d.ts.map +0 -1
- package/dist/core/router/validation/schema.d.ts.map +0 -1
- package/dist/core/router/version/RouteVersionManager.d.ts.map +0 -1
- package/dist/core/router/version/index.d.ts.map +0 -1
- package/dist/core/splash/SplashScreen.d.ts.map +0 -1
- package/dist/core/splash/index.d.ts.map +0 -1
- package/dist/core/splash/splashScreenUtils.d.ts.map +0 -1
- package/dist/core/startup/AppInstance.d.ts.map +0 -1
- package/dist/core/startup/environment.d.ts.map +0 -1
- package/dist/core/startup/index.d.ts.map +0 -1
- package/dist/core/startup/initializeServices.d.ts.map +0 -1
- package/dist/core/startup/performanceTracker.d.ts.map +0 -1
- package/dist/core/startup/renderApp.d.ts.map +0 -1
- package/dist/core/startup/startApp.d.ts.map +0 -1
- package/dist/core/types.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.umd.d.ts.map +0 -1
- package/dist/library/index.d.ts.map +0 -1
- package/dist/library/locale/index.d.ts.map +0 -1
- package/dist/library/locale/langs/en-us/index.d.ts.map +0 -1
- package/dist/library/locale/langs/zh-cn/index.d.ts.map +0 -1
- package/dist/library/locale/types.d.ts.map +0 -1
- package/dist/library/storage/cache.d.ts.map +0 -1
- package/dist/library/storage/encryption.d.ts.map +0 -1
- package/dist/library/storage/index.d.ts.map +0 -1
- package/dist/request/adapter/RequestAdapter.d.ts.map +0 -1
- package/dist/request/adapter/axiosAdapter.d.ts.map +0 -1
- package/dist/request/adapter/fetchAdapter.d.ts.map +0 -1
- package/dist/request/adapter/index.d.ts.map +0 -1
- package/dist/request/adapter/kyAdapter.d.ts.map +0 -1
- package/dist/request/adapter/undiciAdapter.d.ts.map +0 -1
- package/dist/request/core/RequestClient.d.ts.map +0 -1
- package/dist/request/core/index.d.ts.map +0 -1
- package/dist/request/index.d.ts.map +0 -1
- package/dist/request/plugin/RequestPlugin.d.ts.map +0 -1
- package/dist/request/plugin/cache.d.ts.map +0 -1
- package/dist/request/plugin/csrfPlugin.d.ts.map +0 -1
- package/dist/request/plugin/index.d.ts.map +0 -1
- package/dist/request/plugin/monitoring.d.ts.map +0 -1
- package/dist/request/plugin/queue.d.ts.map +0 -1
- package/dist/request/plugin/retry.d.ts.map +0 -1
- package/dist/request/plugin/validation.d.ts.map +0 -1
- package/dist/request/runtime/RequestContext.d.ts.map +0 -1
- package/dist/request/runtime/index.d.ts.map +0 -1
- package/dist/request/types.d.ts.map +0 -1
- package/dist/request/utils/RequestQueueManager.d.ts.map +0 -1
- package/dist/request/utils/dependencyCheck.d.ts.map +0 -1
- package/dist/request/utils/index.d.ts.map +0 -1
- package/dist/state/StateManager.d.ts.map +0 -1
- package/dist/state/adapters/AdapterFactory.d.ts.map +0 -1
- package/dist/state/adapters/DefaultAdapter.d.ts.map +0 -1
- package/dist/state/adapters/ReduxAdapter.d.ts.map +0 -1
- package/dist/state/adapters/ZustandAdapter.d.ts.map +0 -1
- package/dist/state/adapters/index.d.ts.map +0 -1
- package/dist/state/adapters/types.d.ts.map +0 -1
- package/dist/state/core/DerivedStateInstance.d.ts.map +0 -1
- package/dist/state/core/StateInstance.d.ts.map +0 -1
- package/dist/state/core/StateRegistry.d.ts.map +0 -1
- package/dist/state/core/StateScope.d.ts.map +0 -1
- package/dist/state/core/index.d.ts.map +0 -1
- package/dist/state/index.d.ts.map +0 -1
- package/dist/state/types.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/analytics.d.ts.map +0 -1
- package/dist/utils/configSecurity.d.ts.map +0 -1
- package/dist/utils/csrf.d.ts.map +0 -1
- package/dist/utils/errors/ErrorCodes.d.ts.map +0 -1
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.types.d.ts.map +0 -1
- package/dist/utils/monitoring.d.ts.map +0 -1
- package/dist/utils/performance.d.ts.map +0 -1
- package/dist/utils/resourceLoader.d.ts.map +0 -1
- package/dist/utils/runtimeSecurity.d.ts.map +0 -1
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/traceId.d.ts.map +0 -1
- package/dist/utils/validation.d.ts.map +0 -1
|
@@ -122,4 +122,3 @@ export declare class RouteVersionManager {
|
|
|
122
122
|
rollback(version: string, routes: RouteConfig[]): Promise<RouteConfig[]>;
|
|
123
123
|
}
|
|
124
124
|
export declare function getRouteVersionManager(config?: RouteVersionManagerConfig): RouteVersionManager;
|
|
125
|
-
//# sourceMappingURL=RouteVersionManager.d.ts.map
|
|
@@ -10,7 +10,6 @@ Object.defineProperty(exports, "SplashScreen", {
|
|
|
10
10
|
});
|
|
11
11
|
const _jsxruntime = require("react/jsx-runtime");
|
|
12
12
|
const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
|
|
13
|
-
const _antd = require("antd");
|
|
14
13
|
const _utils = require("../../utils");
|
|
15
14
|
const _initialization = require("../initialization");
|
|
16
15
|
function _getRequireWildcardCache(nodeInterop) {
|
|
@@ -63,6 +62,12 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
63
62
|
const [currentStep, setCurrentStep] = (0, _react.useState)('准备初始化...');
|
|
64
63
|
const [isInitializing, setIsInitializing] = (0, _react.useState)(false);
|
|
65
64
|
const [estimatedTime, setEstimatedTime] = (0, _react.useState)(null);
|
|
65
|
+
const [isSystemDark, setIsSystemDark] = (0, _react.useState)(()=>{
|
|
66
|
+
if (typeof window === 'undefined') {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
70
|
+
});
|
|
66
71
|
const hasCompletedRef = (0, _react.useRef)(false);
|
|
67
72
|
const onCompleteRef = (0, _react.useRef)(onComplete);
|
|
68
73
|
const optionsRef = (0, _react.useRef)(options);
|
|
@@ -182,6 +187,51 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
182
187
|
}, [
|
|
183
188
|
debouncedProgressUpdate
|
|
184
189
|
]);
|
|
190
|
+
(0, _react.useEffect)(()=>{
|
|
191
|
+
if (typeof window === 'undefined') {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
195
|
+
const onSystemThemeChange = (event)=>{
|
|
196
|
+
setIsSystemDark(event.matches);
|
|
197
|
+
};
|
|
198
|
+
setIsSystemDark(mediaQuery.matches);
|
|
199
|
+
if (typeof mediaQuery.addEventListener === 'function') {
|
|
200
|
+
mediaQuery.addEventListener('change', onSystemThemeChange);
|
|
201
|
+
return ()=>mediaQuery.removeEventListener('change', onSystemThemeChange);
|
|
202
|
+
}
|
|
203
|
+
mediaQuery.addListener(onSystemThemeChange);
|
|
204
|
+
return ()=>mediaQuery.removeListener(onSystemThemeChange);
|
|
205
|
+
}, []);
|
|
206
|
+
const resolvedMode = _react.default.useMemo(()=>{
|
|
207
|
+
const mode = optionsRef.current.theme?.mode || 'light';
|
|
208
|
+
if (mode === 'system') {
|
|
209
|
+
return isSystemDark ? 'dark' : 'light';
|
|
210
|
+
}
|
|
211
|
+
return mode === 'dark' ? 'dark' : 'light';
|
|
212
|
+
}, [
|
|
213
|
+
isSystemDark
|
|
214
|
+
]);
|
|
215
|
+
const palette = _react.default.useMemo(()=>{
|
|
216
|
+
if (resolvedMode === 'dark') {
|
|
217
|
+
return {
|
|
218
|
+
background: '#0b1220',
|
|
219
|
+
text: '#e2e8f0',
|
|
220
|
+
subText: '#94a3b8',
|
|
221
|
+
track: '#1f2937',
|
|
222
|
+
spinnerTrack: '#334155'
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
background: '#f5f7fb',
|
|
227
|
+
text: '#51606f',
|
|
228
|
+
subText: '#94a3b8',
|
|
229
|
+
track: '#e9eff5',
|
|
230
|
+
spinnerTrack: '#d9e2ec'
|
|
231
|
+
};
|
|
232
|
+
}, [
|
|
233
|
+
resolvedMode
|
|
234
|
+
]);
|
|
185
235
|
// 如果提供了自定义启动屏组件,使用自定义组件
|
|
186
236
|
const CustomSplashScreen = optionsRef.current.splashScreen;
|
|
187
237
|
if (CustomSplashScreen) {
|
|
@@ -206,31 +256,64 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
206
256
|
justifyContent: 'center',
|
|
207
257
|
height: '100vh',
|
|
208
258
|
width: '100%',
|
|
209
|
-
gap: 24
|
|
259
|
+
gap: 24,
|
|
260
|
+
background: palette.background,
|
|
261
|
+
color: palette.text
|
|
210
262
|
},
|
|
211
263
|
children: [
|
|
212
|
-
/*#__PURE__*/ (0, _jsxruntime.jsx)(_antd.Spin, {
|
|
213
|
-
size: "large",
|
|
214
|
-
spinning: isInitializing,
|
|
215
|
-
"aria-label": "加载中"
|
|
216
|
-
}),
|
|
217
264
|
/*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
|
|
265
|
+
"aria-label": "加载中",
|
|
266
|
+
style: {
|
|
267
|
+
width: 42,
|
|
268
|
+
height: 42,
|
|
269
|
+
border: `4px solid ${palette.spinnerTrack}`,
|
|
270
|
+
borderTopColor: 'var(--app-primary-color, #2f80ed)',
|
|
271
|
+
borderRadius: '50%',
|
|
272
|
+
animation: 'secra-spin 1s linear infinite'
|
|
273
|
+
}
|
|
274
|
+
}),
|
|
275
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
|
|
218
276
|
style: {
|
|
219
277
|
width: '300px'
|
|
220
278
|
},
|
|
221
|
-
children:
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
279
|
+
children: [
|
|
280
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
|
|
281
|
+
"aria-label": `加载进度 ${progress}%`,
|
|
282
|
+
style: {
|
|
283
|
+
height: 12,
|
|
284
|
+
background: palette.track,
|
|
285
|
+
borderRadius: 999,
|
|
286
|
+
overflow: 'hidden'
|
|
287
|
+
},
|
|
288
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
|
|
289
|
+
style: {
|
|
290
|
+
width: `${Math.max(0, Math.min(100, progress))}%`,
|
|
291
|
+
height: '100%',
|
|
292
|
+
background: 'var(--app-primary-color, #2f80ed)',
|
|
293
|
+
transition: 'width 0.2s ease'
|
|
294
|
+
}
|
|
295
|
+
})
|
|
296
|
+
}),
|
|
297
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
|
|
298
|
+
style: {
|
|
299
|
+
marginTop: 8,
|
|
300
|
+
textAlign: 'right',
|
|
301
|
+
fontSize: 12,
|
|
302
|
+
color: palette.text
|
|
303
|
+
},
|
|
304
|
+
children: [
|
|
305
|
+
progress,
|
|
306
|
+
"%"
|
|
307
|
+
]
|
|
308
|
+
})
|
|
309
|
+
]
|
|
227
310
|
}),
|
|
228
311
|
/*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
|
|
229
312
|
role: "status",
|
|
230
313
|
"aria-live": "polite",
|
|
231
314
|
style: {
|
|
232
315
|
fontSize: 14,
|
|
233
|
-
color:
|
|
316
|
+
color: palette.text,
|
|
234
317
|
textAlign: 'center'
|
|
235
318
|
},
|
|
236
319
|
children: [
|
|
@@ -238,7 +321,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
238
321
|
estimatedTime !== null && estimatedTime > 0 && /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
|
|
239
322
|
style: {
|
|
240
323
|
fontSize: 12,
|
|
241
|
-
color:
|
|
324
|
+
color: palette.subText,
|
|
242
325
|
marginTop: 8
|
|
243
326
|
},
|
|
244
327
|
children: [
|
|
@@ -248,6 +331,9 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
248
331
|
]
|
|
249
332
|
})
|
|
250
333
|
]
|
|
334
|
+
}),
|
|
335
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)("style", {
|
|
336
|
+
children: `@keyframes secra-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }`
|
|
251
337
|
})
|
|
252
338
|
]
|
|
253
339
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/splash/SplashScreen.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef, memo, useCallback } from 'react';\nimport { Spin, Progress } from 'antd';\nimport { logger } from '../../utils';\nimport { initialization, initializationErrorState } from '../initialization';\nimport type { StartOptions, SplashScreenCustomProps } from '../types';\nimport type { InitializationContext } from '../initialization';\n\ninterface SplashScreenProps {\n options: StartOptions;\n onComplete: (context: InitializationContext) => void;\n}\n\n/**\n * 启动页组件\n * \n * 在启动页中执行初始化,并使用 Ant Design 5 的 Spin 和 Progress 组件展示启动进度\n */\nconst SplashScreen: React.FC<SplashScreenProps> = memo(({ options, onComplete }) => {\n const [progress, setProgress] = useState(0);\n const [currentStep, setCurrentStep] = useState<string>('准备初始化...');\n const [isInitializing, setIsInitializing] = useState(false);\n const [estimatedTime, setEstimatedTime] = useState<number | null>(null);\n const hasCompletedRef = useRef(false);\n const onCompleteRef = useRef(onComplete);\n const optionsRef = useRef(options);\n const startTimeRef = useRef<number>(Date.now());\n const minDisplayTimeRef = useRef<number>(options.minSplashScreenTime ?? 500); // 最小显示时间,默认 500ms\n const progressUpdateTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const rafRef = useRef<number | null>(null);\n const lastProgressRef = useRef(0);\n const progressHistoryRef = useRef<Array<{ progress: number; time: number }>>([]);\n\n // 保持引用最新\n useEffect(() => {\n onCompleteRef.current = onComplete;\n optionsRef.current = options;\n minDisplayTimeRef.current = options.minSplashScreenTime ?? 500;\n }, [onComplete, options]);\n\n // 自适应防抖进度更新函数(使用 requestAnimationFrame 优化)\n const debouncedProgressUpdate = useCallback((progressValue: number, step?: string) => {\n // 取消之前的更新\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n\n // 记录进度历史用于时间预估\n const now = Date.now();\n progressHistoryRef.current.push({ progress: progressValue, time: now });\n // 只保留最近10个记录\n if (progressHistoryRef.current.length > 10) {\n progressHistoryRef.current.shift();\n }\n\n // 计算预估时间\n if (progressHistoryRef.current.length >= 2 && progressValue > 0) {\n const history = progressHistoryRef.current;\n const first = history[0]!;\n const last = history[history.length - 1]!;\n const progressDelta = last.progress - first.progress;\n const timeDelta = last.time - first.time;\n\n if (progressDelta > 0 && timeDelta > 0) {\n const progressPerMs = progressDelta / timeDelta;\n const remainingProgress = 100 - progressValue;\n const estimatedMs = remainingProgress / progressPerMs;\n setEstimatedTime(Math.max(0, Math.round(estimatedMs)));\n }\n }\n\n // 使用 requestAnimationFrame 优化更新\n rafRef.current = requestAnimationFrame(() => {\n setProgress(progressValue);\n if (step) {\n setCurrentStep(step);\n }\n lastProgressRef.current = progressValue;\n rafRef.current = null;\n });\n }, []);\n\n useEffect(() => {\n if (hasCompletedRef.current) return;\n hasCompletedRef.current = true;\n startTimeRef.current = Date.now();\n\n const performInitialization = async () => {\n try {\n setIsInitializing(true);\n setProgress(0);\n setCurrentStep('开始初始化...');\n\n logger.info('启动页开始执行初始化');\n\n // 执行初始化,传入防抖的进度回调\n const context = await initialization(optionsRef.current, (progressValue, step) => {\n debouncedProgressUpdate(progressValue, step);\n });\n\n logger.info('启动页初始化完成', context);\n\n // 动态调整最小显示时间(如果初始化很快,减少最小显示时间)\n const elapsedTime = Date.now() - startTimeRef.current;\n const dynamicMinTime = elapsedTime < 200 ? Math.min(minDisplayTimeRef.current, 300) : minDisplayTimeRef.current;\n const remainingTime = Math.max(0, dynamicMinTime - elapsedTime);\n\n if (remainingTime > 0) {\n await new Promise((resolve) => setTimeout(resolve, remainingTime));\n }\n\n // 清理防抖定时器\n if (progressUpdateTimerRef.current) {\n clearTimeout(progressUpdateTimerRef.current);\n progressUpdateTimerRef.current = null;\n }\n\n // 确保进度条显示 100%\n setProgress(100);\n setCurrentStep('初始化完成');\n\n // 初始化完成,调用回调\n onCompleteRef.current(context);\n } catch (error) {\n logger.error('启动页初始化失败:', error);\n // 设置错误状态,让 ErrorBoundary 能够捕获\n initializationErrorState.setError(error);\n setCurrentStep('初始化失败,请刷新页面重试');\n // 即使失败也调用 onComplete,让应用能够处理错误\n onCompleteRef.current({\n config: {},\n progress: 0,\n isReady: false,\n duration: 0,\n });\n } finally {\n setIsInitializing(false);\n }\n };\n\n performInitialization();\n\n // 清理函数\n return () => {\n if (progressUpdateTimerRef.current) {\n clearTimeout(progressUpdateTimerRef.current);\n }\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [debouncedProgressUpdate]);\n\n // 如果提供了自定义启动屏组件,使用自定义组件\n const CustomSplashScreen = optionsRef.current.splashScreen;\n if (CustomSplashScreen) {\n const customProps: SplashScreenCustomProps = {\n progress,\n currentStep,\n isInitializing,\n };\n return <CustomSplashScreen {...customProps} />;\n }\n\n // 默认启动屏 UI\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"应用正在加载\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n width: '100%',\n gap: 24,\n }}\n >\n <Spin size=\"large\" spinning={isInitializing} aria-label=\"加载中\" />\n <div style={{ width: '300px' }}>\n <Progress\n percent={progress}\n status={isInitializing ? 'active' : 'success'}\n showInfo\n aria-label={`加载进度 ${progress}%`}\n />\n </div>\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={{\n fontSize: 14,\n color: '#666',\n textAlign: 'center',\n }}\n >\n {currentStep}\n {estimatedTime !== null && estimatedTime > 0 && (\n <div style={{ fontSize: 12, color: '#999', marginTop: 8 }}>\n 预计还需 {Math.ceil(estimatedTime / 1000)} 秒\n </div>\n )}\n </div>\n </div>\n );\n});\n\nSplashScreen.displayName = 'SplashScreen';\n\nexport { SplashScreen };"],"names":["SplashScreen","memo","options","onComplete","progress","setProgress","useState","currentStep","setCurrentStep","isInitializing","setIsInitializing","estimatedTime","setEstimatedTime","hasCompletedRef","useRef","onCompleteRef","optionsRef","startTimeRef","Date","now","minDisplayTimeRef","minSplashScreenTime","progressUpdateTimerRef","rafRef","lastProgressRef","progressHistoryRef","useEffect","current","debouncedProgressUpdate","useCallback","progressValue","step","cancelAnimationFrame","push","time","length","shift","history","first","last","progressDelta","timeDelta","progressPerMs","remainingProgress","estimatedMs","Math","max","round","requestAnimationFrame","performInitialization","logger","info","context","initialization","elapsedTime","dynamicMinTime","min","remainingTime","Promise","resolve","setTimeout","clearTimeout","error","initializationErrorState","setError","config","isReady","duration","CustomSplashScreen","splashScreen","customProps","div","role","aria-live","aria-label","style","display","flexDirection","alignItems","justifyContent","height","width","gap","Spin","size","spinning","Progress","percent","status","showInfo","fontSize","color","textAlign","marginTop","ceil","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/splash/SplashScreen.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef, memo, useCallback } from 'react';\nimport { logger } from '../../utils';\nimport { initialization, initializationErrorState } from '../initialization';\nimport type { StartOptions, SplashScreenCustomProps } from '../types';\nimport type { InitializationContext } from '../initialization';\n\ninterface SplashScreenProps {\n options: StartOptions;\n onComplete: (context: InitializationContext) => void;\n}\n\n/**\n * 启动页组件\n * \n * 在启动页中执行初始化,并使用 Ant Design 5 的 Spin 和 Progress 组件展示启动进度\n */\nconst SplashScreen: React.FC<SplashScreenProps> = memo(({ options, onComplete }) => {\n const [progress, setProgress] = useState(0);\n const [currentStep, setCurrentStep] = useState<string>('准备初始化...');\n const [isInitializing, setIsInitializing] = useState(false);\n const [estimatedTime, setEstimatedTime] = useState<number | null>(null);\n const [isSystemDark, setIsSystemDark] = useState<boolean>(() => {\n if (typeof window === 'undefined') {\n return false;\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n });\n const hasCompletedRef = useRef(false);\n const onCompleteRef = useRef(onComplete);\n const optionsRef = useRef(options);\n const startTimeRef = useRef<number>(Date.now());\n const minDisplayTimeRef = useRef<number>(options.minSplashScreenTime ?? 500); // 最小显示时间,默认 500ms\n const progressUpdateTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const rafRef = useRef<number | null>(null);\n const lastProgressRef = useRef(0);\n const progressHistoryRef = useRef<Array<{ progress: number; time: number }>>([]);\n\n // 保持引用最新\n useEffect(() => {\n onCompleteRef.current = onComplete;\n optionsRef.current = options;\n minDisplayTimeRef.current = options.minSplashScreenTime ?? 500;\n }, [onComplete, options]);\n\n // 自适应防抖进度更新函数(使用 requestAnimationFrame 优化)\n const debouncedProgressUpdate = useCallback((progressValue: number, step?: string) => {\n // 取消之前的更新\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n\n // 记录进度历史用于时间预估\n const now = Date.now();\n progressHistoryRef.current.push({ progress: progressValue, time: now });\n // 只保留最近10个记录\n if (progressHistoryRef.current.length > 10) {\n progressHistoryRef.current.shift();\n }\n\n // 计算预估时间\n if (progressHistoryRef.current.length >= 2 && progressValue > 0) {\n const history = progressHistoryRef.current;\n const first = history[0]!;\n const last = history[history.length - 1]!;\n const progressDelta = last.progress - first.progress;\n const timeDelta = last.time - first.time;\n\n if (progressDelta > 0 && timeDelta > 0) {\n const progressPerMs = progressDelta / timeDelta;\n const remainingProgress = 100 - progressValue;\n const estimatedMs = remainingProgress / progressPerMs;\n setEstimatedTime(Math.max(0, Math.round(estimatedMs)));\n }\n }\n\n // 使用 requestAnimationFrame 优化更新\n rafRef.current = requestAnimationFrame(() => {\n setProgress(progressValue);\n if (step) {\n setCurrentStep(step);\n }\n lastProgressRef.current = progressValue;\n rafRef.current = null;\n });\n }, []);\n\n useEffect(() => {\n if (hasCompletedRef.current) return;\n hasCompletedRef.current = true;\n startTimeRef.current = Date.now();\n\n const performInitialization = async () => {\n try {\n setIsInitializing(true);\n setProgress(0);\n setCurrentStep('开始初始化...');\n\n logger.info('启动页开始执行初始化');\n\n // 执行初始化,传入防抖的进度回调\n const context = await initialization(optionsRef.current, (progressValue, step) => {\n debouncedProgressUpdate(progressValue, step);\n });\n\n logger.info('启动页初始化完成', context);\n\n // 动态调整最小显示时间(如果初始化很快,减少最小显示时间)\n const elapsedTime = Date.now() - startTimeRef.current;\n const dynamicMinTime = elapsedTime < 200 ? Math.min(minDisplayTimeRef.current, 300) : minDisplayTimeRef.current;\n const remainingTime = Math.max(0, dynamicMinTime - elapsedTime);\n\n if (remainingTime > 0) {\n await new Promise((resolve) => setTimeout(resolve, remainingTime));\n }\n\n // 清理防抖定时器\n if (progressUpdateTimerRef.current) {\n clearTimeout(progressUpdateTimerRef.current);\n progressUpdateTimerRef.current = null;\n }\n\n // 确保进度条显示 100%\n setProgress(100);\n setCurrentStep('初始化完成');\n\n // 初始化完成,调用回调\n onCompleteRef.current(context);\n } catch (error) {\n logger.error('启动页初始化失败:', error);\n // 设置错误状态,让 ErrorBoundary 能够捕获\n initializationErrorState.setError(error);\n setCurrentStep('初始化失败,请刷新页面重试');\n // 即使失败也调用 onComplete,让应用能够处理错误\n onCompleteRef.current({\n config: {},\n progress: 0,\n isReady: false,\n duration: 0,\n });\n } finally {\n setIsInitializing(false);\n }\n };\n\n performInitialization();\n\n // 清理函数\n return () => {\n if (progressUpdateTimerRef.current) {\n clearTimeout(progressUpdateTimerRef.current);\n }\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [debouncedProgressUpdate]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const onSystemThemeChange = (event: MediaQueryListEvent) => {\n setIsSystemDark(event.matches);\n };\n\n setIsSystemDark(mediaQuery.matches);\n\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', onSystemThemeChange);\n return () => mediaQuery.removeEventListener('change', onSystemThemeChange);\n }\n\n mediaQuery.addListener(onSystemThemeChange);\n return () => mediaQuery.removeListener(onSystemThemeChange);\n }, []);\n\n const resolvedMode = React.useMemo<'light' | 'dark'>(() => {\n const mode = optionsRef.current.theme?.mode || 'light';\n if (mode === 'system') {\n return isSystemDark ? 'dark' : 'light';\n }\n return mode === 'dark' ? 'dark' : 'light';\n }, [isSystemDark]);\n\n const palette = React.useMemo(() => {\n if (resolvedMode === 'dark') {\n return {\n background: '#0b1220',\n text: '#e2e8f0',\n subText: '#94a3b8',\n track: '#1f2937',\n spinnerTrack: '#334155',\n };\n }\n\n return {\n background: '#f5f7fb',\n text: '#51606f',\n subText: '#94a3b8',\n track: '#e9eff5',\n spinnerTrack: '#d9e2ec',\n };\n }, [resolvedMode]);\n\n // 如果提供了自定义启动屏组件,使用自定义组件\n const CustomSplashScreen = optionsRef.current.splashScreen;\n if (CustomSplashScreen) {\n const customProps: SplashScreenCustomProps = {\n progress,\n currentStep,\n isInitializing,\n };\n return <CustomSplashScreen {...customProps} />;\n }\n\n // 默认启动屏 UI\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"应用正在加载\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n width: '100%',\n gap: 24,\n background: palette.background,\n color: palette.text,\n }}\n >\n <div\n aria-label=\"加载中\"\n style={{\n width: 42,\n height: 42,\n border: `4px solid ${palette.spinnerTrack}`,\n borderTopColor: 'var(--app-primary-color, #2f80ed)',\n borderRadius: '50%',\n animation: 'secra-spin 1s linear infinite',\n }}\n />\n <div style={{ width: '300px' }}>\n <div\n aria-label={`加载进度 ${progress}%`}\n style={{\n height: 12,\n background: palette.track,\n borderRadius: 999,\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${Math.max(0, Math.min(100, progress))}%`,\n height: '100%',\n background: 'var(--app-primary-color, #2f80ed)',\n transition: 'width 0.2s ease',\n }}\n />\n </div>\n <div style={{ marginTop: 8, textAlign: 'right', fontSize: 12, color: palette.text }}>\n {progress}%\n </div>\n </div>\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={{\n fontSize: 14,\n color: palette.text,\n textAlign: 'center',\n }}\n >\n {currentStep}\n {estimatedTime !== null && estimatedTime > 0 && (\n <div style={{ fontSize: 12, color: palette.subText, marginTop: 8 }}>\n 预计还需 {Math.ceil(estimatedTime / 1000)} 秒\n </div>\n )}\n </div>\n <style>\n {`@keyframes secra-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }`}\n </style>\n </div>\n );\n});\n\nSplashScreen.displayName = 'SplashScreen';\n\nexport { SplashScreen };\n"],"names":["SplashScreen","memo","options","onComplete","progress","setProgress","useState","currentStep","setCurrentStep","isInitializing","setIsInitializing","estimatedTime","setEstimatedTime","isSystemDark","setIsSystemDark","window","matchMedia","matches","hasCompletedRef","useRef","onCompleteRef","optionsRef","startTimeRef","Date","now","minDisplayTimeRef","minSplashScreenTime","progressUpdateTimerRef","rafRef","lastProgressRef","progressHistoryRef","useEffect","current","debouncedProgressUpdate","useCallback","progressValue","step","cancelAnimationFrame","push","time","length","shift","history","first","last","progressDelta","timeDelta","progressPerMs","remainingProgress","estimatedMs","Math","max","round","requestAnimationFrame","performInitialization","logger","info","context","initialization","elapsedTime","dynamicMinTime","min","remainingTime","Promise","resolve","setTimeout","clearTimeout","error","initializationErrorState","setError","config","isReady","duration","mediaQuery","onSystemThemeChange","event","addEventListener","removeEventListener","addListener","removeListener","resolvedMode","React","useMemo","mode","theme","palette","background","text","subText","track","spinnerTrack","CustomSplashScreen","splashScreen","customProps","div","role","aria-live","aria-label","style","display","flexDirection","alignItems","justifyContent","height","width","gap","color","border","borderTopColor","borderRadius","animation","overflow","transition","marginTop","textAlign","fontSize","ceil","displayName"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useEffect, useState, useRef, memo, useCallback } from "react";
|
|
3
|
-
import { Spin, Progress } from "antd";
|
|
4
3
|
import { logger } from "../../utils";
|
|
5
4
|
import { initialization, initializationErrorState } from "../initialization";
|
|
6
5
|
/**
|
|
@@ -12,6 +11,12 @@ import { initialization, initializationErrorState } from "../initialization";
|
|
|
12
11
|
const [currentStep, setCurrentStep] = useState('准备初始化...');
|
|
13
12
|
const [isInitializing, setIsInitializing] = useState(false);
|
|
14
13
|
const [estimatedTime, setEstimatedTime] = useState(null);
|
|
14
|
+
const [isSystemDark, setIsSystemDark] = useState(()=>{
|
|
15
|
+
if (typeof window === 'undefined') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
19
|
+
});
|
|
15
20
|
const hasCompletedRef = useRef(false);
|
|
16
21
|
const onCompleteRef = useRef(onComplete);
|
|
17
22
|
const optionsRef = useRef(options);
|
|
@@ -131,6 +136,51 @@ import { initialization, initializationErrorState } from "../initialization";
|
|
|
131
136
|
}, [
|
|
132
137
|
debouncedProgressUpdate
|
|
133
138
|
]);
|
|
139
|
+
useEffect(()=>{
|
|
140
|
+
if (typeof window === 'undefined') {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
144
|
+
const onSystemThemeChange = (event)=>{
|
|
145
|
+
setIsSystemDark(event.matches);
|
|
146
|
+
};
|
|
147
|
+
setIsSystemDark(mediaQuery.matches);
|
|
148
|
+
if (typeof mediaQuery.addEventListener === 'function') {
|
|
149
|
+
mediaQuery.addEventListener('change', onSystemThemeChange);
|
|
150
|
+
return ()=>mediaQuery.removeEventListener('change', onSystemThemeChange);
|
|
151
|
+
}
|
|
152
|
+
mediaQuery.addListener(onSystemThemeChange);
|
|
153
|
+
return ()=>mediaQuery.removeListener(onSystemThemeChange);
|
|
154
|
+
}, []);
|
|
155
|
+
const resolvedMode = React.useMemo(()=>{
|
|
156
|
+
const mode = optionsRef.current.theme?.mode || 'light';
|
|
157
|
+
if (mode === 'system') {
|
|
158
|
+
return isSystemDark ? 'dark' : 'light';
|
|
159
|
+
}
|
|
160
|
+
return mode === 'dark' ? 'dark' : 'light';
|
|
161
|
+
}, [
|
|
162
|
+
isSystemDark
|
|
163
|
+
]);
|
|
164
|
+
const palette = React.useMemo(()=>{
|
|
165
|
+
if (resolvedMode === 'dark') {
|
|
166
|
+
return {
|
|
167
|
+
background: '#0b1220',
|
|
168
|
+
text: '#e2e8f0',
|
|
169
|
+
subText: '#94a3b8',
|
|
170
|
+
track: '#1f2937',
|
|
171
|
+
spinnerTrack: '#334155'
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
background: '#f5f7fb',
|
|
176
|
+
text: '#51606f',
|
|
177
|
+
subText: '#94a3b8',
|
|
178
|
+
track: '#e9eff5',
|
|
179
|
+
spinnerTrack: '#d9e2ec'
|
|
180
|
+
};
|
|
181
|
+
}, [
|
|
182
|
+
resolvedMode
|
|
183
|
+
]);
|
|
134
184
|
// 如果提供了自定义启动屏组件,使用自定义组件
|
|
135
185
|
const CustomSplashScreen = optionsRef.current.splashScreen;
|
|
136
186
|
if (CustomSplashScreen) {
|
|
@@ -155,31 +205,64 @@ import { initialization, initializationErrorState } from "../initialization";
|
|
|
155
205
|
justifyContent: 'center',
|
|
156
206
|
height: '100vh',
|
|
157
207
|
width: '100%',
|
|
158
|
-
gap: 24
|
|
208
|
+
gap: 24,
|
|
209
|
+
background: palette.background,
|
|
210
|
+
color: palette.text
|
|
159
211
|
},
|
|
160
212
|
children: [
|
|
161
|
-
/*#__PURE__*/ _jsx(Spin, {
|
|
162
|
-
size: "large",
|
|
163
|
-
spinning: isInitializing,
|
|
164
|
-
"aria-label": "加载中"
|
|
165
|
-
}),
|
|
166
213
|
/*#__PURE__*/ _jsx("div", {
|
|
214
|
+
"aria-label": "加载中",
|
|
215
|
+
style: {
|
|
216
|
+
width: 42,
|
|
217
|
+
height: 42,
|
|
218
|
+
border: `4px solid ${palette.spinnerTrack}`,
|
|
219
|
+
borderTopColor: 'var(--app-primary-color, #2f80ed)',
|
|
220
|
+
borderRadius: '50%',
|
|
221
|
+
animation: 'secra-spin 1s linear infinite'
|
|
222
|
+
}
|
|
223
|
+
}),
|
|
224
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
167
225
|
style: {
|
|
168
226
|
width: '300px'
|
|
169
227
|
},
|
|
170
|
-
children:
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
228
|
+
children: [
|
|
229
|
+
/*#__PURE__*/ _jsx("div", {
|
|
230
|
+
"aria-label": `加载进度 ${progress}%`,
|
|
231
|
+
style: {
|
|
232
|
+
height: 12,
|
|
233
|
+
background: palette.track,
|
|
234
|
+
borderRadius: 999,
|
|
235
|
+
overflow: 'hidden'
|
|
236
|
+
},
|
|
237
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
238
|
+
style: {
|
|
239
|
+
width: `${Math.max(0, Math.min(100, progress))}%`,
|
|
240
|
+
height: '100%',
|
|
241
|
+
background: 'var(--app-primary-color, #2f80ed)',
|
|
242
|
+
transition: 'width 0.2s ease'
|
|
243
|
+
}
|
|
244
|
+
})
|
|
245
|
+
}),
|
|
246
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
247
|
+
style: {
|
|
248
|
+
marginTop: 8,
|
|
249
|
+
textAlign: 'right',
|
|
250
|
+
fontSize: 12,
|
|
251
|
+
color: palette.text
|
|
252
|
+
},
|
|
253
|
+
children: [
|
|
254
|
+
progress,
|
|
255
|
+
"%"
|
|
256
|
+
]
|
|
257
|
+
})
|
|
258
|
+
]
|
|
176
259
|
}),
|
|
177
260
|
/*#__PURE__*/ _jsxs("div", {
|
|
178
261
|
role: "status",
|
|
179
262
|
"aria-live": "polite",
|
|
180
263
|
style: {
|
|
181
264
|
fontSize: 14,
|
|
182
|
-
color:
|
|
265
|
+
color: palette.text,
|
|
183
266
|
textAlign: 'center'
|
|
184
267
|
},
|
|
185
268
|
children: [
|
|
@@ -187,7 +270,7 @@ import { initialization, initializationErrorState } from "../initialization";
|
|
|
187
270
|
estimatedTime !== null && estimatedTime > 0 && /*#__PURE__*/ _jsxs("div", {
|
|
188
271
|
style: {
|
|
189
272
|
fontSize: 12,
|
|
190
|
-
color:
|
|
273
|
+
color: palette.subText,
|
|
191
274
|
marginTop: 8
|
|
192
275
|
},
|
|
193
276
|
children: [
|
|
@@ -197,6 +280,9 @@ import { initialization, initializationErrorState } from "../initialization";
|
|
|
197
280
|
]
|
|
198
281
|
})
|
|
199
282
|
]
|
|
283
|
+
}),
|
|
284
|
+
/*#__PURE__*/ _jsx("style", {
|
|
285
|
+
children: `@keyframes secra-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }`
|
|
200
286
|
})
|
|
201
287
|
]
|
|
202
288
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/splash/SplashScreen.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef, memo, useCallback } from 'react';\nimport { Spin, Progress } from 'antd';\nimport { logger } from '../../utils';\nimport { initialization, initializationErrorState } from '../initialization';\nimport type { StartOptions, SplashScreenCustomProps } from '../types';\nimport type { InitializationContext } from '../initialization';\n\ninterface SplashScreenProps {\n options: StartOptions;\n onComplete: (context: InitializationContext) => void;\n}\n\n/**\n * 启动页组件\n * \n * 在启动页中执行初始化,并使用 Ant Design 5 的 Spin 和 Progress 组件展示启动进度\n */\nconst SplashScreen: React.FC<SplashScreenProps> = memo(({ options, onComplete }) => {\n const [progress, setProgress] = useState(0);\n const [currentStep, setCurrentStep] = useState<string>('准备初始化...');\n const [isInitializing, setIsInitializing] = useState(false);\n const [estimatedTime, setEstimatedTime] = useState<number | null>(null);\n const hasCompletedRef = useRef(false);\n const onCompleteRef = useRef(onComplete);\n const optionsRef = useRef(options);\n const startTimeRef = useRef<number>(Date.now());\n const minDisplayTimeRef = useRef<number>(options.minSplashScreenTime ?? 500); // 最小显示时间,默认 500ms\n const progressUpdateTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const rafRef = useRef<number | null>(null);\n const lastProgressRef = useRef(0);\n const progressHistoryRef = useRef<Array<{ progress: number; time: number }>>([]);\n\n // 保持引用最新\n useEffect(() => {\n onCompleteRef.current = onComplete;\n optionsRef.current = options;\n minDisplayTimeRef.current = options.minSplashScreenTime ?? 500;\n }, [onComplete, options]);\n\n // 自适应防抖进度更新函数(使用 requestAnimationFrame 优化)\n const debouncedProgressUpdate = useCallback((progressValue: number, step?: string) => {\n // 取消之前的更新\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n\n // 记录进度历史用于时间预估\n const now = Date.now();\n progressHistoryRef.current.push({ progress: progressValue, time: now });\n // 只保留最近10个记录\n if (progressHistoryRef.current.length > 10) {\n progressHistoryRef.current.shift();\n }\n\n // 计算预估时间\n if (progressHistoryRef.current.length >= 2 && progressValue > 0) {\n const history = progressHistoryRef.current;\n const first = history[0]!;\n const last = history[history.length - 1]!;\n const progressDelta = last.progress - first.progress;\n const timeDelta = last.time - first.time;\n\n if (progressDelta > 0 && timeDelta > 0) {\n const progressPerMs = progressDelta / timeDelta;\n const remainingProgress = 100 - progressValue;\n const estimatedMs = remainingProgress / progressPerMs;\n setEstimatedTime(Math.max(0, Math.round(estimatedMs)));\n }\n }\n\n // 使用 requestAnimationFrame 优化更新\n rafRef.current = requestAnimationFrame(() => {\n setProgress(progressValue);\n if (step) {\n setCurrentStep(step);\n }\n lastProgressRef.current = progressValue;\n rafRef.current = null;\n });\n }, []);\n\n useEffect(() => {\n if (hasCompletedRef.current) return;\n hasCompletedRef.current = true;\n startTimeRef.current = Date.now();\n\n const performInitialization = async () => {\n try {\n setIsInitializing(true);\n setProgress(0);\n setCurrentStep('开始初始化...');\n\n logger.info('启动页开始执行初始化');\n\n // 执行初始化,传入防抖的进度回调\n const context = await initialization(optionsRef.current, (progressValue, step) => {\n debouncedProgressUpdate(progressValue, step);\n });\n\n logger.info('启动页初始化完成', context);\n\n // 动态调整最小显示时间(如果初始化很快,减少最小显示时间)\n const elapsedTime = Date.now() - startTimeRef.current;\n const dynamicMinTime = elapsedTime < 200 ? Math.min(minDisplayTimeRef.current, 300) : minDisplayTimeRef.current;\n const remainingTime = Math.max(0, dynamicMinTime - elapsedTime);\n\n if (remainingTime > 0) {\n await new Promise((resolve) => setTimeout(resolve, remainingTime));\n }\n\n // 清理防抖定时器\n if (progressUpdateTimerRef.current) {\n clearTimeout(progressUpdateTimerRef.current);\n progressUpdateTimerRef.current = null;\n }\n\n // 确保进度条显示 100%\n setProgress(100);\n setCurrentStep('初始化完成');\n\n // 初始化完成,调用回调\n onCompleteRef.current(context);\n } catch (error) {\n logger.error('启动页初始化失败:', error);\n // 设置错误状态,让 ErrorBoundary 能够捕获\n initializationErrorState.setError(error);\n setCurrentStep('初始化失败,请刷新页面重试');\n // 即使失败也调用 onComplete,让应用能够处理错误\n onCompleteRef.current({\n config: {},\n progress: 0,\n isReady: false,\n duration: 0,\n });\n } finally {\n setIsInitializing(false);\n }\n };\n\n performInitialization();\n\n // 清理函数\n return () => {\n if (progressUpdateTimerRef.current) {\n clearTimeout(progressUpdateTimerRef.current);\n }\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [debouncedProgressUpdate]);\n\n // 如果提供了自定义启动屏组件,使用自定义组件\n const CustomSplashScreen = optionsRef.current.splashScreen;\n if (CustomSplashScreen) {\n const customProps: SplashScreenCustomProps = {\n progress,\n currentStep,\n isInitializing,\n };\n return <CustomSplashScreen {...customProps} />;\n }\n\n // 默认启动屏 UI\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"应用正在加载\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n width: '100%',\n gap: 24,\n }}\n >\n <Spin size=\"large\" spinning={isInitializing} aria-label=\"加载中\" />\n <div style={{ width: '300px' }}>\n <Progress\n percent={progress}\n status={isInitializing ? 'active' : 'success'}\n showInfo\n aria-label={`加载进度 ${progress}%`}\n />\n </div>\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={{\n fontSize: 14,\n color: '#666',\n textAlign: 'center',\n }}\n >\n {currentStep}\n {estimatedTime !== null && estimatedTime > 0 && (\n <div style={{ fontSize: 12, color: '#999', marginTop: 8 }}>\n 预计还需 {Math.ceil(estimatedTime / 1000)} 秒\n </div>\n )}\n </div>\n </div>\n );\n});\n\nSplashScreen.displayName = 'SplashScreen';\n\nexport { SplashScreen };"],"names":["React","useEffect","useState","useRef","memo","useCallback","Spin","Progress","logger","initialization","initializationErrorState","SplashScreen","options","onComplete","progress","setProgress","currentStep","setCurrentStep","isInitializing","setIsInitializing","estimatedTime","setEstimatedTime","hasCompletedRef","onCompleteRef","optionsRef","startTimeRef","Date","now","minDisplayTimeRef","minSplashScreenTime","progressUpdateTimerRef","rafRef","lastProgressRef","progressHistoryRef","current","debouncedProgressUpdate","progressValue","step","cancelAnimationFrame","push","time","length","shift","history","first","last","progressDelta","timeDelta","progressPerMs","remainingProgress","estimatedMs","Math","max","round","requestAnimationFrame","performInitialization","info","context","elapsedTime","dynamicMinTime","min","remainingTime","Promise","resolve","setTimeout","clearTimeout","error","setError","config","isReady","duration","CustomSplashScreen","splashScreen","customProps","div","role","aria-live","aria-label","style","display","flexDirection","alignItems","justifyContent","height","width","gap","size","spinning","percent","status","showInfo","fontSize","color","textAlign","marginTop","ceil","displayName"],"mappings":";AAAA,OAAOA,SAASC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,WAAW,QAAQ,QAAQ;AAC9E,SAASC,IAAI,EAAEC,QAAQ,QAAQ,OAAO;AACtC,SAASC,MAAM,QAAQ,cAAc;AACrC,SAASC,cAAc,EAAEC,wBAAwB,QAAQ,oBAAoB;AAS7E;;;;CAIC,GACD,MAAMC,6BAA4CP,KAAK,CAAC,EAAEQ,OAAO,EAAEC,UAAU,EAAE;IAC7E,MAAM,CAACC,UAAUC,YAAY,GAAGb,SAAS;IACzC,MAAM,CAACc,aAAaC,eAAe,GAAGf,SAAiB;IACvD,MAAM,CAACgB,gBAAgBC,kBAAkB,GAAGjB,SAAS;IACrD,MAAM,CAACkB,eAAeC,iBAAiB,GAAGnB,SAAwB;IAClE,MAAMoB,kBAAkBnB,OAAO;IAC/B,MAAMoB,gBAAgBpB,OAAOU;IAC7B,MAAMW,aAAarB,OAAOS;IAC1B,MAAMa,eAAetB,OAAeuB,KAAKC,GAAG;IAC5C,MAAMC,oBAAoBzB,OAAeS,QAAQiB,mBAAmB,IAAI,MAAM,kBAAkB;IAChG,MAAMC,yBAAyB3B,OAA6C;IAC5E,MAAM4B,SAAS5B,OAAsB;IACrC,MAAM6B,kBAAkB7B,OAAO;IAC/B,MAAM8B,qBAAqB9B,OAAkD,EAAE;IAE/E,SAAS;IACTF,UAAU;QACRsB,cAAcW,OAAO,GAAGrB;QACxBW,WAAWU,OAAO,GAAGtB;QACrBgB,kBAAkBM,OAAO,GAAGtB,QAAQiB,mBAAmB,IAAI;IAC7D,GAAG;QAAChB;QAAYD;KAAQ;IAExB,2CAA2C;IAC3C,MAAMuB,0BAA0B9B,YAAY,CAAC+B,eAAuBC;QAClE,UAAU;QACV,IAAIN,OAAOG,OAAO,KAAK,MAAM;YAC3BI,qBAAqBP,OAAOG,OAAO;QACrC;QAEA,eAAe;QACf,MAAMP,MAAMD,KAAKC,GAAG;QACpBM,mBAAmBC,OAAO,CAACK,IAAI,CAAC;YAAEzB,UAAUsB;YAAeI,MAAMb;QAAI;QACrE,aAAa;QACb,IAAIM,mBAAmBC,OAAO,CAACO,MAAM,GAAG,IAAI;YAC1CR,mBAAmBC,OAAO,CAACQ,KAAK;QAClC;QAEA,SAAS;QACT,IAAIT,mBAAmBC,OAAO,CAACO,MAAM,IAAI,KAAKL,gBAAgB,GAAG;YAC/D,MAAMO,UAAUV,mBAAmBC,OAAO;YAC1C,MAAMU,QAAQD,OAAO,CAAC,EAAE;YACxB,MAAME,OAAOF,OAAO,CAACA,QAAQF,MAAM,GAAG,EAAE;YACxC,MAAMK,gBAAgBD,KAAK/B,QAAQ,GAAG8B,MAAM9B,QAAQ;YACpD,MAAMiC,YAAYF,KAAKL,IAAI,GAAGI,MAAMJ,IAAI;YAExC,IAAIM,gBAAgB,KAAKC,YAAY,GAAG;gBACtC,MAAMC,gBAAgBF,gBAAgBC;gBACtC,MAAME,oBAAoB,MAAMb;gBAChC,MAAMc,cAAcD,oBAAoBD;gBACxC3B,iBAAiB8B,KAAKC,GAAG,CAAC,GAAGD,KAAKE,KAAK,CAACH;YAC1C;QACF;QAEA,gCAAgC;QAChCnB,OAAOG,OAAO,GAAGoB,sBAAsB;YACrCvC,YAAYqB;YACZ,IAAIC,MAAM;gBACRpB,eAAeoB;YACjB;YACAL,gBAAgBE,OAAO,GAAGE;YAC1BL,OAAOG,OAAO,GAAG;QACnB;IACF,GAAG,EAAE;IAELjC,UAAU;QACR,IAAIqB,gBAAgBY,OAAO,EAAE;QAC7BZ,gBAAgBY,OAAO,GAAG;QAC1BT,aAAaS,OAAO,GAAGR,KAAKC,GAAG;QAE/B,MAAM4B,wBAAwB;YAC5B,IAAI;gBACFpC,kBAAkB;gBAClBJ,YAAY;gBACZE,eAAe;gBAEfT,OAAOgD,IAAI,CAAC;gBAEZ,kBAAkB;gBAClB,MAAMC,UAAU,MAAMhD,eAAee,WAAWU,OAAO,EAAE,CAACE,eAAeC;oBACvEF,wBAAwBC,eAAeC;gBACzC;gBAEA7B,OAAOgD,IAAI,CAAC,YAAYC;gBAExB,+BAA+B;gBAC/B,MAAMC,cAAchC,KAAKC,GAAG,KAAKF,aAAaS,OAAO;gBACrD,MAAMyB,iBAAiBD,cAAc,MAAMP,KAAKS,GAAG,CAAChC,kBAAkBM,OAAO,EAAE,OAAON,kBAAkBM,OAAO;gBAC/G,MAAM2B,gBAAgBV,KAAKC,GAAG,CAAC,GAAGO,iBAAiBD;gBAEnD,IAAIG,gBAAgB,GAAG;oBACrB,MAAM,IAAIC,QAAQ,CAACC,UAAYC,WAAWD,SAASF;gBACrD;gBAEA,UAAU;gBACV,IAAI/B,uBAAuBI,OAAO,EAAE;oBAClC+B,aAAanC,uBAAuBI,OAAO;oBAC3CJ,uBAAuBI,OAAO,GAAG;gBACnC;gBAEA,eAAe;gBACfnB,YAAY;gBACZE,eAAe;gBAEf,aAAa;gBACbM,cAAcW,OAAO,CAACuB;YACxB,EAAE,OAAOS,OAAO;gBACd1D,OAAO0D,KAAK,CAAC,aAAaA;gBAC1B,8BAA8B;gBAC9BxD,yBAAyByD,QAAQ,CAACD;gBAClCjD,eAAe;gBACf,+BAA+B;gBAC/BM,cAAcW,OAAO,CAAC;oBACpBkC,QAAQ,CAAC;oBACTtD,UAAU;oBACVuD,SAAS;oBACTC,UAAU;gBACZ;YACF,SAAU;gBACRnD,kBAAkB;YACpB;QACF;QAEAoC;QAEA,OAAO;QACP,OAAO;YACL,IAAIzB,uBAAuBI,OAAO,EAAE;gBAClC+B,aAAanC,uBAAuBI,OAAO;YAC7C;YACA,IAAIH,OAAOG,OAAO,KAAK,MAAM;gBAC3BI,qBAAqBP,OAAOG,OAAO;YACrC;QACF;IACF,GAAG;QAACC;KAAwB;IAE5B,wBAAwB;IACxB,MAAMoC,qBAAqB/C,WAAWU,OAAO,CAACsC,YAAY;IAC1D,IAAID,oBAAoB;QACtB,MAAME,cAAuC;YAC3C3D;YACAE;YACAE;QACF;QACA,qBAAO,KAACqD;YAAoB,GAAGE,WAAW;;IAC5C;IAEA,WAAW;IACX,qBACE,MAACC;QACCC,MAAK;QACLC,aAAU;QACVC,cAAW;QACXC,OAAO;YACLC,SAAS;YACTC,eAAe;YACfC,YAAY;YACZC,gBAAgB;YAChBC,QAAQ;YACRC,OAAO;YACPC,KAAK;QACP;;0BAEA,KAAC/E;gBAAKgF,MAAK;gBAAQC,UAAUrE;gBAAgB2D,cAAW;;0BACxD,KAACH;gBAAII,OAAO;oBAAEM,OAAO;gBAAQ;0BAC3B,cAAA,KAAC7E;oBACCiF,SAAS1E;oBACT2E,QAAQvE,iBAAiB,WAAW;oBACpCwE,QAAQ;oBACRb,cAAY,CAAC,KAAK,EAAE/D,SAAS,CAAC,CAAC;;;0BAGnC,MAAC4D;gBACCC,MAAK;gBACLC,aAAU;gBACVE,OAAO;oBACLa,UAAU;oBACVC,OAAO;oBACPC,WAAW;gBACb;;oBAEC7E;oBACAI,kBAAkB,QAAQA,gBAAgB,mBACzC,MAACsD;wBAAII,OAAO;4BAAEa,UAAU;4BAAIC,OAAO;4BAAQE,WAAW;wBAAE;;4BAAG;4BACnD3C,KAAK4C,IAAI,CAAC3E,gBAAgB;4BAAM;;;;;;;AAMlD;AAEAT,aAAaqF,WAAW,GAAG;AAE3B,SAASrF,YAAY,GAAG"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/splash/SplashScreen.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef, memo, useCallback } from 'react';\nimport { logger } from '../../utils';\nimport { initialization, initializationErrorState } from '../initialization';\nimport type { StartOptions, SplashScreenCustomProps } from '../types';\nimport type { InitializationContext } from '../initialization';\n\ninterface SplashScreenProps {\n options: StartOptions;\n onComplete: (context: InitializationContext) => void;\n}\n\n/**\n * 启动页组件\n * \n * 在启动页中执行初始化,并使用 Ant Design 5 的 Spin 和 Progress 组件展示启动进度\n */\nconst SplashScreen: React.FC<SplashScreenProps> = memo(({ options, onComplete }) => {\n const [progress, setProgress] = useState(0);\n const [currentStep, setCurrentStep] = useState<string>('准备初始化...');\n const [isInitializing, setIsInitializing] = useState(false);\n const [estimatedTime, setEstimatedTime] = useState<number | null>(null);\n const [isSystemDark, setIsSystemDark] = useState<boolean>(() => {\n if (typeof window === 'undefined') {\n return false;\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n });\n const hasCompletedRef = useRef(false);\n const onCompleteRef = useRef(onComplete);\n const optionsRef = useRef(options);\n const startTimeRef = useRef<number>(Date.now());\n const minDisplayTimeRef = useRef<number>(options.minSplashScreenTime ?? 500); // 最小显示时间,默认 500ms\n const progressUpdateTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const rafRef = useRef<number | null>(null);\n const lastProgressRef = useRef(0);\n const progressHistoryRef = useRef<Array<{ progress: number; time: number }>>([]);\n\n // 保持引用最新\n useEffect(() => {\n onCompleteRef.current = onComplete;\n optionsRef.current = options;\n minDisplayTimeRef.current = options.minSplashScreenTime ?? 500;\n }, [onComplete, options]);\n\n // 自适应防抖进度更新函数(使用 requestAnimationFrame 优化)\n const debouncedProgressUpdate = useCallback((progressValue: number, step?: string) => {\n // 取消之前的更新\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n\n // 记录进度历史用于时间预估\n const now = Date.now();\n progressHistoryRef.current.push({ progress: progressValue, time: now });\n // 只保留最近10个记录\n if (progressHistoryRef.current.length > 10) {\n progressHistoryRef.current.shift();\n }\n\n // 计算预估时间\n if (progressHistoryRef.current.length >= 2 && progressValue > 0) {\n const history = progressHistoryRef.current;\n const first = history[0]!;\n const last = history[history.length - 1]!;\n const progressDelta = last.progress - first.progress;\n const timeDelta = last.time - first.time;\n\n if (progressDelta > 0 && timeDelta > 0) {\n const progressPerMs = progressDelta / timeDelta;\n const remainingProgress = 100 - progressValue;\n const estimatedMs = remainingProgress / progressPerMs;\n setEstimatedTime(Math.max(0, Math.round(estimatedMs)));\n }\n }\n\n // 使用 requestAnimationFrame 优化更新\n rafRef.current = requestAnimationFrame(() => {\n setProgress(progressValue);\n if (step) {\n setCurrentStep(step);\n }\n lastProgressRef.current = progressValue;\n rafRef.current = null;\n });\n }, []);\n\n useEffect(() => {\n if (hasCompletedRef.current) return;\n hasCompletedRef.current = true;\n startTimeRef.current = Date.now();\n\n const performInitialization = async () => {\n try {\n setIsInitializing(true);\n setProgress(0);\n setCurrentStep('开始初始化...');\n\n logger.info('启动页开始执行初始化');\n\n // 执行初始化,传入防抖的进度回调\n const context = await initialization(optionsRef.current, (progressValue, step) => {\n debouncedProgressUpdate(progressValue, step);\n });\n\n logger.info('启动页初始化完成', context);\n\n // 动态调整最小显示时间(如果初始化很快,减少最小显示时间)\n const elapsedTime = Date.now() - startTimeRef.current;\n const dynamicMinTime = elapsedTime < 200 ? Math.min(minDisplayTimeRef.current, 300) : minDisplayTimeRef.current;\n const remainingTime = Math.max(0, dynamicMinTime - elapsedTime);\n\n if (remainingTime > 0) {\n await new Promise((resolve) => setTimeout(resolve, remainingTime));\n }\n\n // 清理防抖定时器\n if (progressUpdateTimerRef.current) {\n clearTimeout(progressUpdateTimerRef.current);\n progressUpdateTimerRef.current = null;\n }\n\n // 确保进度条显示 100%\n setProgress(100);\n setCurrentStep('初始化完成');\n\n // 初始化完成,调用回调\n onCompleteRef.current(context);\n } catch (error) {\n logger.error('启动页初始化失败:', error);\n // 设置错误状态,让 ErrorBoundary 能够捕获\n initializationErrorState.setError(error);\n setCurrentStep('初始化失败,请刷新页面重试');\n // 即使失败也调用 onComplete,让应用能够处理错误\n onCompleteRef.current({\n config: {},\n progress: 0,\n isReady: false,\n duration: 0,\n });\n } finally {\n setIsInitializing(false);\n }\n };\n\n performInitialization();\n\n // 清理函数\n return () => {\n if (progressUpdateTimerRef.current) {\n clearTimeout(progressUpdateTimerRef.current);\n }\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [debouncedProgressUpdate]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const onSystemThemeChange = (event: MediaQueryListEvent) => {\n setIsSystemDark(event.matches);\n };\n\n setIsSystemDark(mediaQuery.matches);\n\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', onSystemThemeChange);\n return () => mediaQuery.removeEventListener('change', onSystemThemeChange);\n }\n\n mediaQuery.addListener(onSystemThemeChange);\n return () => mediaQuery.removeListener(onSystemThemeChange);\n }, []);\n\n const resolvedMode = React.useMemo<'light' | 'dark'>(() => {\n const mode = optionsRef.current.theme?.mode || 'light';\n if (mode === 'system') {\n return isSystemDark ? 'dark' : 'light';\n }\n return mode === 'dark' ? 'dark' : 'light';\n }, [isSystemDark]);\n\n const palette = React.useMemo(() => {\n if (resolvedMode === 'dark') {\n return {\n background: '#0b1220',\n text: '#e2e8f0',\n subText: '#94a3b8',\n track: '#1f2937',\n spinnerTrack: '#334155',\n };\n }\n\n return {\n background: '#f5f7fb',\n text: '#51606f',\n subText: '#94a3b8',\n track: '#e9eff5',\n spinnerTrack: '#d9e2ec',\n };\n }, [resolvedMode]);\n\n // 如果提供了自定义启动屏组件,使用自定义组件\n const CustomSplashScreen = optionsRef.current.splashScreen;\n if (CustomSplashScreen) {\n const customProps: SplashScreenCustomProps = {\n progress,\n currentStep,\n isInitializing,\n };\n return <CustomSplashScreen {...customProps} />;\n }\n\n // 默认启动屏 UI\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"应用正在加载\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n width: '100%',\n gap: 24,\n background: palette.background,\n color: palette.text,\n }}\n >\n <div\n aria-label=\"加载中\"\n style={{\n width: 42,\n height: 42,\n border: `4px solid ${palette.spinnerTrack}`,\n borderTopColor: 'var(--app-primary-color, #2f80ed)',\n borderRadius: '50%',\n animation: 'secra-spin 1s linear infinite',\n }}\n />\n <div style={{ width: '300px' }}>\n <div\n aria-label={`加载进度 ${progress}%`}\n style={{\n height: 12,\n background: palette.track,\n borderRadius: 999,\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${Math.max(0, Math.min(100, progress))}%`,\n height: '100%',\n background: 'var(--app-primary-color, #2f80ed)',\n transition: 'width 0.2s ease',\n }}\n />\n </div>\n <div style={{ marginTop: 8, textAlign: 'right', fontSize: 12, color: palette.text }}>\n {progress}%\n </div>\n </div>\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={{\n fontSize: 14,\n color: palette.text,\n textAlign: 'center',\n }}\n >\n {currentStep}\n {estimatedTime !== null && estimatedTime > 0 && (\n <div style={{ fontSize: 12, color: palette.subText, marginTop: 8 }}>\n 预计还需 {Math.ceil(estimatedTime / 1000)} 秒\n </div>\n )}\n </div>\n <style>\n {`@keyframes secra-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }`}\n </style>\n </div>\n );\n});\n\nSplashScreen.displayName = 'SplashScreen';\n\nexport { SplashScreen };\n"],"names":["React","useEffect","useState","useRef","memo","useCallback","logger","initialization","initializationErrorState","SplashScreen","options","onComplete","progress","setProgress","currentStep","setCurrentStep","isInitializing","setIsInitializing","estimatedTime","setEstimatedTime","isSystemDark","setIsSystemDark","window","matchMedia","matches","hasCompletedRef","onCompleteRef","optionsRef","startTimeRef","Date","now","minDisplayTimeRef","minSplashScreenTime","progressUpdateTimerRef","rafRef","lastProgressRef","progressHistoryRef","current","debouncedProgressUpdate","progressValue","step","cancelAnimationFrame","push","time","length","shift","history","first","last","progressDelta","timeDelta","progressPerMs","remainingProgress","estimatedMs","Math","max","round","requestAnimationFrame","performInitialization","info","context","elapsedTime","dynamicMinTime","min","remainingTime","Promise","resolve","setTimeout","clearTimeout","error","setError","config","isReady","duration","mediaQuery","onSystemThemeChange","event","addEventListener","removeEventListener","addListener","removeListener","resolvedMode","useMemo","mode","theme","palette","background","text","subText","track","spinnerTrack","CustomSplashScreen","splashScreen","customProps","div","role","aria-live","aria-label","style","display","flexDirection","alignItems","justifyContent","height","width","gap","color","border","borderTopColor","borderRadius","animation","overflow","transition","marginTop","textAlign","fontSize","ceil","displayName"],"mappings":"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"}
|