const { h, Component } = require('preact') const classNames = require('classnames') const { nanoid } = require('nanoid/non-secure') const getFileTypeIcon = require('../../utils/getFileTypeIcon') const ignoreEvent = require('../../utils/ignoreEvent.js') const FilePreview = require('../FilePreview') class FileCard extends Component { form = document.createElement('form') constructor (props) { super(props) const file = this.props.files[this.props.fileCardFor] const metaFields = this.getMetaFields() || [] const storedMetaData = {} metaFields.forEach((field) => { storedMetaData[field.id] = file.meta[field.id] || '' }) this.state = { formState: storedMetaData, } this.form.id = nanoid() } // TODO(aduh95): move this to `UNSAFE_componentWillMount` when updating to Preact X+. componentWillMount () { // eslint-disable-line react/no-deprecated this.form.addEventListener('submit', this.handleSave) document.body.appendChild(this.form) } componentWillUnmount () { this.form.removeEventListener('submit', this.handleSave) document.body.removeChild(this.form) } getMetaFields () { return typeof this.props.metaFields === 'function' ? this.props.metaFields(this.props.files[this.props.fileCardFor]) : this.props.metaFields } updateMeta = (newVal, name) => { this.setState(({ formState }) => ({ formState: { ...formState, [name]: newVal, }, })) } handleSave = (e) => { e.preventDefault() const fileID = this.props.fileCardFor this.props.saveFileCard(this.state.formState, fileID) } handleCancel = () => { this.props.toggleFileCard(false) } saveOnEnter = (ev) => { if (ev.keyCode === 13) { ev.stopPropagation() ev.preventDefault() const file = this.props.files[this.props.fileCardFor] this.props.saveFileCard(this.state.formState, file.id) } } renderMetaFields = () => { const metaFields = this.getMetaFields() || [] const fieldCSSClasses = { text: 'uppy-u-reset uppy-c-textInput uppy-Dashboard-FileCard-input', } return metaFields.map((field) => { const id = `uppy-Dashboard-FileCard-input-${field.id}` const required = this.props.requiredMetaFields.includes(field.id) return (
{field.render !== undefined ? field.render({ value: this.state.formState[field.id], onChange: (newVal) => this.updateMeta(newVal, field.id), fieldCSSClasses, required, form: this.form.id, }, h) : ( . onKeyUp={'form' in HTMLInputElement.prototype ? undefined : this.saveOnEnter} onKeyDown={'form' in HTMLInputElement.prototype ? undefined : this.saveOnEnter} onKeyPress={'form' in HTMLInputElement.prototype ? undefined : this.saveOnEnter} onInput={ev => this.updateMeta(ev.target.value, field.id)} data-uppy-super-focusable /> )}
) }) } render () { const file = this.props.files[this.props.fileCardFor] const showEditButton = this.props.canEditFile(file) return (
{this.props.i18nArray('editing', { file: {file.meta ? file.meta.name : file.name}, })}
{showEditButton && ( )}
{this.renderMetaFields()}
) } } module.exports = FileCard