import { h, Component } from 'preact'; import PropTypes from 'prop-types'; import linkCopyIcon from '../../../assets/images/content-copy.svg'; import { generateMainImage } from '../actions'; import { validateFileInputs } from '../../packs/validateFileInputs'; export default class ImageManagement extends Component { constructor(props) { super(props); this.state = { insertionImageUrls: [], uploadError: false, uploadErrorMessage: null, }; } handleMainImageUpload = e => { e.preventDefault(); this.clearUploadError(); const validFileInputs = validateFileInputs(); if (validFileInputs) { const payload = { image: e.target.files, wrap_cloudinary: true }; const { onMainImageUrlChange } = this.props; generateMainImage(payload, onMainImageUrlChange, this.onUploadError); } }; handleInsertionImageUpload = e => { this.clearUploadError(); const validFileInputs = validateFileInputs(); if (validFileInputs) { const payload = { image: e.target.files }; generateMainImage( payload, this.handleInsertImageUploadSuccess, this.onUploadError, ); } }; handleInsertImageUploadSuccess = response => { this.setState({ insertionImageUrls: response.links, }); }; triggerMainImageRemoval = e => { e.preventDefault(); const { onMainImageUrlChange } = this.props; onMainImageUrlChange({ links: [], }); }; clearUploadError = () => { this.setState({ uploadError: false, uploadErrorMessage: null, }); }; onUploadError = error => { this.setState({ insertionImageUrls: [], uploadError: true, uploadErrorMessage: error.message, }); }; execCopyText = () => { this.imageMarkdownInput.setSelectionRange( 0, this.imageMarkdownInput.value.length, ); document.execCommand('copy'); this.imageMarkdownAnnouncer.hidden = false; } copyText = () => { this.imageMarkdownAnnouncer = document.getElementById( 'image-markdown-copy-link-announcer', ); this.imageMarkdownInput = document.getElementById( 'image-markdown-copy-link-input', ); const isNativeAndroid = navigator.userAgent === 'DEV-Native-android' && typeof AndroidBridge !== "undefined" && AndroidBridge !== null; const isClipboardSupported = typeof navigator.clipboard !== "undefined" && navigator.clipboard !== null; if (isNativeAndroid) { AndroidBridge.copyToClipboard(this.imageMarkdownInput.value); this.imageMarkdownAnnouncer.hidden = false; } else if (isClipboardSupported) { navigator.clipboard.writeText(this.imageMarkdownInput.value) .then(() => { this.imageMarkdownAnnouncer.hidden = false; }) .catch((err) => { this.execCopyText(); }); } else { this.execCopyText(); } }; linksToMarkdownForm = imageLinks => { return imageLinks.map(imageLink => ``).join('\n'); }; linksToDirectForm = imageLinks => { return imageLinks.join('\n'); }; render() { const { onExit, mainImage, version } = this.props; const { insertionImageUrls, uploadError, uploadErrorMessage } = this.state; let mainImageArea; if (mainImage) { mainImageArea = (
To add a cover image for the post, add
cover_image: direct_url_to_image.jpg
to the frontmatter