sharded-gotify/ui/src/index.tsx

95 lines
2.8 KiB
TypeScript

import * as React from 'react';
import * as ReactDOM from 'react-dom';
import 'typeface-roboto';
import 'typeface-roboto-mono';
import {initAxios} from './apiAuth';
import * as config from './config';
import Layout from './layout/Layout';
import registerServiceWorker from './registerServiceWorker';
import * as Notifications from './snack/browserNotification';
import {CurrentUser} from './CurrentUser';
import {AppStore} from './application/AppStore';
import {reaction} from 'mobx';
import {WebSocketStore} from './message/WebSocketStore';
import {SnackManager} from './snack/SnackManager';
import {InjectProvider, StoreMapping} from './inject';
import {UserStore} from './user/UserStore';
import {MessagesStore} from './message/MessagesStore';
import {ClientStore} from './client/ClientStore';
const defaultDevConfig = {
url: 'http://localhost:80/',
};
const {port, hostname, protocol} = window.location;
const slashes = protocol.concat('//');
const url = slashes.concat(hostname.concat(':', port));
const urlWithSlash = url.endsWith('/') ? url : url.concat('/');
const defaultProdConfig = {
url: urlWithSlash,
};
declare global {
// tslint:disable-next-line
interface Window {
config: config.IConfig;
}
}
const initStores = (): StoreMapping => {
const snackManager = new SnackManager();
const appStore = new AppStore(snackManager.snack);
const userStore = new UserStore(snackManager.snack);
const messagesStore = new MessagesStore(appStore, snackManager.snack);
const currentUser = new CurrentUser(snackManager.snack);
const clientStore = new ClientStore(snackManager.snack);
const wsStore = new WebSocketStore(snackManager.snack, currentUser);
return {
appStore,
snackManager,
userStore,
messagesStore,
currentUser,
clientStore,
wsStore,
};
};
(function clientJS() {
Notifications.requestPermission();
if (process.env.NODE_ENV === 'production') {
config.set(window.config || defaultProdConfig);
} else {
config.set(window.config || defaultDevConfig);
}
const stores = initStores();
initAxios(stores.currentUser, stores.snackManager.snack);
reaction(
() => stores.currentUser.loggedIn,
(loggedIn) => {
if (loggedIn) {
stores.wsStore.listen((message) => {
stores.messagesStore.publishSingleMessage(message);
Notifications.notifyNewMessage(message);
});
} else {
stores.wsStore.close();
}
stores.appStore.refresh();
}
);
stores.currentUser.tryAuthenticate();
ReactDOM.render(
<InjectProvider stores={stores}>
<Layout />
</InjectProvider>,
document.getElementById('root')
);
registerServiceWorker();
})();