@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.
@@ -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
- if (file.type.startsWith('image/')) {
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 file.type.startsWith('image/') || file.type.startsWith('application/');
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 = (chunk, error) => {
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: "image/*,application/*", 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: {
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.type) {
43
- case 'avi':
44
- return avi_1.default;
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 'xsl':
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.type]);
63
- const imageComponent = (0, jsx_runtime_1.jsx)(material_1.Box, { component: "img", alt: "pdf preview", src: getImage(), sx: { cursor: handleDownload ? 'pointer' : undefined } });
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 (file.type.startsWith('image/') || file.type === 'application/pdf') {
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
- if (file.type.startsWith('image/')) {
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 file.type.startsWith('image/') || file.type.startsWith('application/');
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 = (chunk, error) => {
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: "image/*,application/*", fileFilter: handleFileUploadFilter, multiple: true }, { children: [_jsx(MediaChunkUploader, { type: mediaType, onSuccess: handleUploadSuccess, onProgress: handleUploadProgress, onError: handleUploadError }), _jsx(UploadButton, { className: className, extraProps: {
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, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Button, Icon, IconButton, Stack, styled, Typography } from '@mui/material';
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.type) {
40
- case 'avi':
41
- return avi;
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 'xsl':
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.type]);
60
- const imageComponent = _jsx(Box, { component: "img", alt: "pdf preview", src: getImage(), sx: { cursor: handleDownload ? 'pointer' : undefined } });
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 (file.type.startsWith('image/') || file.type === 'application/pdf') {
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]);