You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
5.9 KiB
TypeScript

// Copyright (C) 2020-2022 Intel Corporation
//
// SPDX-License-Identifier: MIT
import React from 'react';
import ReactDOM from 'react-dom';
import { connect, Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';
import { getAboutAsync } from 'actions/about-actions';
import { authorizedAsync, loadAuthActionsAsync } from 'actions/auth-actions';
import { getFormatsAsync } from 'actions/formats-actions';
import { getModelsAsync } from 'actions/models-actions';
import { getPluginsAsync } from 'actions/plugins-actions';
import { switchSettingsDialog } from 'actions/settings-actions';
import { shortcutsActions } from 'actions/shortcuts-actions';
import { getUserAgreementsAsync } from 'actions/useragreements-actions';
import CVATApplication from 'components/cvat-app';
import LayoutGrid from 'components/layout-grid/layout-grid';
import logger, { LogType } from 'cvat-logger';
import createCVATStore, { getCVATStore } from 'cvat-store';
import { KeyMap } from 'utils/mousetrap-react';
import createRootReducer from 'reducers/root-reducer';
import { getOrganizationsAsync } from 'actions/organization-actions';
import { resetErrors, resetMessages } from './actions/notification-actions';
import { CombinedState, NotificationsState } from './reducers';
createCVATStore(createRootReducer);
const cvatStore = getCVATStore();
interface StateToProps {
pluginsInitialized: boolean;
pluginsFetching: boolean;
modelsInitialized: boolean;
modelsFetching: boolean;
userInitialized: boolean;
userFetching: boolean;
organizationsFetching: boolean;
organizationsInitialized: boolean;
aboutInitialized: boolean;
aboutFetching: boolean;
formatsInitialized: boolean;
formatsFetching: boolean;
userAgreementsInitialized: boolean;
userAgreementsFetching: boolean;
authActionsFetching: boolean;
authActionsInitialized: boolean;
allowChangePassword: boolean;
allowResetPassword: boolean;
notifications: NotificationsState;
user: any;
keyMap: KeyMap;
isModelPluginActive: boolean;
}
interface DispatchToProps {
loadFormats: () => void;
verifyAuthorized: () => void;
loadAbout: () => void;
initModels: () => void;
initPlugins: () => void;
resetErrors: () => void;
resetMessages: () => void;
switchShortcutsDialog: () => void;
loadUserAgreements: () => void;
switchSettingsDialog: () => void;
loadAuthActions: () => void;
loadOrganizations: () => void;
}
function mapStateToProps(state: CombinedState): StateToProps {
const { plugins } = state;
const { auth } = state;
const { formats } = state;
const { about } = state;
const { shortcuts } = state;
const { userAgreements } = state;
const { models } = state;
const { organizations } = state;
return {
userInitialized: auth.initialized,
userFetching: auth.fetching,
organizationsFetching: organizations.fetching,
organizationsInitialized: organizations.initialized,
pluginsInitialized: plugins.initialized,
pluginsFetching: plugins.fetching,
modelsInitialized: models.initialized,
modelsFetching: models.fetching,
aboutInitialized: about.initialized,
aboutFetching: about.fetching,
formatsInitialized: formats.initialized,
formatsFetching: formats.fetching,
userAgreementsInitialized: userAgreements.initialized,
userAgreementsFetching: userAgreements.fetching,
authActionsFetching: auth.authActionsFetching,
authActionsInitialized: auth.authActionsInitialized,
allowChangePassword: auth.allowChangePassword,
allowResetPassword: auth.allowResetPassword,
notifications: state.notifications,
user: auth.user,
keyMap: shortcuts.keyMap,
isModelPluginActive: plugins.list.MODELS,
};
}
function mapDispatchToProps(dispatch: any): DispatchToProps {
return {
loadFormats: (): void => dispatch(getFormatsAsync()),
verifyAuthorized: (): void => dispatch(authorizedAsync()),
loadUserAgreements: (): void => dispatch(getUserAgreementsAsync()),
initPlugins: (): void => dispatch(getPluginsAsync()),
initModels: (): void => dispatch(getModelsAsync()),
loadAbout: (): void => dispatch(getAboutAsync()),
resetErrors: (): void => dispatch(resetErrors()),
resetMessages: (): void => dispatch(resetMessages()),
switchShortcutsDialog: (): void => dispatch(shortcutsActions.switchShortcutsDialog()),
switchSettingsDialog: (): void => dispatch(switchSettingsDialog()),
loadAuthActions: (): void => dispatch(loadAuthActionsAsync()),
loadOrganizations: (): void => dispatch(getOrganizationsAsync()),
};
}
const ReduxAppWrapper = connect(mapStateToProps, mapDispatchToProps)(CVATApplication);
ReactDOM.render(
<Provider store={cvatStore}>
<BrowserRouter>
<ReduxAppWrapper />
</BrowserRouter>
<LayoutGrid />
</Provider>,
document.getElementById('root'),
);
window.addEventListener('error', (errorEvent: ErrorEvent) => {
if (
errorEvent.filename &&
typeof errorEvent.lineno === 'number' &&
typeof errorEvent.colno === 'number' &&
errorEvent.error
) {
const logPayload = {
filename: errorEvent.filename,
line: errorEvent.lineno,
message: errorEvent.error.message,
column: errorEvent.colno,
stack: errorEvent.error.stack,
};
const store = getCVATStore();
const state: CombinedState = store.getState();
const { pathname } = window.location;
const re = RegExp(/\/tasks\/[0-9]+\/jobs\/[0-9]+$/);
const { instance: job } = state.annotation.job;
if (re.test(pathname) && job) {
job.logger.log(LogType.sendException, logPayload);
} else {
logger.log(LogType.sendException, logPayload);
}
}
});