@arco-design/mobile-react 2.30.10 → 2.31.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/CHANGELOG.md +19 -0
- package/README.en-US.md +2 -2
- package/README.md +2 -2
- package/cjs/form/form-item.d.ts +3 -0
- package/cjs/form/form-item.js +38 -10
- package/cjs/form/style/css/index.css +13 -0
- package/cjs/form/style/index.less +18 -0
- package/cjs/icon/IconCheck/index.js +1 -2
- package/cjs/icon/IconDownload/index.d.ts +7 -0
- package/cjs/icon/IconDownload/index.js +41 -0
- package/cjs/icon/IconFile/index.d.ts +7 -0
- package/cjs/icon/IconFile/index.js +41 -0
- package/cjs/icon/IconKeyboard/index.js +1 -0
- package/cjs/icon/IconQuestionCircle/index.js +1 -2
- package/cjs/icon/IconUpload/index.js +6 -4
- package/cjs/icon/IconUserFill/index.js +1 -2
- package/cjs/icon/index.d.ts +3 -1
- package/cjs/icon/index.js +17 -7
- package/cjs/icon/type.d.ts +3 -1
- package/cjs/image-picker/index.js +15 -161
- package/cjs/image-picker/type.d.ts +4 -73
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +6 -2
- package/cjs/input/hooks.js +2 -2
- package/cjs/input/props.d.ts +2 -2
- package/cjs/picker/index.js +59 -19
- package/cjs/picker/type.d.ts +6 -1
- package/cjs/style.d.ts +1 -0
- package/cjs/style.js +3 -1
- package/cjs/tabs/tab-cell.js +1 -1
- package/cjs/uploader/index.d.ts +16 -0
- package/cjs/uploader/index.js +180 -0
- package/cjs/uploader/style/css/index.css +650 -0
- package/cjs/uploader/style/css/index.d.ts +4 -0
- package/cjs/uploader/style/css/index.js +9 -0
- package/cjs/uploader/style/index.d.ts +4 -0
- package/cjs/uploader/style/index.js +9 -0
- package/cjs/uploader/style/index.less +161 -0
- package/cjs/uploader/type.d.ts +108 -0
- package/cjs/uploader/type.js +3 -0
- package/cjs/uploader/upload/index.d.ts +2 -0
- package/cjs/uploader/upload/index.js +19 -0
- package/cjs/uploader/upload/type.d.ts +107 -0
- package/cjs/uploader/upload/type.js +3 -0
- package/cjs/uploader/upload/upload.d.ts +20 -0
- package/cjs/uploader/upload/upload.js +189 -0
- package/dist/index.js +580 -265
- package/dist/index.min.js +4 -4
- package/dist/style.css +593 -0
- package/dist/style.min.css +1 -1
- package/esm/form/form-item.d.ts +3 -0
- package/esm/form/form-item.js +36 -10
- package/esm/form/style/css/index.css +13 -0
- package/esm/form/style/index.less +18 -0
- package/esm/icon/IconCheck/index.js +1 -2
- package/esm/icon/IconDownload/index.d.ts +7 -0
- package/esm/icon/IconDownload/index.js +30 -0
- package/esm/icon/IconFile/index.d.ts +7 -0
- package/esm/icon/IconFile/index.js +30 -0
- package/esm/icon/IconKeyboard/index.js +1 -0
- package/esm/icon/IconQuestionCircle/index.js +1 -2
- package/esm/icon/IconUpload/index.js +6 -4
- package/esm/icon/IconUserFill/index.js +1 -2
- package/esm/icon/index.d.ts +3 -1
- package/esm/icon/index.js +3 -1
- package/esm/icon/type.d.ts +3 -1
- package/esm/image-picker/index.js +14 -160
- package/esm/image-picker/type.d.ts +4 -73
- package/esm/index.d.ts +1 -0
- package/esm/index.js +2 -1
- package/esm/input/hooks.js +2 -2
- package/esm/input/props.d.ts +2 -2
- package/esm/picker/index.js +60 -20
- package/esm/picker/type.d.ts +6 -1
- package/esm/style.d.ts +1 -0
- package/esm/style.js +2 -1
- package/esm/tabs/tab-cell.js +2 -2
- package/esm/uploader/index.d.ts +16 -0
- package/esm/uploader/index.js +150 -0
- package/esm/uploader/style/css/index.css +650 -0
- package/esm/uploader/style/css/index.d.ts +4 -0
- package/esm/uploader/style/css/index.js +4 -0
- package/esm/uploader/style/index.d.ts +4 -0
- package/esm/uploader/style/index.js +4 -0
- package/esm/uploader/style/index.less +161 -0
- package/esm/uploader/type.d.ts +108 -0
- package/esm/uploader/type.js +1 -0
- package/esm/uploader/upload/index.d.ts +2 -0
- package/esm/uploader/upload/index.js +2 -0
- package/esm/uploader/upload/type.d.ts +107 -0
- package/esm/uploader/upload/type.js +1 -0
- package/esm/uploader/upload/upload.d.ts +20 -0
- package/esm/uploader/upload/upload.js +175 -0
- package/package.json +3 -3
- package/tokens/app/arcodesign/default/css-variables.less +27 -0
- package/tokens/app/arcodesign/default/index.d.ts +27 -0
- package/tokens/app/arcodesign/default/index.js +28 -1
- package/tokens/app/arcodesign/default/index.json +292 -0
- package/tokens/app/arcodesign/default/index.less +27 -0
- package/umd/form/form-item.d.ts +3 -0
- package/umd/form/form-item.js +38 -10
- package/umd/form/style/css/index.css +13 -0
- package/umd/form/style/index.less +18 -0
- package/umd/icon/IconCheck/index.js +1 -2
- package/umd/icon/IconDownload/index.d.ts +7 -0
- package/umd/icon/IconDownload/index.js +49 -0
- package/umd/icon/IconFile/index.d.ts +7 -0
- package/umd/icon/IconFile/index.js +49 -0
- package/umd/icon/IconKeyboard/index.js +1 -0
- package/umd/icon/IconQuestionCircle/index.js +1 -2
- package/umd/icon/IconUpload/index.js +6 -4
- package/umd/icon/IconUserFill/index.js +1 -2
- package/umd/icon/index.d.ts +3 -1
- package/umd/icon/index.js +15 -9
- package/umd/icon/type.d.ts +3 -1
- package/umd/image-picker/index.js +17 -163
- package/umd/image-picker/type.d.ts +4 -73
- package/umd/index.d.ts +1 -0
- package/umd/index.js +7 -5
- package/umd/input/hooks.js +2 -2
- package/umd/input/props.d.ts +2 -2
- package/umd/picker/index.js +59 -19
- package/umd/picker/type.d.ts +6 -1
- package/umd/style.d.ts +1 -0
- package/umd/style.js +4 -4
- package/umd/tabs/tab-cell.js +1 -1
- package/umd/uploader/index.d.ts +16 -0
- package/umd/uploader/index.js +178 -0
- package/umd/uploader/style/css/index.css +650 -0
- package/umd/uploader/style/css/index.d.ts +4 -0
- package/umd/uploader/style/css/index.js +15 -0
- package/umd/uploader/style/index.d.ts +4 -0
- package/umd/uploader/style/index.js +15 -0
- package/umd/uploader/style/index.less +161 -0
- package/umd/uploader/type.d.ts +108 -0
- package/umd/uploader/type.js +17 -0
- package/umd/uploader/upload/index.d.ts +2 -0
- package/umd/uploader/upload/index.js +27 -0
- package/umd/uploader/upload/type.d.ts +107 -0
- package/umd/uploader/upload/type.js +17 -0
- package/umd/uploader/upload/upload.d.ts +20 -0
- package/umd/uploader/upload/upload.js +200 -0
@@ -0,0 +1,161 @@
|
|
1
|
+
@import '../../../style/mixin.less';
|
2
|
+
|
3
|
+
.@{prefix}-uploader {
|
4
|
+
&-container {
|
5
|
+
display: flex;
|
6
|
+
flex-wrap: wrap;
|
7
|
+
}
|
8
|
+
&-add {
|
9
|
+
position: relative;
|
10
|
+
input {
|
11
|
+
position: absolute;
|
12
|
+
opacity: 0;
|
13
|
+
left: 0;
|
14
|
+
top: 0;
|
15
|
+
width: 100%;
|
16
|
+
height: 100%;
|
17
|
+
display: none;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
&-list {
|
21
|
+
width: 100%;
|
22
|
+
&-item {
|
23
|
+
display: flex;
|
24
|
+
align-items: center;
|
25
|
+
.use-var(height, uploader-item-height);
|
26
|
+
.use-var(margin-top, uploader-item-margin-top);
|
27
|
+
&-container {
|
28
|
+
flex: 1;
|
29
|
+
display: flex;
|
30
|
+
align-items: center;
|
31
|
+
height: 100%;
|
32
|
+
.use-var(border-radius, uploader-item-border-radius);
|
33
|
+
.use-var(background-color, uploader-item-background-color);
|
34
|
+
.use-var(padding, uploader-item-padding);
|
35
|
+
}
|
36
|
+
&-wrapper {
|
37
|
+
display: flex;
|
38
|
+
flex: 1;
|
39
|
+
align-items: center;
|
40
|
+
}
|
41
|
+
&-file {
|
42
|
+
display: flex;
|
43
|
+
.use-var(font-size, uploader-file-icon-font-size);
|
44
|
+
.use-var-with-rtl(margin-right, uploader-file-icon-margin-right);
|
45
|
+
&-icon {
|
46
|
+
.use-var(color, uploader-file-icon-color);
|
47
|
+
}
|
48
|
+
}
|
49
|
+
&-text {
|
50
|
+
font-weight: 400;
|
51
|
+
.use-var(font-size, uploader-item-text-font-size);
|
52
|
+
.use-var(color, uploader-item-text-color);
|
53
|
+
&-error {
|
54
|
+
.use-var(color, uploader-item-text-error-color);
|
55
|
+
}
|
56
|
+
}
|
57
|
+
&-loaded {
|
58
|
+
display: flex;
|
59
|
+
.use-var(font-size, uploader-loaded-icon-font-size);
|
60
|
+
.use-var(color, uploader-loaded-icon-color);
|
61
|
+
}
|
62
|
+
&-error {
|
63
|
+
font-weight: 400;
|
64
|
+
.use-var(font-size, uploader-error-text-font-size);
|
65
|
+
.use-var(color, uploader-error-text-color);
|
66
|
+
}
|
67
|
+
&-delete {
|
68
|
+
display: flex;
|
69
|
+
height: 100%;
|
70
|
+
align-items: center;
|
71
|
+
.use-var-with-rtl(padding-left, uploader-delete-icon-padding-left);
|
72
|
+
.use-var(font-size, uploader-delete-icon-font-size);
|
73
|
+
&-icon {
|
74
|
+
.use-var(color, uploader-delete-icon-color);
|
75
|
+
&-disabled {
|
76
|
+
.use-var(color, uploader-disabled-delete-icon-color);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
.@{prefix}-uploader-disabled {
|
85
|
+
pointer-events: none;
|
86
|
+
}
|
87
|
+
|
88
|
+
/***************************************************
|
89
|
+
* *
|
90
|
+
* Arco Theme Style *
|
91
|
+
* *
|
92
|
+
***************************************************/
|
93
|
+
& when (@use-dark-mode = 1) {
|
94
|
+
|
95
|
+
.process-bg-color-with-config,
|
96
|
+
.process-custom-icon-bg-color-with-config {
|
97
|
+
@{arco-dark-mode-selector} & {
|
98
|
+
.use-var(color, dark-steps-process-with-config-item-icon-color);
|
99
|
+
.use-var(color, dark-steps-process-with-config-item-icon-color);
|
100
|
+
}
|
101
|
+
}
|
102
|
+
.wait-custom-icon-bg-color-with-config {
|
103
|
+
@{arco-dark-mode-selector} & {
|
104
|
+
.use-var(background, dark-steps-wait-icon-num-background);
|
105
|
+
.use-var(color, dark-sub-info-font-color);
|
106
|
+
.use-var(background, dark-steps-wait-icon-num-background);
|
107
|
+
.use-var(color, dark-sub-info-font-color);
|
108
|
+
}
|
109
|
+
}
|
110
|
+
.@{prefix}-uploader {
|
111
|
+
&-list {
|
112
|
+
&-item {
|
113
|
+
&-container {
|
114
|
+
@{arco-dark-mode-selector} & {
|
115
|
+
.use-var(background-color, dark-uploader-item-background-color);
|
116
|
+
}
|
117
|
+
}
|
118
|
+
&-file {
|
119
|
+
&-icon {
|
120
|
+
@{arco-dark-mode-selector} & {
|
121
|
+
.use-var(color, dark-uploader-file-icon-color);
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
&-text {
|
126
|
+
@{arco-dark-mode-selector} & {
|
127
|
+
.use-var(color, dark-uploader-item-text-color);
|
128
|
+
}
|
129
|
+
&-error {
|
130
|
+
@{arco-dark-mode-selector} & {
|
131
|
+
.use-var(color, dark-uploader-item-text-error-color);
|
132
|
+
}
|
133
|
+
}
|
134
|
+
}
|
135
|
+
&-loaded {
|
136
|
+
@{arco-dark-mode-selector} & {
|
137
|
+
.use-var(color, dark-uploader-loaded-icon-color);
|
138
|
+
}
|
139
|
+
}
|
140
|
+
&-error {
|
141
|
+
@{arco-dark-mode-selector} & {
|
142
|
+
.use-var(color, dark-uploader-error-text-color);
|
143
|
+
}
|
144
|
+
}
|
145
|
+
&-delete {
|
146
|
+
&-icon {
|
147
|
+
@{arco-dark-mode-selector} & {
|
148
|
+
.use-var(color, dark-uploader-delete-icon-color);
|
149
|
+
}
|
150
|
+
&-disabled {
|
151
|
+
@{arco-dark-mode-selector} & {
|
152
|
+
.use-var(color, dark-uploader-disabled-delete-icon-color);
|
153
|
+
}
|
154
|
+
}
|
155
|
+
}
|
156
|
+
}
|
157
|
+
}
|
158
|
+
}
|
159
|
+
}
|
160
|
+
}
|
161
|
+
/********************* End *************************/
|
@@ -0,0 +1,108 @@
|
|
1
|
+
import { InputHTMLAttributes } from 'react';
|
2
|
+
import { UploadCommonProps, CommonFileItem } from './upload/type';
|
3
|
+
export interface FileItem extends CommonFileItem {
|
4
|
+
/**
|
5
|
+
* 文件
|
6
|
+
* @en File
|
7
|
+
*/
|
8
|
+
file: File;
|
9
|
+
}
|
10
|
+
export interface UploaderProps extends UploadCommonProps {
|
11
|
+
/**
|
12
|
+
* 自定义类名
|
13
|
+
* @en Custom className
|
14
|
+
*/
|
15
|
+
className?: string;
|
16
|
+
/**
|
17
|
+
* 自定义样式
|
18
|
+
* @en Custom stylesheet
|
19
|
+
*/
|
20
|
+
style?: React.CSSProperties;
|
21
|
+
/**
|
22
|
+
* 可以选择的文件类型
|
23
|
+
* @en Available file types
|
24
|
+
* @default undefined
|
25
|
+
*/
|
26
|
+
accept?: InputHTMLAttributes<unknown>['accept'];
|
27
|
+
/**
|
28
|
+
* 是否支持多选
|
29
|
+
* @en Whether to support multiple selection
|
30
|
+
*/
|
31
|
+
multiple?: boolean;
|
32
|
+
/**
|
33
|
+
* 文件选取模式 File selection mode [capture MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/capture)
|
34
|
+
* @en Whether To Support Multiple Selection [capture MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/capture)
|
35
|
+
*/
|
36
|
+
capture?: InputHTMLAttributes<unknown>['capture'];
|
37
|
+
/**
|
38
|
+
* 是否隐藏文件上传状态
|
39
|
+
* @en Whether to hide file upload status
|
40
|
+
* @default false
|
41
|
+
*/
|
42
|
+
hideStatus?: boolean;
|
43
|
+
/**
|
44
|
+
* 是否总是展示选择Icon,默认情况下当文件数量超出limit值时会自动隐藏选择Icon
|
45
|
+
* @en Whether to always show Select Icon
|
46
|
+
* @default false
|
47
|
+
*/
|
48
|
+
alwaysShowSelect?: boolean;
|
49
|
+
/**
|
50
|
+
* 禁用选择和删除图片
|
51
|
+
* @en Disable select & delete image
|
52
|
+
*/
|
53
|
+
disabled?: boolean;
|
54
|
+
/**
|
55
|
+
* 自定义删除区域
|
56
|
+
* @en Defined delete area
|
57
|
+
*/
|
58
|
+
renderDeleteArea?: (fileItem: FileItem, index: number) => React.ReactNode;
|
59
|
+
/**
|
60
|
+
* 自定义上传成功区域
|
61
|
+
* @en Defined loaded area
|
62
|
+
*/
|
63
|
+
renderLoadedArea?: (fileItem: FileItem, index: number) => React.ReactNode;
|
64
|
+
/**
|
65
|
+
* 自定义上传中区域
|
66
|
+
* @en Defined loading area
|
67
|
+
*/
|
68
|
+
renderLoadingArea?: (fileItem: FileItem, index: number) => React.ReactNode;
|
69
|
+
/**
|
70
|
+
* 自定义上传失败区域
|
71
|
+
* @en Defined error area
|
72
|
+
*/
|
73
|
+
renderErrorArea?: (fileItem: FileItem, index: number) => React.ReactNode;
|
74
|
+
/**
|
75
|
+
* 自定义文件索引区域
|
76
|
+
* @en Defined file index area
|
77
|
+
*/
|
78
|
+
renderFileIndexArea?: (fileItem: FileItem, index: number) => React.ReactNode;
|
79
|
+
/**
|
80
|
+
* 自定义上传按钮区域
|
81
|
+
* @en Defined upload button area
|
82
|
+
*/
|
83
|
+
renderUploadArea?: () => React.ReactNode;
|
84
|
+
/**
|
85
|
+
* 自定义上传文件列表展示
|
86
|
+
* @en Defined file list display
|
87
|
+
*/
|
88
|
+
renderFileList?: (methods: FileListMethods) => React.ReactNode;
|
89
|
+
}
|
90
|
+
export interface UploaderRef {
|
91
|
+
/**
|
92
|
+
* 最外层 DOM 元素
|
93
|
+
* @en The outer DOM element of the component
|
94
|
+
*/
|
95
|
+
dom: HTMLDivElement | null;
|
96
|
+
}
|
97
|
+
export interface FileListMethods {
|
98
|
+
/**
|
99
|
+
* 重新上传
|
100
|
+
* @en Retry to upload
|
101
|
+
*/
|
102
|
+
retryUpload: (index: number) => void;
|
103
|
+
/**
|
104
|
+
* 删除文件
|
105
|
+
* @en Delete file
|
106
|
+
*/
|
107
|
+
deleteFile: (index: number) => void;
|
108
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
exports.__esModule = true;
|
4
|
+
|
5
|
+
var _type = require("./type");
|
6
|
+
|
7
|
+
Object.keys(_type).forEach(function (key) {
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
9
|
+
if (key in exports && exports[key] === _type[key]) return;
|
10
|
+
exports[key] = _type[key];
|
11
|
+
});
|
12
|
+
|
13
|
+
var _upload = require("./upload");
|
14
|
+
|
15
|
+
Object.keys(_upload).forEach(function (key) {
|
16
|
+
if (key === "default" || key === "__esModule") return;
|
17
|
+
if (key in exports && exports[key] === _upload[key]) return;
|
18
|
+
exports[key] = _upload[key];
|
19
|
+
});
|
@@ -0,0 +1,107 @@
|
|
1
|
+
/// <reference types="react" />
|
2
|
+
export interface AdapterFile {
|
3
|
+
/**
|
4
|
+
* 文件 url
|
5
|
+
* @en Url of file
|
6
|
+
*/
|
7
|
+
url?: string;
|
8
|
+
/**
|
9
|
+
* 文件大小
|
10
|
+
* @en File size
|
11
|
+
*/
|
12
|
+
size: number;
|
13
|
+
/**
|
14
|
+
* 文件名
|
15
|
+
* @en File name
|
16
|
+
*/
|
17
|
+
name: string;
|
18
|
+
}
|
19
|
+
export interface SelectCallback {
|
20
|
+
/**
|
21
|
+
* 文件列表
|
22
|
+
* @en File list
|
23
|
+
*/
|
24
|
+
files: AdapterFile[];
|
25
|
+
}
|
26
|
+
export interface CommonFileItem {
|
27
|
+
/**
|
28
|
+
* 文件地址
|
29
|
+
* @en file Url
|
30
|
+
*/
|
31
|
+
url?: string;
|
32
|
+
/**
|
33
|
+
* 文件
|
34
|
+
* @en File
|
35
|
+
*/
|
36
|
+
file?: File;
|
37
|
+
/**
|
38
|
+
* 文件状态
|
39
|
+
* @en Image Status
|
40
|
+
* @default 以文件自身加载状态而定
|
41
|
+
* @default_en According to inner status of the image
|
42
|
+
*/
|
43
|
+
status?: 'loaded' | 'loading' | 'error';
|
44
|
+
}
|
45
|
+
export interface UploadCommonProps<FileItem extends CommonFileItem = CommonFileItem> {
|
46
|
+
/**
|
47
|
+
* 上传方法
|
48
|
+
* @en Upload function
|
49
|
+
*/
|
50
|
+
upload?: (file: FileItem) => Promise<FileItem | null>;
|
51
|
+
/**
|
52
|
+
* 已选文件列表发生变化
|
53
|
+
* @en The list of selected files changes
|
54
|
+
*/
|
55
|
+
onChange?: (fileList: FileItem[]) => void;
|
56
|
+
/**
|
57
|
+
* 文件大小限制,单位为K
|
58
|
+
* @en File size limit, in K
|
59
|
+
*/
|
60
|
+
maxSize?: number;
|
61
|
+
/**
|
62
|
+
* 文件超过限制大小
|
63
|
+
* @en Image exceeds size limit
|
64
|
+
*/
|
65
|
+
onMaxSizeExceed?: (file: File) => void;
|
66
|
+
/**
|
67
|
+
* 最多选择文件数,超出数量自动隐藏上传按钮,0表示不做限制
|
68
|
+
* @en Max pictures can choose, 0 means no restriction
|
69
|
+
* @default 0
|
70
|
+
*/
|
71
|
+
limit?: number;
|
72
|
+
/**
|
73
|
+
* 选择文件数超过限制
|
74
|
+
* @en The number of pictures exceeds the limit
|
75
|
+
*/
|
76
|
+
onLimitExceed?: (files: File[]) => void;
|
77
|
+
/**
|
78
|
+
* 已选择文件列表
|
79
|
+
* @en Selected files list
|
80
|
+
*/
|
81
|
+
files: FileItem[];
|
82
|
+
/**
|
83
|
+
* 删除点击事件
|
84
|
+
* @en Delete area click event
|
85
|
+
*/
|
86
|
+
onDeleteClick?: (index: number) => void;
|
87
|
+
/**
|
88
|
+
* 上传文件点击事件
|
89
|
+
* @en Upload area click event
|
90
|
+
*/
|
91
|
+
onUploadClick?: () => void;
|
92
|
+
/**
|
93
|
+
* 文件选择适配器
|
94
|
+
* @en Select adaptor
|
95
|
+
*/
|
96
|
+
selectAdapter?: () => Promise<SelectCallback>;
|
97
|
+
/**
|
98
|
+
* 文件点击
|
99
|
+
* @en click event
|
100
|
+
*/
|
101
|
+
onClick?: (e: React.MouseEvent<HTMLElement, MouseEvent>, file: FileItem, index: number) => void;
|
102
|
+
/**
|
103
|
+
* 文件长按事件
|
104
|
+
* @en long press event
|
105
|
+
*/
|
106
|
+
onLongPress?: (e: React.TouchEvent<HTMLElement>, file: FileItem, index: number) => void;
|
107
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
import React from 'react';
|
3
|
+
import { Promise } from 'es6-promise';
|
4
|
+
import { AdapterFile, CommonFileItem, UploadCommonProps } from './type';
|
5
|
+
export declare class Upload<FileItem extends CommonFileItem = CommonFileItem> {
|
6
|
+
props: UploadCommonProps<FileItem>;
|
7
|
+
fileRef: React.MutableRefObject<HTMLInputElement | null>;
|
8
|
+
cacheRef: React.MutableRefObject<FileItem[]>;
|
9
|
+
timeOutEvent: NodeJS.Timeout | number;
|
10
|
+
constructor(props: UploadCommonProps<FileItem>, fileRef: React.MutableRefObject<HTMLInputElement | null>, cacheRef: React.MutableRefObject<FileItem[]>);
|
11
|
+
init(): void;
|
12
|
+
handleFile: (newFiles: File[]) => void;
|
13
|
+
handleChange: (event: any, fromAdapter?: boolean | undefined) => void;
|
14
|
+
deleteFile: (index: number) => void;
|
15
|
+
retryUpload: (index: number) => void;
|
16
|
+
handleSelect: (e: React.MouseEvent) => void;
|
17
|
+
handleClick: (e: React.MouseEvent<HTMLDivElement, MouseEvent>, file: FileItem, index: number) => void;
|
18
|
+
handleTouchStart: (e: React.TouchEvent<HTMLDivElement>, image: FileItem, index: number) => void;
|
19
|
+
}
|
20
|
+
export declare const parseFile: (file: AdapterFile) => Promise<unknown>;
|
@@ -0,0 +1,189 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
4
|
+
|
5
|
+
exports.__esModule = true;
|
6
|
+
exports.parseFile = exports.Upload = void 0;
|
7
|
+
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
9
|
+
|
10
|
+
var _es6Promise = require("es6-promise");
|
11
|
+
|
12
|
+
var Upload = /*#__PURE__*/function () {
|
13
|
+
// click && longPress
|
14
|
+
function Upload(props, fileRef, cacheRef) {
|
15
|
+
var _this = this;
|
16
|
+
|
17
|
+
this.props = void 0;
|
18
|
+
this.fileRef = void 0;
|
19
|
+
this.cacheRef = void 0;
|
20
|
+
this.timeOutEvent = void 0;
|
21
|
+
|
22
|
+
this.handleFile = function (newFiles) {
|
23
|
+
_es6Promise.Promise.all(newFiles.map(function (file) {
|
24
|
+
return parseFile(file);
|
25
|
+
})).then(function (parseFiles) {
|
26
|
+
var res = parseFiles.map(function (url, index) {
|
27
|
+
return {
|
28
|
+
url: url,
|
29
|
+
status: typeof _this.props.upload === 'function' ? 'loading' : 'loaded',
|
30
|
+
file: newFiles[index]
|
31
|
+
};
|
32
|
+
});
|
33
|
+
_this.cacheRef.current = [].concat(_this.cacheRef.current, res);
|
34
|
+
|
35
|
+
_this.props.onChange([].concat(_this.cacheRef.current)); // 执行upload
|
36
|
+
|
37
|
+
|
38
|
+
if (typeof _this.props.upload === 'function') {
|
39
|
+
newFiles.forEach(function (_file) {
|
40
|
+
_this.props.upload(_this.cacheRef.current.find(function (_ref) {
|
41
|
+
var file = _ref.file;
|
42
|
+
return file === _file;
|
43
|
+
})).then(function (data) {
|
44
|
+
var index = _this.cacheRef.current.findIndex(function (_ref2) {
|
45
|
+
var file = _ref2.file;
|
46
|
+
return file === _file;
|
47
|
+
});
|
48
|
+
|
49
|
+
if (index !== -1) {
|
50
|
+
_this.cacheRef.current[index] = (0, _extends2.default)({}, _this.cacheRef.current[index], data, {
|
51
|
+
status: 'loaded'
|
52
|
+
});
|
53
|
+
}
|
54
|
+
}).catch(function () {
|
55
|
+
var index = _this.cacheRef.current.findIndex(function (_ref3) {
|
56
|
+
var file = _ref3.file;
|
57
|
+
return file === _file;
|
58
|
+
});
|
59
|
+
|
60
|
+
if (index !== -1) {
|
61
|
+
_this.cacheRef.current[index].status = 'error';
|
62
|
+
}
|
63
|
+
}).finally(function () {
|
64
|
+
_this.props.onChange([].concat(_this.cacheRef.current));
|
65
|
+
});
|
66
|
+
});
|
67
|
+
}
|
68
|
+
});
|
69
|
+
};
|
70
|
+
|
71
|
+
this.handleChange = function (event, fromAdapter) {
|
72
|
+
var newFiles = Array.prototype.filter.call(event.target.files || [], function (file) {
|
73
|
+
// 过滤maxSize
|
74
|
+
if (_this.props.maxSize && file.size > _this.props.maxSize * 1024) {
|
75
|
+
_this.props.onMaxSizeExceed && _this.props.onMaxSizeExceed(file);
|
76
|
+
return false;
|
77
|
+
}
|
78
|
+
|
79
|
+
return true;
|
80
|
+
}) || [];
|
81
|
+
|
82
|
+
if (!fromAdapter) {
|
83
|
+
event.target.value = '';
|
84
|
+
} // 截断limit
|
85
|
+
|
86
|
+
|
87
|
+
if (_this.props.limit !== 0 && newFiles.length + _this.props.files.length > _this.props.limit) {
|
88
|
+
_this.props.onLimitExceed && _this.props.onLimitExceed(newFiles);
|
89
|
+
newFiles.length = _this.props.limit - _this.props.files.length;
|
90
|
+
}
|
91
|
+
|
92
|
+
_this.handleFile(newFiles);
|
93
|
+
};
|
94
|
+
|
95
|
+
this.deleteFile = function (index) {
|
96
|
+
_this.props.onDeleteClick && _this.props.onDeleteClick(index);
|
97
|
+
|
98
|
+
_this.props.onChange(_this.props.files.filter(function (_i, j) {
|
99
|
+
return j !== index;
|
100
|
+
}));
|
101
|
+
};
|
102
|
+
|
103
|
+
this.retryUpload = function (index) {
|
104
|
+
_this.deleteFile(index);
|
105
|
+
|
106
|
+
_this.handleFile([_this.props.files[index].file]);
|
107
|
+
};
|
108
|
+
|
109
|
+
this.handleSelect = function (e) {
|
110
|
+
if (e.target !== _this.fileRef.current) {
|
111
|
+
var _this$fileRef$current;
|
112
|
+
|
113
|
+
_this.props.onUploadClick && _this.props.onUploadClick();
|
114
|
+
_this.props.selectAdapter ? _this.props.selectAdapter().then(function (value) {
|
115
|
+
return _this.handleChange({
|
116
|
+
target: {
|
117
|
+
files: value.files
|
118
|
+
}
|
119
|
+
}, true);
|
120
|
+
}) : (_this$fileRef$current = _this.fileRef.current) == null ? void 0 : _this$fileRef$current.click();
|
121
|
+
}
|
122
|
+
};
|
123
|
+
|
124
|
+
this.handleClick = function (e, file, index) {
|
125
|
+
clearTimeout(_this.timeOutEvent);
|
126
|
+
|
127
|
+
if (_this.timeOutEvent !== 0) {
|
128
|
+
_this.props.onClick == null ? void 0 : _this.props.onClick(e, file, index);
|
129
|
+
}
|
130
|
+
};
|
131
|
+
|
132
|
+
this.handleTouchStart = function (e, image, index) {
|
133
|
+
_this.timeOutEvent = setTimeout(function () {
|
134
|
+
_this.timeOutEvent = 0;
|
135
|
+
_this.props.onLongPress == null ? void 0 : _this.props.onLongPress(e, image, index);
|
136
|
+
}, 750);
|
137
|
+
};
|
138
|
+
|
139
|
+
this.props = (0, _extends2.default)({}, props);
|
140
|
+
this.fileRef = fileRef;
|
141
|
+
this.cacheRef = cacheRef;
|
142
|
+
this.init();
|
143
|
+
}
|
144
|
+
|
145
|
+
var _proto = Upload.prototype;
|
146
|
+
|
147
|
+
_proto.init = function init() {
|
148
|
+
!this.props.files && (this.props.files = []);
|
149
|
+
!this.props.limit && (this.props.limit = 0);
|
150
|
+
!this.props.onChange && (this.props.onChange = function () {
|
151
|
+
return null;
|
152
|
+
});
|
153
|
+
} // 解析文件生成预览
|
154
|
+
;
|
155
|
+
|
156
|
+
return Upload;
|
157
|
+
}();
|
158
|
+
|
159
|
+
exports.Upload = Upload;
|
160
|
+
|
161
|
+
var parseFile = function parseFile(file) {
|
162
|
+
return new _es6Promise.Promise(function (resolve, reject) {
|
163
|
+
if (file.url) {
|
164
|
+
resolve(file.url);
|
165
|
+
} else {
|
166
|
+
var reader = new FileReader();
|
167
|
+
|
168
|
+
reader.onload = function (e) {
|
169
|
+
var _e$target;
|
170
|
+
|
171
|
+
var dataURL = (_e$target = e.target) == null ? void 0 : _e$target.result;
|
172
|
+
|
173
|
+
if (!dataURL) {
|
174
|
+
reject(new Error('file parse error'));
|
175
|
+
}
|
176
|
+
|
177
|
+
resolve(dataURL);
|
178
|
+
};
|
179
|
+
|
180
|
+
reader.onerror = function () {
|
181
|
+
reject(new Error('file parse error'));
|
182
|
+
};
|
183
|
+
|
184
|
+
reader.readAsDataURL(file);
|
185
|
+
}
|
186
|
+
});
|
187
|
+
};
|
188
|
+
|
189
|
+
exports.parseFile = parseFile;
|