2
0
mirror of https://github.com/frappe/books.git synced 2024-12-23 11:29:03 +00:00
books/src/renderer.ts
18alantom 8d3d0a29ee incr: add logUnexpected
- prevent undefined rootType, log it instead
2022-09-20 22:49:09 +05:30

128 lines
3.4 KiB
TypeScript

import { ipcRenderer } from 'electron';
import { ConfigKeys } from 'fyo/core/types';
import { DateTime } from 'luxon';
import { CUSTOM_EVENTS, IPC_ACTIONS } from 'utils/messages';
import { UnexpectedLogObject } from 'utils/types';
import { App as VueApp, createApp } from 'vue';
import App from './App.vue';
import Badge from './components/Badge.vue';
import FeatherIcon from './components/FeatherIcon.vue';
import { getErrorHandled, handleError, sendError } from './errorHandling';
import { fyo } from './initFyo';
import { outsideClickDirective } from './renderer/helpers';
import registerIpcRendererListeners from './renderer/registerIpcRendererListeners';
import router from './router';
import { stringifyCircular } from './utils';
import { setLanguageMap } from './utils/language';
(async () => {
const language = fyo.config.get(ConfigKeys.Language) as string;
if (language) {
await setLanguageMap(language);
}
fyo.store.language = language || 'English';
ipcRenderer.send = getErrorHandled(ipcRenderer.send);
ipcRenderer.invoke = getErrorHandled(ipcRenderer.invoke);
registerIpcRendererListeners();
const { isDevelopment, platform, version } = (await ipcRenderer.invoke(
IPC_ACTIONS.GET_ENV
)) as { isDevelopment: boolean; platform: string; version: string };
fyo.store.isDevelopment = isDevelopment;
fyo.store.appVersion = version;
fyo.store.platform = platform;
const platformName = getPlatformName(platform);
setOnWindow(isDevelopment);
const app = createApp({
template: '<App/>',
});
app.config.unwrapInjectedRef = true;
setErrorHandlers(app);
app.use(router);
app.component('App', App);
app.component('FeatherIcon', FeatherIcon);
app.component('Badge', Badge);
app.directive('on-outside-click', outsideClickDirective);
app.mixin({
computed: {
fyo() {
return fyo;
},
platform() {
return platformName;
},
},
methods: {
t: fyo.t,
T: fyo.T,
},
});
await fyo.telemetry.logOpened();
app.mount('body');
})();
function setErrorHandlers(app: VueApp) {
window.onerror = (message, source, lineno, colno, error) => {
error = error ?? new Error('triggered in window.onerror');
handleError(true, error, { message, source, lineno, colno });
};
window.onunhandledrejection = (event: PromiseRejectionEvent) => {
const error = event.reason;
handleError(true, error).catch((err) => console.error(err));
};
window.addEventListener(CUSTOM_EVENTS.LOG_UNEXPECTED, (event) => {
const details = (event as CustomEvent)?.detail as UnexpectedLogObject;
sendError(details);
});
app.config.errorHandler = (err, vm, info) => {
const more: Record<string, unknown> = {
info,
};
if (vm) {
const { fullPath, params } = vm.$route;
more.fullPath = fullPath;
more.params = stringifyCircular(params ?? {});
more.props = stringifyCircular(vm.$props ?? {}, true, true);
}
handleError(false, err as Error, more);
console.error(err, vm, info);
};
}
function setOnWindow(isDevelopment: boolean) {
if (!isDevelopment) {
return;
}
// @ts-ignore
window.router = router;
// @ts-ignore
window.fyo = fyo;
// @ts-ignore
window.DateTime = DateTime;
}
function getPlatformName(platform: string) {
switch (platform) {
case 'win32':
return 'Windows';
case 'darwin':
return 'Mac';
case 'linux':
return 'Linux';
default:
return 'Linux';
}
}