@selfcommunity/react-ui 0.11.0-alpha.103 → 0.11.0-alpha.105
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.
- package/lib/cjs/components/Editor/plugins/MediaPlugin.js +9 -4
- package/lib/cjs/shared/Media/File/DocComponent.js +33 -23
- package/lib/cjs/shared/Media/File/TriggerButton.js +23 -7
- package/lib/esm/components/Editor/plugins/MediaPlugin.js +11 -6
- package/lib/esm/shared/Media/File/DocComponent.js +35 -25
- package/lib/esm/shared/Media/File/TriggerButton.js +24 -8
- package/lib/umd/react-ui.js +1 -1
- package/package.json +7 -7
|
@@ -40,8 +40,12 @@ function MediaPlugin(props) {
|
|
|
40
40
|
// CONTEXT
|
|
41
41
|
const scContext = (0, react_core_1.useSCContext)();
|
|
42
42
|
const scUserContext = (0, react_core_1.useSCUser)();
|
|
43
|
+
const { preferences } = (0, react_core_1.useSCPreferences)();
|
|
43
44
|
// HOOKS
|
|
44
45
|
const { enqueueSnackbar } = (0, notistack_1.useSnackbar)();
|
|
46
|
+
const acceptedMediaMimetypes = (0, react_1.useMemo)(() => preferences &&
|
|
47
|
+
react_core_1.SCPreferences.CONFIGURATIONS_ACCEPTED_MEDIA_MIMETYPES in preferences &&
|
|
48
|
+
preferences[react_core_1.SCPreferences.CONFIGURATIONS_ACCEPTED_MEDIA_MIMETYPES].value, [preferences]);
|
|
45
49
|
(0, react_1.useEffect)(() => {
|
|
46
50
|
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
|
|
47
51
|
// @ts-ignore
|
|
@@ -63,13 +67,14 @@ function MediaPlugin(props) {
|
|
|
63
67
|
}, [editor]);
|
|
64
68
|
// HANDLERS
|
|
65
69
|
const handleFileUploadFilter = (file) => {
|
|
66
|
-
|
|
70
|
+
const type = file.type;
|
|
71
|
+
if (type.startsWith('image/')) {
|
|
67
72
|
setMediaType('image');
|
|
68
73
|
}
|
|
69
74
|
else {
|
|
70
75
|
setMediaType('file');
|
|
71
76
|
}
|
|
72
|
-
return
|
|
77
|
+
return acceptedMediaMimetypes.includes(type);
|
|
73
78
|
};
|
|
74
79
|
const handleUploadSuccess = (media) => {
|
|
75
80
|
if (media.type === 'image') {
|
|
@@ -97,7 +102,7 @@ function MediaPlugin(props) {
|
|
|
97
102
|
setUploading(Object.assign({}, chunks));
|
|
98
103
|
isUploading && isUploading(Object.keys(chunks).length !== 0);
|
|
99
104
|
};
|
|
100
|
-
const handleUploadError = (
|
|
105
|
+
const handleUploadError = (_chunk, error) => {
|
|
101
106
|
enqueueSnackbar(error, {
|
|
102
107
|
variant: 'error',
|
|
103
108
|
autoHideDuration: 3000
|
|
@@ -112,7 +117,7 @@ function MediaPlugin(props) {
|
|
|
112
117
|
url: `${scContext.settings.portal}${api_services_1.Endpoints.ComposerChunkUploadMedia.url()}`,
|
|
113
118
|
headers: ((_a = scContext.settings.session) === null || _a === void 0 ? void 0 : _a.authToken) ? { Authorization: `Bearer ${scContext.settings.session.authToken.accessToken}` } : {},
|
|
114
119
|
method: api_services_1.Endpoints.ComposerChunkUploadMedia.method
|
|
115
|
-
}, chunkSize: 204800, accept:
|
|
120
|
+
}, chunkSize: 204800, accept: acceptedMediaMimetypes, fileFilter: handleFileUploadFilter, multiple: true }, { children: [(0, jsx_runtime_1.jsx)(MediaChunkUploader_1.default, { type: mediaType, onSuccess: handleUploadSuccess, onProgress: handleUploadProgress, onError: handleUploadError }), (0, jsx_runtime_1.jsx)(UploadButton, { className: className, extraProps: {
|
|
116
121
|
disabled: Object.keys(uploading).length !== 0,
|
|
117
122
|
progress: Object.keys(uploading).length !== 0 ? Object.values(uploading)[0].completed : null
|
|
118
123
|
} })] })) })));
|
|
@@ -5,14 +5,13 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
5
5
|
const material_1 = require("@mui/material");
|
|
6
6
|
const constants_1 = require("./constants");
|
|
7
7
|
const react_core_1 = require("@selfcommunity/react-core");
|
|
8
|
+
const types_1 = require("@selfcommunity/types");
|
|
8
9
|
const react_1 = require("react");
|
|
9
|
-
const avi_1 = tslib_1.__importDefault(require("../../../assets/composer/avi"));
|
|
10
|
-
const mp3_1 = tslib_1.__importDefault(require("../../../assets/composer/mp3"));
|
|
11
|
-
const pdf_1 = tslib_1.__importDefault(require("../../../assets/composer/pdf"));
|
|
12
|
-
const ppt_1 = tslib_1.__importDefault(require("../../../assets/composer/ppt"));
|
|
13
|
-
const psd_1 = tslib_1.__importDefault(require("../../../assets/composer/psd"));
|
|
14
10
|
const txt_1 = tslib_1.__importDefault(require("../../../assets/composer/txt"));
|
|
11
|
+
const pdf_1 = tslib_1.__importDefault(require("../../../assets/composer/pdf"));
|
|
12
|
+
const doc_1 = tslib_1.__importDefault(require("../../../assets/composer/doc"));
|
|
15
13
|
const xls_1 = tslib_1.__importDefault(require("../../../assets/composer/xls"));
|
|
14
|
+
const ppt_1 = tslib_1.__importDefault(require("../../../assets/composer/ppt"));
|
|
16
15
|
const fallback_1 = tslib_1.__importDefault(require("../../../assets/composer/fallback"));
|
|
17
16
|
const classes = {
|
|
18
17
|
docRoot: `${constants_1.PREFIX}-doc-root`,
|
|
@@ -39,28 +38,39 @@ function formatBytes(bytes, decimals = 2) {
|
|
|
39
38
|
function DocComponent(props) {
|
|
40
39
|
const { document, index, onDelete, handleDownload, onMediaClick } = props;
|
|
41
40
|
const getImage = (0, react_1.useCallback)(() => {
|
|
42
|
-
switch (document.
|
|
43
|
-
case
|
|
44
|
-
|
|
45
|
-
case 'doc':
|
|
46
|
-
return pdf_1.default; // TODO - use "doc" instead of "pdf" after api will be updated
|
|
47
|
-
case 'mp3':
|
|
48
|
-
return mp3_1.default;
|
|
49
|
-
case 'pdf':
|
|
50
|
-
return pdf_1.default;
|
|
51
|
-
case 'ppt':
|
|
52
|
-
return ppt_1.default;
|
|
53
|
-
case 'psd':
|
|
54
|
-
return psd_1.default;
|
|
55
|
-
case 'txt':
|
|
41
|
+
switch (document.mimetype) {
|
|
42
|
+
case types_1.SCMimeTypes.PLAIN_TEXT:
|
|
43
|
+
case types_1.SCMimeTypes.CSV:
|
|
56
44
|
return txt_1.default;
|
|
57
|
-
case
|
|
45
|
+
case types_1.SCMimeTypes.PDF:
|
|
46
|
+
return pdf_1.default;
|
|
47
|
+
case types_1.SCMimeTypes.DOC:
|
|
48
|
+
case types_1.SCMimeTypes.DOCX:
|
|
49
|
+
case types_1.SCMimeTypes.DOTX:
|
|
50
|
+
case types_1.SCMimeTypes.DOCM:
|
|
51
|
+
case types_1.SCMimeTypes.DOTM:
|
|
52
|
+
return doc_1.default;
|
|
53
|
+
case types_1.SCMimeTypes.XLS:
|
|
54
|
+
case types_1.SCMimeTypes.XLSX:
|
|
55
|
+
case types_1.SCMimeTypes.XLTX:
|
|
56
|
+
case types_1.SCMimeTypes.XLSM:
|
|
57
|
+
case types_1.SCMimeTypes.XLTM:
|
|
58
|
+
case types_1.SCMimeTypes.XLAM:
|
|
59
|
+
case types_1.SCMimeTypes.XLSB:
|
|
58
60
|
return xls_1.default;
|
|
61
|
+
case types_1.SCMimeTypes.PPT:
|
|
62
|
+
case types_1.SCMimeTypes.PPTX:
|
|
63
|
+
case types_1.SCMimeTypes.POTX:
|
|
64
|
+
case types_1.SCMimeTypes.PPSX:
|
|
65
|
+
case types_1.SCMimeTypes.PPAM:
|
|
66
|
+
case types_1.SCMimeTypes.PPTM:
|
|
67
|
+
case types_1.SCMimeTypes.POTM:
|
|
68
|
+
case types_1.SCMimeTypes.PPSM:
|
|
69
|
+
return ppt_1.default;
|
|
59
70
|
default:
|
|
60
71
|
return fallback_1.default;
|
|
61
72
|
}
|
|
62
|
-
}, [document.
|
|
63
|
-
|
|
64
|
-
return ((0, jsx_runtime_1.jsxs)(Root, Object.assign({ className: classes.docRoot }, { children: [handleDownload ? ((0, jsx_runtime_1.jsx)(material_1.Button, Object.assign({ className: classes.imageWrapper, component: react_core_1.Link, to: document.url, target: "_blank", onClick: () => onMediaClick === null || onMediaClick === void 0 ? void 0 : onMediaClick(document) }, { children: imageComponent }))) : ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: imageComponent })), (0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ className: classes.textWrapper }, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.title }, { children: document.title })), document.size && (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.subtitle }, { children: formatBytes(document.size) }))] })), (handleDownload || onDelete) && ((0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ className: classes.actionWrapper }, { children: [onDelete && ((0, jsx_runtime_1.jsx)(material_1.IconButton, Object.assign({ className: classes.action, onClick: () => onDelete(document.id) }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "delete" }) }))), handleDownload && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.IconButton, Object.assign({ className: classes.action, component: react_core_1.Link, to: document.url, target: "_blank", onClick: () => onMediaClick === null || onMediaClick === void 0 ? void 0 : onMediaClick(document) }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "visibility" }) })), (0, jsx_runtime_1.jsx)(material_1.IconButton, Object.assign({ className: classes.action, onClick: () => handleDownload(index) }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "download" }) }))] }))] })))] })));
|
|
73
|
+
}, [document.mimetype]);
|
|
74
|
+
return ((0, jsx_runtime_1.jsxs)(Root, Object.assign({ className: classes.docRoot }, { children: [(0, jsx_runtime_1.jsx)(material_1.Box, { component: "img", alt: document.title, src: getImage() }), (0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ className: classes.textWrapper }, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.title }, { children: document.title })), document.size && (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.subtitle }, { children: formatBytes(document.size) }))] })), (handleDownload || onDelete) && ((0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ className: classes.actionWrapper }, { children: [onDelete && ((0, jsx_runtime_1.jsx)(material_1.IconButton, Object.assign({ className: classes.action, onClick: () => onDelete(document.id) }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "delete" }) }))), handleDownload && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [document.mimetype === types_1.SCMimeTypes.PDF && ((0, jsx_runtime_1.jsx)(material_1.IconButton, Object.assign({ className: classes.action, component: react_core_1.Link, to: document.url, target: "_blank", onClick: () => onMediaClick === null || onMediaClick === void 0 ? void 0 : onMediaClick(document) }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "visibility" }) }))), (0, jsx_runtime_1.jsx)(material_1.IconButton, Object.assign({ className: classes.action, onClick: () => handleDownload(index) }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "download" }) }))] }))] })))] })));
|
|
65
75
|
}
|
|
66
76
|
exports.default = DocComponent;
|
|
@@ -32,11 +32,6 @@ const MenuRoot = (0, material_1.styled)(material_1.Menu, {
|
|
|
32
32
|
name: constants_1.PREFIX,
|
|
33
33
|
slot: 'TriggerMenuRoot'
|
|
34
34
|
})(() => ({}));
|
|
35
|
-
const PhotoUploadListItemButton = (0, asUploadButton_1.default)((0, react_1.forwardRef)((props, ref) => (0, jsx_runtime_1.jsx)(material_1.ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: 'image/*', capture: 'camera' });
|
|
36
|
-
const GalleryUploadListItemButton = (0, asUploadButton_1.default)((0, react_1.forwardRef)((props, ref) => (0, jsx_runtime_1.jsx)(material_1.ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: 'image/*' });
|
|
37
|
-
const DocumentUploadListItemButton = (0, asUploadButton_1.default)((0, react_1.forwardRef)((props, ref) => (0, jsx_runtime_1.jsx)(material_1.ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: 'application/pdf' });
|
|
38
|
-
const GalleryUploadMenuItem = (0, asUploadButton_1.default)((0, react_1.forwardRef)((props, ref) => (0, jsx_runtime_1.jsx)(material_1.MenuItem, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: 'image/*' });
|
|
39
|
-
const DocumentUploadMenuItem = (0, asUploadButton_1.default)((0, react_1.forwardRef)((props, ref) => (0, jsx_runtime_1.jsx)(material_1.MenuItem, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: 'application/pdf' });
|
|
40
35
|
exports.default = (_a) => {
|
|
41
36
|
var { className, onAdd = null } = _a, rest = tslib_1.__rest(_a, ["className", "onAdd"]);
|
|
42
37
|
// STATE
|
|
@@ -44,10 +39,31 @@ exports.default = (_a) => {
|
|
|
44
39
|
const [isUploading, setIsUploading] = (0, react_1.useState)(false);
|
|
45
40
|
// CONTEXT
|
|
46
41
|
const scContext = (0, react_core_1.useSCContext)();
|
|
42
|
+
const { preferences } = (0, react_core_1.useSCPreferences)();
|
|
47
43
|
// HOOKS
|
|
48
44
|
const theme = (0, material_1.useTheme)();
|
|
49
45
|
const isMobile = (0, material_1.useMediaQuery)(theme.breakpoints.down('md'));
|
|
50
46
|
const { enqueueSnackbar, closeSnackbar } = (0, notistack_1.useSnackbar)();
|
|
47
|
+
const acceptedMediaMimetypes = (0, react_1.useMemo)(() => preferences &&
|
|
48
|
+
react_core_1.SCPreferences.CONFIGURATIONS_ACCEPTED_MEDIA_MIMETYPES in preferences &&
|
|
49
|
+
preferences[react_core_1.SCPreferences.CONFIGURATIONS_ACCEPTED_MEDIA_MIMETYPES].value, [preferences]);
|
|
50
|
+
const mimeTypesArray = (0, react_1.useMemo)(() => acceptedMediaMimetypes.split(','), [acceptedMediaMimetypes]);
|
|
51
|
+
const { imageMimeTypes, documentMimeTypes } = (0, react_1.useMemo)(() => mimeTypesArray.reduce((acc, type) => {
|
|
52
|
+
if (type.startsWith('image/')) {
|
|
53
|
+
acc = Object.assign(Object.assign({}, acc), { imageMimeTypes: acc.imageMimeTypes.concat(`${type},`) });
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
acc = Object.assign(Object.assign({}, acc), { documentMimeTypes: acc.documentMimeTypes.concat(`${type},`) });
|
|
57
|
+
}
|
|
58
|
+
return acc;
|
|
59
|
+
}, { imageMimeTypes: '', documentMimeTypes: '' }), [mimeTypesArray]);
|
|
60
|
+
const formattedImageMimeTypes = (0, react_1.useMemo)(() => imageMimeTypes.substring(0, imageMimeTypes.length - 1), [imageMimeTypes]);
|
|
61
|
+
const formattedDocumentMimeTypes = (0, react_1.useMemo)(() => documentMimeTypes.substring(0, documentMimeTypes.length - 1), [documentMimeTypes]);
|
|
62
|
+
const PhotoUploadListItemButton = (0, asUploadButton_1.default)((0, react_1.forwardRef)((props, ref) => (0, jsx_runtime_1.jsx)(material_1.ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: formattedImageMimeTypes, capture: 'camera' });
|
|
63
|
+
const GalleryUploadListItemButton = (0, asUploadButton_1.default)((0, react_1.forwardRef)((props, ref) => (0, jsx_runtime_1.jsx)(material_1.ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: formattedImageMimeTypes });
|
|
64
|
+
const DocumentUploadListItemButton = (0, asUploadButton_1.default)((0, react_1.forwardRef)((props, ref) => (0, jsx_runtime_1.jsx)(material_1.ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: formattedDocumentMimeTypes });
|
|
65
|
+
const GalleryUploadMenuItem = (0, asUploadButton_1.default)((0, react_1.forwardRef)((props, ref) => (0, jsx_runtime_1.jsx)(material_1.MenuItem, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: formattedImageMimeTypes });
|
|
66
|
+
const DocumentUploadMenuItem = (0, asUploadButton_1.default)((0, react_1.forwardRef)((props, ref) => (0, jsx_runtime_1.jsx)(material_1.MenuItem, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: formattedDocumentMimeTypes });
|
|
51
67
|
// HANDLERS
|
|
52
68
|
const handleOpen = (0, react_1.useCallback)((event) => {
|
|
53
69
|
setAnchorEl(event.currentTarget);
|
|
@@ -56,7 +72,7 @@ exports.default = (_a) => {
|
|
|
56
72
|
setAnchorEl(null);
|
|
57
73
|
}, []);
|
|
58
74
|
const handleFilterByMime = (0, react_1.useCallback)((file) => {
|
|
59
|
-
if (
|
|
75
|
+
if (acceptedMediaMimetypes.includes(file.type)) {
|
|
60
76
|
return true;
|
|
61
77
|
}
|
|
62
78
|
const _snackBar = enqueueSnackbar((0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.composer.media.file.error", defaultMessage: "ui.composer.media.file.error" }), {
|
|
@@ -70,7 +86,7 @@ exports.default = (_a) => {
|
|
|
70
86
|
}
|
|
71
87
|
});
|
|
72
88
|
return false;
|
|
73
|
-
}, []);
|
|
89
|
+
}, [acceptedMediaMimetypes]);
|
|
74
90
|
const handleSuccess = (0, react_1.useCallback)((media) => {
|
|
75
91
|
onAdd && onAdd(media);
|
|
76
92
|
}, [onAdd]);
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { __rest } from "tslib";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { forwardRef, useEffect, useState } from 'react';
|
|
3
|
+
import { forwardRef, useEffect, useMemo, useState } from 'react';
|
|
4
4
|
import { COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical';
|
|
5
5
|
import { $insertNodeToNearestRoot } from '@lexical/utils';
|
|
6
6
|
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
|
7
7
|
import { Box, CircularProgress, Icon, IconButton, styled } from '@mui/material';
|
|
8
8
|
import ChunkedUploady from '@rpldy/chunked-uploady';
|
|
9
9
|
import { Endpoints } from '@selfcommunity/api-services';
|
|
10
|
-
import { useSCContext, useSCUser } from '@selfcommunity/react-core';
|
|
10
|
+
import { SCPreferences, useSCContext, useSCPreferences, useSCUser } from '@selfcommunity/react-core';
|
|
11
11
|
import MediaChunkUploader from '../../../shared/MediaChunkUploader';
|
|
12
12
|
import { asUploadButton } from '@rpldy/upload-button';
|
|
13
13
|
import { useSnackbar } from 'notistack';
|
|
@@ -37,8 +37,12 @@ export default function MediaPlugin(props) {
|
|
|
37
37
|
// CONTEXT
|
|
38
38
|
const scContext = useSCContext();
|
|
39
39
|
const scUserContext = useSCUser();
|
|
40
|
+
const { preferences } = useSCPreferences();
|
|
40
41
|
// HOOKS
|
|
41
42
|
const { enqueueSnackbar } = useSnackbar();
|
|
43
|
+
const acceptedMediaMimetypes = useMemo(() => preferences &&
|
|
44
|
+
SCPreferences.CONFIGURATIONS_ACCEPTED_MEDIA_MIMETYPES in preferences &&
|
|
45
|
+
preferences[SCPreferences.CONFIGURATIONS_ACCEPTED_MEDIA_MIMETYPES].value, [preferences]);
|
|
42
46
|
useEffect(() => {
|
|
43
47
|
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
|
|
44
48
|
// @ts-ignore
|
|
@@ -60,13 +64,14 @@ export default function MediaPlugin(props) {
|
|
|
60
64
|
}, [editor]);
|
|
61
65
|
// HANDLERS
|
|
62
66
|
const handleFileUploadFilter = (file) => {
|
|
63
|
-
|
|
67
|
+
const type = file.type;
|
|
68
|
+
if (type.startsWith('image/')) {
|
|
64
69
|
setMediaType('image');
|
|
65
70
|
}
|
|
66
71
|
else {
|
|
67
72
|
setMediaType('file');
|
|
68
73
|
}
|
|
69
|
-
return
|
|
74
|
+
return acceptedMediaMimetypes.includes(type);
|
|
70
75
|
};
|
|
71
76
|
const handleUploadSuccess = (media) => {
|
|
72
77
|
if (media.type === 'image') {
|
|
@@ -94,7 +99,7 @@ export default function MediaPlugin(props) {
|
|
|
94
99
|
setUploading(Object.assign({}, chunks));
|
|
95
100
|
isUploading && isUploading(Object.keys(chunks).length !== 0);
|
|
96
101
|
};
|
|
97
|
-
const handleUploadError = (
|
|
102
|
+
const handleUploadError = (_chunk, error) => {
|
|
98
103
|
enqueueSnackbar(error, {
|
|
99
104
|
variant: 'error',
|
|
100
105
|
autoHideDuration: 3000
|
|
@@ -109,7 +114,7 @@ export default function MediaPlugin(props) {
|
|
|
109
114
|
url: `${scContext.settings.portal}${Endpoints.ComposerChunkUploadMedia.url()}`,
|
|
110
115
|
headers: ((_a = scContext.settings.session) === null || _a === void 0 ? void 0 : _a.authToken) ? { Authorization: `Bearer ${scContext.settings.session.authToken.accessToken}` } : {},
|
|
111
116
|
method: Endpoints.ComposerChunkUploadMedia.method
|
|
112
|
-
}, chunkSize: 204800, accept:
|
|
117
|
+
}, chunkSize: 204800, accept: acceptedMediaMimetypes, fileFilter: handleFileUploadFilter, multiple: true }, { children: [_jsx(MediaChunkUploader, { type: mediaType, onSuccess: handleUploadSuccess, onProgress: handleUploadProgress, onError: handleUploadError }), _jsx(UploadButton, { className: className, extraProps: {
|
|
113
118
|
disabled: Object.keys(uploading).length !== 0,
|
|
114
119
|
progress: Object.keys(uploading).length !== 0 ? Object.values(uploading)[0].completed : null
|
|
115
120
|
} })] })) })));
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
2
|
-
import { Box,
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Icon, IconButton, Stack, styled, Typography } from '@mui/material';
|
|
3
3
|
import { PREFIX } from './constants';
|
|
4
4
|
import { Link } from '@selfcommunity/react-core';
|
|
5
|
+
import { SCMimeTypes } from '@selfcommunity/types';
|
|
5
6
|
import { useCallback } from 'react';
|
|
6
|
-
import avi from '../../../assets/composer/avi';
|
|
7
|
-
import mp3 from '../../../assets/composer/mp3';
|
|
8
|
-
import pdf from '../../../assets/composer/pdf';
|
|
9
|
-
import ppt from '../../../assets/composer/ppt';
|
|
10
|
-
import psd from '../../../assets/composer/psd';
|
|
11
7
|
import txt from '../../../assets/composer/txt';
|
|
8
|
+
import pdf from '../../../assets/composer/pdf';
|
|
9
|
+
import doc from '../../../assets/composer/doc';
|
|
12
10
|
import xls from '../../../assets/composer/xls';
|
|
11
|
+
import ppt from '../../../assets/composer/ppt';
|
|
13
12
|
import fallback from '../../../assets/composer/fallback';
|
|
14
13
|
const classes = {
|
|
15
14
|
docRoot: `${PREFIX}-doc-root`,
|
|
@@ -36,27 +35,38 @@ function formatBytes(bytes, decimals = 2) {
|
|
|
36
35
|
export default function DocComponent(props) {
|
|
37
36
|
const { document, index, onDelete, handleDownload, onMediaClick } = props;
|
|
38
37
|
const getImage = useCallback(() => {
|
|
39
|
-
switch (document.
|
|
40
|
-
case
|
|
41
|
-
|
|
42
|
-
case 'doc':
|
|
43
|
-
return pdf; // TODO - use "doc" instead of "pdf" after api will be updated
|
|
44
|
-
case 'mp3':
|
|
45
|
-
return mp3;
|
|
46
|
-
case 'pdf':
|
|
47
|
-
return pdf;
|
|
48
|
-
case 'ppt':
|
|
49
|
-
return ppt;
|
|
50
|
-
case 'psd':
|
|
51
|
-
return psd;
|
|
52
|
-
case 'txt':
|
|
38
|
+
switch (document.mimetype) {
|
|
39
|
+
case SCMimeTypes.PLAIN_TEXT:
|
|
40
|
+
case SCMimeTypes.CSV:
|
|
53
41
|
return txt;
|
|
54
|
-
case
|
|
42
|
+
case SCMimeTypes.PDF:
|
|
43
|
+
return pdf;
|
|
44
|
+
case SCMimeTypes.DOC:
|
|
45
|
+
case SCMimeTypes.DOCX:
|
|
46
|
+
case SCMimeTypes.DOTX:
|
|
47
|
+
case SCMimeTypes.DOCM:
|
|
48
|
+
case SCMimeTypes.DOTM:
|
|
49
|
+
return doc;
|
|
50
|
+
case SCMimeTypes.XLS:
|
|
51
|
+
case SCMimeTypes.XLSX:
|
|
52
|
+
case SCMimeTypes.XLTX:
|
|
53
|
+
case SCMimeTypes.XLSM:
|
|
54
|
+
case SCMimeTypes.XLTM:
|
|
55
|
+
case SCMimeTypes.XLAM:
|
|
56
|
+
case SCMimeTypes.XLSB:
|
|
55
57
|
return xls;
|
|
58
|
+
case SCMimeTypes.PPT:
|
|
59
|
+
case SCMimeTypes.PPTX:
|
|
60
|
+
case SCMimeTypes.POTX:
|
|
61
|
+
case SCMimeTypes.PPSX:
|
|
62
|
+
case SCMimeTypes.PPAM:
|
|
63
|
+
case SCMimeTypes.PPTM:
|
|
64
|
+
case SCMimeTypes.POTM:
|
|
65
|
+
case SCMimeTypes.PPSM:
|
|
66
|
+
return ppt;
|
|
56
67
|
default:
|
|
57
68
|
return fallback;
|
|
58
69
|
}
|
|
59
|
-
}, [document.
|
|
60
|
-
|
|
61
|
-
return (_jsxs(Root, Object.assign({ className: classes.docRoot }, { children: [handleDownload ? (_jsx(Button, Object.assign({ className: classes.imageWrapper, component: Link, to: document.url, target: "_blank", onClick: () => onMediaClick === null || onMediaClick === void 0 ? void 0 : onMediaClick(document) }, { children: imageComponent }))) : (_jsx(_Fragment, { children: imageComponent })), _jsxs(Stack, Object.assign({ className: classes.textWrapper }, { children: [_jsx(Typography, Object.assign({ className: classes.title }, { children: document.title })), document.size && _jsx(Typography, Object.assign({ className: classes.subtitle }, { children: formatBytes(document.size) }))] })), (handleDownload || onDelete) && (_jsxs(Stack, Object.assign({ className: classes.actionWrapper }, { children: [onDelete && (_jsx(IconButton, Object.assign({ className: classes.action, onClick: () => onDelete(document.id) }, { children: _jsx(Icon, { children: "delete" }) }))), handleDownload && (_jsxs(_Fragment, { children: [_jsx(IconButton, Object.assign({ className: classes.action, component: Link, to: document.url, target: "_blank", onClick: () => onMediaClick === null || onMediaClick === void 0 ? void 0 : onMediaClick(document) }, { children: _jsx(Icon, { children: "visibility" }) })), _jsx(IconButton, Object.assign({ className: classes.action, onClick: () => handleDownload(index) }, { children: _jsx(Icon, { children: "download" }) }))] }))] })))] })));
|
|
70
|
+
}, [document.mimetype]);
|
|
71
|
+
return (_jsxs(Root, Object.assign({ className: classes.docRoot }, { children: [_jsx(Box, { component: "img", alt: document.title, src: getImage() }), _jsxs(Stack, Object.assign({ className: classes.textWrapper }, { children: [_jsx(Typography, Object.assign({ className: classes.title }, { children: document.title })), document.size && _jsx(Typography, Object.assign({ className: classes.subtitle }, { children: formatBytes(document.size) }))] })), (handleDownload || onDelete) && (_jsxs(Stack, Object.assign({ className: classes.actionWrapper }, { children: [onDelete && (_jsx(IconButton, Object.assign({ className: classes.action, onClick: () => onDelete(document.id) }, { children: _jsx(Icon, { children: "delete" }) }))), handleDownload && (_jsxs(_Fragment, { children: [document.mimetype === SCMimeTypes.PDF && (_jsx(IconButton, Object.assign({ className: classes.action, component: Link, to: document.url, target: "_blank", onClick: () => onMediaClick === null || onMediaClick === void 0 ? void 0 : onMediaClick(document) }, { children: _jsx(Icon, { children: "visibility" }) }))), _jsx(IconButton, Object.assign({ className: classes.action, onClick: () => handleDownload(index) }, { children: _jsx(Icon, { children: "download" }) }))] }))] })))] })));
|
|
62
72
|
}
|
|
@@ -4,7 +4,7 @@ import { forwardRef, useCallback, useMemo, useState } from 'react';
|
|
|
4
4
|
import { CircularProgress, IconButton, List, ListItem, ListItemButton, Menu, MenuItem, SwipeableDrawer, useMediaQuery, useTheme, Icon, styled } from '@mui/material';
|
|
5
5
|
import { PREFIX } from './constants';
|
|
6
6
|
import classNames from 'classnames';
|
|
7
|
-
import { useSCContext } from '@selfcommunity/react-core';
|
|
7
|
+
import { SCPreferences, useSCContext, useSCPreferences } from '@selfcommunity/react-core';
|
|
8
8
|
import { FormattedMessage } from 'react-intl';
|
|
9
9
|
import MediaChunkUploader from '../../MediaChunkUploader';
|
|
10
10
|
import ChunkedUploady from '@rpldy/chunked-uploady';
|
|
@@ -30,11 +30,6 @@ const MenuRoot = styled(Menu, {
|
|
|
30
30
|
name: PREFIX,
|
|
31
31
|
slot: 'TriggerMenuRoot'
|
|
32
32
|
})(() => ({}));
|
|
33
|
-
const PhotoUploadListItemButton = asUploadButton(forwardRef((props, ref) => _jsx(ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: 'image/*', capture: 'camera' });
|
|
34
|
-
const GalleryUploadListItemButton = asUploadButton(forwardRef((props, ref) => _jsx(ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: 'image/*' });
|
|
35
|
-
const DocumentUploadListItemButton = asUploadButton(forwardRef((props, ref) => _jsx(ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: 'application/pdf' });
|
|
36
|
-
const GalleryUploadMenuItem = asUploadButton(forwardRef((props, ref) => _jsx(MenuItem, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: 'image/*' });
|
|
37
|
-
const DocumentUploadMenuItem = asUploadButton(forwardRef((props, ref) => _jsx(MenuItem, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: 'application/pdf' });
|
|
38
33
|
export default (_a) => {
|
|
39
34
|
var { className, onAdd = null } = _a, rest = __rest(_a, ["className", "onAdd"]);
|
|
40
35
|
// STATE
|
|
@@ -42,10 +37,31 @@ export default (_a) => {
|
|
|
42
37
|
const [isUploading, setIsUploading] = useState(false);
|
|
43
38
|
// CONTEXT
|
|
44
39
|
const scContext = useSCContext();
|
|
40
|
+
const { preferences } = useSCPreferences();
|
|
45
41
|
// HOOKS
|
|
46
42
|
const theme = useTheme();
|
|
47
43
|
const isMobile = useMediaQuery(theme.breakpoints.down('md'));
|
|
48
44
|
const { enqueueSnackbar, closeSnackbar } = useSnackbar();
|
|
45
|
+
const acceptedMediaMimetypes = useMemo(() => preferences &&
|
|
46
|
+
SCPreferences.CONFIGURATIONS_ACCEPTED_MEDIA_MIMETYPES in preferences &&
|
|
47
|
+
preferences[SCPreferences.CONFIGURATIONS_ACCEPTED_MEDIA_MIMETYPES].value, [preferences]);
|
|
48
|
+
const mimeTypesArray = useMemo(() => acceptedMediaMimetypes.split(','), [acceptedMediaMimetypes]);
|
|
49
|
+
const { imageMimeTypes, documentMimeTypes } = useMemo(() => mimeTypesArray.reduce((acc, type) => {
|
|
50
|
+
if (type.startsWith('image/')) {
|
|
51
|
+
acc = Object.assign(Object.assign({}, acc), { imageMimeTypes: acc.imageMimeTypes.concat(`${type},`) });
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
acc = Object.assign(Object.assign({}, acc), { documentMimeTypes: acc.documentMimeTypes.concat(`${type},`) });
|
|
55
|
+
}
|
|
56
|
+
return acc;
|
|
57
|
+
}, { imageMimeTypes: '', documentMimeTypes: '' }), [mimeTypesArray]);
|
|
58
|
+
const formattedImageMimeTypes = useMemo(() => imageMimeTypes.substring(0, imageMimeTypes.length - 1), [imageMimeTypes]);
|
|
59
|
+
const formattedDocumentMimeTypes = useMemo(() => documentMimeTypes.substring(0, documentMimeTypes.length - 1), [documentMimeTypes]);
|
|
60
|
+
const PhotoUploadListItemButton = asUploadButton(forwardRef((props, ref) => _jsx(ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: formattedImageMimeTypes, capture: 'camera' });
|
|
61
|
+
const GalleryUploadListItemButton = asUploadButton(forwardRef((props, ref) => _jsx(ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: formattedImageMimeTypes });
|
|
62
|
+
const DocumentUploadListItemButton = asUploadButton(forwardRef((props, ref) => _jsx(ListItemButton, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: formattedDocumentMimeTypes });
|
|
63
|
+
const GalleryUploadMenuItem = asUploadButton(forwardRef((props, ref) => _jsx(MenuItem, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: formattedImageMimeTypes });
|
|
64
|
+
const DocumentUploadMenuItem = asUploadButton(forwardRef((props, ref) => _jsx(MenuItem, Object.assign({}, props, { "aria-label": "upload", ref: ref }))), { accept: formattedDocumentMimeTypes });
|
|
49
65
|
// HANDLERS
|
|
50
66
|
const handleOpen = useCallback((event) => {
|
|
51
67
|
setAnchorEl(event.currentTarget);
|
|
@@ -54,7 +70,7 @@ export default (_a) => {
|
|
|
54
70
|
setAnchorEl(null);
|
|
55
71
|
}, []);
|
|
56
72
|
const handleFilterByMime = useCallback((file) => {
|
|
57
|
-
if (
|
|
73
|
+
if (acceptedMediaMimetypes.includes(file.type)) {
|
|
58
74
|
return true;
|
|
59
75
|
}
|
|
60
76
|
const _snackBar = enqueueSnackbar(_jsx(FormattedMessage, { id: "ui.composer.media.file.error", defaultMessage: "ui.composer.media.file.error" }), {
|
|
@@ -68,7 +84,7 @@ export default (_a) => {
|
|
|
68
84
|
}
|
|
69
85
|
});
|
|
70
86
|
return false;
|
|
71
|
-
}, []);
|
|
87
|
+
}, [acceptedMediaMimetypes]);
|
|
72
88
|
const handleSuccess = useCallback((media) => {
|
|
73
89
|
onAdd && onAdd(media);
|
|
74
90
|
}, [onAdd]);
|