@hh.ru/magritte-ui-upload 1.1.0 → 1.2.0

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/Upload.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import { ReactElement } from 'react';
2
2
  import { UploadProps } from '@hh.ru/magritte-ui-upload/types';
3
- declare const Upload: ({ files, trls, accept, selectFileButton: _selectFileButton, deleteFileButton: _deleteFileButton, replaceImageButton: _replaceImageButton, deleteImageButton: _deleteImageButton, renderFileInfo, onDropAccepted: onDropAcceptedExternal, onDropRejected: onDropRejectedExternal, onFileDelete: onFileDeleteExternal, ...dropzoneProps }: UploadProps) => ReactElement;
3
+ declare const Upload: ({ files, trls, size, multiple, accept, selectFileButton: _selectFileButton, deleteFileButton: _deleteFileButton, replaceImageButton: _replaceImageButton, deleteImageButton: _deleteImageButton, renderFileInfo, onDropAccepted: onDropAcceptedExternal, onDropRejected: onDropRejectedExternal, onFileDelete: onFileDeleteExternal, "aria-label": ariaLabel, ...dropzoneProps }: UploadProps) => ReactElement;
4
4
  export { Upload };
package/Upload.js CHANGED
@@ -3,12 +3,15 @@ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
3
3
  import { useRef, useMemo, useEffect, useCallback, cloneElement } from 'react';
4
4
  import { useDropzone } from 'react-dropzone';
5
5
  import classnames from 'classnames';
6
- import { CrossOutlinedSize24, ExclamationTriangleOutlinedSize32, DocumentOutlinedSize32, VideocameraOutlinedSize32, ImageSize32, DocumentArrowUpOutlinedSize32 } from '@hh.ru/magritte-ui-icon/icon';
6
+ import { Action } from '@hh.ru/magritte-ui-action';
7
+ import { Avatar } from '@hh.ru/magritte-ui-avatar';
8
+ import { ExclamationTriangleOutlinedSize16, CheckCircleOutlinedSize16, CrossOutlinedSize24, TrashOutlinedSize24, ExclamationTriangleOutlinedSize32 } from '@hh.ru/magritte-ui-icon/icon';
7
9
  import { Loader } from '@hh.ru/magritte-ui-loader';
8
10
  import { VSpacing } from '@hh.ru/magritte-ui-spacing';
9
11
  import { Text } from '@hh.ru/magritte-ui-typography';
12
+ import { getUploadIcon } from './utils.js';
10
13
 
11
- var styles = {"root":"magritte-root___FV1tC_1-1-0","background":"magritte-background___RfZ0U_1-1-0","drag-active":"magritte-drag-active___dihBL_1-1-0","dragActive":"magritte-drag-active___dihBL_1-1-0","load":"magritte-load___MghDA_1-1-0","loading":"magritte-loading___9E3p-_1-1-0","invalid":"magritte-invalid___Rt10-_1-1-0","body":"magritte-body___O7ROl_1-1-0","loader":"magritte-loader___XYpWg_1-1-0","cancel":"magritte-cancel___tQ-yX_1-1-0","image-controls":"magritte-image-controls___vLf94_1-1-0","imageControls":"magritte-image-controls___vLf94_1-1-0"};
14
+ var styles = {"root":"magritte-root___FV1tC_1-2-0","background":"magritte-background___RfZ0U_1-2-0","drag-active":"magritte-drag-active___dihBL_1-2-0","dragActive":"magritte-drag-active___dihBL_1-2-0","load":"magritte-load___MghDA_1-2-0","loading":"magritte-loading___9E3p-_1-2-0","invalid":"magritte-invalid___Rt10-_1-2-0","root_medium":"magritte-root_medium___67WJa_1-2-0","rootMedium":"magritte-root_medium___67WJa_1-2-0","body":"magritte-body___O7ROl_1-2-0","root_small":"magritte-root_small___dkUYq_1-2-0","rootSmall":"magritte-root_small___dkUYq_1-2-0","loader":"magritte-loader___XYpWg_1-2-0","cancel":"magritte-cancel___tQ-yX_1-2-0","image-controls":"magritte-image-controls___vLf94_1-2-0","imageControls":"magritte-image-controls___vLf94_1-2-0","small-controls":"magritte-small-controls___Qn9TP_1-2-0","smallControls":"magritte-small-controls___Qn9TP_1-2-0","small-file-info":"magritte-small-file-info___cMns-_1-2-0","smallFileInfo":"magritte-small-file-info___cMns-_1-2-0"};
12
15
 
13
16
  const order = 1024 * 1024;
14
17
  const bytes2mb = (value) => {
@@ -26,61 +29,43 @@ const getAvaliableFileTypes = (accept) => {
26
29
  const avaliableType = avaliableTypes[0];
27
30
  return avaliableType.split('/')[0];
28
31
  };
29
- // иконка может меняться в зависимости от типа и состояния загрузки
30
- const getUploadIcon = (uploadType, loadedFile) => {
31
- if (loadedFile) {
32
- const { error, loading } = loadedFile;
33
- if (loading) {
34
- return null;
35
- }
36
- if (error) {
37
- return jsx(ExclamationTriangleOutlinedSize32, { initial: "negative" });
38
- }
39
- // иначе надо обработать type (причем некоторые меняются)
40
- if (uploadType === 'mixed' || uploadType === 'application') {
41
- return jsx(DocumentOutlinedSize32, { initial: "secondary" });
42
- }
43
- if (uploadType === 'video') {
44
- return jsx(VideocameraOutlinedSize32, { initial: "secondary" });
45
- }
46
- return jsx(ImageSize32, { initial: "secondary" });
47
- }
48
- // отличается от условий выше (для video и application)
49
- if (uploadType === 'mixed' || uploadType === 'application') {
50
- return jsx(DocumentArrowUpOutlinedSize32, { initial: "secondary" });
51
- }
52
- // video and image
53
- return jsx(ImageSize32, { initial: "secondary" });
54
- };
55
32
  const RenderFileInfoDefault = (loadedFile) => {
56
33
  return loadedFile.fileSizeMB;
57
34
  };
58
35
  const DEFAULT_ACCEPT = {
59
36
  'image/*': ['.png', '.jpeg', '.jpg'],
60
37
  };
61
- const Upload = ({ files, trls, accept = DEFAULT_ACCEPT, selectFileButton: _selectFileButton, deleteFileButton: _deleteFileButton, replaceImageButton: _replaceImageButton, deleteImageButton: _deleteImageButton, renderFileInfo = RenderFileInfoDefault, onDropAccepted: onDropAcceptedExternal, onDropRejected: onDropRejectedExternal, onFileDelete: onFileDeleteExternal, ...dropzoneProps }) => {
38
+ const Upload = ({ files, trls, size = 'medium', multiple = false, accept = DEFAULT_ACCEPT, selectFileButton: _selectFileButton, deleteFileButton: _deleteFileButton, replaceImageButton: _replaceImageButton, deleteImageButton: _deleteImageButton, renderFileInfo = RenderFileInfoDefault, onDropAccepted: onDropAcceptedExternal, onDropRejected: onDropRejectedExternal, onFileDelete: onFileDeleteExternal, 'aria-label': ariaLabel, ...dropzoneProps }) => {
62
39
  const bodyUploadRef = useRef(null);
63
40
  const uploadType = getAvaliableFileTypes(accept);
64
41
  const loadedFile = files.length > 0 ? files[0] : undefined;
65
42
  const isLoad = Boolean(loadedFile);
66
43
  const isLoading = Boolean(loadedFile?.loading);
67
44
  const isInvalid = Boolean(loadedFile?.error);
45
+ const isSizeSmall = size === 'small';
46
+ const isImageType = uploadType === 'image';
68
47
  const backgroundUploadPreview = useMemo(() => {
69
- if (!loadedFile || uploadType !== 'image') {
48
+ if (!loadedFile || !isImageType) {
70
49
  return 'none';
71
50
  }
72
51
  if (loadedFile.loading) {
73
52
  return 'none';
74
53
  }
54
+ if (isSizeSmall) {
55
+ return URL.createObjectURL(loadedFile.data);
56
+ }
75
57
  return `url('${URL.createObjectURL(loadedFile.data)}')`;
76
- }, [loadedFile, uploadType]);
58
+ }, [loadedFile, isImageType, isSizeSmall]);
77
59
  useEffect(() => {
78
60
  if (!bodyUploadRef.current) {
79
61
  return;
80
62
  }
63
+ if (isSizeSmall) {
64
+ return;
65
+ }
81
66
  // фиксируем ширину, так как после выбора контент поменяется
82
67
  bodyUploadRef.current.style.minHeight = `${bodyUploadRef.current.offsetHeight}px`;
83
- }, []);
68
+ }, [isSizeSmall]);
84
69
  const onDropAccepted = useCallback((acceptedFiles, event) => {
85
70
  const acceptedLoadFiles = acceptedFiles.map((file) => ({ data: file, loading: true, loadPercentage: 0 }));
86
71
  onDropAcceptedExternal(acceptedLoadFiles, event);
@@ -101,37 +86,47 @@ const Upload = ({ files, trls, accept = DEFAULT_ACCEPT, selectFileButton: _selec
101
86
  key: 'selectFileButton',
102
87
  'data-qa': 'magritte-select-file-button',
103
88
  });
104
- const deleteFileButton = cloneElement(_deleteFileButton, {
105
- key: 'deleteFileButton',
106
- 'data-qa': 'magritte-delete-file-button',
107
- onClick: (event) => {
108
- onFileDelete(event);
109
- },
110
- });
111
- const replaceImageButton = cloneElement(_replaceImageButton, {
112
- key: 'replaceImageButton',
113
- 'data-qa': 'magritte-select-replace-image-button',
114
- });
115
- const deleteImageButton = cloneElement(_deleteImageButton, {
116
- key: 'deleteImageButton',
117
- 'data-qa': 'magritte-delete-image-button',
118
- onClick: (event) => {
119
- onFileDelete(event);
120
- },
121
- });
89
+ const deleteFileButton = _deleteFileButton &&
90
+ cloneElement(_deleteFileButton, {
91
+ key: 'deleteFileButton',
92
+ 'data-qa': 'magritte-delete-file-button',
93
+ onClick: (event) => {
94
+ onFileDelete(event);
95
+ },
96
+ });
97
+ const replaceImageButton = _replaceImageButton &&
98
+ cloneElement(_replaceImageButton, {
99
+ key: 'replaceImageButton',
100
+ 'data-qa': 'magritte-select-replace-image-button',
101
+ });
102
+ const deleteImageButton = _deleteImageButton &&
103
+ cloneElement(_deleteImageButton, {
104
+ key: 'deleteImageButton',
105
+ 'data-qa': 'magritte-delete-image-button',
106
+ onClick: (event) => {
107
+ onFileDelete(event);
108
+ },
109
+ });
122
110
  const { getRootProps, getInputProps, isDragActive } = useDropzone({
123
111
  ...dropzoneProps,
124
112
  accept,
125
113
  onDropAccepted,
126
114
  onDropRejected,
127
- multiple: false,
115
+ multiple,
128
116
  });
129
- return (jsxs("div", { className: classnames(styles.root, { [styles.dragActive]: isDragActive }, { [styles.loading]: isLoading }, { [styles.load]: isLoad }, { [styles.invalid]: isInvalid }), ...getRootProps(), children: [jsx("div", { className: styles.background, style: { backgroundImage: backgroundUploadPreview } }), jsxs("div", { className: styles.body, ref: bodyUploadRef, children: [jsx("input", { ...getInputProps() }), isLoading && (jsxs("div", { className: styles.loader, children: [jsx(Loader, { size: 64 }), jsx("div", { className: styles.cancel, children: jsx(CrossOutlinedSize24, { initial: "accent", onClick: (event) => {
130
- onFileDelete(event);
131
- } }) })] })), getUploadIcon(uploadType, loadedFile), jsx(VSpacing, { default: 16 }), loadedFile && (jsxs(Fragment, { children: [jsx(Text, { typography: "label-2-regular", children: loadedFile.data.name }), jsx(VSpacing, { default: 6 }), jsx(Text, { typography: "label-4-regular", style: "secondary", children: renderFileInfo({
132
- ...loadedFile,
133
- fileSizeMB: bytes2mb(loadedFile.data.size),
134
- }) }), jsx(VSpacing, { default: 8 }), !loadedFile.loading && uploadType !== 'image' && (jsxs(Fragment, { children: [jsx(VSpacing, { default: 8 }), deleteFileButton] })), !loadedFile.loading && uploadType === 'image' && (jsxs("div", { className: styles.imageControls, children: [replaceImageButton, deleteImageButton] }))] })), !loadedFile && (jsxs(Fragment, { children: [jsx(Text, { typography: "label-2-regular", children: trls.title }), jsx(VSpacing, { default: 6 }), jsx(Text, { typography: "label-4-regular", style: "secondary", children: trls.subTitle }), jsx(VSpacing, { default: 16 }), selectFileButton] }))] })] }));
117
+ return (jsxs("div", { className: classnames(styles.root, styles[`root_${size}`], { [styles.dragActive]: isDragActive }, { [styles.loading]: isLoading }, { [styles.load]: isLoad }, { [styles.invalid]: isInvalid }), ...getRootProps(), children: [jsx("div", { className: styles.background, style: { backgroundImage: !isSizeSmall ? backgroundUploadPreview : 'none' } }), jsxs("div", { className: styles.body, ref: bodyUploadRef, children: [jsx("input", { ...getInputProps() }), isSizeSmall && (jsxs(Fragment, { children: [loadedFile && (jsxs(Fragment, { children: [jsx(Avatar, { mode: isImageType && !isLoading ? 'image' : 'icon', style: "secondary", image: backgroundUploadPreview, size: 48, icon: getUploadIcon(uploadType, loadedFile, true), "aria-label": ariaLabel }), jsxs("div", { children: [jsx(Text, { typography: "label-2-regular", children: loadedFile.data.name }), jsx(VSpacing, { default: 4 }), jsx(Text, { typography: "label-4-regular", style: "secondary", children: jsxs("div", { className: styles.smallFileInfo, children: [isInvalid && jsx(ExclamationTriangleOutlinedSize16, { initial: "negative" }), isLoading && jsx(Loader, { size: 16 }), !isInvalid && !isLoading && (jsx(CheckCircleOutlinedSize16, { initial: "positive" })), renderFileInfo({
118
+ ...loadedFile,
119
+ fileSizeMB: bytes2mb(loadedFile.data.size),
120
+ })] }) })] }), jsxs("div", { className: styles.smallControls, children: [isLoading && (jsx(Action, { icon: CrossOutlinedSize24, mode: "secondary", onClick: (event) => {
121
+ onFileDelete(event);
122
+ } })), !isLoading && (jsx(Action, { icon: TrashOutlinedSize24, mode: "secondary", onClick: (event) => {
123
+ onFileDelete(event);
124
+ } }))] })] })), !loadedFile && (jsxs(Fragment, { children: [jsx(Avatar, { mode: "icon", style: "secondary", size: 48, icon: getUploadIcon(uploadType, loadedFile, true), "aria-label": ariaLabel }), jsxs("div", { children: [jsx(Text, { typography: "label-2-regular", children: trls.title }), jsx(VSpacing, { default: 4 }), jsx(Text, { typography: "label-4-regular", style: "secondary", children: trls.subTitle })] }), jsx("div", { className: styles.smallControls, children: selectFileButton })] }))] })), !isSizeSmall && (jsxs(Fragment, { children: [isLoading && (jsxs("div", { className: styles.loader, children: [jsx(Loader, { size: 64 }), jsx("div", { className: styles.cancel, children: jsx(CrossOutlinedSize24, { initial: "accent", onClick: (event) => {
125
+ onFileDelete(event);
126
+ } }) })] })), isInvalid ? (jsx(ExclamationTriangleOutlinedSize32, { initial: "negative" })) : (getUploadIcon(uploadType, loadedFile, false)), jsx(VSpacing, { default: 16 }), loadedFile && (jsxs(Fragment, { children: [jsx(Text, { typography: "label-2-regular", children: loadedFile.data.name }), jsx(VSpacing, { default: 6 }), jsx(Text, { typography: "label-4-regular", style: "secondary", children: renderFileInfo({
127
+ ...loadedFile,
128
+ fileSizeMB: bytes2mb(loadedFile.data.size),
129
+ }) }), jsx(VSpacing, { default: 8 }), !loadedFile.loading && !isImageType && (jsxs(Fragment, { children: [jsx(VSpacing, { default: 8 }), deleteFileButton] })), !loadedFile.loading && isImageType && (jsxs("div", { className: styles.imageControls, children: [replaceImageButton, deleteImageButton] }))] })), !loadedFile && (jsxs(Fragment, { children: [jsx(Text, { typography: "label-2-regular", children: trls.title }), jsx(VSpacing, { default: 6 }), jsx(Text, { typography: "label-4-regular", style: "secondary", children: trls.subTitle }), jsx(VSpacing, { default: 16 }), selectFileButton] }))] }))] })] }));
135
130
  };
136
131
 
137
132
  export { Upload };
package/Upload.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Upload.js","sources":["../src/Upload.tsx"],"sourcesContent":["import {\n ReactElement,\n useRef,\n ReactNode,\n useEffect,\n useCallback,\n cloneElement,\n MouseEvent,\n ComponentProps,\n useMemo,\n} from 'react';\nimport { useDropzone, Accept, DropEvent, FileRejection } from 'react-dropzone';\nimport classnames from 'classnames';\n\nimport { Button } from '@hh.ru/magritte-ui-button';\nimport {\n DocumentArrowUpOutlinedSize32,\n DocumentOutlinedSize32,\n VideocameraOutlinedSize32,\n ImageSize32,\n ExclamationTriangleOutlinedSize32,\n CrossOutlinedSize24,\n} from '@hh.ru/magritte-ui-icon/icon';\nimport { Loader } from '@hh.ru/magritte-ui-loader';\nimport { VSpacing } from '@hh.ru/magritte-ui-spacing';\nimport { Text } from '@hh.ru/magritte-ui-typography';\nimport { LoadedFile, UploadProps, UploadType, LoadedFileWithFileSize } from '@hh.ru/magritte-ui-upload/types';\n\nimport styles from './upload.less';\n\nconst order = 1024 * 1024;\nconst bytes2mb = (value: number): string => {\n return (value / order).toFixed(2);\n};\n\n// парсим accept в нормальный формат\nconst getAvaliableFileTypes = (accept: Accept): UploadType => {\n const avaliableTypes = Object.keys(accept);\n if (avaliableTypes.length === 0) {\n throw new Error(`Magritte component Upload: accept can't be empty`);\n }\n if (avaliableTypes.length > 1) {\n return 'mixed';\n }\n const avaliableType = avaliableTypes[0];\n return avaliableType.split('/')[0] as UploadType;\n};\n\n// иконка может меняться в зависимости от типа и состояния загрузки\nconst getUploadIcon = (uploadType: UploadType, loadedFile: LoadedFile | undefined): ReactNode => {\n if (loadedFile) {\n const { error, loading } = loadedFile;\n if (loading) {\n return null;\n }\n if (error) {\n return <ExclamationTriangleOutlinedSize32 initial=\"negative\" />;\n }\n // иначе надо обработать type (причем некоторые меняются)\n if (uploadType === 'mixed' || uploadType === 'application') {\n return <DocumentOutlinedSize32 initial=\"secondary\" />;\n }\n if (uploadType === 'video') {\n return <VideocameraOutlinedSize32 initial=\"secondary\" />;\n }\n return <ImageSize32 initial=\"secondary\" />;\n }\n\n // отличается от условий выше (для video и application)\n if (uploadType === 'mixed' || uploadType === 'application') {\n return <DocumentArrowUpOutlinedSize32 initial=\"secondary\" />;\n }\n // video and image\n return <ImageSize32 initial=\"secondary\" />;\n};\n\nconst RenderFileInfoDefault = (loadedFile: LoadedFileWithFileSize): ReactNode => {\n return loadedFile.fileSizeMB;\n};\n\nconst DEFAULT_ACCEPT: Accept = {\n 'image/*': ['.png', '.jpeg', '.jpg'],\n};\n\nconst Upload = ({\n files,\n trls,\n accept = DEFAULT_ACCEPT,\n selectFileButton: _selectFileButton,\n deleteFileButton: _deleteFileButton,\n replaceImageButton: _replaceImageButton,\n deleteImageButton: _deleteImageButton,\n renderFileInfo = RenderFileInfoDefault,\n onDropAccepted: onDropAcceptedExternal,\n onDropRejected: onDropRejectedExternal,\n onFileDelete: onFileDeleteExternal,\n ...dropzoneProps\n}: UploadProps): ReactElement => {\n const bodyUploadRef = useRef<HTMLDivElement>(null);\n const uploadType = getAvaliableFileTypes(accept);\n const loadedFile = files.length > 0 ? files[0] : undefined;\n const isLoad = Boolean(loadedFile);\n const isLoading = Boolean(loadedFile?.loading);\n const isInvalid = Boolean(loadedFile?.error);\n\n const backgroundUploadPreview: string = useMemo(() => {\n if (!loadedFile || uploadType !== 'image') {\n return 'none';\n }\n if (loadedFile.loading) {\n return 'none';\n }\n return `url('${URL.createObjectURL(loadedFile.data)}')`;\n }, [loadedFile, uploadType]);\n\n useEffect(() => {\n if (!bodyUploadRef.current) {\n return;\n }\n // фиксируем ширину, так как после выбора контент поменяется\n bodyUploadRef.current.style.minHeight = `${bodyUploadRef.current.offsetHeight}px`;\n }, []);\n\n const onDropAccepted = useCallback(\n (acceptedFiles: File[], event: DropEvent) => {\n const acceptedLoadFiles = acceptedFiles.map((file) => ({ data: file, loading: true, loadPercentage: 0 }));\n onDropAcceptedExternal(acceptedLoadFiles, event);\n },\n [onDropAcceptedExternal]\n );\n const onDropRejected = useCallback(\n (fileRejections: FileRejection[], event: DropEvent) => {\n const rejectionLoadFiles = fileRejections.map((fileRejection) => ({\n data: fileRejection.file,\n loading: false,\n error: fileRejection.errors?.[0].code || '',\n }));\n onDropRejectedExternal?.(rejectionLoadFiles, event);\n },\n [onDropRejectedExternal]\n );\n\n const onFileDelete = useCallback(\n (event: MouseEvent) => {\n loadedFile && onFileDeleteExternal(loadedFile, 0);\n event.stopPropagation();\n },\n [loadedFile, onFileDeleteExternal]\n );\n\n const selectFileButton = cloneElement(_selectFileButton, {\n key: 'selectFileButton',\n 'data-qa': 'magritte-select-file-button',\n } as Partial<ComponentProps<typeof Button>>);\n\n const deleteFileButton = cloneElement(_deleteFileButton, {\n key: 'deleteFileButton',\n 'data-qa': 'magritte-delete-file-button',\n onClick: (event: MouseEvent) => {\n onFileDelete(event);\n },\n } as Partial<ComponentProps<typeof Button>>);\n\n const replaceImageButton = cloneElement(_replaceImageButton, {\n key: 'replaceImageButton',\n 'data-qa': 'magritte-select-replace-image-button',\n } as Partial<ComponentProps<typeof Button>>);\n\n const deleteImageButton = cloneElement(_deleteImageButton, {\n key: 'deleteImageButton',\n 'data-qa': 'magritte-delete-image-button',\n onClick: (event: MouseEvent) => {\n onFileDelete(event);\n },\n } as Partial<ComponentProps<typeof Button>>);\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n ...dropzoneProps,\n accept,\n onDropAccepted,\n onDropRejected,\n multiple: false,\n });\n return (\n <div\n className={classnames(\n styles.root,\n { [styles.dragActive]: isDragActive },\n { [styles.loading]: isLoading },\n { [styles.load]: isLoad },\n { [styles.invalid]: isInvalid }\n )}\n {...getRootProps()}\n >\n <div className={styles.background} style={{ backgroundImage: backgroundUploadPreview }} />\n <div className={styles.body} ref={bodyUploadRef}>\n <input {...getInputProps()} />\n {isLoading && (\n <div className={styles.loader}>\n <Loader size={64} />\n <div className={styles.cancel}>\n <CrossOutlinedSize24\n initial=\"accent\"\n onClick={(event) => {\n onFileDelete(event);\n }}\n />\n </div>\n </div>\n )}\n {getUploadIcon(uploadType, loadedFile)}\n <VSpacing default={16} />\n {loadedFile && (\n <>\n <Text typography=\"label-2-regular\">{loadedFile.data.name}</Text>\n <VSpacing default={6} />\n <Text typography=\"label-4-regular\" style=\"secondary\">\n {renderFileInfo({\n ...loadedFile,\n fileSizeMB: bytes2mb(loadedFile.data.size),\n })}\n </Text>\n <VSpacing default={8} />\n {!loadedFile.loading && uploadType !== 'image' && (\n <>\n <VSpacing default={8} />\n {deleteFileButton}\n </>\n )}\n {!loadedFile.loading && uploadType === 'image' && (\n <div className={styles.imageControls}>\n {replaceImageButton}\n {deleteImageButton}\n </div>\n )}\n </>\n )}\n {!loadedFile && (\n <>\n <Text typography=\"label-2-regular\">{trls.title}</Text>\n <VSpacing default={6} />\n <Text typography=\"label-4-regular\" style=\"secondary\">\n {trls.subTitle}\n </Text>\n <VSpacing default={16} />\n {selectFileButton}\n </>\n )}\n </div>\n </div>\n );\n};\n\nexport { Upload };\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":";;;;;;;;;;;AA8BA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;AAC1B,MAAM,QAAQ,GAAG,CAAC,KAAa,KAAY;IACvC,OAAO,CAAC,KAAK,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF;AACA,MAAM,qBAAqB,GAAG,CAAC,MAAc,KAAgB;IACzD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3C,IAAA,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7B,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,gDAAA,CAAkD,CAAC,CAAC;KACvE;AACD,IAAA,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,QAAA,OAAO,OAAO,CAAC;KAClB;AACD,IAAA,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAe,CAAC;AACrD,CAAC,CAAC;AAEF;AACA,MAAM,aAAa,GAAG,CAAC,UAAsB,EAAE,UAAkC,KAAe;IAC5F,IAAI,UAAU,EAAE;AACZ,QAAA,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;QACtC,IAAI,OAAO,EAAE;AACT,YAAA,OAAO,IAAI,CAAC;SACf;QACD,IAAI,KAAK,EAAE;AACP,YAAA,OAAOA,IAAC,iCAAiC,EAAA,EAAC,OAAO,EAAC,UAAU,GAAG,CAAC;SACnE;;QAED,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,aAAa,EAAE;AACxD,YAAA,OAAOA,IAAC,sBAAsB,EAAA,EAAC,OAAO,EAAC,WAAW,GAAG,CAAC;SACzD;AACD,QAAA,IAAI,UAAU,KAAK,OAAO,EAAE;AACxB,YAAA,OAAOA,IAAC,yBAAyB,EAAA,EAAC,OAAO,EAAC,WAAW,GAAG,CAAC;SAC5D;AACD,QAAA,OAAOA,IAAC,WAAW,EAAA,EAAC,OAAO,EAAC,WAAW,GAAG,CAAC;KAC9C;;IAGD,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,aAAa,EAAE;AACxD,QAAA,OAAOA,IAAC,6BAA6B,EAAA,EAAC,OAAO,EAAC,WAAW,GAAG,CAAC;KAChE;;AAED,IAAA,OAAOA,IAAC,WAAW,EAAA,EAAC,OAAO,EAAC,WAAW,GAAG,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,UAAkC,KAAe;IAC5E,OAAO,UAAU,CAAC,UAAU,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,cAAc,GAAW;AAC3B,IAAA,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;CACvC,CAAC;AAEI,MAAA,MAAM,GAAG,CAAC,EACZ,KAAK,EACL,IAAI,EACJ,MAAM,GAAG,cAAc,EACvB,gBAAgB,EAAE,iBAAiB,EACnC,gBAAgB,EAAE,iBAAiB,EACnC,kBAAkB,EAAE,mBAAmB,EACvC,iBAAiB,EAAE,kBAAkB,EACrC,cAAc,GAAG,qBAAqB,EACtC,cAAc,EAAE,sBAAsB,EACtC,cAAc,EAAE,sBAAsB,EACtC,YAAY,EAAE,oBAAoB,EAClC,GAAG,aAAa,EACN,KAAkB;AAC5B,IAAA,MAAM,aAAa,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AACnD,IAAA,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACjD,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAC3D,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAE7C,IAAA,MAAM,uBAAuB,GAAW,OAAO,CAAC,MAAK;AACjD,QAAA,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,OAAO,EAAE;AACvC,YAAA,OAAO,MAAM,CAAC;SACjB;AACD,QAAA,IAAI,UAAU,CAAC,OAAO,EAAE;AACpB,YAAA,OAAO,MAAM,CAAC;SACjB;QACD,OAAO,CAAA,KAAA,EAAQ,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA,EAAA,CAAI,CAAC;AAC5D,KAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAE7B,SAAS,CAAC,MAAK;AACX,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;YACxB,OAAO;SACV;;AAED,QAAA,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAG,EAAA,aAAa,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC;KACrF,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,WAAW,CAC9B,CAAC,aAAqB,EAAE,KAAgB,KAAI;QACxC,MAAM,iBAAiB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1G,QAAA,sBAAsB,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;AACrD,KAAC,EACD,CAAC,sBAAsB,CAAC,CAC3B,CAAC;IACF,MAAM,cAAc,GAAG,WAAW,CAC9B,CAAC,cAA+B,EAAE,KAAgB,KAAI;QAClD,MAAM,kBAAkB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,aAAa,MAAM;YAC9D,IAAI,EAAE,aAAa,CAAC,IAAI;AACxB,YAAA,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;AAC9C,SAAA,CAAC,CAAC,CAAC;AACJ,QAAA,sBAAsB,GAAG,kBAAkB,EAAE,KAAK,CAAC,CAAC;AACxD,KAAC,EACD,CAAC,sBAAsB,CAAC,CAC3B,CAAC;AAEF,IAAA,MAAM,YAAY,GAAG,WAAW,CAC5B,CAAC,KAAiB,KAAI;AAClB,QAAA,UAAU,IAAI,oBAAoB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,eAAe,EAAE,CAAC;AAC5B,KAAC,EACD,CAAC,UAAU,EAAE,oBAAoB,CAAC,CACrC,CAAC;AAEF,IAAA,MAAM,gBAAgB,GAAG,YAAY,CAAC,iBAAiB,EAAE;AACrD,QAAA,GAAG,EAAE,kBAAkB;AACvB,QAAA,SAAS,EAAE,6BAA6B;AACD,KAAA,CAAC,CAAC;AAE7C,IAAA,MAAM,gBAAgB,GAAG,YAAY,CAAC,iBAAiB,EAAE;AACrD,QAAA,GAAG,EAAE,kBAAkB;AACvB,QAAA,SAAS,EAAE,6BAA6B;AACxC,QAAA,OAAO,EAAE,CAAC,KAAiB,KAAI;YAC3B,YAAY,CAAC,KAAK,CAAC,CAAC;SACvB;AACsC,KAAA,CAAC,CAAC;AAE7C,IAAA,MAAM,kBAAkB,GAAG,YAAY,CAAC,mBAAmB,EAAE;AACzD,QAAA,GAAG,EAAE,oBAAoB;AACzB,QAAA,SAAS,EAAE,sCAAsC;AACV,KAAA,CAAC,CAAC;AAE7C,IAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,kBAAkB,EAAE;AACvD,QAAA,GAAG,EAAE,mBAAmB;AACxB,QAAA,SAAS,EAAE,8BAA8B;AACzC,QAAA,OAAO,EAAE,CAAC,KAAiB,KAAI;YAC3B,YAAY,CAAC,KAAK,CAAC,CAAC;SACvB;AACsC,KAAA,CAAC,CAAC;IAE7C,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC;AAC9D,QAAA,GAAG,aAAa;QAChB,MAAM;QACN,cAAc;QACd,cAAc;AACd,QAAA,QAAQ,EAAE,KAAK;AAClB,KAAA,CAAC,CAAC;IACH,QACIC,IACI,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CACjB,MAAM,CAAC,IAAI,EACX,EAAE,CAAC,MAAM,CAAC,UAAU,GAAG,YAAY,EAAE,EACrC,EAAE,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS,EAAE,EAC/B,EAAE,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE,EACzB,EAAE,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS,EAAE,CAClC,EAAA,GACG,YAAY,EAAE,EAElB,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,uBAAuB,EAAE,EAAA,CAAI,EAC1FC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,EAAA,QAAA,EAAA,CAC3CD,GAAW,CAAA,OAAA,EAAA,EAAA,GAAA,aAAa,EAAE,EAAA,CAAI,EAC7B,SAAS,KACNC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,MAAM,EACzB,QAAA,EAAA,CAAAD,GAAA,CAAC,MAAM,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,EACpBA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,MAAM,EAAA,QAAA,EACzBA,GAAC,CAAA,mBAAmB,EAChB,EAAA,OAAO,EAAC,QAAQ,EAChB,OAAO,EAAE,CAAC,KAAK,KAAI;wCACf,YAAY,CAAC,KAAK,CAAC,CAAC;qCACvB,EAAA,CACH,EACA,CAAA,CAAA,EAAA,CACJ,CACT,EACA,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,EACtCA,GAAA,CAAC,QAAQ,EAAA,EAAC,OAAO,EAAE,EAAE,EAAA,CAAI,EACxB,UAAU,KACPC,IACI,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CAAAF,GAAA,CAAC,IAAI,EAAA,EAAC,UAAU,EAAC,iBAAiB,EAAE,QAAA,EAAA,UAAU,CAAC,IAAI,CAAC,IAAI,EAAQ,CAAA,EAChEA,GAAC,CAAA,QAAQ,EAAC,EAAA,OAAO,EAAE,CAAC,EAAI,CAAA,EACxBA,GAAC,CAAA,IAAI,EAAC,EAAA,UAAU,EAAC,iBAAiB,EAAC,KAAK,EAAC,WAAW,EAC/C,QAAA,EAAA,cAAc,CAAC;AACZ,oCAAA,GAAG,UAAU;oCACb,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;iCAC7C,CAAC,EAAA,CACC,EACPA,GAAA,CAAC,QAAQ,EAAA,EAAC,OAAO,EAAE,CAAC,EAAI,CAAA,EACvB,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,KAAK,OAAO,KAC1CC,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACIF,GAAC,CAAA,QAAQ,EAAC,EAAA,OAAO,EAAE,CAAC,GAAI,EACvB,gBAAgB,CAClB,EAAA,CAAA,CACN,EACA,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,KAAK,OAAO,KAC1CC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,aAAa,EAAA,QAAA,EAAA,CAC/B,kBAAkB,EAClB,iBAAiB,CAAA,EAAA,CAChB,CACT,CAAA,EAAA,CACF,CACN,EACA,CAAC,UAAU,KACRA,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACIF,IAAC,IAAI,EAAA,EAAC,UAAU,EAAC,iBAAiB,EAAA,QAAA,EAAE,IAAI,CAAC,KAAK,EAAQ,CAAA,EACtDA,GAAC,CAAA,QAAQ,EAAC,EAAA,OAAO,EAAE,CAAC,EAAI,CAAA,EACxBA,GAAC,CAAA,IAAI,IAAC,UAAU,EAAC,iBAAiB,EAAC,KAAK,EAAC,WAAW,EAAA,QAAA,EAC/C,IAAI,CAAC,QAAQ,EAAA,CACX,EACPA,GAAA,CAAC,QAAQ,EAAC,EAAA,OAAO,EAAE,EAAE,EAAI,CAAA,EACxB,gBAAgB,CAAA,EAAA,CAClB,CACN,CAAA,EAAA,CACC,CACJ,EAAA,CAAA,EACR;AACN;;;;"}
1
+ {"version":3,"file":"Upload.js","sources":["../src/Upload.tsx"],"sourcesContent":["import {\n ReactElement,\n useRef,\n ReactNode,\n useEffect,\n useCallback,\n cloneElement,\n MouseEvent,\n ComponentProps,\n useMemo,\n} from 'react';\nimport { useDropzone, Accept, DropEvent, FileRejection } from 'react-dropzone';\nimport classnames from 'classnames';\n\nimport { Action } from '@hh.ru/magritte-ui-action';\nimport { Avatar } from '@hh.ru/magritte-ui-avatar';\nimport { Button } from '@hh.ru/magritte-ui-button';\nimport {\n CrossOutlinedSize24,\n CheckCircleOutlinedSize16,\n ExclamationTriangleOutlinedSize32,\n ExclamationTriangleOutlinedSize16,\n TrashOutlinedSize24,\n} from '@hh.ru/magritte-ui-icon/icon';\nimport { Loader } from '@hh.ru/magritte-ui-loader';\nimport { VSpacing } from '@hh.ru/magritte-ui-spacing';\nimport { Text } from '@hh.ru/magritte-ui-typography';\nimport { UploadProps, UploadType, LoadedFileWithFileSize } from '@hh.ru/magritte-ui-upload/types';\nimport { getUploadIcon } from '@hh.ru/magritte-ui-upload/utils';\n\nimport styles from './upload.less';\n\nconst order = 1024 * 1024;\nconst bytes2mb = (value: number): string => {\n return (value / order).toFixed(2);\n};\n\n// парсим accept в нормальный формат\nconst getAvaliableFileTypes = (accept: Accept): UploadType => {\n const avaliableTypes = Object.keys(accept);\n if (avaliableTypes.length === 0) {\n throw new Error(`Magritte component Upload: accept can't be empty`);\n }\n if (avaliableTypes.length > 1) {\n return 'mixed';\n }\n const avaliableType = avaliableTypes[0];\n return avaliableType.split('/')[0] as UploadType;\n};\n\nconst RenderFileInfoDefault = (loadedFile: LoadedFileWithFileSize): ReactNode => {\n return loadedFile.fileSizeMB;\n};\n\nconst DEFAULT_ACCEPT: Accept = {\n 'image/*': ['.png', '.jpeg', '.jpg'],\n};\n\nconst Upload = ({\n files,\n trls,\n size = 'medium',\n multiple = false,\n accept = DEFAULT_ACCEPT,\n selectFileButton: _selectFileButton,\n deleteFileButton: _deleteFileButton,\n replaceImageButton: _replaceImageButton,\n deleteImageButton: _deleteImageButton,\n renderFileInfo = RenderFileInfoDefault,\n onDropAccepted: onDropAcceptedExternal,\n onDropRejected: onDropRejectedExternal,\n onFileDelete: onFileDeleteExternal,\n 'aria-label': ariaLabel,\n ...dropzoneProps\n}: UploadProps): ReactElement => {\n const bodyUploadRef = useRef<HTMLDivElement>(null);\n const uploadType = getAvaliableFileTypes(accept);\n const loadedFile = files.length > 0 ? files[0] : undefined;\n const isLoad = Boolean(loadedFile);\n const isLoading = Boolean(loadedFile?.loading);\n const isInvalid = Boolean(loadedFile?.error);\n const isSizeSmall = size === 'small';\n const isImageType = uploadType === 'image';\n\n const backgroundUploadPreview: string = useMemo(() => {\n if (!loadedFile || !isImageType) {\n return 'none';\n }\n if (loadedFile.loading) {\n return 'none';\n }\n if (isSizeSmall) {\n return URL.createObjectURL(loadedFile.data);\n }\n return `url('${URL.createObjectURL(loadedFile.data)}')`;\n }, [loadedFile, isImageType, isSizeSmall]);\n\n useEffect(() => {\n if (!bodyUploadRef.current) {\n return;\n }\n if (isSizeSmall) {\n return;\n }\n // фиксируем ширину, так как после выбора контент поменяется\n bodyUploadRef.current.style.minHeight = `${bodyUploadRef.current.offsetHeight}px`;\n }, [isSizeSmall]);\n\n const onDropAccepted = useCallback(\n (acceptedFiles: File[], event: DropEvent) => {\n const acceptedLoadFiles = acceptedFiles.map((file) => ({ data: file, loading: true, loadPercentage: 0 }));\n onDropAcceptedExternal(acceptedLoadFiles, event);\n },\n [onDropAcceptedExternal]\n );\n const onDropRejected = useCallback(\n (fileRejections: FileRejection[], event: DropEvent) => {\n const rejectionLoadFiles = fileRejections.map((fileRejection) => ({\n data: fileRejection.file,\n loading: false,\n error: fileRejection.errors?.[0].code || '',\n }));\n onDropRejectedExternal?.(rejectionLoadFiles, event);\n },\n [onDropRejectedExternal]\n );\n const onFileDelete = useCallback(\n (event: MouseEvent) => {\n loadedFile && onFileDeleteExternal(loadedFile, 0);\n event.stopPropagation();\n },\n [loadedFile, onFileDeleteExternal]\n );\n\n const selectFileButton = cloneElement(_selectFileButton, {\n key: 'selectFileButton',\n 'data-qa': 'magritte-select-file-button',\n } as Partial<ComponentProps<typeof Button>>);\n\n const deleteFileButton =\n _deleteFileButton &&\n cloneElement(_deleteFileButton, {\n key: 'deleteFileButton',\n 'data-qa': 'magritte-delete-file-button',\n onClick: (event: MouseEvent) => {\n onFileDelete(event);\n },\n } as Partial<ComponentProps<typeof Button>>);\n\n const replaceImageButton =\n _replaceImageButton &&\n cloneElement(_replaceImageButton, {\n key: 'replaceImageButton',\n 'data-qa': 'magritte-select-replace-image-button',\n } as Partial<ComponentProps<typeof Button>>);\n\n const deleteImageButton =\n _deleteImageButton &&\n cloneElement(_deleteImageButton, {\n key: 'deleteImageButton',\n 'data-qa': 'magritte-delete-image-button',\n onClick: (event: MouseEvent) => {\n onFileDelete(event);\n },\n } as Partial<ComponentProps<typeof Button>>);\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n ...dropzoneProps,\n accept,\n onDropAccepted,\n onDropRejected,\n multiple,\n });\n return (\n <div\n className={classnames(\n styles.root,\n styles[`root_${size}`],\n { [styles.dragActive]: isDragActive },\n { [styles.loading]: isLoading },\n { [styles.load]: isLoad },\n { [styles.invalid]: isInvalid }\n )}\n {...getRootProps()}\n >\n <div\n className={styles.background}\n style={{ backgroundImage: !isSizeSmall ? backgroundUploadPreview : 'none' }}\n />\n <div className={styles.body} ref={bodyUploadRef}>\n <input {...getInputProps()} />\n {isSizeSmall && (\n <>\n {loadedFile && (\n <>\n <Avatar\n mode={isImageType && !isLoading ? 'image' : 'icon'}\n style=\"secondary\"\n image={backgroundUploadPreview}\n size={48}\n icon={getUploadIcon(uploadType, loadedFile, true)}\n aria-label={ariaLabel as string}\n />\n <div>\n <Text typography=\"label-2-regular\">{loadedFile.data.name}</Text>\n <VSpacing default={4} />\n <Text typography=\"label-4-regular\" style=\"secondary\">\n <div className={styles.smallFileInfo}>\n {isInvalid && <ExclamationTriangleOutlinedSize16 initial=\"negative\" />}\n {isLoading && <Loader size={16} />}\n {!isInvalid && !isLoading && (\n <CheckCircleOutlinedSize16 initial=\"positive\" />\n )}\n {renderFileInfo({\n ...loadedFile,\n fileSizeMB: bytes2mb(loadedFile.data.size),\n })}\n </div>\n </Text>\n </div>\n <div className={styles.smallControls}>\n {isLoading && (\n <Action\n icon={CrossOutlinedSize24}\n mode=\"secondary\"\n onClick={(event) => {\n onFileDelete(event);\n }}\n />\n )}\n {!isLoading && (\n <Action\n icon={TrashOutlinedSize24}\n mode=\"secondary\"\n onClick={(event) => {\n onFileDelete(event);\n }}\n />\n )}\n </div>\n </>\n )}\n {!loadedFile && (\n <>\n <Avatar\n mode=\"icon\"\n style=\"secondary\"\n size={48}\n icon={getUploadIcon(uploadType, loadedFile, true)}\n aria-label={ariaLabel as string}\n />\n <div>\n <Text typography=\"label-2-regular\">{trls.title}</Text>\n <VSpacing default={4} />\n <Text typography=\"label-4-regular\" style=\"secondary\">\n {trls.subTitle}\n </Text>\n </div>\n <div className={styles.smallControls}>{selectFileButton}</div>\n </>\n )}\n </>\n )}\n {!isSizeSmall && (\n <>\n {isLoading && (\n <div className={styles.loader}>\n <Loader size={64} />\n <div className={styles.cancel}>\n <CrossOutlinedSize24\n initial=\"accent\"\n onClick={(event) => {\n onFileDelete(event);\n }}\n />\n </div>\n </div>\n )}\n {isInvalid ? (\n <ExclamationTriangleOutlinedSize32 initial=\"negative\" />\n ) : (\n getUploadIcon(uploadType, loadedFile, false)\n )}\n <VSpacing default={16} />\n {loadedFile && (\n <>\n <Text typography=\"label-2-regular\">{loadedFile.data.name}</Text>\n <VSpacing default={6} />\n <Text typography=\"label-4-regular\" style=\"secondary\">\n {renderFileInfo({\n ...loadedFile,\n fileSizeMB: bytes2mb(loadedFile.data.size),\n })}\n </Text>\n <VSpacing default={8} />\n {!loadedFile.loading && !isImageType && (\n <>\n <VSpacing default={8} />\n {deleteFileButton}\n </>\n )}\n {!loadedFile.loading && isImageType && (\n <div className={styles.imageControls}>\n {replaceImageButton}\n {deleteImageButton}\n </div>\n )}\n </>\n )}\n {!loadedFile && (\n <>\n <Text typography=\"label-2-regular\">{trls.title}</Text>\n <VSpacing default={6} />\n <Text typography=\"label-4-regular\" style=\"secondary\">\n {trls.subTitle}\n </Text>\n <VSpacing default={16} />\n {selectFileButton}\n </>\n )}\n </>\n )}\n </div>\n </div>\n );\n};\n\nexport { Upload };\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
package/index.css CHANGED
@@ -270,7 +270,10 @@
270
270
  --magritte-typography-_custom-5-italic-text-indent-v20-0-1:0px;
271
271
  --magritte-typography-_custom-5-italic-text-transform-v20-0-1:none;
272
272
  --magritte-typography-_custom-5-italic-text-decoration-v20-0-1:none;
273
+ --magritte-static-space-100-v20-0-1:4px;
273
274
  --magritte-static-space-300-v20-0-1:12px;
275
+ --magritte-static-space-400-v20-0-1:16px;
276
+ --magritte-static-space-500-v20-0-1:20px;
274
277
  --magritte-static-space-600-v20-0-1:24px;
275
278
  --magritte-static-border-radius-600-v20-0-1:24px;
276
279
  }
@@ -547,42 +550,56 @@
547
550
  --magritte-typography-_custom-5-italic-text-transform-v20-0-1:none;
548
551
  --magritte-typography-_custom-5-italic-text-decoration-v20-0-1:none;
549
552
  }
550
- .magritte-root___FV1tC_1-1-0{
553
+ .magritte-root___FV1tC_1-2-0{
551
554
  position:relative;
552
555
  display:flex;
553
- justify-content:center;
554
- padding:var(--magritte-static-space-600-v20-0-1);
555
556
  overflow:hidden;
556
557
  border-radius:var(--magritte-static-border-radius-600-v20-0-1);
557
558
  background-color:var(--magritte-color-background-primary-v20-0-1);
558
559
  }
559
- .magritte-root___FV1tC_1-1-0:hover{
560
+ .magritte-root___FV1tC_1-2-0:hover{
560
561
  cursor:pointer;
561
562
  }
562
- .magritte-root___FV1tC_1-1-0:hover .magritte-background___RfZ0U_1-1-0{
563
+ .magritte-root___FV1tC_1-2-0:hover .magritte-background___RfZ0U_1-2-0{
563
564
  border-color:var(--magritte-color-stroke-accent-v20-0-1);
564
565
  }
565
- .magritte-root___FV1tC_1-1-0.magritte-drag-active___dihBL_1-1-0 .magritte-background___RfZ0U_1-1-0{
566
+ .magritte-root___FV1tC_1-2-0.magritte-drag-active___dihBL_1-2-0 .magritte-background___RfZ0U_1-2-0{
566
567
  border-color:var(--magritte-color-stroke-accent-v20-0-1);
567
568
  }
568
- .magritte-root___FV1tC_1-1-0.focus-visible{
569
+ .magritte-root___FV1tC_1-2-0.focus-visible{
569
570
  outline:var(--magritte-color-stroke-state-focused-accessible-v20-0-1) solid 4px;
570
571
  }
571
- .magritte-root___FV1tC_1-1-0.focus-visible .magritte-background___RfZ0U_1-1-0{
572
+ .magritte-root___FV1tC_1-2-0.focus-visible .magritte-background___RfZ0U_1-2-0{
572
573
  border-color:var(--magritte-color-stroke-accent-v20-0-1);
573
574
  }
574
- .magritte-root___FV1tC_1-1-0.magritte-load___MghDA_1-1-0 .magritte-background___RfZ0U_1-1-0,
575
- .magritte-root___FV1tC_1-1-0.magritte-loading___9E3p-_1-1-0 .magritte-background___RfZ0U_1-1-0{
575
+ .magritte-root___FV1tC_1-2-0.magritte-load___MghDA_1-2-0 .magritte-background___RfZ0U_1-2-0,
576
+ .magritte-root___FV1tC_1-2-0.magritte-loading___9E3p-_1-2-0 .magritte-background___RfZ0U_1-2-0{
576
577
  border-style:solid;
577
578
  border-width:7px;
578
579
  }
579
- .magritte-root___FV1tC_1-1-0.magritte-invalid___Rt10-_1-1-0.focus-visible{
580
+ .magritte-root___FV1tC_1-2-0.magritte-invalid___Rt10-_1-2-0.focus-visible{
580
581
  outline:var(--magritte-color-component-input-stroke-state-negative-focused-accessible-v20-0-1) solid 4px;
581
582
  }
582
- .magritte-root___FV1tC_1-1-0.magritte-invalid___Rt10-_1-1-0 .magritte-background___RfZ0U_1-1-0{
583
+ .magritte-root___FV1tC_1-2-0.magritte-invalid___Rt10-_1-2-0 .magritte-background___RfZ0U_1-2-0{
583
584
  border-color:var(--magritte-color-stroke-neutral-v20-0-1);
584
585
  }
585
- .magritte-background___RfZ0U_1-1-0{
586
+ .magritte-root_medium___67WJa_1-2-0{
587
+ justify-content:center;
588
+ padding:var(--magritte-static-space-600-v20-0-1);
589
+ }
590
+ .magritte-root_medium___67WJa_1-2-0 .magritte-body___O7ROl_1-2-0{
591
+ flex-direction:column;
592
+ align-items:center;
593
+ justify-content:center;
594
+ }
595
+ .magritte-root_small___dkUYq_1-2-0{
596
+ padding:var(--magritte-static-space-400-v20-0-1) var(--magritte-static-space-500-v20-0-1) var(--magritte-static-space-400-v20-0-1) var(--magritte-static-space-400-v20-0-1);
597
+ }
598
+ .magritte-root_small___dkUYq_1-2-0 .magritte-body___O7ROl_1-2-0{
599
+ width:100%;
600
+ gap:var(--magritte-static-space-400-v20-0-1);
601
+ }
602
+ .magritte-background___RfZ0U_1-2-0{
586
603
  position:absolute;
587
604
  border-width:8px;
588
605
  border-style:dashed;
@@ -595,17 +612,14 @@
595
612
  background-position:center;
596
613
  background-size:100%;
597
614
  }
598
- .magritte-body___O7ROl_1-1-0{
615
+ .magritte-body___O7ROl_1-2-0{
599
616
  display:flex;
600
- flex-direction:column;
601
- align-items:center;
602
- justify-content:center;
603
617
  }
604
- .magritte-loader___XYpWg_1-1-0{
618
+ .magritte-loader___XYpWg_1-2-0{
605
619
  position:relative;
606
620
  display:flex;
607
621
  }
608
- .magritte-cancel___tQ-yX_1-1-0{
622
+ .magritte-cancel___tQ-yX_1-2-0{
609
623
  position:absolute;
610
624
  top:0;
611
625
  left:0;
@@ -615,10 +629,19 @@
615
629
  align-items:center;
616
630
  justify-content:center;
617
631
  }
618
- .magritte-image-controls___vLf94_1-1-0{
632
+ .magritte-image-controls___vLf94_1-2-0{
619
633
  display:flex;
620
634
  position:absolute;
621
635
  right:var(--magritte-static-space-300-v20-0-1);
622
636
  bottom:var(--magritte-static-space-300-v20-0-1);
623
637
  gap:var(--magritte-static-space-300-v20-0-1);
624
638
  }
639
+ .magritte-small-controls___Qn9TP_1-2-0{
640
+ display:flex;
641
+ align-items:center;
642
+ margin-left:auto;
643
+ }
644
+ .magritte-small-file-info___cMns-_1-2-0{
645
+ display:flex;
646
+ gap:var(--magritte-static-space-100-v20-0-1);
647
+ }
package/index.js CHANGED
@@ -4,8 +4,11 @@ import 'react/jsx-runtime';
4
4
  import 'react';
5
5
  import 'react-dropzone';
6
6
  import 'classnames';
7
+ import '@hh.ru/magritte-ui-action';
8
+ import '@hh.ru/magritte-ui-avatar';
7
9
  import '@hh.ru/magritte-ui-icon/icon';
8
10
  import '@hh.ru/magritte-ui-loader';
9
11
  import '@hh.ru/magritte-ui-spacing';
10
12
  import '@hh.ru/magritte-ui-typography';
13
+ import './utils.js';
11
14
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-upload",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -27,6 +27,8 @@
27
27
  "react": ">=18.2.0"
28
28
  },
29
29
  "dependencies": {
30
+ "@hh.ru/magritte-ui-action": "4.4.17",
31
+ "@hh.ru/magritte-ui-avatar": "5.0.16",
30
32
  "@hh.ru/magritte-ui-button": "5.2.9",
31
33
  "@hh.ru/magritte-ui-icon": "7.9.6",
32
34
  "@hh.ru/magritte-ui-loader": "1.3.11",
@@ -34,5 +36,5 @@
34
36
  "@hh.ru/magritte-ui-typography": "3.0.22",
35
37
  "react-dropzone": "14.3.5"
36
38
  },
37
- "gitHead": "4c85532c7420dc718812510bb3635032b806eac0"
39
+ "gitHead": "b341cdeb2e54dcbbb25e420ad3a5c23e50362e5c"
38
40
  }
package/types.d.ts CHANGED
@@ -10,6 +10,7 @@ export interface LoadedFile {
10
10
  }
11
11
  export type ButtonElement = ReactElement<ComponentProps<typeof Button>>;
12
12
  export type UploadType = 'application' | 'image' | 'video' | 'mixed';
13
+ export type UploadSize = 'medium' | 'small';
13
14
  export type LoadedFileWithFileSize = LoadedFile & {
14
15
  fileSizeMB: string;
15
16
  };
@@ -20,14 +21,17 @@ interface UploadTrls {
20
21
  type DropzoneOptionsHepler = Omit<DropzoneOptions, 'onDropAccepted' | 'onDropRejected'>;
21
22
  export interface UploadProps extends DropzoneOptionsHepler {
22
23
  files: LoadedFile[];
24
+ size?: UploadSize;
25
+ multiple?: boolean;
23
26
  selectFileButton: ButtonElement;
24
- deleteFileButton: ButtonElement;
25
- replaceImageButton: ButtonElement;
26
- deleteImageButton: ButtonElement;
27
+ deleteFileButton?: ButtonElement;
28
+ replaceImageButton?: ButtonElement;
29
+ deleteImageButton?: ButtonElement;
27
30
  trls: UploadTrls;
28
31
  onFileDelete: (loadedFile: LoadedFile, fileIndex: number) => void;
29
32
  onDropAccepted: (files: LoadedFile[], event: DropEvent) => void;
30
33
  onDropRejected?: (files: LoadedFile[], event: DropEvent) => void;
31
34
  renderFileInfo?: (loadedFile: LoadedFileWithFileSize) => ReactNode;
35
+ 'aria-label'?: string;
32
36
  }
33
37
  export {};
package/utils.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { ReactElement } from 'react';
2
+ import { LoadedFile, UploadType } from '@hh.ru/magritte-ui-upload/types';
3
+ export declare const getUploadIcon: (uploadType: UploadType, loadedFile: LoadedFile | undefined, isSmall: boolean) => ReactElement;
package/utils.js ADDED
@@ -0,0 +1,29 @@
1
+ import './index.css';
2
+ import { jsx, Fragment } from 'react/jsx-runtime';
3
+ import { ImageSize24, ImageSize32, VideocameraOutlinedSize24, VideocameraOutlinedSize32, DocumentOutlinedSize24, DocumentOutlinedSize32, DocumentArrowUpOutlinedSize24, DocumentArrowUpOutlinedSize32 } from '@hh.ru/magritte-ui-icon/icon';
4
+
5
+ // иконка (тип и цвет) может меняться в зависимости от типа, размера и состояния загрузки
6
+ const getUploadIcon = (uploadType, loadedFile, isSmall) => {
7
+ if (loadedFile) {
8
+ const { error, loading } = loadedFile;
9
+ if ((loading || error) && !isSmall) {
10
+ return jsx(Fragment, {});
11
+ }
12
+ if (uploadType === 'image') {
13
+ return isSmall ? jsx(ImageSize24, { initial: "accent" }) : jsx(ImageSize32, { initial: "secondary" });
14
+ }
15
+ if (uploadType === 'video') {
16
+ return isSmall ? (jsx(VideocameraOutlinedSize24, { initial: "accent" })) : (jsx(VideocameraOutlinedSize32, { initial: "secondary" }));
17
+ }
18
+ // mixed, application
19
+ return isSmall ? jsx(DocumentOutlinedSize24, { initial: "accent" }) : jsx(DocumentOutlinedSize32, { initial: "secondary" });
20
+ }
21
+ if (uploadType === 'video' || uploadType === 'image') {
22
+ return isSmall ? jsx(ImageSize24, { initial: "secondary" }) : jsx(ImageSize32, { initial: "secondary" });
23
+ }
24
+ // mixed, application
25
+ return isSmall ? (jsx(DocumentArrowUpOutlinedSize24, { initial: "secondary" })) : (jsx(DocumentArrowUpOutlinedSize32, { initial: "secondary" }));
26
+ };
27
+
28
+ export { getUploadIcon };
29
+ //# sourceMappingURL=utils.js.map
package/utils.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../src/utils.tsx"],"sourcesContent":["import { ReactElement } from 'react';\n\nimport {\n DocumentArrowUpOutlinedSize32,\n DocumentOutlinedSize32,\n VideocameraOutlinedSize32,\n ImageSize32,\n DocumentArrowUpOutlinedSize24,\n DocumentOutlinedSize24,\n VideocameraOutlinedSize24,\n ImageSize24,\n} from '@hh.ru/magritte-ui-icon/icon';\nimport { LoadedFile, UploadType } from '@hh.ru/magritte-ui-upload/types';\n\n// иконка (тип и цвет) может меняться в зависимости от типа, размера и состояния загрузки\nexport const getUploadIcon = (\n uploadType: UploadType,\n loadedFile: LoadedFile | undefined,\n isSmall: boolean\n): ReactElement => {\n if (loadedFile) {\n const { error, loading } = loadedFile;\n if ((loading || error) && !isSmall) {\n return <></>;\n }\n if (uploadType === 'image') {\n return isSmall ? <ImageSize24 initial=\"accent\" /> : <ImageSize32 initial=\"secondary\" />;\n }\n if (uploadType === 'video') {\n return isSmall ? (\n <VideocameraOutlinedSize24 initial=\"accent\" />\n ) : (\n <VideocameraOutlinedSize32 initial=\"secondary\" />\n );\n }\n // mixed, application\n return isSmall ? <DocumentOutlinedSize24 initial=\"accent\" /> : <DocumentOutlinedSize32 initial=\"secondary\" />;\n }\n if (uploadType === 'video' || uploadType === 'image') {\n return isSmall ? <ImageSize24 initial=\"secondary\" /> : <ImageSize32 initial=\"secondary\" />;\n }\n // mixed, application\n return isSmall ? (\n <DocumentArrowUpOutlinedSize24 initial=\"secondary\" />\n ) : (\n <DocumentArrowUpOutlinedSize32 initial=\"secondary\" />\n );\n};\n"],"names":["_jsx"],"mappings":";;;AAcA;AACa,MAAA,aAAa,GAAG,CACzB,UAAsB,EACtB,UAAkC,EAClC,OAAgB,KACF;IACd,IAAI,UAAU,EAAE;AACZ,QAAA,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE;AAChC,YAAA,OAAOA,iBAAK,CAAC;SAChB;AACD,QAAA,IAAI,UAAU,KAAK,OAAO,EAAE;YACxB,OAAO,OAAO,GAAGA,IAAC,WAAW,EAAA,EAAC,OAAO,EAAC,QAAQ,GAAG,GAAGA,GAAC,CAAA,WAAW,IAAC,OAAO,EAAC,WAAW,EAAA,CAAG,CAAC;SAC3F;AACD,QAAA,IAAI,UAAU,KAAK,OAAO,EAAE;YACxB,OAAO,OAAO,IACVA,IAAC,yBAAyB,EAAA,EAAC,OAAO,EAAC,QAAQ,EAAA,CAAG,KAE9CA,GAAC,CAAA,yBAAyB,EAAC,EAAA,OAAO,EAAC,WAAW,EAAG,CAAA,CACpD,CAAC;SACL;;QAED,OAAO,OAAO,GAAGA,IAAC,sBAAsB,EAAA,EAAC,OAAO,EAAC,QAAQ,GAAG,GAAGA,GAAC,CAAA,sBAAsB,IAAC,OAAO,EAAC,WAAW,EAAA,CAAG,CAAC;KACjH;IACD,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,OAAO,EAAE;QAClD,OAAO,OAAO,GAAGA,IAAC,WAAW,EAAA,EAAC,OAAO,EAAC,WAAW,GAAG,GAAGA,GAAC,CAAA,WAAW,IAAC,OAAO,EAAC,WAAW,EAAA,CAAG,CAAC;KAC9F;;IAED,OAAO,OAAO,IACVA,IAAC,6BAA6B,EAAA,EAAC,OAAO,EAAC,WAAW,EAAA,CAAG,KAErDA,GAAC,CAAA,6BAA6B,EAAC,EAAA,OAAO,EAAC,WAAW,EAAG,CAAA,CACxD,CAAC;AACN;;;;"}