aboutsummaryrefslogtreecommitdiff
path: root/packages/anastasis-webui/src/components/FlieButton.tsx
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2021-11-24 17:38:39 -0300
committerSebastian <sebasjm@gmail.com>2021-11-24 17:38:39 -0300
commitf49df12b441a2bd06520df42ddd41fc42f639147 (patch)
tree13a3f9a5cecb5df234ceec1149bd794b2f03ea73 /packages/anastasis-webui/src/components/FlieButton.tsx
parent668c0430c204c1233fc266b723ed1be308d5f3f1 (diff)
downloadwallet-core-f49df12b441a2bd06520df42ddd41fc42f639147.tar.xz
restore and save session
Diffstat (limited to 'packages/anastasis-webui/src/components/FlieButton.tsx')
-rw-r--r--packages/anastasis-webui/src/components/FlieButton.tsx57
1 files changed, 57 insertions, 0 deletions
diff --git a/packages/anastasis-webui/src/components/FlieButton.tsx b/packages/anastasis-webui/src/components/FlieButton.tsx
new file mode 100644
index 000000000..aab0b6170
--- /dev/null
+++ b/packages/anastasis-webui/src/components/FlieButton.tsx
@@ -0,0 +1,57 @@
+import { h, VNode } from "preact";
+import { useRef, useState } from "preact/hooks";
+
+const MAX_IMAGE_UPLOAD_SIZE = 1024 * 1024;
+
+export interface FileTypeContent {
+ content: string;
+ type: string;
+ name: string;
+}
+
+interface Props {
+ label: string;
+ onChange: (v: FileTypeContent | undefined) => void;
+}
+export function FileButton(props: Props): VNode {
+ const fileInputRef = useRef<HTMLInputElement>(null);
+ const [sizeError, setSizeError] = useState(false);
+ return (
+ <div>
+ <button class="button" onClick={(e) => fileInputRef.current?.click()}>
+ <span>{props.label}</span>
+ </button>
+ <input
+ ref={fileInputRef}
+ style={{ display: "none" }}
+ type="file"
+ onChange={(e) => {
+ const f: FileList | null = e.currentTarget.files;
+ if (!f || f.length != 1) {
+ return props.onChange(undefined);
+ }
+ console.log(f);
+ if (f[0].size > MAX_IMAGE_UPLOAD_SIZE) {
+ setSizeError(true);
+ return props.onChange(undefined);
+ }
+ setSizeError(false);
+ return f[0].arrayBuffer().then((b) => {
+ const content = new Uint8Array(b).reduce(
+ (data, byte) => data + String.fromCharCode(byte),
+ "",
+ );
+ return props.onChange({
+ content,
+ name: f[0].name,
+ type: f[0].type,
+ });
+ });
+ }}
+ />
+ {sizeError && (
+ <p class="help is-danger">File should be smaller than 1 MB</p>
+ )}
+ </div>
+ );
+}