aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp/src/app/common/FileInput.tsx
blob: 3d1bc2b343dc4f9fd13964655dd68683f6992fe4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import React from "react";
import clsx from "clsx";

import { ExcludeKey } from "../utilities/type";

export interface FileInputProps
  extends ExcludeKey<
    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;