Skip to content

Commit ec3db0c

Browse files
author
ChenYong
committed
provide hooks API uploadTrigger; alpha release
1 parent f774a60 commit ec3db0c

File tree

3 files changed

+83
-42
lines changed

3 files changed

+83
-42
lines changed

example/pages/upload-wrapper.tsx

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
import React, { FC } from "react";
22
import { css } from "emotion";
33
import { DocDemo, DocSnippet, DocBlock } from "@jimengio/doc-frame";
4-
import { UploadWrapper } from "../../src";
4+
import UploadWrapper, { useUploadTrigger } from "../../src/component/upload-wrapper";
55
import { Button } from "antd";
66
import { JimoButton } from "@jimengio/jimo-basics";
77

88
let PageUploadWrapper: FC<{}> = React.memo((props) => {
99
/** Plugins */
10+
11+
let uploadPlugin = useUploadTrigger({
12+
acceptedFileTypes: ["jpg", "png"],
13+
onChange: async (files) => {
14+
console.log("files", files);
15+
},
16+
});
17+
1018
/** Methods */
1119
/** Effects */
1220
/** Renderers */
@@ -24,6 +32,12 @@ let PageUploadWrapper: FC<{}> = React.memo((props) => {
2432
<JimoButton text="点击选取一个文件, 在 Console 查看" onClick={() => {}}></JimoButton>
2533
</UploadWrapper>
2634
</DocDemo>
35+
36+
<DocDemo title="Upload Trigger">
37+
<JimoButton text="点击选取一个文件, 在 Console 查看" onClick={uploadPlugin.onUpload}></JimoButton>
38+
<DocSnippet code={hooksCode} />
39+
{uploadPlugin.ui}
40+
</DocDemo>
2741
</div>
2842
);
2943
});
@@ -43,3 +57,14 @@ let code = `
4357
let content = `
4458
UploadWrapper 可以包裹一个区域, 用来获取 File 对象. 得到 File 对象之后, 再通过 API 手动发送.
4559
`;
60+
61+
let hooksCode = `
62+
let uploadPlugin = useUploadTrigger({
63+
acceptedFileTypes: ["jpg", "png"],
64+
onChange: async (files) => {
65+
console.log("files", files);
66+
},
67+
});
68+
69+
<JimoButton text="点击选取一个文件, 在 Console 查看" onClick={uploadPlugin.onUpload}></JimoButton>
70+
`;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@jimengio/files-picker",
3-
"version": "0.0.1-a12",
3+
"version": "0.0.1-a13",
44
"description": "",
55
"main": "lib/index.js",
66
"scripts": {

src/component/upload-wrapper.tsx

Lines changed: 56 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ interface IProps {
2929
onError?: (error: EUploadError) => void;
3030
}
3131

32-
let UploadWrapper: FC<IProps> = React.memo((props) => {
32+
export let useUploadTrigger = (props: IProps) => {
3333
let inputElement = useRef(null);
3434

3535
let inputAccepts = props.accept;
@@ -40,6 +40,59 @@ let UploadWrapper: FC<IProps> = React.memo((props) => {
4040
}
4141
}
4242

43+
let ui = (
44+
<input
45+
title=""
46+
className={styleInput}
47+
ref={inputElement}
48+
type="file"
49+
accept={inputAccepts}
50+
multiple={props.multiple}
51+
onChange={async (e) => {
52+
if (props.onChange) {
53+
const fileList = Array.from(e.target.files); // copy to array before resetting
54+
55+
e.target.files = null; // without resetting, not able to trigger a change after failed
56+
57+
if (fileList.length > 0) {
58+
const files: File[] = [];
59+
60+
fileList.forEach((file) => {
61+
const fileExtension = file.name.split(".").pop();
62+
if (props.acceptedFileTypes && !props.acceptedFileTypes.includes(fileExtension)) {
63+
if (props.onError) {
64+
props.onError(EUploadError.unsupportedFileType);
65+
}
66+
message.error(interpolateLocale(uploadingLocales.unsupportedFileType, { type: props.acceptedFileTypes.join(", ") }));
67+
return;
68+
}
69+
files.push(file);
70+
});
71+
72+
props.onChange(files);
73+
}
74+
}
75+
}}
76+
/>
77+
);
78+
79+
let onUpload = () => {
80+
if (inputElement.current != null) {
81+
inputElement.current.click();
82+
} else {
83+
console.error("input element for files is not mounted!");
84+
}
85+
};
86+
87+
return {
88+
ui,
89+
onUpload,
90+
};
91+
};
92+
93+
let UploadWrapper: FC<IProps> = React.memo((props) => {
94+
let uploadPlugin = useUploadTrigger(props);
95+
4396
/** Plugins */
4497
/** Methods */
4598
/** Effects */
@@ -48,48 +101,11 @@ let UploadWrapper: FC<IProps> = React.memo((props) => {
48101
<div
49102
className={cx(styleWrapper, props.className)}
50103
onClick={() => {
51-
if (inputElement.current != null) {
52-
inputElement.current.click();
53-
} else {
54-
console.error("Input element is missing in upload wrapper");
55-
}
104+
uploadPlugin.onUpload();
56105
}}
57106
>
58107
{props.children}
59-
60-
<input
61-
title=""
62-
className={styleInput}
63-
ref={inputElement}
64-
type="file"
65-
accept={inputAccepts}
66-
multiple={props.multiple}
67-
onChange={async (e) => {
68-
if (props.onChange) {
69-
const fileList = Array.from(e.target.files); // copy to array before resetting
70-
71-
e.target.files = null; // without resetting, not able to trigger a change after failed
72-
73-
if (fileList.length > 0) {
74-
const files: File[] = [];
75-
76-
fileList.forEach((file) => {
77-
const fileExtension = file.name.split(".").pop();
78-
if (props.acceptedFileTypes && !props.acceptedFileTypes.includes(fileExtension)) {
79-
if (props.onError) {
80-
props.onError(EUploadError.unsupportedFileType);
81-
}
82-
message.error(interpolateLocale(uploadingLocales.unsupportedFileType, { type: props.acceptedFileTypes.join(", ") }));
83-
return;
84-
}
85-
files.push(file);
86-
});
87-
88-
props.onChange(files);
89-
}
90-
}
91-
}}
92-
/>
108+
{uploadPlugin.ui}
93109
</div>
94110
);
95111
});

0 commit comments

Comments
 (0)