import { h, Component } from 'preact'; import { Button } from '@crayons'; import { generateMainImage } from '../actions'; import { validateFileInputs } from '../../packs/validateFileInputs'; import { ClipboardButton } from './ClipboardButton'; function isNativeAndroid() { return ( navigator.userAgent === 'DEV-Native-android' && typeof AndroidBridge !== 'undefined' && AndroidBridge !== null ); } function isClipboardSupported() { return ( typeof navigator.clipboard !== 'undefined' && navigator.clipboard !== null ); } const ImageIcon = () => ( ); ImageIcon.displayName = 'ImageIcon'; export class ImageUploader extends Component { state = { insertionImageUrls: [], uploadError: false, uploadErrorMessage: null, showImageCopiedMessage: false, }; onUploadError = (error) => { this.setState({ insertionImageUrls: [], uploadError: true, uploadErrorMessage: error.message, }); }; copyText = () => { this.imageMarkdownInput = document.getElementById( 'image-markdown-copy-link-input', ); if (isNativeAndroid()) { AndroidBridge.copyToClipboard(this.imageMarkdownInput.value); this.setState({ showImageCopiedMessage: true }); } else if (isClipboardSupported()) { navigator.clipboard .writeText(this.imageMarkdownInput.value) .then(() => { this.setState({ showImageCopiedMessage: true }); }) .catch((_err) => { this.execCopyText(); }); } else { this.execCopyText(); } }; handleInsertionImageUpload = (e) => { const { files } = e.target; this.clearUploadError(); const validFileInputs = validateFileInputs(); if (validFileInputs && files.length > 0) { const payload = { image: files }; this.setState({ showImageCopiedMessage: false }); generateMainImage( payload, this.handleInsertImageUploadSuccess, this.onUploadError, ); } }; handleInsertImageUploadSuccess = (response) => { this.setState({ insertionImageUrls: response.links, }); }; execCopyText() { this.imageMarkdownInput.setSelectionRange( 0, this.imageMarkdownInput.value.length, ); document.execCommand('copy'); this.setState({ showImageCopiedMessage: true }); } clearUploadError() { this.setState({ uploadError: false, uploadErrorMessage: null, }); } render() { const { insertionImageUrls, uploadError, uploadErrorMessage, showImageCopiedMessage, } = this.state; return (