mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-05 05:29:26 +08:00
* refactor: update umi version 3.x to version 4.x
* refactor: update react-router-dom version to 6.x
* refactor(react-router-dom): change Layout Component `props.children` to `<Outlet />`
* refactor(react-router-dom): change <Route /> props and <RouteSwitch /> correct
* refactor(react-router-dom): replace `<Redirect />` to `<Navigate replace />`
* refactor(react-router-dom): replace `useHistory` to `useNavigate`
* refactor(react-router-dom): replace `useRouteMatch` to `useParams`
* refactor(react-router-dom & dumi): fix <RouteSwitch /> & umi document bug
* refactor(react-router-dom): `useRoutes` Optimize `<RouteSwitch />` code
* refactor(react-router-dom): update `Route` types and docs
* refactor(react-router-dom): optimize RouteSwitch code
* refactor(react-router-dom): `useLocation` no generics type
* refactor(react-router-dom): add `less v3.9.0` to `resolutions` to solve the error of `gulp-less`
* refactor(react-router-dom): fix `<RouteSwitch />` `props.routes` as an array is not handled
* chore: upgrade `dumi` and refactor docs
* fix: completed code review, add `targets` to solve browser compatibility & removed `chainWebpack`
* refactor(dumi): upgraded dumi under `packages/core/client`
* refactor(dumi): delete `packages/core/dumi-theme-nocobase`
* refactor(dumi): degrade `react` & replace `dumi-theme-antd` to `dumi-theme-nocobase`
* refactor(dumi): solve conflicts between multiple dumi applications
* fix: login page error in react 17
* refactor(dumi): remove less resolutions
* refactor(dumi): umi add `msfu: true` config
* fix: merge bug
* fix: self code review
* fix: code reivew and test bug
* refactor: upgrade react to 18
* refactor: degrade react types to 17
* chore: fix ci error
* fix: support routerBase & fix workflow page params
* fix(doc): menu externel link
* fix: build error
* fix: delete
* fix: vitest error
* fix: react-router new code replace
* fix: vitest markdown error
* fix: title is none when refresh
* fix: merge error
* fix: sidebar width is wrong
* fix: useProps error
* fix: side-menu-width
* fix: menu selectId is wrong & useProps is string
* fix: menu selected first default & side menu hide when change
* fix: test error & v0.10 change log
* fix: new compnent doc modify
* fix: set umi `fastRefresh=false`
* refactor: application v2
* fix: improve code
* fix: bug
* fix: page = 0 error
* fix: workflow navigate error
* feat: plugin manager
* fix: afterAdd
* feat: update docs
* feat: update docs
* fix: page tab change not work
* fix: login redirect query param doesn't work
* fix: bug and doc
* feat: update docs
* fix: ci error
* fix: merge main
* feat: update docs
* feat: update docs
* feat: update docs
* chore(versions): 😊 publish v0.10.0-alpha.1
* fix: translations
* chore: backend node test max old space size
* docs: add useSearchParams
---------
Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: ChengLei Shao <chareice@live.com>
92 lines
2.5 KiB
TypeScript
92 lines
2.5 KiB
TypeScript
import { i18n } from 'i18next';
|
|
import { merge } from 'lodash';
|
|
import get from 'lodash/get';
|
|
import set from 'lodash/set';
|
|
import React from 'react';
|
|
import { createRoot } from 'react-dom/client';
|
|
import { I18nextProvider } from 'react-i18next';
|
|
import { APIClient, APIClientProvider } from '../api-client';
|
|
import { Plugin } from './Plugin';
|
|
import { PluginManager } from './PluginManager';
|
|
import { Router } from './Router';
|
|
import { AppComponent, defaultAppComponents } from './components';
|
|
import { ApplicationOptions } from './types';
|
|
|
|
export class Application {
|
|
providers: any[];
|
|
router: Router;
|
|
plugins: Map<string, Plugin>;
|
|
scopes: Record<string, any>;
|
|
i18n: i18n;
|
|
apiClient: APIClient;
|
|
components: any;
|
|
pm: PluginManager;
|
|
|
|
constructor(protected _options: ApplicationOptions) {
|
|
this.providers = [];
|
|
this.plugins = new Map<string, Plugin>();
|
|
this.scopes = merge(this.scopes, _options.scopes || {});
|
|
this.components = merge(defaultAppComponents, _options.components || {});
|
|
this.apiClient = new APIClient(_options.apiClient);
|
|
this.router = new Router(_options.router, { app: this });
|
|
this.pm = new PluginManager(this);
|
|
this.useDefaultProviders();
|
|
}
|
|
|
|
get options() {
|
|
return this._options;
|
|
}
|
|
|
|
useDefaultProviders() {
|
|
this.use([APIClientProvider, { apiClient: this.apiClient }]);
|
|
this.use(I18nextProvider, { i18n: this.i18n });
|
|
}
|
|
|
|
getPlugin(name: string) {
|
|
return this.plugins.get(name);
|
|
}
|
|
|
|
getComponent(name: string) {
|
|
return get(this.components, name);
|
|
}
|
|
|
|
renderComponent(name: string, props = {}) {
|
|
return React.createElement(this.getComponent(name), props);
|
|
}
|
|
|
|
registerComponent(name: string, component: any) {
|
|
set(this.components, name, component);
|
|
}
|
|
|
|
registerComponents(components: any) {
|
|
Object.keys(components).forEach((name) => {
|
|
this.registerComponent(name, components[name]);
|
|
});
|
|
}
|
|
|
|
registerScopes(scopes: Record<string, any>) {
|
|
this.scopes = merge(this.scopes, scopes);
|
|
}
|
|
|
|
use(component: any, props?: any) {
|
|
this.providers.push(props ? [component, props] : component);
|
|
}
|
|
|
|
async load() {
|
|
return this.pm.load();
|
|
}
|
|
|
|
getRootComponent() {
|
|
return () => <AppComponent app={this} />;
|
|
}
|
|
|
|
mount(selector: string) {
|
|
const container = typeof selector === 'string' ? document.querySelector(selector) : selector;
|
|
if (container) {
|
|
const App = this.getRootComponent();
|
|
const root = createRoot(container);
|
|
root.render(<App />);
|
|
}
|
|
}
|
|
}
|