@nutui/nutui-react-taro 1.4.9-beta.1 → 1.4.9-beta.2

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.
Files changed (108) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/esm/ActionSheet.js +3 -3
  3. package/dist/esm/Address.js +3 -3
  4. package/dist/esm/Badge.js +3 -2
  5. package/dist/esm/Calendar.js +4 -4
  6. package/dist/esm/CalendarItem.js +3 -2
  7. package/dist/esm/Card.js +3 -3
  8. package/dist/esm/Cascader.js +4 -4
  9. package/dist/esm/Checkbox.js +2 -2
  10. package/dist/esm/CheckboxGroup.js +2 -2
  11. package/dist/esm/CircleProgress.js +3 -2
  12. package/dist/esm/Collapse.js +3 -2
  13. package/dist/esm/DatePicker.js +5 -4
  14. package/dist/esm/Form/style/index.js +1 -1
  15. package/dist/esm/FormItem/style/index.js +1 -1
  16. package/dist/esm/Grid.js +3 -2
  17. package/dist/esm/GridItem.js +3 -2
  18. package/dist/esm/ImagePreview.js +3 -3
  19. package/dist/esm/Indicator.js +2 -2
  20. package/dist/esm/MenuItem/style/index.js +1 -1
  21. package/dist/esm/NavBar/style/index.js +1 -1
  22. package/dist/esm/NumberKeyboard/style/index.js +1 -1
  23. package/dist/esm/NumberKeyboard.js +3 -3
  24. package/dist/esm/Picker.js +3 -3
  25. package/dist/esm/Popover/style/index.js +2 -1
  26. package/dist/esm/Popup.js +2 -2
  27. package/dist/esm/Rate.js +3 -2
  28. package/dist/esm/SearchBar/style/index.js +1 -1
  29. package/dist/esm/ShortPassword.js +3 -3
  30. package/dist/esm/SideNavBar/style/index.js +1 -1
  31. package/dist/esm/SideNavBar.js +3 -3
  32. package/dist/esm/Skeleton/style/index.js +1 -1
  33. package/dist/esm/Sticky.js +6 -3
  34. package/dist/esm/Swipe.js +3 -2
  35. package/dist/esm/Table/style/index.js +1 -1
  36. package/dist/esm/Tabs/style/index.js +2 -1
  37. package/dist/esm/Tabs.js +3 -2
  38. package/dist/esm/TimeSelect/style/index.js +1 -0
  39. package/dist/esm/TimeSelect.js +3 -3
  40. package/dist/esm/Uploader/style/index.js +1 -0
  41. package/dist/esm/Uploader.js +4 -2
  42. package/dist/esm/{actionsheet.taro-166ce936.js → actionsheet.taro-c5ccaf4e.js} +1 -1
  43. package/dist/esm/{address.taro-55f308f1.js → address.taro-f977bad0.js} +1 -1
  44. package/dist/esm/{badge.taro-116b2521.js → badge.taro-a2e7dd5a.js} +5 -2
  45. package/dist/esm/{calendar.taro-c95e6998.js → calendar.taro-2dee4f90.js} +2 -2
  46. package/dist/esm/{calendaritem.taro-86412398.js → calendaritem.taro-f5da0936.js} +6 -2
  47. package/dist/esm/{card.taro-a03f0dfc.js → card.taro-4fb6bc4e.js} +2 -1
  48. package/dist/esm/{cascader.taro-e0fb7e63.js → cascader.taro-a2ee549c.js} +2 -2
  49. package/dist/esm/{checkbox.taro-b76b1c82.js → checkbox.taro-6aab93c3.js} +60 -69
  50. package/dist/esm/{circleprogress.taro-47db537c.js → circleprogress.taro-897ea24b.js} +1 -2
  51. package/dist/esm/{collapse.taro-af58206c.js → collapse.taro-c903a060.js} +2 -1
  52. package/dist/esm/{datepicker.taro-324d9d98.js → datepicker.taro-e5f3aa90.js} +11 -10
  53. package/dist/esm/{grid.taro-e6decfce.js → grid.taro-9410ff69.js} +4 -1
  54. package/dist/esm/{griditem.taro-5406bd2c.js → griditem.taro-26863577.js} +9 -2
  55. package/dist/esm/{imagepreview.taro-2d23d0ae.js → imagepreview.taro-3a5722e8.js} +1 -1
  56. package/dist/esm/index-a90733f9.js +7 -0
  57. package/dist/esm/{indicator.taro-183ea169.js → indicator.taro-25682172.js} +1 -1
  58. package/dist/esm/{numberkeyboard.taro-c6b5b0e1.js → numberkeyboard.taro-78224b3a.js} +1 -1
  59. package/dist/esm/nutui-react.es.js +28 -27
  60. package/dist/esm/{picker.taro-33e33120.js → picker.taro-4298ce4e.js} +1 -1
  61. package/dist/esm/{popup.taro-4c18f46c.js → popup.taro-6e81162a.js} +1 -1
  62. package/dist/esm/{rate.taro-17b84a51.js → rate.taro-f18381f3.js} +5 -2
  63. package/dist/esm/{shortpassword.taro-53b7ee7b.js → shortpassword.taro-e8ea4593.js} +1 -1
  64. package/dist/esm/{sidenavbar.taro-51a133e6.js → sidenavbar.taro-e03a5287.js} +1 -1
  65. package/dist/esm/{sticky.taro-2d9b2804.js → sticky.taro-b15d1173.js} +9 -4
  66. package/dist/esm/{swipe.taro-6532405d.js → swipe.taro-9375a9a1.js} +2 -1
  67. package/dist/esm/{tabs.taro-4629d66c.js → tabs.taro-95edd45d.js} +2 -0
  68. package/dist/esm/{timeselect.taro-4fb46162.js → timeselect.taro-f276b0a9.js} +1 -1
  69. package/dist/esm/types/src/packages/checkbox/checkbox.d.ts +2 -7
  70. package/dist/esm/types/src/packages/checkbox/checkbox.taro.d.ts +2 -7
  71. package/dist/esm/types/src/packages/checkboxgroup/checkboxgroup.d.ts +4 -5
  72. package/dist/esm/types/src/packages/checkboxgroup/checkboxgroup.taro.d.ts +4 -5
  73. package/dist/esm/types/src/packages/checkboxgroup/context.d.ts +10 -0
  74. package/dist/esm/types/src/packages/tabs/tabs.d.ts +4 -1
  75. package/dist/esm/types/src/packages/tabs/tabs.taro.d.ts +4 -1
  76. package/dist/esm/types/src/packages/uploader/upload.d.ts +3 -0
  77. package/dist/esm/types/src/packages/uploader/uploader.d.ts +4 -1
  78. package/dist/esm/types/src/packages/uploader/uploader.taro.d.ts +15 -6
  79. package/dist/esm/types/src/utils/Interceptor.d.ts +6 -0
  80. package/dist/esm/types/src/utils/index.d.ts +2 -0
  81. package/dist/esm/{uploader.taro-c830b573.js → uploader.taro-77396b5d.js} +183 -81
  82. package/dist/locales/base.js +1 -1
  83. package/dist/locales/en-US.js +1 -1
  84. package/dist/locales/id-ID.js +1 -1
  85. package/dist/locales/zh-CN.js +1 -1
  86. package/dist/locales/zh-TW.js +1 -1
  87. package/dist/locales/zh-UG.js +1 -1
  88. package/dist/nutui.react.es.js +319 -218
  89. package/dist/nutui.react.umd.js +318 -217
  90. package/dist/packages/datepicker/datepicker.scss +0 -3
  91. package/dist/packages/form/form.scss +1 -0
  92. package/dist/packages/formitem/formitem.scss +13 -0
  93. package/dist/packages/menuitem/menuitem.scss +4 -0
  94. package/dist/packages/navbar/navbar.scss +24 -0
  95. package/dist/packages/numberkeyboard/numberkeyboard.scss +1 -0
  96. package/dist/packages/searchbar/searchbar.scss +1 -0
  97. package/dist/packages/sidenavbar/sidenavbar.scss +13 -0
  98. package/dist/packages/skeleton/skeleton.scss +7 -0
  99. package/dist/packages/table/table.scss +22 -0
  100. package/dist/packages/tabs/tabs.scss +44 -2
  101. package/dist/packages/timeselect/timeselect.scss +7 -0
  102. package/dist/packages/uploader/uploader.scss +85 -28
  103. package/dist/style.css +1 -1
  104. package/dist/style.es.js +1 -1
  105. package/dist/styles/variables.scss +62 -0
  106. package/dist/types/index.d.ts +28 -21
  107. package/package.json +1 -1
  108. package/dist/esm/types/src/packages/tabbar/use-props-value.d.ts +0 -7
@@ -1,10 +1,6 @@
1
1
  import React, { FunctionComponent } from 'react';
2
2
  import CheckboxGroup from '@/packages/checkboxgroup/index.taro';
3
3
  import { BasicComponent } from '@/utils/typings';
4
- interface InheritParentProps {
5
- getParentVals?: () => string[] | undefined;
6
- max?: number | undefined;
7
- }
8
4
  export interface CheckboxProps extends BasicComponent {
9
5
  checked: boolean;
10
6
  disabled: boolean;
@@ -16,10 +12,9 @@ export interface CheckboxProps extends BasicComponent {
16
12
  iconClassPrefix: string;
17
13
  iconFontClassName: string;
18
14
  indeterminate: boolean;
19
- label: string;
15
+ label: string | number;
20
16
  onChange: (state: boolean, label: string) => void;
21
17
  }
22
- export declare const Checkbox: FunctionComponent<Partial<CheckboxProps> & Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & InheritParentProps> & {
18
+ export declare const Checkbox: FunctionComponent<Partial<CheckboxProps> & Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>> & {
23
19
  Group: typeof CheckboxGroup;
24
20
  };
25
- export {};
@@ -1,15 +1,14 @@
1
1
  import React from 'react';
2
2
  import { RadioGroupOptionType } from '@/packages/radiogroup/type';
3
- type Position = 'left' | 'right';
4
- type Direction = 'horizontal' | 'vertical';
3
+ export type CheckboxTextPosition = 'left' | 'right';
4
+ export type CheckboxDirection = 'horizontal' | 'vertical';
5
5
  export interface CheckboxGroupProps {
6
6
  disabled: boolean;
7
7
  checkedValue: string[];
8
8
  max: number | undefined;
9
- textPosition: Position;
10
- direction: Direction;
9
+ textPosition: CheckboxTextPosition;
10
+ direction: CheckboxDirection;
11
11
  onChange: (value: string[]) => void;
12
12
  options: RadioGroupOptionType[];
13
13
  }
14
14
  export declare const CheckboxGroup: React.ForwardRefExoticComponent<Partial<CheckboxGroupProps> & Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> & React.RefAttributes<unknown>>;
15
- export {};
@@ -1,15 +1,14 @@
1
1
  import React from 'react';
2
2
  import { RadioGroupOptionType } from '@/packages/radiogroup/type';
3
- type Position = 'left' | 'right';
4
- type Direction = 'horizontal' | 'vertical';
3
+ export type CheckboxTextPosition = 'left' | 'right';
4
+ export type CheckboxDirection = 'horizontal' | 'vertical';
5
5
  export interface CheckboxGroupProps {
6
6
  disabled: boolean;
7
7
  checkedValue: string[];
8
8
  max: number | undefined;
9
- textPosition: Position;
10
- direction: Direction;
9
+ textPosition: CheckboxTextPosition;
10
+ direction: CheckboxDirection;
11
11
  onChange: (value: string[]) => void;
12
12
  options: RadioGroupOptionType[];
13
13
  }
14
14
  export declare const CheckboxGroup: React.ForwardRefExoticComponent<Partial<CheckboxGroupProps> & Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> & React.RefAttributes<unknown>>;
15
- export {};
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ declare const CheckboxGroupContext: import("react").Context<{
3
+ textPosition: 'left' | 'right';
4
+ disabled: boolean | undefined;
5
+ checkedValue: string[];
6
+ max: number | undefined;
7
+ check: (value: string) => void;
8
+ uncheck: (value: string) => void;
9
+ } | null>;
10
+ export default CheckboxGroupContext;
@@ -1,5 +1,6 @@
1
1
  import React, { FunctionComponent } from 'react';
2
2
  import { BasicComponent } from '@/utils/typings';
3
+ import TabPane from '@/packages/tabpane';
3
4
  declare class Title {
4
5
  title: string;
5
6
  paneKey: string;
@@ -29,5 +30,7 @@ export interface TabsProps extends BasicComponent {
29
30
  autoHeight: boolean;
30
31
  children?: React.ReactNode;
31
32
  }
32
- export declare const Tabs: FunctionComponent<Partial<TabsProps>>;
33
+ export declare const Tabs: FunctionComponent<Partial<TabsProps>> & {
34
+ TabPane: typeof TabPane;
35
+ };
33
36
  export {};
@@ -1,5 +1,6 @@
1
1
  import React, { FunctionComponent } from 'react';
2
2
  import { BasicComponent } from '@/utils/typings';
3
+ import TabPane from '@/packages/tabpane/index.taro';
3
4
  declare class Title {
4
5
  title: string;
5
6
  paneKey: string;
@@ -29,5 +30,7 @@ export interface TabsProps extends BasicComponent {
29
30
  autoHeight: boolean;
30
31
  children?: React.ReactNode;
31
32
  }
32
- export declare const Tabs: FunctionComponent<Partial<TabsProps>>;
33
+ export declare const Tabs: FunctionComponent<Partial<TabsProps>> & {
34
+ TabPane: typeof TabPane;
35
+ };
33
36
  export {};
@@ -20,5 +20,8 @@ export declare class Upload {
20
20
  options: UploadOptions;
21
21
  constructor(options: UploadOptions);
22
22
  upload(): void;
23
+ }
24
+ export declare class UploaderTaro extends Upload {
25
+ constructor(options: UploadOptions);
23
26
  uploadTaro(uploadFile: Function, env: string): void;
24
27
  }
@@ -1,10 +1,10 @@
1
1
  import React from 'react';
2
2
  import { UploadOptions } from './upload';
3
+ import { BasicComponent } from '@/utils/typings';
3
4
  export type FileType<T> = {
4
5
  [key: string]: T;
5
6
  };
6
7
  export type FileItemStatus = 'ready' | 'uploading' | 'success' | 'error' | 'removed';
7
- import { BasicComponent } from '@/utils/typings';
8
8
  export interface UploaderProps extends BasicComponent {
9
9
  url: string;
10
10
  maximum: string | number;
@@ -13,6 +13,7 @@ export interface UploaderProps extends BasicComponent {
13
13
  listType: string;
14
14
  uploadIcon: string;
15
15
  uploadIconSize: string | number;
16
+ uploadIconTip: string;
16
17
  name: string;
17
18
  accept: string;
18
19
  disabled: boolean;
@@ -36,6 +37,7 @@ export interface UploaderProps extends BasicComponent {
36
37
  onSuccess?: (param: {
37
38
  responseText: XMLHttpRequest['responseText'];
38
39
  option: UploadOptions;
40
+ fileList: FileItem[];
39
41
  }) => void;
40
42
  onProgress?: (param: {
41
43
  e: ProgressEvent<XMLHttpRequestEventTarget>;
@@ -45,6 +47,7 @@ export interface UploaderProps extends BasicComponent {
45
47
  onFailure?: (param: {
46
48
  responseText: XMLHttpRequest['responseText'];
47
49
  option: UploadOptions;
50
+ fileList: FileItem[];
48
51
  }) => void;
49
52
  onUpdate?: (fileList: FileItem[]) => void;
50
53
  onOversize?: (file: File[]) => void;
@@ -19,22 +19,29 @@ interface sourceType {
19
19
  album: string;
20
20
  /** 使用相机 */
21
21
  camera: string;
22
- /** 使用前置摄像头(仅H5纯浏览器使用) */
23
- user: string;
24
- /** 使用后置摄像头(仅H5纯浏览器) */
25
- environment: string;
22
+ }
23
+ /** 视频的来源 */
24
+ interface mediaType {
25
+ /** 只能拍摄图片或从相册选择图片 */
26
+ image: string;
27
+ /** 只能拍摄视频或从相册选择视频 */
28
+ video: string;
26
29
  }
27
30
  export interface UploaderProps extends BasicComponent {
28
31
  url: string;
29
32
  maximum: string | number;
30
33
  sizeType: (keyof sizeType)[];
31
34
  sourceType: (keyof sourceType)[];
35
+ mediaType: (keyof mediaType)[];
36
+ camera: string;
32
37
  maximize: number;
33
38
  defaultFileList: FileType<string>[];
34
39
  listType: string;
35
40
  uploadIcon: string;
36
41
  uploadIconSize: string | number;
42
+ uploadIconTip: string;
37
43
  name: string;
44
+ accept: string;
38
45
  disabled: boolean;
39
46
  autoUpload: boolean;
40
47
  multiple: boolean;
@@ -47,12 +54,14 @@ export interface UploaderProps extends BasicComponent {
47
54
  isDeletable: boolean;
48
55
  className: string;
49
56
  defaultImg: string;
57
+ maxDuration: number;
50
58
  style: React.CSSProperties;
51
59
  onStart?: (option: UploadOptions) => void;
52
60
  onRemove?: (file: FileItem, fileList: FileType<string>[]) => void;
53
61
  onSuccess?: (param: {
54
62
  responseText: XMLHttpRequest['responseText'];
55
63
  option: UploadOptions;
64
+ fileList: FileType<string>[];
56
65
  }) => void;
57
66
  onProgress?: (param: {
58
67
  e: ProgressEvent<XMLHttpRequestEventTarget>;
@@ -62,13 +71,13 @@ export interface UploaderProps extends BasicComponent {
62
71
  onFailure?: (param: {
63
72
  responseText: XMLHttpRequest['responseText'];
64
73
  option: UploadOptions;
74
+ fileList: FileType<string>[];
65
75
  }) => void;
66
76
  onUpdate?: (fileList: FileType<string>[]) => void;
67
- onOversize?: (file: Taro.chooseImage.ImageFile[]) => void;
77
+ onOversize?: (files: Taro.chooseImage.ImageFile[] | Taro.chooseMedia.ChooseMedia[] | any) => void;
68
78
  onChange?: (param: {
69
79
  fileList: FileType<string>[];
70
80
  }) => void;
71
- onBeforeUpload?: (file: Taro.chooseImage.ImageFile[]) => Promise<any[]>;
72
81
  onBeforeXhrUpload?: (xhr: XMLHttpRequest, options: any) => void;
73
82
  onBeforeDelete?: (file: FileItem, files: FileType<string>[]) => boolean;
74
83
  onFileItemClick?: (file: FileItem) => void;
@@ -0,0 +1,6 @@
1
+ export type Interceptor = (...args: any[]) => Promise<boolean> | boolean | undefined | void;
2
+ export declare const funcInterceptor: (interceptor: Interceptor | undefined, { args, done, canceled, }: {
3
+ args?: unknown[] | undefined;
4
+ done: (val?: any) => void;
5
+ canceled?: (() => void) | undefined;
6
+ }) => void;
@@ -1 +1,3 @@
1
1
  export declare const isObject: (val: unknown) => val is Record<any, any>;
2
+ export declare const isFunction: (val: unknown) => val is Function;
3
+ export declare const isPromise: <T = any>(val: unknown) => val is Promise<T>;
@@ -1,11 +1,13 @@
1
1
  import React__default, { useState, useEffect, useImperativeHandle } from 'react';
2
2
  import classNames from 'classnames';
3
- import { uploadFile, getEnv, chooseImage } from '@tarojs/taro';
3
+ import Taro, { uploadFile, getEnv, chooseMedia, chooseImage } from '@tarojs/taro';
4
4
  import { I as Icon } from './icon.taro-c9254a81.js';
5
5
  import { B as Button } from './button.taro-dc4795a3.js';
6
6
  import { P as Progress } from './progress.taro-773482ed.js';
7
+ import { Image } from '@tarojs/components';
7
8
  import { c as cn } from './bem-893ad28d.js';
8
9
  import { u as useConfig } from './configprovider.taro-26882dd2.js';
10
+ import { i as isPromise } from './index-a90733f9.js';
9
11
  import { C as ComponentDefaults } from './typings-1c5f2628.js';
10
12
 
11
13
  class UploadOptions {
@@ -67,59 +69,93 @@ class Upload {
67
69
  console.warn('浏览器不支持 XMLHttpRequest');
68
70
  }
69
71
  }
72
+ }
73
+ class UploaderTaro extends Upload {
74
+ constructor(options) {
75
+ super(options);
76
+ }
70
77
  uploadTaro(uploadFile, env) {
71
78
  const options = this.options;
72
79
  if (env === 'WEB') {
73
80
  this.upload();
74
81
  }
75
- else if (options.beforeXhrUpload) {
76
- options.beforeXhrUpload(uploadFile, options);
77
- }
78
82
  else {
79
- const uploadTask = uploadFile({
80
- url: options.url,
81
- filePath: options.taroFilePath,
82
- fileType: options.fileType,
83
- header: {
84
- 'Content-Type': 'multipart/form-data',
85
- ...options.headers,
86
- },
87
- formData: options.formData,
88
- name: options.name,
89
- success(response) {
90
- if (options.xhrState == response.statusCode) {
91
- options.onSuccess?.(response, options);
92
- }
93
- else {
94
- options.onFailure?.(response, options);
95
- }
96
- },
97
- fail(e) {
98
- options.onFailure?.(e, options);
99
- },
100
- });
101
- options.onStart?.(options);
102
- uploadTask.progress((res) => {
103
- options.onProgress?.(res, options);
104
- // console.log('上传进度', res.progress);
105
- // console.log('已经上传的数据长度', res.totalBytesSent);
106
- // console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend);
107
- });
108
- // uploadTask.abort(); // 取消上传任务
83
+ if (options.beforeXhrUpload) {
84
+ options.beforeXhrUpload(uploadFile, options);
85
+ }
86
+ else {
87
+ const uploadTask = uploadFile({
88
+ url: options.url,
89
+ filePath: options.taroFilePath,
90
+ fileType: options.fileType,
91
+ header: {
92
+ 'Content-Type': 'multipart/form-data',
93
+ ...options.headers,
94
+ },
95
+ formData: options.formData,
96
+ name: options.name,
97
+ success(response) {
98
+ if (options.xhrState == response.statusCode) {
99
+ options.onSuccess?.(response, options);
100
+ }
101
+ else {
102
+ options.onFailure?.(response, options);
103
+ }
104
+ },
105
+ fail(e) {
106
+ options.onFailure?.(e, options);
107
+ },
108
+ });
109
+ options.onStart?.(options);
110
+ uploadTask.progress((res) => {
111
+ options.onProgress?.(res, options);
112
+ });
113
+ }
109
114
  }
110
115
  }
111
116
  }
112
117
 
118
+ const funcInterceptor = (interceptor, { args = [], done, canceled, }) => {
119
+ if (interceptor) {
120
+ const returnVal = interceptor.apply(null, args);
121
+ if (isPromise(returnVal)) {
122
+ returnVal
123
+ .then((value) => {
124
+ if (value) {
125
+ done(value);
126
+ }
127
+ else if (canceled) {
128
+ canceled();
129
+ }
130
+ })
131
+ .catch(() => { });
132
+ }
133
+ else if (returnVal) {
134
+ done();
135
+ }
136
+ else if (canceled) {
137
+ canceled();
138
+ }
139
+ }
140
+ else {
141
+ done();
142
+ }
143
+ };
144
+
113
145
  const defaultProps = {
114
146
  ...ComponentDefaults,
115
147
  url: '',
116
- maximum: 9,
148
+ maximum: 1,
117
149
  sizeType: ['original', 'compressed'],
118
150
  sourceType: ['album', 'camera'],
151
+ mediaType: ['image', 'video'],
152
+ camera: 'back',
119
153
  uploadIcon: 'photograph',
120
154
  uploadIconSize: '',
155
+ uploadIconTip: '',
121
156
  listType: 'picture',
122
157
  name: 'file',
158
+ accept: '*',
123
159
  disabled: false,
124
160
  autoUpload: true,
125
161
  multiple: false,
@@ -132,6 +168,7 @@ const defaultProps = {
132
168
  timeout: 1000 * 30,
133
169
  isPreview: true,
134
170
  isDeletable: true,
171
+ maxDuration: 10,
135
172
  onBeforeDelete: (file, files) => {
136
173
  return true;
137
174
  },
@@ -149,7 +186,7 @@ class FileItem {
149
186
  }
150
187
  const InternalUploader = (props, ref) => {
151
188
  const { locale } = useConfig();
152
- const { children, uploadIcon, uploadIconSize, name, defaultFileList, listType, disabled, url, defaultImg, headers, timeout, method, xhrState, data, isPreview, isDeletable, maximum, maximize, multiple, className, autoUpload, sizeType, sourceType, onStart, onRemove, onChange, onFileItemClick, onProgress, onSuccess, onUpdate, onFailure, onOversize, onBeforeUpload, onBeforeXhrUpload, onBeforeDelete, ...restProps } = { ...defaultProps, ...props };
189
+ const { children, uploadIcon, uploadIconSize, uploadIconTip, accept, name, camera, defaultFileList, listType, disabled, multiple, url, defaultImg, headers, timeout, method, xhrState, data, isPreview, isDeletable, maximum, maximize, mediaType, className, autoUpload, sizeType, sourceType, maxDuration, iconClassPrefix, iconFontClassName, onStart, onRemove, onChange, onFileItemClick, onProgress, onSuccess, onUpdate, onFailure, onOversize, onBeforeXhrUpload, onBeforeDelete, ...restProps } = { ...defaultProps, ...props };
153
190
  const [fileList, setFileList] = useState([]);
154
191
  const [uploadQueue, setUploadQueue] = useState([]);
155
192
  useEffect(() => {
@@ -165,6 +202,9 @@ const InternalUploader = (props, ref) => {
165
202
  res.forEach((i) => i.uploadTaro(uploadFile, getEnv()));
166
203
  });
167
204
  },
205
+ clear: () => {
206
+ clearUploadQueue();
207
+ },
168
208
  }));
169
209
  const clearUploadQueue = (index = -1) => {
170
210
  if (index > -1) {
@@ -173,20 +213,64 @@ const InternalUploader = (props, ref) => {
173
213
  }
174
214
  else {
175
215
  setUploadQueue([]);
216
+ fileList.splice(0, fileList.length);
217
+ setFileList([...fileList]);
176
218
  }
177
219
  };
178
220
  const _chooseImage = () => {
179
221
  if (disabled) {
180
222
  return;
181
223
  }
182
- chooseImage({
183
- // 选择数量
184
- count: multiple ? maximum * 1 - fileList.length : 1,
185
- // 可以指定是原图还是压缩图,默认二者都有
186
- sizeType,
187
- sourceType,
188
- success: onChangeFn,
189
- });
224
+ if (Taro.getEnv() == 'WEB') {
225
+ let el = document.getElementById('taroChooseImage');
226
+ if (el) {
227
+ el?.setAttribute('accept', accept);
228
+ }
229
+ else {
230
+ const obj = document.createElement('input');
231
+ obj.setAttribute('type', 'file');
232
+ obj.setAttribute('id', 'taroChooseImage');
233
+ obj.setAttribute('accept', accept);
234
+ obj.setAttribute('style', 'position: fixed; top: -4000px; left: -3000px; z-index: -300;');
235
+ document.body.appendChild(obj);
236
+ }
237
+ }
238
+ if (getEnv() == 'WEAPP') {
239
+ // chooseMedia 目前只支持微信小程序原生,其余端全部使用 chooseImage API
240
+ chooseMedia({
241
+ /** 最多可以选择的文件个数 */
242
+ count: multiple ? maximum * 1 - fileList.length : 1,
243
+ /** 文件类型 */
244
+ mediaType: mediaType,
245
+ /** 图片和视频选择的来源 */
246
+ sourceType: sourceType,
247
+ /** 拍摄视频最长拍摄时间,单位秒。时间范围为 3s 至 30s 之间 */
248
+ maxDuration: maxDuration,
249
+ /** 仅对 mediaType 为 image 时有效,是否压缩所选文件 */
250
+ sizeType: [],
251
+ /** 仅在 sourceType 为 camera 时生效,使用前置或后置摄像头 */
252
+ camera: camera,
253
+ /** 接口调用失败的回调函数 */
254
+ fail: (res) => {
255
+ onFailure && onFailure(res);
256
+ },
257
+ /** 接口调用成功的回调函数 */
258
+ success: onChangeMedia,
259
+ });
260
+ }
261
+ else {
262
+ chooseImage({
263
+ // 选择数量
264
+ count: multiple ? maximum * 1 - fileList.length : 1,
265
+ // 可以指定是原图还是压缩图,默认二者都有
266
+ sizeType,
267
+ sourceType,
268
+ success: onChangeImage,
269
+ fail: (res) => {
270
+ onFailure && onFailure(res);
271
+ },
272
+ });
273
+ }
190
274
  };
191
275
  const executeUpload = (fileItem, index) => {
192
276
  const uploadOption = new UploadOptions();
@@ -241,6 +325,7 @@ const InternalUploader = (props, ref) => {
241
325
  onSuccess({
242
326
  responseText,
243
327
  option,
328
+ fileList,
244
329
  });
245
330
  };
246
331
  uploadOption.onFailure = (responseText, option) => {
@@ -257,9 +342,10 @@ const InternalUploader = (props, ref) => {
257
342
  onFailure({
258
343
  responseText,
259
344
  option,
345
+ fileList,
260
346
  });
261
347
  };
262
- const task = new Upload(uploadOption);
348
+ const task = new UploaderTaro(uploadOption);
263
349
  if (props.autoUpload) {
264
350
  task.uploadTaro(uploadFile, getEnv());
265
351
  }
@@ -271,19 +357,30 @@ const InternalUploader = (props, ref) => {
271
357
  }
272
358
  };
273
359
  const readFile = (files) => {
274
- const imgReg = /\.(png|jpeg|jpg|webp|gif)$/i;
275
360
  files.forEach((file, index) => {
276
- console.log('file', file);
277
361
  let fileType = file.type;
362
+ let filepath = (file.tempFilePath || file.path);
278
363
  const fileItem = new FileItem();
279
- if (!fileType && imgReg.test(file.path)) {
280
- fileType = 'image';
364
+ if (file.fileType) {
365
+ fileType = file.fileType;
366
+ }
367
+ else {
368
+ const imgReg = /\.(png|jpeg|jpg|webp|gif)$/i;
369
+ if (!fileType &&
370
+ (imgReg.test(filepath) || filepath.includes('data:image'))) {
371
+ fileType = 'image';
372
+ }
281
373
  }
282
- fileItem.path = file.path;
283
- fileItem.name = file.path;
374
+ fileItem.path = filepath;
375
+ fileItem.name = filepath;
284
376
  fileItem.status = 'ready';
285
- fileItem.message = locale.uploader.readyUpload;
286
377
  fileItem.type = fileType;
378
+ if (autoUpload) {
379
+ fileItem.message = locale.uploader.readyUpload;
380
+ }
381
+ else {
382
+ fileItem.message = locale.uploader.waitingUpload;
383
+ }
287
384
  if (getEnv() === 'WEB') {
288
385
  const formData = new FormData();
289
386
  for (const [key, value] of Object.entries(data)) {
@@ -298,7 +395,7 @@ const InternalUploader = (props, ref) => {
298
395
  fileItem.formData = data;
299
396
  }
300
397
  if (isPreview) {
301
- fileItem.url = file.path;
398
+ fileItem.url = fileType == 'video' ? file.thumbTempFilePath : filepath;
302
399
  }
303
400
  fileList.push(fileItem);
304
401
  setFileList([...fileList]);
@@ -325,30 +422,30 @@ const InternalUploader = (props, ref) => {
325
422
  }
326
423
  return filterFile;
327
424
  };
425
+ const deleted = (file, index) => {
426
+ fileList.splice(index, 1);
427
+ onRemove && onRemove(file, fileList);
428
+ setFileList([...fileList]);
429
+ };
328
430
  const onDelete = (file, index) => {
329
431
  clearUploadQueue(index);
330
- if (onBeforeDelete && onBeforeDelete(file, fileList)) {
331
- fileList.splice(index, 1);
332
- onRemove && onRemove(file, fileList);
333
- setFileList([...fileList]);
334
- }
335
- else {
336
- console.log(locale.uploader.deleteWord);
337
- }
432
+ funcInterceptor(onBeforeDelete, {
433
+ args: [file, fileList],
434
+ done: () => deleted(file, index),
435
+ });
338
436
  };
339
- const onChangeFn = (res) => {
437
+ const onChangeMedia = (res) => {
340
438
  // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
341
439
  const { tempFiles } = res;
342
- if (onBeforeUpload) {
343
- onBeforeUpload(tempFiles).then((f) => {
344
- const _files = filterFiles(f);
345
- readFile(_files);
346
- });
347
- }
348
- else {
349
- const _files = filterFiles(tempFiles);
350
- readFile(_files);
351
- }
440
+ const _files = filterFiles(tempFiles);
441
+ readFile(_files);
442
+ onChange && onChange({ fileList });
443
+ };
444
+ const onChangeImage = (res) => {
445
+ // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
446
+ const { tempFiles } = res;
447
+ const _files = filterFiles(tempFiles);
448
+ readFile(_files);
352
449
  onChange && onChange({ fileList });
353
450
  };
354
451
  const handleItemClick = (file) => {
@@ -363,27 +460,32 @@ const InternalUploader = (props, ref) => {
363
460
  fileList.map((item, index) => {
364
461
  return (React__default.createElement("div", { className: `nut-uploader__preview ${listType}`, key: item.uid },
365
462
  listType === 'picture' && !children && (React__default.createElement("div", { className: "nut-uploader__preview-img" },
463
+ isDeletable && (React__default.createElement(Icon, { classPrefix: iconClassPrefix, fontClassName: iconFontClassName, color: "rgba(0,0,0,0.6)", className: "close", name: "failure", onClick: () => onDelete(item, index) })),
366
464
  item.status === 'ready' ? (React__default.createElement("div", { className: "nut-uploader__preview__progress" },
367
465
  React__default.createElement("div", { className: "nut-uploader__preview__progress__msg" }, item.message))) : (item.status !== 'success' && (React__default.createElement("div", { className: "nut-uploader__preview__progress" },
368
- React__default.createElement(Icon, { classPrefix: props.iconClassPrefix, fontClassName: props.iconFontClassName, color: "#fff", name: `${item.status === 'error' ? 'failure' : 'loading'}` }),
466
+ item.failIcon === ' ' ||
467
+ item.loadingIcon === ' ' ? null : (React__default.createElement(Icon, { classPrefix: iconClassPrefix, fontClassName: iconFontClassName, color: "#fff", name: `${item.status === 'error'
468
+ ? `${item.failIcon || 'failure'}`
469
+ : `${item.loadingIcon || 'loading'}`}` })),
369
470
  React__default.createElement("div", { className: "nut-uploader__preview__progress__msg" }, item.message)))),
370
- isDeletable && (React__default.createElement(Icon, { classPrefix: props.iconClassPrefix, fontClassName: props.iconFontClassName, color: "rgba(0,0,0,0.6)", className: "close", name: "failure", onClick: () => onDelete(item, index) })),
371
- item.type.includes('image') ? (React__default.createElement(React__default.Fragment, null, item.url && (React__default.createElement("img", { className: "nut-uploader__preview-img__c", src: item.url, alt: "", onClick: () => handleItemClick(item) })))) : (React__default.createElement(React__default.Fragment, null, defaultImg ? (React__default.createElement("img", { className: "nut-uploader__preview-img__c", src: defaultImg, alt: "", onClick: () => handleItemClick(item) })) : (React__default.createElement("div", { className: "nut-uploader__preview-img__file" },
471
+ item.type.includes('image') ? (React__default.createElement(React__default.Fragment, null, item.url && (React__default.createElement(Image, { className: "nut-uploader__preview-img__c", mode: "aspectFit", src: item.url, onClick: () => handleItemClick(item) })))) : (React__default.createElement(React__default.Fragment, null, defaultImg ? (React__default.createElement(Image, { className: "nut-uploader__preview-img__c", mode: "aspectFit", src: defaultImg, onClick: () => handleItemClick(item) })) : (React__default.createElement("div", { className: "nut-uploader__preview-img__file" },
372
472
  React__default.createElement("div", { onClick: () => handleItemClick(item), className: "nut-uploader__preview-img__file__name" },
373
- React__default.createElement(Icon, { classPrefix: props.iconClassPrefix, fontClassName: props.iconFontClassName, color: "#808080", name: "link" }),
473
+ React__default.createElement(Icon, { classPrefix: iconClassPrefix, fontClassName: iconFontClassName, color: "#808080", name: "link" }),
374
474
  "\u00A0",
375
475
  item.name))))),
376
- React__default.createElement("div", { className: "tips" }, item.name))),
476
+ item.status === 'success' ? (React__default.createElement("div", { className: "tips" }, item.name)) : null)),
377
477
  listType === 'list' && (React__default.createElement("div", { className: "nut-uploader__preview-list" },
378
478
  React__default.createElement("div", { className: `nut-uploader__preview-img__file__name ${item.status}`, onClick: () => handleItemClick(item) },
379
- React__default.createElement(Icon, { classPrefix: props.iconClassPrefix, fontClassName: props.iconFontClassName, name: "link" }),
479
+ React__default.createElement(Icon, { classPrefix: iconClassPrefix, fontClassName: iconFontClassName, name: "link" }),
380
480
  "\u00A0",
381
481
  item.name),
382
- isDeletable && (React__default.createElement(Icon, { classPrefix: props.iconClassPrefix, fontClassName: props.iconFontClassName, color: "#808080", className: "nut-uploader__preview-img__file__del", name: "del", onClick: () => onDelete(item, index) })),
482
+ isDeletable && (React__default.createElement(Icon, { classPrefix: iconClassPrefix, fontClassName: iconFontClassName, color: "#808080", className: "nut-uploader__preview-img__file__del", name: "del", onClick: () => onDelete(item, index) })),
383
483
  item.status === 'uploading' && (React__default.createElement(Progress, { size: "small", percentage: item.percentage, strokeColor: "linear-gradient(270deg, rgba(18,126,255,1) 0%,rgba(32,147,255,1) 32.815625%,rgba(13,242,204,1) 100%)", showText: false }))))));
384
484
  }),
385
- maximum > fileList.length && listType === 'picture' && !children && (React__default.createElement("div", { className: `nut-uploader__upload ${listType}` },
386
- React__default.createElement(Icon, { classPrefix: props.iconClassPrefix, fontClassName: props.iconFontClassName, size: uploadIconSize, color: "#808080", name: uploadIcon }),
485
+ maximum > fileList.length && listType === 'picture' && !children && (React__default.createElement("div", { className: `nut-uploader__upload ${listType} ${disabled ? 'nut-uploader__upload-disabled' : ''}` },
486
+ React__default.createElement("div", { className: "nut-uploader__icon" },
487
+ React__default.createElement(Icon, { classPrefix: iconClassPrefix, fontClassName: iconFontClassName, size: uploadIconSize, color: "#808080", name: uploadIcon }),
488
+ React__default.createElement("span", { className: "nut-uploader__icon-tip" }, uploadIconTip)),
387
489
  React__default.createElement(Button, { className: "nut-uploader__input", onClick: _chooseImage })))));
388
490
  };
389
491
  const Uploader = React__default.forwardRef(InternalUploader);
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @nutui/nutui-react-taro v1.4.9-beta.1 Fri Feb 24 2023 14:33:30 GMT+0800 (China Standard Time)
2
+ * @nutui/nutui-react-taro v1.4.9 Wed Mar 01 2023 15:41:50 GMT+0800 (China Standard Time)
3
3
  * (c) 2023 @jdf2e.
4
4
  * Released under the MIT License.
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @nutui/nutui-react-taro v1.4.9-beta.1 Fri Feb 24 2023 14:33:30 GMT+0800 (China Standard Time)
2
+ * @nutui/nutui-react-taro v1.4.9 Wed Mar 01 2023 15:41:50 GMT+0800 (China Standard Time)
3
3
  * (c) 2023 @jdf2e.
4
4
  * Released under the MIT License.
5
5
  */