2020-02-21 08:55:25 +01:00
|
|
|
import React, { useState, createRef, useEffect, useRef } from 'react';
|
2020-02-24 14:08:51 +01:00
|
|
|
import { get } from 'lodash';
|
2020-02-21 07:58:14 +01:00
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import { Inputs } from '@buffetjs/custom';
|
2020-02-24 15:45:00 +01:00
|
|
|
import { useGlobalContext } from 'strapi-helper-plugin';
|
2020-02-21 08:55:25 +01:00
|
|
|
import Cropper from 'cropperjs';
|
|
|
|
import 'cropperjs/dist/cropper.css';
|
2020-02-21 07:58:14 +01:00
|
|
|
import CardControl from '../CardControl';
|
|
|
|
import CardControlsWrapper from '../CardControlsWrapper';
|
|
|
|
import ModalSection from '../ModalSection';
|
|
|
|
import FileDetailsBox from './FileDetailsBox';
|
|
|
|
import FileWrapper from './FileWrapper';
|
2020-02-24 15:09:07 +01:00
|
|
|
import FormWrapper from './FormWrapper';
|
2020-02-21 07:58:14 +01:00
|
|
|
import Row from './Row';
|
|
|
|
import Wrapper from './Wrapper';
|
|
|
|
import form from './utils/form';
|
2020-02-24 14:08:51 +01:00
|
|
|
import isImageType from './utils/isImageType';
|
2020-02-21 07:58:14 +01:00
|
|
|
|
2020-02-24 15:45:00 +01:00
|
|
|
const EditForm = ({
|
|
|
|
fileToEdit,
|
|
|
|
onChange,
|
|
|
|
onSubmitEditNewFile,
|
|
|
|
setCropResult,
|
|
|
|
}) => {
|
2020-02-21 07:58:14 +01:00
|
|
|
const { formatMessage } = useGlobalContext();
|
2020-02-21 08:13:55 +01:00
|
|
|
const [isCropping, setIsCropping] = useState(false);
|
2020-02-24 15:09:07 +01:00
|
|
|
const [src, setSrc] = useState(null);
|
|
|
|
|
|
|
|
const mimeType = get(fileToEdit, ['file', 'type'], '');
|
2020-02-24 16:07:43 +01:00
|
|
|
const isImg = isImageType(mimeType);
|
|
|
|
// TODO
|
|
|
|
const canCrop = isImg && !mimeType.includes('svg');
|
2020-02-21 08:55:25 +01:00
|
|
|
|
|
|
|
const imgRef = createRef();
|
|
|
|
let cropper = useRef();
|
|
|
|
|
2020-02-24 15:09:07 +01:00
|
|
|
useEffect(() => {
|
2020-02-24 16:07:43 +01:00
|
|
|
if (isImg) {
|
2020-02-24 15:09:07 +01:00
|
|
|
// TODO: update when editing existing file
|
|
|
|
const reader = new FileReader();
|
|
|
|
|
|
|
|
reader.onloadend = () => {
|
|
|
|
setSrc(reader.result);
|
|
|
|
};
|
|
|
|
|
|
|
|
reader.readAsDataURL(fileToEdit.file);
|
|
|
|
}
|
2020-02-24 16:07:43 +01:00
|
|
|
}, [isImg, fileToEdit]);
|
2020-02-24 15:09:07 +01:00
|
|
|
|
2020-02-21 08:55:25 +01:00
|
|
|
useEffect(() => {
|
|
|
|
if (isCropping) {
|
|
|
|
cropper.current = new Cropper(imgRef.current, {
|
|
|
|
modal: false,
|
|
|
|
initialAspectRatio: 16 / 9,
|
|
|
|
movable: true,
|
|
|
|
zoomable: false,
|
|
|
|
cropBoxResizable: true,
|
|
|
|
background: false,
|
|
|
|
});
|
|
|
|
} else if (cropper.current) {
|
|
|
|
cropper.current.destroy();
|
|
|
|
}
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
if (cropper.current) {
|
|
|
|
cropper.current.destroy();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
|
|
}, [cropper, isCropping]);
|
2020-02-21 08:13:55 +01:00
|
|
|
|
|
|
|
const handleToggleCropMode = () => {
|
|
|
|
setIsCropping(prev => !prev);
|
|
|
|
};
|
2020-02-21 07:58:14 +01:00
|
|
|
|
2020-02-21 08:55:25 +01:00
|
|
|
const handleClick = () => {
|
|
|
|
if (cropper) {
|
|
|
|
const canvas = cropper.current.getCroppedCanvas();
|
2020-02-24 15:09:07 +01:00
|
|
|
canvas.toBlob(blob => {
|
|
|
|
const {
|
|
|
|
file: { lastModifiedDate, lastModified, name },
|
|
|
|
} = fileToEdit;
|
|
|
|
|
2020-02-24 15:45:00 +01:00
|
|
|
setCropResult(
|
|
|
|
new File([blob], name, {
|
|
|
|
type: mimeType,
|
|
|
|
lastModified,
|
|
|
|
lastModifiedDate,
|
|
|
|
})
|
|
|
|
);
|
|
|
|
});
|
2020-02-21 08:55:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
setIsCropping(false);
|
|
|
|
};
|
|
|
|
|
2020-02-24 15:09:07 +01:00
|
|
|
const handleSubmit = e => {
|
|
|
|
e.preventDefault();
|
|
|
|
|
2020-02-24 15:45:00 +01:00
|
|
|
onSubmitEditNewFile(e);
|
2020-02-24 15:09:07 +01:00
|
|
|
};
|
|
|
|
|
2020-02-21 07:58:14 +01:00
|
|
|
return (
|
2020-02-24 15:09:07 +01:00
|
|
|
<form onSubmit={handleSubmit}>
|
|
|
|
<ModalSection>
|
|
|
|
<Wrapper>
|
|
|
|
<div className="row">
|
|
|
|
<div className="col-6">
|
|
|
|
<FileWrapper>
|
|
|
|
<CardControlsWrapper className="card-control-wrapper">
|
|
|
|
{!isCropping ? (
|
|
|
|
<>
|
|
|
|
<CardControl color="#9EA7B8" type="trash" />
|
|
|
|
{canCrop && (
|
|
|
|
<CardControl
|
|
|
|
type="crop"
|
|
|
|
color="#9EA7B8"
|
|
|
|
onClick={handleToggleCropMode}
|
|
|
|
/>
|
|
|
|
)}
|
|
|
|
</>
|
|
|
|
) : (
|
|
|
|
<>
|
2020-02-24 14:08:51 +01:00
|
|
|
<CardControl
|
2020-02-24 15:09:07 +01:00
|
|
|
type="clear"
|
|
|
|
color="#F64D0A"
|
2020-02-24 14:08:51 +01:00
|
|
|
onClick={handleToggleCropMode}
|
|
|
|
/>
|
2020-02-24 15:09:07 +01:00
|
|
|
<CardControl
|
|
|
|
type="check"
|
|
|
|
color="#6DBB1A"
|
|
|
|
onClick={handleClick}
|
|
|
|
/>
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
</CardControlsWrapper>
|
|
|
|
|
2020-02-24 16:07:43 +01:00
|
|
|
{isImg ? (
|
2020-02-24 15:45:00 +01:00
|
|
|
<img src={src} alt="" ref={isCropping ? imgRef : null} />
|
2020-02-24 15:09:07 +01:00
|
|
|
) : null}
|
|
|
|
</FileWrapper>
|
|
|
|
</div>
|
|
|
|
<div className="col-6">
|
|
|
|
<FileDetailsBox />
|
|
|
|
<FormWrapper>
|
|
|
|
{form.map(({ key, inputs }) => {
|
|
|
|
return (
|
|
|
|
<Row key={key}>
|
|
|
|
{inputs.map(input => {
|
|
|
|
return (
|
|
|
|
<div className="col-12" key={input.name}>
|
|
|
|
<Inputs
|
|
|
|
type="text"
|
|
|
|
onChange={onChange}
|
|
|
|
{...input}
|
|
|
|
label={formatMessage(input.label)}
|
|
|
|
description={
|
|
|
|
input.description
|
|
|
|
? formatMessage(input.description)
|
|
|
|
: null
|
|
|
|
}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
</Row>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
</FormWrapper>
|
|
|
|
</div>
|
2020-02-21 07:58:14 +01:00
|
|
|
</div>
|
2020-02-24 15:09:07 +01:00
|
|
|
</Wrapper>
|
2020-02-24 15:45:00 +01:00
|
|
|
<button type="submit" style={{ display: 'none' }}>
|
|
|
|
hidden button to make to get the native form event
|
|
|
|
</button>
|
2020-02-24 15:09:07 +01:00
|
|
|
</ModalSection>
|
|
|
|
</form>
|
2020-02-21 07:58:14 +01:00
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
EditForm.defaultProps = {
|
2020-02-24 14:08:51 +01:00
|
|
|
fileToEdit: null,
|
2020-02-21 07:58:14 +01:00
|
|
|
onChange: () => {},
|
2020-02-24 15:09:07 +01:00
|
|
|
onSubmitEditNewFile: e => e.preventDefault(),
|
2020-02-24 15:45:00 +01:00
|
|
|
setCropResult: () => {},
|
2020-02-21 07:58:14 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
EditForm.propTypes = {
|
2020-02-24 14:08:51 +01:00
|
|
|
fileToEdit: PropTypes.object,
|
2020-02-21 07:58:14 +01:00
|
|
|
onChange: PropTypes.func,
|
2020-02-24 15:09:07 +01:00
|
|
|
onSubmitEditNewFile: PropTypes.func,
|
2020-02-24 15:45:00 +01:00
|
|
|
setCropResult: PropTypes.func,
|
2020-02-21 07:58:14 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
export default EditForm;
|