import React from 'react'; import { Callback } from '@tutorbook/model'; import { TextField, TextFieldProps, TextFieldHTMLProps } from '@rmwc/textfield'; import { v4 as uuid } from 'uuid'; import firebase from '@tutorbook/firebase'; import styles from './photo-input.module.scss'; type Reference = firebase.storage.Reference; type TextFieldPropOverrides = 'helpText' | 'inputRef' | 'invalid'; interface UniquePhotoInputProps { label: string; value: string; onChange: Callback; } type Overrides = TextFieldPropOverrides | keyof UniquePhotoInputProps; export type PhotoInputProps = Omit & Omit & UniquePhotoInputProps; export default function PhotoInput({ value, onChange, ...textFieldProps }: PhotoInputProps): JSX.Element { const inputRef: React.RefObject = React.createRef(); const helperRef: React.RefObject = React.createRef(); React.useEffect(() => { if (inputRef.current) { inputRef.current.type = 'file'; inputRef.current.accept = 'image/*'; inputRef.current.style.display = 'none'; } }); const [helperValue, setHelperValue] = React.useState( 'Click the text field above to upload a photo.' ); const [errored, setErrored] = React.useState(false); const handleClick = (event: React.FormEvent) => { event.preventDefault(); event.stopPropagation(); if (inputRef.current) inputRef.current.click(); }; const handleChange = (event: React.FormEvent) => { event.preventDefault(); event.stopPropagation(); if (!event.currentTarget.files || !event.currentTarget.files.length) return; setErrored(false); const file: File = event.currentTarget.files[0]; const lastDotIndex: number = file.name.lastIndexOf('.'); const filename: string = file.name.substring(0, lastDotIndex); const extension: string = file.name.substring(lastDotIndex + 1); const pathname = `${ process.env.NODE_ENV === 'development' ? 'test' : 'default' }/temp/${uuid()}.${extension}`; const ref: Reference = firebase.storage().ref(pathname); setHelperValue(`Uploading ${filename}.${extension}...`); ref.put(file).on(firebase.storage.TaskEvent.STATE_CHANGED, { next() {}, // See https://github.com/firebase/firebase-js-sdk/issues/3158 async complete() { onChange(await ref.getDownloadURL()); setHelperValue(`Uploaded ${filename}.${extension}.`); }, error(error: Error) { setErrored(true); setHelperValue( `An error occurred while uploading ${filename}.${extension}. ${error.message}` ); }, }); }; /* eslint-disable jsx-a11y/control-has-associated-label */ return (