in packages/react-simulator-renderer/src/renderer.ts [251:360]
constructor() {
makeObservable(this);
this.autoRender = host.autoRender;
this.disposeFunctions.push(host.connect(this, () => {
// sync layout config
this._layout = host.project.get('config').layout;
// todo: split with others, not all should recompute
if (this._libraryMap !== host.libraryMap
|| this._componentsMap !== host.designer.componentsMap) {
this._libraryMap = host.libraryMap || {};
this._componentsMap = host.designer.componentsMap;
this.buildComponents();
}
// sync designMode
this._designMode = host.designMode;
this._locale = host.locale;
// sync requestHandlersMap
this._requestHandlersMap = host.requestHandlersMap;
// sync device
this._device = host.device;
}));
const documentInstanceMap = new Map<string, DocumentInstance>();
let initialEntry = '/';
let firstRun = true;
this.disposeFunctions.push(host.autorun(() => {
this._documentInstances = host.project.documents.map((doc) => {
let inst = documentInstanceMap.get(doc.id);
if (!inst) {
inst = new DocumentInstance(this, doc);
documentInstanceMap.set(doc.id, inst);
}
return inst;
});
const path = host.project.currentDocument
? documentInstanceMap.get(host.project.currentDocument.id)!.path
: '/';
if (firstRun) {
initialEntry = path;
firstRun = false;
} else if (this.history.location.pathname !== path) {
this.history.replace(path);
}
}));
const history = createMemoryHistory({
initialEntries: [initialEntry],
});
this.history = history;
history.listen((location) => {
const docId = location.pathname.slice(1);
docId && host.project.open(docId);
});
host.componentsConsumer.consume(async (componentsAsset) => {
if (componentsAsset) {
await this.load(componentsAsset);
this.buildComponents();
}
});
this._appContext = {
utils: {
router: {
push(path: string, params?: object) {
history.push(withQueryParams(path, params));
},
replace(path: string, params?: object) {
history.replace(withQueryParams(path, params));
},
},
legaoBuiltins: {
getUrlParams() {
const { search } = history.location;
return parseQuery(search);
},
},
i18n: {
setLocale: (loc: string) => {
this._appContext.utils.i18n.currentLocale = loc;
this._locale = loc;
},
currentLocale: this.locale,
messages: {},
},
...getProjectUtils(this._libraryMap, host.get('utilsMetadata')),
},
constants: {},
requestHandlersMap: this._requestHandlersMap,
};
host.injectionConsumer.consume((data) => {
// TODO: sync utils, i18n, contants,... config
const newCtx = {
...this._appContext,
};
merge(newCtx, data.appHelper || {});
this._appContext = newCtx;
});
host.i18nConsumer.consume((data) => {
const newCtx = {
...this._appContext,
};
newCtx.utils.i18n.messages = data || {};
this._appContext = newCtx;
});
}