2022-02-16 05:39:52 +01:00
|
|
|
import React, { useEffect } from 'react';
|
2022-02-06 00:09:43 +01:00
|
|
|
import ActionDispatcher from '../maps-page/action-dispatcher';
|
|
|
|
import { ActionType } from '../maps-page/action-chooser';
|
2022-02-06 20:12:20 +01:00
|
|
|
import Editor from '@wisemapping/editor';
|
2022-08-26 03:35:59 +02:00
|
|
|
import { EditorRenderMode, PersistenceManager } from '@wisemapping/editor';
|
2022-03-14 18:47:42 +01:00
|
|
|
import { IntlProvider } from 'react-intl';
|
|
|
|
import AppI18n, { Locales } from '../../classes/app-i18n';
|
2022-02-13 04:15:51 +01:00
|
|
|
import { useSelector } from 'react-redux';
|
2022-02-22 06:55:13 +01:00
|
|
|
import { hotkeysEnabled } from '../../redux/editorSlice';
|
2022-05-29 19:22:57 +02:00
|
|
|
import ReactGA from 'react-ga4';
|
2022-02-21 03:50:03 +01:00
|
|
|
import Client from '../../classes/client';
|
2022-03-05 17:10:03 +01:00
|
|
|
import { activeInstance, fetchAccount, fetchMapById } from '../../redux/clientSlice';
|
2022-03-14 18:57:07 +01:00
|
|
|
import EditorOptionsBuilder from './EditorOptionsBuilder';
|
2022-01-25 19:10:40 +01:00
|
|
|
|
|
|
|
export type EditorPropsType = {
|
2022-07-10 05:56:01 +02:00
|
|
|
isTryMode: boolean;
|
2022-01-25 19:10:40 +01:00
|
|
|
};
|
|
|
|
|
2022-02-22 06:37:00 +01:00
|
|
|
const EditorPage = ({ isTryMode }: EditorPropsType): React.ReactElement => {
|
2022-07-10 05:56:01 +02:00
|
|
|
const [activeDialog, setActiveDialog] = React.useState<ActionType | null>(null);
|
|
|
|
const hotkey = useSelector(hotkeysEnabled);
|
|
|
|
const userLocale = AppI18n.getUserLocale();
|
|
|
|
const client: Client = useSelector(activeInstance);
|
2022-02-05 22:53:10 +01:00
|
|
|
|
2022-07-10 05:56:01 +02:00
|
|
|
useEffect(() => {
|
|
|
|
ReactGA.send({ hitType: 'pageview', page: window.location.pathname, title: `Map Editor` });
|
|
|
|
}, []);
|
2022-02-22 06:37:00 +01:00
|
|
|
|
2022-07-10 05:56:01 +02:00
|
|
|
const findEditorMode = (isTryMode: boolean, mapId: number): EditorRenderMode | null => {
|
|
|
|
let result: EditorRenderMode = null;
|
|
|
|
if (isTryMode) {
|
|
|
|
result = 'showcase';
|
|
|
|
} else if (global.mindmapLocked) {
|
|
|
|
result = 'viewonly';
|
|
|
|
} else {
|
|
|
|
const fetchResult = fetchMapById(mapId);
|
|
|
|
if (!fetchResult.isLoading) {
|
|
|
|
if (fetchResult.error) {
|
|
|
|
throw new Error(`Map info could not be loaded: ${JSON.stringify(fetchResult.error)}`);
|
|
|
|
}
|
2022-03-15 20:23:41 +01:00
|
|
|
|
2022-07-10 05:56:01 +02:00
|
|
|
if (!fetchResult.map) {
|
|
|
|
throw new Error(
|
|
|
|
`Map info could not be loaded. Info not present: ${JSON.stringify(fetchResult)}`,
|
|
|
|
);
|
2022-03-05 17:10:03 +01:00
|
|
|
}
|
2022-07-10 05:56:01 +02:00
|
|
|
result = `edition-${fetchResult.map.role}`;
|
|
|
|
}
|
2022-03-05 17:10:03 +01:00
|
|
|
}
|
2022-07-10 05:56:01 +02:00
|
|
|
return result;
|
|
|
|
};
|
2022-03-05 17:10:03 +01:00
|
|
|
|
2022-07-10 05:56:01 +02:00
|
|
|
// What is the role ?
|
|
|
|
const mapId = EditorOptionsBuilder.loadMapId();
|
|
|
|
const mode = findEditorMode(isTryMode, mapId);
|
2022-03-05 17:10:03 +01:00
|
|
|
|
2022-07-10 05:56:01 +02:00
|
|
|
// Account settings can be null and editor cannot be initilized multiple times. This creates problems
|
|
|
|
// at the i18n resource loading.
|
|
|
|
const isAccountLoaded = mode === 'showcase' || fetchAccount;
|
|
|
|
const loadCompleted = mode && isAccountLoaded;
|
2022-02-26 04:59:21 +01:00
|
|
|
|
2022-07-10 05:56:01 +02:00
|
|
|
let options, persistence: PersistenceManager;
|
|
|
|
if (loadCompleted) {
|
|
|
|
options = EditorOptionsBuilder.build(userLocale.code, mode, hotkey);
|
|
|
|
persistence = client.buildPersistenceManager(mode);
|
|
|
|
}
|
2022-01-25 19:10:40 +01:00
|
|
|
|
2022-07-10 05:56:01 +02:00
|
|
|
return loadCompleted ? (
|
|
|
|
<IntlProvider
|
|
|
|
locale={userLocale.code}
|
|
|
|
defaultLocale={Locales.EN.code}
|
|
|
|
messages={userLocale.message as Record<string, string>}
|
|
|
|
>
|
|
|
|
<Editor
|
|
|
|
onAction={setActiveDialog}
|
|
|
|
options={options}
|
|
|
|
persistenceManager={persistence}
|
|
|
|
mapId={mapId}
|
|
|
|
/>
|
|
|
|
{activeDialog && (
|
|
|
|
<ActionDispatcher
|
|
|
|
action={activeDialog}
|
|
|
|
onClose={() => setActiveDialog(null)}
|
|
|
|
mapsId={[mapId]}
|
|
|
|
fromEditor
|
|
|
|
/>
|
|
|
|
)}
|
|
|
|
</IntlProvider>
|
|
|
|
) : (
|
|
|
|
<></>
|
|
|
|
);
|
|
|
|
};
|
2022-02-22 06:37:00 +01:00
|
|
|
|
2022-02-06 00:09:43 +01:00
|
|
|
export default EditorPage;
|