@mirrormedia/lilith-draft-editor 3.0.4 → 3.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -112,7 +112,5 @@ function AnnotationButton(props) {
112
112
  return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, urlInput, /*#__PURE__*/_react.default.createElement("div", {
113
113
  className: className,
114
114
  onMouseDown: isActive ? removeAnnotation : promptForAnnotation
115
- }, /*#__PURE__*/_react.default.createElement("i", {
116
- className: "far"
117
- }), /*#__PURE__*/_react.default.createElement("span", null, "Annotation")));
115
+ }, /*#__PURE__*/_react.default.createElement("span", null, "Annotation")));
118
116
  }
@@ -103,7 +103,5 @@ function EmbeddedCodeButton(props) {
103
103
  promptForInput();
104
104
  },
105
105
  className: className
106
- }, /*#__PURE__*/_react.default.createElement("i", {
107
- className: "far"
108
- }), /*#__PURE__*/_react.default.createElement("span", null, "Embed")));
106
+ }, /*#__PURE__*/_react.default.createElement("span", null, "Embed")));
109
107
  }
@@ -28,29 +28,30 @@ function ImageButton(props) {
28
28
  setToShowImageSelector(true);
29
29
  };
30
30
 
31
- const onImageSelectorChange = (selectedImagesWithMeta, align) => {
32
- const selected = selectedImagesWithMeta === null || selectedImagesWithMeta === void 0 ? void 0 : selectedImagesWithMeta[0];
33
-
34
- if (!selected) {
31
+ const onImageSelectorChange = (selectedImages, align) => {
32
+ if (selectedImages.length === 0) {
35
33
  setToShowImageSelector(false);
36
- return;
37
34
  }
38
35
 
39
- const contentState = editorState.getCurrentContent();
40
- const contentStateWithEntity = contentState.createEntity('image', 'IMMUTABLE', { ...selected.image,
41
- desc: selected.desc,
42
- url: selected.url,
43
- alignment: align
44
- });
45
- const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
36
+ let newEditorState = editorState;
46
37
 
47
- const newEditorState = _draftJs.EditorState.set(editorState, {
48
- currentContent: contentStateWithEntity
49
- }); // The third parameter here is a space string, not an empty string
50
- // If you set an empty string, you will get an error: Unknown DraftEntity key: null
38
+ for (const selectedImage of selectedImages) {
39
+ const contentState = newEditorState.getCurrentContent();
40
+ const contentStateWithEntity = contentState.createEntity('image', 'IMMUTABLE', { ...selectedImage.image,
41
+ desc: selectedImage.desc,
42
+ url: selectedImage.url,
43
+ alignment: align
44
+ });
45
+ const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
46
+ newEditorState = _draftJs.EditorState.set(newEditorState, {
47
+ currentContent: contentStateWithEntity
48
+ }); // The third parameter here is a space string, not an empty string
49
+ // If you set an empty string, you will get an error: Unknown DraftEntity key: null
51
50
 
51
+ newEditorState = _draftJs.AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' ');
52
+ }
52
53
 
53
- onChange(_draftJs.AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' '));
54
+ onChange(newEditorState);
54
55
  setToShowImageSelector(false);
55
56
  };
56
57
 
@@ -58,7 +59,8 @@ function ImageButton(props) {
58
59
  onChange: onImageSelectorChange,
59
60
  enableCaption: true,
60
61
  enableUrl: true,
61
- enableAlignment: true
62
+ enableAlignment: true,
63
+ enableMultiSelect: true
62
64
  }), /*#__PURE__*/_react.default.createElement("div", {
63
65
  className: className,
64
66
  onClick: promptForImageSelector
@@ -142,7 +142,5 @@ function InfoBoxButton(props) {
142
142
  onClick: () => {
143
143
  setToShowInput(true);
144
144
  }
145
- }, /*#__PURE__*/_react.default.createElement("i", {
146
- className: "far"
147
- }), /*#__PURE__*/_react.default.createElement("span", null, "InfoBox")));
145
+ }, /*#__PURE__*/_react.default.createElement("span", null, "InfoBox")));
148
146
  }
@@ -23,6 +23,10 @@ var _searchBox = require("./search-box");
23
23
 
24
24
  var _pagination = require("./pagination");
25
25
 
26
+ var _button = require("@keystone-ui/button");
27
+
28
+ var _imageUploader = require("./image-uploader");
29
+
26
30
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
31
 
28
32
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -77,6 +81,9 @@ const GlobalStyle = (0, _styledComponents.createGlobalStyle)`
77
81
  const ImageSearchBox = (0, _styledComponents.default)(_searchBox.SearchBox)`
78
82
  margin-top: 10px;
79
83
  `;
84
+ const CustomButton = (0, _styledComponents.default)(_button.Button)`
85
+ margin-top: 10px;
86
+ `;
80
87
  const ImageSelectionWrapper = _styledComponents.default.div`
81
88
  overflow: auto;
82
89
  margin-top: 10px;
@@ -89,7 +96,7 @@ const ImageGridsWrapper = _styledComponents.default.div`
89
96
  margin-top: 5px;
90
97
  `;
91
98
  const ImageGridWrapper = _styledComponents.default.div`
92
- flex: 0 0 33.3333%;
99
+ width: 33.3333%;
93
100
  cursor: pointer;
94
101
  padding: 0 10px 10px;
95
102
  `;
@@ -99,7 +106,7 @@ const ImageMetaGridsWrapper = _styledComponents.default.div`
99
106
  overflow: auto;
100
107
  `;
101
108
  const ImageMetaGridWrapper = _styledComponents.default.div`
102
- flex: 0 0 33.3333%;
109
+ width: 33.3333%;
103
110
  cursor: pointer;
104
111
  padding: 0 10px 10px;
105
112
  `;
@@ -107,7 +114,7 @@ const Image = _styledComponents.default.img`
107
114
  display: block;
108
115
  width: 100%;
109
116
  aspect-ratio: 2;
110
- object-fit: cover;
117
+ object-fit: contain;
111
118
  `;
112
119
  const Label = _styledComponents.default.label`
113
120
  display: block;
@@ -287,6 +294,7 @@ function ImageSelector(props) {
287
294
  const [selected, setSelected] = (0, _react.useState)(initialSelected);
288
295
  const [delay, setDelay] = (0, _react.useState)(initialDelay ?? '5');
289
296
  const [align, setAlign] = (0, _react.useState)(initialAlign);
297
+ const [showImageUploader, setShowImageUploader] = (0, _react.useState)(false);
290
298
  const contentWrapperRef = (0, _react.useRef)(null);
291
299
  const pageSize = 18;
292
300
  const options = [{
@@ -336,6 +344,15 @@ function ImageSelector(props) {
336
344
  }
337
345
  };
338
346
 
347
+ const onImageUploaderChange = images => {
348
+ setSelected(prev => prev.concat(images.map(image => ({
349
+ image,
350
+ desc: '',
351
+ url: ''
352
+ }))));
353
+ setShowImageUploader(false);
354
+ };
355
+
339
356
  const onImageMetaChange = imageEntityWithMeta => {
340
357
  if (enableMultiSelect) {
341
358
  const foundIndex = selected.findIndex(ele => {
@@ -438,7 +455,9 @@ function ImageSelector(props) {
438
455
  width: "narrow"
439
456
  }, /*#__PURE__*/_react.default.createElement("div", {
440
457
  ref: contentWrapperRef
441
- }, /*#__PURE__*/_react.default.createElement(ImageSearchBox, {
458
+ }, /*#__PURE__*/_react.default.createElement(CustomButton, {
459
+ onClick: () => setShowImageUploader(true)
460
+ }, "\u4E0A\u50B3\u5716\u7247"), /*#__PURE__*/_react.default.createElement(ImageSearchBox, {
442
461
  onChange: onSearchBoxChange
443
462
  }), /*#__PURE__*/_react.default.createElement(ImageSelectionWrapper, null, /*#__PURE__*/_react.default.createElement("div", null, searchResult), !!selected.length && /*#__PURE__*/_react.default.createElement(SeparationLine, null), /*#__PURE__*/_react.default.createElement(ImageMetaGrids, {
444
463
  imageMetas: selected,
@@ -455,5 +474,7 @@ function ImageSelector(props) {
455
474
  options: options,
456
475
  onChange: onAlignSelectChange,
457
476
  onOpen: onAlignSelectOpen
458
- }))))));
477
+ }))))), showImageUploader && /*#__PURE__*/_react.default.createElement(_imageUploader.ImageUploader, {
478
+ onChange: onImageUploaderChange
479
+ }));
459
480
  }
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ImageUploader = ImageUploader;
7
+
8
+ var _apollo = require("@keystone-6/core/admin-ui/apollo");
9
+
10
+ var _modals = require("@keystone-ui/modals");
11
+
12
+ var _react = _interopRequireWildcard(require("react"));
13
+
14
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
15
+
16
+ var _fileConvert = require("../utils/file-convert");
17
+
18
+ var _button = require("@keystone-ui/button");
19
+
20
+ var _fields = require("@keystone-ui/fields");
21
+
22
+ var _lodash = _interopRequireDefault(require("lodash"));
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
28
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
+
30
+ const imagesMutation = (0, _apollo.gql)`
31
+ mutation AddPhotos($data: [PhotoCreateInput!]!) {
32
+ photos: createPhotos(data: $data) {
33
+ id
34
+ name
35
+ imageFile {
36
+ url
37
+ width
38
+ height
39
+ }
40
+ resized {
41
+ original
42
+ w480
43
+ w800
44
+ w1200
45
+ w1600
46
+ w2400
47
+ }
48
+ resizedWebp {
49
+ original
50
+ w480
51
+ w800
52
+ w1200
53
+ w1600
54
+ w2400
55
+ }
56
+ }
57
+ }
58
+ `;
59
+ const CustomButton = (0, _styledComponents.default)(_button.Button)`
60
+ margin-top: 10px;
61
+ `;
62
+ const HiddenInput = _styledComponents.default.input`
63
+ display: none;
64
+ `;
65
+ const ImagesWrapper = _styledComponents.default.div`
66
+ overflow: auto;
67
+ margin-top: 10px;
68
+ `;
69
+ const ImageFilesWrapper = _styledComponents.default.div`
70
+ display: flex;
71
+ flex-wrap: wrap;
72
+ overflow: auto;
73
+ `;
74
+ const ImageFileWrapper = _styledComponents.default.div`
75
+ width: 33%;
76
+ cursor: pointer;
77
+ padding: 0 10px 10px;
78
+ `;
79
+ const Image = _styledComponents.default.img`
80
+ display: block;
81
+ width: 100%;
82
+ aspect-ratio: 2;
83
+ object-fit: contain;
84
+ `;
85
+ const ImageName = _styledComponents.default.p`
86
+ text-align: center;
87
+ `;
88
+ const CustomCheckbox = (0, _styledComponents.default)(_fields.Checkbox)`
89
+ display: flex;
90
+ align-items: center;
91
+ cursor: pointer;
92
+ `;
93
+ const Label = _styledComponents.default.label`
94
+ display: block;
95
+ margin: 10px 0;
96
+ font-weight: 600;
97
+ `;
98
+
99
+ const AddImages = ({
100
+ onAddImages
101
+ }) => {
102
+ const inputRef = (0, _react.useRef)(null);
103
+
104
+ const inputChangeHandler = async event => {
105
+ const files = event.target.files;
106
+ event.target.files = null;
107
+ if (!files) return;
108
+ const imagesFiles = await (0, _fileConvert.convertFilesToImageData)(files);
109
+ console.log('imagesFiles', imagesFiles);
110
+ onAddImages(imagesFiles);
111
+ };
112
+
113
+ const onUploadButton = () => {
114
+ var _inputRef$current;
115
+
116
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.click();
117
+ };
118
+
119
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(CustomButton, {
120
+ onClick: onUploadButton
121
+ }, "\u65B0\u589E\u5716\u7247"), /*#__PURE__*/_react.default.createElement(HiddenInput, {
122
+ type: "file",
123
+ multiple: true,
124
+ accept: "image/*",
125
+ ref: inputRef,
126
+ onChange: inputChangeHandler
127
+ }));
128
+ };
129
+
130
+ const ImageFiles = ({
131
+ files,
132
+ onChange
133
+ }) => {
134
+ return /*#__PURE__*/_react.default.createElement(ImageFilesWrapper, null, files.map(file => /*#__PURE__*/_react.default.createElement(ImageFile, {
135
+ key: file.uid,
136
+ file: file,
137
+ onChange: onChange
138
+ })));
139
+ };
140
+
141
+ const ImageFile = ({
142
+ file,
143
+ onChange
144
+ }) => {
145
+ return /*#__PURE__*/_react.default.createElement(ImageFileWrapper, null, /*#__PURE__*/_react.default.createElement(Image, {
146
+ src: file.blobURL
147
+ }), /*#__PURE__*/_react.default.createElement(Label, {
148
+ htmlFor: "name"
149
+ }, "Image Name"), /*#__PURE__*/_react.default.createElement(_fields.TextInput, {
150
+ id: "name",
151
+ type: "text",
152
+ defaultValue: file.name,
153
+ onChange: _lodash.default.debounce(e => {
154
+ onChange({ ...file,
155
+ name: e.target.value
156
+ });
157
+ })
158
+ }), /*#__PURE__*/_react.default.createElement(ImageName, null, file.name), /*#__PURE__*/_react.default.createElement(CustomCheckbox, {
159
+ defaultChecked: file.shouldSetWatermark,
160
+ onChange: _lodash.default.debounce(e => {
161
+ onChange({ ...file,
162
+ shouldSetWatermark: e.target.checked
163
+ });
164
+ })
165
+ }, "\u6D6E\u6C34\u5370"));
166
+ };
167
+
168
+ function ImageUploader({
169
+ onChange
170
+ }) {
171
+ const [files, setFiles] = (0, _react.useState)([]);
172
+ const [addPhotos, {
173
+ data: uploadData,
174
+ loading: uploadLoading,
175
+ error: uploadError
176
+ }] = (0, _apollo.useMutation)(imagesMutation);
177
+
178
+ const onAddImages = rawFiles => {
179
+ const existedImageUids = new Set(files.map(file => file.uid));
180
+ const newFiles = rawFiles.filter(file => !existedImageUids.has(file.uid)).map(rawFile => ({ ...rawFile,
181
+ shouldSetWatermark: true
182
+ }));
183
+ setFiles(prev => prev.concat(newFiles));
184
+ };
185
+
186
+ const onConfirm = async () => {
187
+ if (!files.length) return onChange([]);
188
+ const tasks = files.map(async data => ({ ...data,
189
+ file: await (0, _fileConvert.convertStringToFile)(data.blobURL, data.name, data.type)
190
+ }));
191
+ const data = (await Promise.allSettled(tasks)).filter(function (settledResult) {
192
+ return settledResult.status === 'fulfilled';
193
+ }).map(result => result.value);
194
+ addPhotos({
195
+ variables: {
196
+ data: data.map(d => ({
197
+ name: d.name,
198
+ imageFile: {
199
+ upload: d.file
200
+ },
201
+ waterMark: d.shouldSetWatermark
202
+ }))
203
+ }
204
+ });
205
+ };
206
+
207
+ const onImageFileChang = file => {
208
+ const newFiles = Array.from(files);
209
+ const foundIndex = newFiles.findIndex(ele => ele.uid === file.uid);
210
+
211
+ if (foundIndex !== -1) {
212
+ newFiles[foundIndex] = file;
213
+ setFiles(newFiles);
214
+ }
215
+ };
216
+
217
+ (0, _react.useEffect)(() => {
218
+ var _uploadData$photos;
219
+
220
+ if (uploadData !== null && uploadData !== void 0 && (_uploadData$photos = uploadData.photos) !== null && _uploadData$photos !== void 0 && _uploadData$photos.length) {
221
+ onChange(uploadData.photos);
222
+ }
223
+ }, [uploadData, onChange]);
224
+ return /*#__PURE__*/_react.default.createElement(_modals.DrawerController, {
225
+ isOpen: true
226
+ }, /*#__PURE__*/_react.default.createElement(_modals.Drawer, {
227
+ title: "Upload images",
228
+ actions: {
229
+ cancel: {
230
+ label: 'Cancel',
231
+ action: () => {
232
+ onChange([]);
233
+ }
234
+ },
235
+ confirm: {
236
+ label: 'Confirm',
237
+ action: onConfirm
238
+ }
239
+ },
240
+ width: "narrow"
241
+ }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(AddImages, {
242
+ onAddImages: onAddImages
243
+ }), /*#__PURE__*/_react.default.createElement(ImagesWrapper, null, /*#__PURE__*/_react.default.createElement(ImageFiles, {
244
+ files: files,
245
+ onChange: onImageFileChang
246
+ })), uploadLoading && /*#__PURE__*/_react.default.createElement("div", null, "loading"), uploadError && /*#__PURE__*/_react.default.createElement("div", null, uploadError.message))));
247
+ }
@@ -21,6 +21,10 @@ var _pagination = require("./pagination");
21
21
 
22
22
  var _fields = require("@keystone-ui/fields");
23
23
 
24
+ var _videoUploader = require("./video-uploader");
25
+
26
+ var _button = require("@keystone-ui/button");
27
+
24
28
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
29
 
26
30
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -29,9 +33,11 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
29
33
 
30
34
  const videosQuery = (0, _apollo.gql)`
31
35
  query Videos($searchText: String!, $take: Int, $skip: Int) {
32
- videosCount(where: { name: { contains: $searchText } })
36
+ videosCount(
37
+ where: { name: { contains: $searchText }, state: { equals: "published" } }
38
+ )
33
39
  videos(
34
- where: { name: { contains: $searchText } }
40
+ where: { name: { contains: $searchText }, state: { equals: "published" } }
35
41
  orderBy: { id: desc }
36
42
  take: $take
37
43
  skip: $skip
@@ -39,6 +45,7 @@ const videosQuery = (0, _apollo.gql)`
39
45
  id
40
46
  name
41
47
  videoSrc
48
+ youtubeUrl
42
49
  file {
43
50
  filename
44
51
  filesize
@@ -70,6 +77,9 @@ const GlobalStyle = (0, _styledComponents.createGlobalStyle)`
70
77
  const VideoSearchBox = (0, _styledComponents.default)(_searchBox.SearchBox)`
71
78
  margin-top: 10px;
72
79
  `;
80
+ const CustomButton = (0, _styledComponents.default)(_button.Button)`
81
+ margin-top: 10px;
82
+ `;
73
83
  const VideoSelectionWrapper = _styledComponents.default.div`
74
84
  overflow: auto;
75
85
  margin-top: 10px;
@@ -80,7 +90,7 @@ const VideoGridsWrapper = _styledComponents.default.div`
80
90
  overflow: auto;
81
91
  `;
82
92
  const VideoGridWrapper = _styledComponents.default.div`
83
- flex: 0 0 33.3333%;
93
+ width: 33.3333%;
84
94
  cursor: pointer;
85
95
  padding: 0 10px 10px;
86
96
  `;
@@ -90,7 +100,7 @@ const VideoMetaGridsWrapper = _styledComponents.default.div`
90
100
  overflow: auto;
91
101
  `;
92
102
  const VideoMetaGridWrapper = _styledComponents.default.div`
93
- flex: 0 0 33.3333%;
103
+ width: 33.3333%;
94
104
  cursor: pointer;
95
105
  padding: 0 10px 10px;
96
106
  `;
@@ -98,7 +108,7 @@ const Video = _styledComponents.default.video`
98
108
  display: block;
99
109
  width: 100%;
100
110
  aspect-ratio: 2;
101
- object-fit: cover;
111
+ object-fit: contain;
102
112
  `;
103
113
  const SeparationLine = _styledComponents.default.div`
104
114
  border: #e1e5e9 1px solid;
@@ -230,6 +240,7 @@ function VideoSelector(props) {
230
240
 
231
241
  const [searchText, setSearchText] = (0, _react.useState)('');
232
242
  const [selected, setSelected] = (0, _react.useState)([]);
243
+ const [showVideoUploader, setShowVideoUploader] = (0, _react.useState)(false);
233
244
  const pageSize = 6;
234
245
  const {
235
246
  onChange
@@ -248,6 +259,14 @@ function VideoSelector(props) {
248
259
  setCurrentPage(1);
249
260
  };
250
261
 
262
+ const onVideoUploaderChange = video => {
263
+ if (video) setSelected(prev => [...prev, {
264
+ video,
265
+ desc: ''
266
+ }]);
267
+ setShowVideoUploader(false);
268
+ };
269
+
251
270
  const onVideoMetaChange = videoEntityWithMeta => {
252
271
  setSelected([videoEntityWithMeta]);
253
272
  };
@@ -325,10 +344,14 @@ function VideoSelector(props) {
325
344
  }
326
345
  },
327
346
  width: "narrow"
328
- }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(VideoSearchBox, {
347
+ }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(CustomButton, {
348
+ onClick: () => setShowVideoUploader(true)
349
+ }, "\u4E0A\u50B3\u5716\u7247"), /*#__PURE__*/_react.default.createElement(VideoSearchBox, {
329
350
  onChange: onSearchBoxChange
330
351
  }), /*#__PURE__*/_react.default.createElement(VideoSelectionWrapper, null, /*#__PURE__*/_react.default.createElement("div", null, searchResult), !!selected.length && /*#__PURE__*/_react.default.createElement(SeparationLine, null), /*#__PURE__*/_react.default.createElement(VideoMetaGrids, {
331
352
  videoMetas: selected,
332
353
  onChange: onVideoMetaChange
333
- }))))));
354
+ }))))), showVideoUploader && /*#__PURE__*/_react.default.createElement(_videoUploader.VideoUploader, {
355
+ onChange: onVideoUploaderChange
356
+ }));
334
357
  }
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.VideoUploader = VideoUploader;
7
+
8
+ var _apollo = require("@keystone-6/core/admin-ui/apollo");
9
+
10
+ var _react = _interopRequireWildcard(require("react"));
11
+
12
+ var _fileConvert = require("../utils/file-convert");
13
+
14
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
15
+
16
+ var _button = require("@keystone-ui/button");
17
+
18
+ var _modals = require("@keystone-ui/modals");
19
+
20
+ var _lodash = _interopRequireDefault(require("lodash"));
21
+
22
+ var _fields = require("@keystone-ui/fields");
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
28
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
+
30
+ const videoMutation = (0, _apollo.gql)`
31
+ mutation AddVideo($data: VideoCreateInput!) {
32
+ video: createVideo(data: $data) {
33
+ id
34
+ name
35
+ videoSrc
36
+ youtubeUrl
37
+ file {
38
+ filename
39
+ filesize
40
+ url
41
+ }
42
+ heroImage {
43
+ id
44
+ name
45
+ imageFile {
46
+ url
47
+ }
48
+ resized {
49
+ original
50
+ }
51
+ }
52
+ }
53
+ }
54
+ `;
55
+ const CustomButton = (0, _styledComponents.default)(_button.Button)`
56
+ margin: 10px 0;
57
+ `;
58
+ const HiddenInput = _styledComponents.default.input`
59
+ display: none;
60
+ `;
61
+ const VideoWrapper = _styledComponents.default.div`
62
+ overflow: auto;
63
+ margin-top: 10px;
64
+ `;
65
+ const Video = _styledComponents.default.video`
66
+ width: 100%;
67
+ aspect-ratio: 2;
68
+ object-fit: contain;
69
+ `;
70
+ const Label = _styledComponents.default.label`
71
+ display: block;
72
+ margin: 10px 0;
73
+ font-weight: 600;
74
+ `;
75
+ const HintWrapper = _styledComponents.default.div`
76
+ margin: 10px 0;
77
+ `;
78
+
79
+ const AddVideo = ({
80
+ onAddVideo
81
+ }) => {
82
+ const inputRef = (0, _react.useRef)(null);
83
+
84
+ const inputChangeHandler = async event => {
85
+ const files = event.target.files;
86
+ event.target.files = null;
87
+ if (!files) return;
88
+ const videoFiles = await (0, _fileConvert.convertFilesToVideoData)(files);
89
+ onAddVideo(videoFiles[0]);
90
+ };
91
+
92
+ const onUploadButton = () => {
93
+ var _inputRef$current;
94
+
95
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.click();
96
+ };
97
+
98
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(CustomButton, {
99
+ onClick: onUploadButton
100
+ }, "\u65B0\u589E\u5F71\u7247"), /*#__PURE__*/_react.default.createElement(HiddenInput, {
101
+ type: "file",
102
+ multiple: false,
103
+ accept: "video/*",
104
+ ref: inputRef,
105
+ onChange: inputChangeHandler
106
+ }));
107
+ };
108
+
109
+ function VideoUploader({
110
+ onChange
111
+ }) {
112
+ const [file, setFile] = (0, _react.useState)();
113
+ const [addVideo, {
114
+ data: uploadData,
115
+ loading: uploadLoading,
116
+ error: uploadError
117
+ }] = (0, _apollo.useMutation)(videoMutation);
118
+
119
+ const onAddVideo = file => {
120
+ setFile(file);
121
+ };
122
+
123
+ const onVideoNameChange = e => {
124
+ if (!file) return;
125
+ setFile({ ...file,
126
+ name: e.target.value
127
+ });
128
+ };
129
+
130
+ const onConfirm = async () => {
131
+ if (!file) return onChange();
132
+ const data = { ...file,
133
+ file: await (0, _fileConvert.convertStringToFile)(file.blobURL, file.name, file.type)
134
+ };
135
+ addVideo({
136
+ variables: {
137
+ data: {
138
+ name: data.name,
139
+ file: {
140
+ upload: data.file
141
+ }
142
+ }
143
+ }
144
+ });
145
+ };
146
+
147
+ (0, _react.useEffect)(() => {
148
+ if (uploadData !== null && uploadData !== void 0 && uploadData.video) {
149
+ onChange(uploadData.video);
150
+ }
151
+ }, [uploadData, onChange]);
152
+ return /*#__PURE__*/_react.default.createElement(_modals.DrawerController, {
153
+ isOpen: true
154
+ }, /*#__PURE__*/_react.default.createElement(_modals.Drawer, {
155
+ title: "Upload images",
156
+ actions: {
157
+ cancel: {
158
+ label: 'Cancel',
159
+ action: () => {
160
+ onChange();
161
+ }
162
+ },
163
+ confirm: {
164
+ label: 'Confirm',
165
+ action: onConfirm
166
+ }
167
+ },
168
+ width: "narrow"
169
+ }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(AddVideo, {
170
+ onAddVideo: onAddVideo
171
+ }), file && /*#__PURE__*/_react.default.createElement(VideoWrapper, null, /*#__PURE__*/_react.default.createElement(Video, {
172
+ src: file === null || file === void 0 ? void 0 : file.blobURL,
173
+ muted: true,
174
+ loop: true,
175
+ controls: true,
176
+ autoPlay: true
177
+ }), /*#__PURE__*/_react.default.createElement(Label, {
178
+ htmlFor: "name"
179
+ }, "Video Name"), /*#__PURE__*/_react.default.createElement(_fields.TextInput, {
180
+ id: "name",
181
+ type: "text",
182
+ defaultValue: file.name,
183
+ onChange: _lodash.default.debounce(onVideoNameChange)
184
+ })), uploadLoading && /*#__PURE__*/_react.default.createElement(HintWrapper, null, "loading"), uploadError && /*#__PURE__*/_react.default.createElement(HintWrapper, null, uploadError.message))));
185
+ }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.convertBlobToString = convertBlobToString;
7
+ exports.convertFilesToImageData = convertFilesToImageData;
8
+ exports.convertFilesToVideoData = convertFilesToVideoData;
9
+ exports.convertStringToFile = convertStringToFile;
10
+
11
+ var _jsSha = require("js-sha256");
12
+
13
+ async function convertFilesToMediaData(fileList, isValidFile, wrapResult) {
14
+ const files = Array.from(fileList);
15
+ const fileNamePostfix = new Intl.DateTimeFormat('fr-CA', {
16
+ year: 'numeric',
17
+ month: '2-digit',
18
+ day: '2-digit'
19
+ }).format(Date.now());
20
+ const tasks = files.map(async file => {
21
+ if (!isValidFile(file)) return;
22
+ const uInt8Data = await file.arrayBuffer();
23
+ const name = file.name;
24
+ const positionOfLastDot = name.lastIndexOf('.');
25
+ const filename = positionOfLastDot > -1 ? `${name.slice(0, positionOfLastDot)}_${fileNamePostfix}${name.slice(positionOfLastDot)}` : `${name}_${fileNamePostfix}`;
26
+ return wrapResult({
27
+ uid: (0, _jsSha.sha256)(uInt8Data),
28
+ name: filename,
29
+ type: file.type,
30
+ blobURL: convertBlobToString(file)
31
+ });
32
+ });
33
+ const results = await Promise.allSettled(tasks);
34
+ return results.filter(r => r.status === 'fulfilled').map(r => r.value).filter(r => Boolean(r));
35
+ }
36
+
37
+ function isImageFile(file) {
38
+ return file.type.startsWith('image/');
39
+ }
40
+
41
+ async function convertFilesToImageData(fileList) {
42
+ return convertFilesToMediaData(fileList, isImageFile, ({
43
+ uid,
44
+ name,
45
+ type,
46
+ blobURL
47
+ }) => ({
48
+ uid,
49
+ name,
50
+ type,
51
+ blobURL
52
+ }));
53
+ }
54
+
55
+ async function convertFilesToVideoData(fileList) {
56
+ return convertFilesToMediaData(fileList, isVideoFile, ({
57
+ uid,
58
+ name,
59
+ type,
60
+ blobURL
61
+ }) => ({
62
+ uid,
63
+ name,
64
+ type,
65
+ blobURL
66
+ }));
67
+ }
68
+
69
+ function isVideoFile(file) {
70
+ return file.type.startsWith('video/');
71
+ }
72
+
73
+ function blobToFile(blob, fileName, extension) {
74
+ return new File([blob], fileName, {
75
+ type: extension
76
+ });
77
+ }
78
+
79
+ function convertBlobToString(blob) {
80
+ return URL.createObjectURL(blob);
81
+ }
82
+
83
+ async function convertStringToFile(str, fileName, extension) {
84
+ const request = new Request(str);
85
+ return await fetch(request).then(response => response.blob()).then(blob => blobToFile(blob, fileName, extension ?? blob.type));
86
+ }
@@ -436,6 +436,12 @@ const DraftEditorContainer = _styledComponents.default.div`
436
436
  `;
437
437
  const ButtonGroup = _styledComponents.default.div`
438
438
  margin: 0 10px 0 0;
439
+
440
+ ${({
441
+ isDisabled
442
+ }) => isDisabled ? (0, _styledComponents.css)`
443
+ display: none;
444
+ ` : ''}
439
445
  `;
440
446
  const EnlargeButtonWrapper = _styledComponents.default.div`
441
447
  position: absolute;
@@ -718,125 +724,145 @@ class RichTextEditor extends _react.default.Component {
718
724
  })), /*#__PURE__*/_react.default.createElement(EnlargeButtonWrapper, null, /*#__PURE__*/_react.default.createElement(CustomEnlargeButton, {
719
725
  onToggle: this.toggleEnlarge,
720
726
  isEnlarged: isEnlarged
721
- }))), /*#__PURE__*/_react.default.createElement(DraftEditorControlsWrapper, null, /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomLinkButton, {
722
- isDisabled: disabledButtons.includes(buttonNames.link),
727
+ }))), /*#__PURE__*/_react.default.createElement(DraftEditorControlsWrapper, null, /*#__PURE__*/_react.default.createElement(ButtonGroup, {
728
+ isDisabled: disabledButtons.includes(buttonNames.link)
729
+ }, /*#__PURE__*/_react.default.createElement(CustomLinkButton, {
723
730
  isActive: entityType === 'LINK',
724
731
  readOnly: readOnly,
725
732
  editorState: editorState,
726
733
  onChange: this.onChange
727
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomFontColorButton, {
728
- isDisabled: disabledButtons.includes(buttonNames.fontColor),
734
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
735
+ isDisabled: disabledButtons.includes(buttonNames.fontColor)
736
+ }, /*#__PURE__*/_react.default.createElement(CustomFontColorButton, {
729
737
  isActive: Object.prototype.hasOwnProperty.call(customStyle, 'color'),
730
738
  readOnly: readOnly,
731
739
  editorState: editorState,
732
740
  onChange: this.onChange
733
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomDividerButton, {
734
- isDisabled: disabledButtons.includes(buttonNames.divider),
741
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
742
+ isDisabled: disabledButtons.includes(buttonNames.divider)
743
+ }, /*#__PURE__*/_react.default.createElement(CustomDividerButton, {
735
744
  editorState: editorState,
736
745
  onChange: this.onChange
737
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomAnnotationButton, {
738
- isDisabled: disabledButtons.includes(buttonNames.annotation),
746
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
747
+ isDisabled: disabledButtons.includes(buttonNames.annotation)
748
+ }, /*#__PURE__*/_react.default.createElement(CustomAnnotationButton, {
739
749
  isActive: entityType === 'ANNOTATION',
740
750
  readOnly: readOnly,
741
751
  editorState: editorState,
742
752
  onChange: this.onChange,
743
753
  renderBasicEditor: renderBasicEditor,
744
754
  decorators: _entityDecorator.default
745
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomImageButton, {
746
- isDisabled: disabledButtons.includes(buttonNames.image),
755
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
756
+ isDisabled: disabledButtons.includes(buttonNames.image)
757
+ }, /*#__PURE__*/_react.default.createElement(CustomImageButton, {
747
758
  readOnly: readOnly,
748
759
  editorState: editorState,
749
760
  onChange: this.onChange,
750
761
  ImageSelector: _imageSelector.ImageSelector
751
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomVideoButton, {
752
- isDisabled: disabledButtons.includes(buttonNames.video),
762
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
763
+ isDisabled: disabledButtons.includes(buttonNames.video)
764
+ }, /*#__PURE__*/_react.default.createElement(CustomVideoButton, {
753
765
  readOnly: readOnly,
754
766
  editorState: editorState,
755
767
  onChange: this.onChange,
756
768
  VideoSelector: _videoSelector.VideoSelector
757
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomYoutubeButton, {
758
- isDisabled: disabledButtons.includes(buttonNames.youtube),
769
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
770
+ isDisabled: disabledButtons.includes(buttonNames.youtube)
771
+ }, /*#__PURE__*/_react.default.createElement(CustomYoutubeButton, {
759
772
  readOnly: readOnly,
760
773
  editorState: editorState,
761
774
  onChange: this.onChange
762
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomAudioButton, {
763
- isDisabled: disabledButtons.includes(buttonNames.audio),
775
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
776
+ isDisabled: disabledButtons.includes(buttonNames.audio)
777
+ }, /*#__PURE__*/_react.default.createElement(CustomAudioButton, {
764
778
  readOnly: readOnly,
765
779
  editorState: editorState,
766
780
  onChange: this.onChange,
767
781
  AudioSelector: _audioSelector.AudioSelector
768
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomSlideshowButton, {
769
- isDisabled: disabledButtons.includes(buttonNames.slideshow),
782
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
783
+ isDisabled: disabledButtons.includes(buttonNames.slideshow)
784
+ }, /*#__PURE__*/_react.default.createElement(CustomSlideshowButton, {
770
785
  readOnly: readOnly,
771
786
  editorState: editorState,
772
787
  onChange: this.onChange,
773
788
  ImageSelector: _imageSelector.ImageSelector
774
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomInfoBoxButton, {
775
- isDisabled: disabledButtons.includes(buttonNames.infoBox),
789
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
790
+ isDisabled: disabledButtons.includes(buttonNames.infoBox)
791
+ }, /*#__PURE__*/_react.default.createElement(CustomInfoBoxButton, {
776
792
  readOnly: readOnly,
777
793
  editorState: editorState,
778
794
  onChange: this.onChange,
779
795
  renderBasicEditor: renderBasicEditor // decorators={decorators}
780
796
 
781
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomEmbeddedCodeButton, {
782
- isDisabled: disabledButtons.includes(buttonNames.embed),
797
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
798
+ isDisabled: disabledButtons.includes(buttonNames.embed)
799
+ }, /*#__PURE__*/_react.default.createElement(CustomEmbeddedCodeButton, {
783
800
  readOnly: readOnly,
784
801
  editorState: editorState,
785
802
  onChange: this.onChange
786
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomTableButton, {
787
- isDisabled: disabledButtons.includes(buttonNames.table),
803
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
804
+ isDisabled: disabledButtons.includes(buttonNames.table)
805
+ }, /*#__PURE__*/_react.default.createElement(CustomTableButton, {
788
806
  readOnly: readOnly,
789
807
  editorState: editorState,
790
808
  onChange: this.onChange
791
- }))), /*#__PURE__*/_react.default.createElement(DraftEditorControlsWrapper, null, /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomAlignLeftButton, {
792
- isDisabled: disabledButtons.includes(buttonNames.textAlign),
809
+ }))), /*#__PURE__*/_react.default.createElement(DraftEditorControlsWrapper, null, /*#__PURE__*/_react.default.createElement(ButtonGroup, {
810
+ isDisabled: disabledButtons.includes(buttonNames.textAlign)
811
+ }, /*#__PURE__*/_react.default.createElement(CustomAlignLeftButton, {
793
812
  isActive: (0, _textAlign.getSelectionBlockData)(editorState, 'textAlign') === 'left',
794
813
  readOnly: readOnly,
795
814
  editorState: editorState,
796
815
  onChange: this.onChange
797
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomAlignCenterButton, {
798
- isDisabled: disabledButtons.includes(buttonNames.textAlign),
816
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
817
+ isDisabled: disabledButtons.includes(buttonNames.textAlign)
818
+ }, /*#__PURE__*/_react.default.createElement(CustomAlignCenterButton, {
799
819
  isActive: (0, _textAlign.getSelectionBlockData)(editorState, 'textAlign') === 'center',
800
820
  readOnly: readOnly,
801
821
  editorState: editorState,
802
822
  onChange: this.onChange
803
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomColorBoxButton, {
804
- isDisabled: disabledButtons.includes(buttonNames.colorBox),
823
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
824
+ isDisabled: disabledButtons.includes(buttonNames.colorBox)
825
+ }, /*#__PURE__*/_react.default.createElement(CustomColorBoxButton, {
805
826
  readOnly: readOnly,
806
827
  editorState: editorState,
807
828
  onChange: this.onChange,
808
829
  renderBasicEditor: renderBasicEditor // decorators={decorators}
809
830
 
810
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomBackgroundColorButton, {
811
- isDisabled: disabledButtons.includes(buttonNames.backgroundColor),
831
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
832
+ isDisabled: disabledButtons.includes(buttonNames.backgroundColor)
833
+ }, /*#__PURE__*/_react.default.createElement(CustomBackgroundColorButton, {
812
834
  isActive: Object.prototype.hasOwnProperty.call(customStyle, 'backgroundColor'),
813
835
  readOnly: readOnly,
814
836
  editorState: editorState,
815
837
  onChange: this.onChange
816
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomBGImageButton, {
817
- isDisabled: disabledButtons.includes(buttonNames.backgroundImage),
838
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
839
+ isDisabled: disabledButtons.includes(buttonNames.backgroundImage)
840
+ }, /*#__PURE__*/_react.default.createElement(CustomBGImageButton, {
818
841
  readOnly: readOnly,
819
842
  editorState: editorState,
820
843
  onChange: this.onChange,
821
844
  ImageSelector: _imageSelector.ImageSelector,
822
845
  renderBasicEditor: renderBasicEditor,
823
846
  decorators: _entityDecorator.default
824
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomBGVideoButton, {
825
- isDisabled: disabledButtons.includes(buttonNames.backgroundVideo),
847
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
848
+ isDisabled: disabledButtons.includes(buttonNames.backgroundVideo)
849
+ }, /*#__PURE__*/_react.default.createElement(CustomBGVideoButton, {
826
850
  readOnly: readOnly,
827
851
  editorState: editorState,
828
852
  onChange: this.onChange,
829
853
  VideoSelector: _videoSelector.VideoSelector,
830
854
  renderBasicEditor: renderBasicEditor,
831
855
  decorators: _entityDecorator.default
832
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomRelatedPostButton, {
833
- isDisabled: disabledButtons.includes(buttonNames.relatedPost),
856
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
857
+ isDisabled: disabledButtons.includes(buttonNames.relatedPost)
858
+ }, /*#__PURE__*/_react.default.createElement(CustomRelatedPostButton, {
834
859
  readOnly: readOnly,
835
860
  editorState: editorState,
836
861
  onChange: this.onChange,
837
862
  PostSelector: _postSelector.PostSelector
838
- })), /*#__PURE__*/_react.default.createElement(ButtonGroup, null, /*#__PURE__*/_react.default.createElement(CustomSideIndexButton, {
839
- isDisabled: disabledButtons.includes(buttonNames.sideIndex),
863
+ })), /*#__PURE__*/_react.default.createElement(ButtonGroup, {
864
+ isDisabled: disabledButtons.includes(buttonNames.sideIndex)
865
+ }, /*#__PURE__*/_react.default.createElement(CustomSideIndexButton, {
840
866
  readOnly: readOnly,
841
867
  editorState: editorState,
842
868
  onChange: this.onChange
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mirrormedia/lilith-draft-editor",
3
- "version": "3.0.4",
3
+ "version": "3.0.6",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -22,6 +22,7 @@
22
22
  "dependencies": {
23
23
  "@mirrormedia/lilith-draft-renderer": "^1.4.3",
24
24
  "draft-js": "^0.11.7",
25
+ "js-sha256": "^0.11.0",
25
26
  "usehooks-ts": "^2"
26
27
  },
27
28
  "peerDependencies": {