aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp/src/app/views/common/FileInput.tsx
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-09-01 02:32:06 +0800
committercrupest <crupest@outlook.com>2020-09-01 02:32:06 +0800
commitaa89b6cce7701a57b0c377d938788b4c940013d6 (patch)
treeae95cb16698439ac825eb1d692ce14125b625ecb /Timeline/ClientApp/src/app/views/common/FileInput.tsx
parentc3e95a6cd7322c644159eed6350a20dfd1a002ff (diff)
downloadtimeline-aa89b6cce7701a57b0c377d938788b4c940013d6.tar.gz
timeline-aa89b6cce7701a57b0c377d938788b4c940013d6.tar.bz2
timeline-aa89b6cce7701a57b0c377d938788b4c940013d6.zip
...
Diffstat (limited to 'Timeline/ClientApp/src/app/views/common/FileInput.tsx')
-rw-r--r--Timeline/ClientApp/src/app/views/common/FileInput.tsx36
1 files changed, 36 insertions, 0 deletions
diff --git a/Timeline/ClientApp/src/app/views/common/FileInput.tsx b/Timeline/ClientApp/src/app/views/common/FileInput.tsx
new file mode 100644
index 00000000..7b053d5c
--- /dev/null
+++ b/Timeline/ClientApp/src/app/views/common/FileInput.tsx
@@ -0,0 +1,36 @@
+import React from "react";
+import clsx from "clsx";
+
+export interface FileInputProps
+ extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "type" | "id"> {
+ inputId?: string;
+ labelText: string;
+ color?: string;
+ className?: string;
+}
+
+const FileInput: React.FC<FileInputProps> = (props) => {
+ const { inputId, labelText, color, className, ...otherProps } = props;
+
+ const realInputId = React.useMemo<string>(() => {
+ if (inputId != null) return inputId;
+ return (
+ "file-input-" +
+ (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
+ );
+ }, [inputId]);
+
+ return (
+ <>
+ <input className="d-none" type="file" id={realInputId} {...otherProps} />
+ <label
+ htmlFor={realInputId}
+ className={clsx("btn", "btn-" + (color ?? "primary"), className)}
+ >
+ {labelText}
+ </label>
+ </>
+ );
+};
+
+export default FileInput;