forked from openedx/frontend-app-authoring
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAdvancedEditor.tsx
More file actions
104 lines (92 loc) · 3.2 KB
/
AdvancedEditor.tsx
File metadata and controls
104 lines (92 loc) · 3.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import React, { useEffect } from 'react';
import { getConfig } from '@edx/frontend-platform';
import { useIntl } from '@edx/frontend-platform/i18n';
import {
ActionRow,
Icon,
IconButton,
ModalDialog,
ModalCloseButton,
Stack,
useToggle,
} from '@openedx/paragon';
import { Close, CloseFullscreen, OpenInFull } from '@openedx/paragon/icons';
import { LibraryBlock } from '../library-authoring/LibraryBlock';
import { EditorModalWrapper } from './containers/EditorContainer';
import { ToastContext } from '../generic/toast-context';
import messages from './messages';
import CancelConfirmModal from './containers/EditorContainer/components/CancelConfirmModal';
import { IframeProvider } from '../generic/hooks/context/iFrameContext';
import editorModalWrapperMessages from './containers/EditorContainer/messages';
interface AdvancedEditorProps {
usageKey: string,
onClose: (() => void) | null,
}
const AdvancedEditor = ({ usageKey, onClose }: AdvancedEditorProps) => {
const intl = useIntl();
const { showToast } = React.useContext(ToastContext);
const [isCancelConfirmOpen, openCancelConfirmModal, closeCancelConfirmModal] = useToggle(false);
const [isFullscreen, , , toggleFullscreen] = useToggle(false);
useEffect(() => {
const handleIframeMessage = (event) => {
if (event.origin !== getConfig().STUDIO_BASE_URL) {
return;
}
if (event.data.type === 'xblock-event') {
const { eventName, data } = event.data;
if (eventName === 'cancel') {
openCancelConfirmModal();
} else if (onClose && eventName === 'save' && data.state === 'end') {
onClose();
} else if (eventName === 'error') {
showToast(intl.formatMessage(messages.advancedEditorGenericError));
}
}
};
window.addEventListener('message', handleIframeMessage);
return () => {
window.removeEventListener('message', handleIframeMessage);
};
}, []);
return (
<>
<EditorModalWrapper onClose={openCancelConfirmModal} fullscreen={isFullscreen}>
<ModalDialog.Header>
<ActionRow>
<ModalDialog.Title>
{intl.formatMessage(editorModalWrapperMessages.modalTitle)}
</ModalDialog.Title>
<ActionRow.Spacer />
<Stack direction="horizontal" reversed gap={1}>
<ModalCloseButton
as={IconButton}
src={Close}
iconAs={Icon}
/>
<IconButton
src={isFullscreen ? CloseFullscreen : OpenInFull}
iconAs={Icon}
alt={intl.formatMessage(messages.advancedEditorFullscreenButtonAlt)}
onClick={toggleFullscreen}
/>
</Stack>
</ActionRow>
</ModalDialog.Header>
<IframeProvider>
<LibraryBlock
usageKey={usageKey}
view="studio_view"
scrolling="yes"
minHeight="70vh"
/>
</IframeProvider>
</EditorModalWrapper>
<CancelConfirmModal
isOpen={isCancelConfirmOpen}
closeCancelConfirmModal={closeCancelConfirmModal}
onCloseEditor={onClose}
/>
</>
);
};
export default AdvancedEditor;