import { h } from 'preact'; import { useReducer } from 'preact/hooks'; import { generateMainImage } from '../actions'; import { validateFileInputs } from '../../packs/validateFileInputs'; import { ClipboardButton } from './ClipboardButton'; import { Button, Spinner } from '@crayons'; 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 = () => ( Upload image ); ImageIcon.displayName = 'ImageIcon'; function imageUploaderReducer(state, action) { const { type, payload } = action; switch (type) { case 'uploading_image': return { ...state, uploadError: false, uploadingErrorMessage: null, uploadingImage: true, insertionImageUrls: [], showImageCopiedMessage: false, }; case 'upload_error': return { ...state, insertionImageUrls: [], uploadError: true, uploadErrorMessage: payload.errorMessage, uploadingImage: false, }; case 'show_copied_image_message': return { ...state, showImageCopiedMessage: true, }; case 'upload_image_success': return { ...state, insertionImageUrls: payload.insertionImageUrls, uploadingImage: false, }; default: return state; } } export const ImageUploader = () => { const [state, dispatch] = useReducer(imageUploaderReducer, { insertionImageUrls: [], uploadError: false, uploadErrorMessage: null, showImageCopiedMessage: false, uploadingImage: false, }); const { uploadingImage, showImageCopiedMessage, uploadErrorMessage, uploadError, insertionImageUrls, } = state; let imageMarkdownInput = null; function onUploadError(error) { dispatch({ type: 'upload_error', payload: { errorMessage: error.message }, }); } function copyText() { imageMarkdownInput = document.getElementById( 'image-markdown-copy-link-input', ); if (isNativeAndroid()) { AndroidBridge.copyToClipboard(imageMarkdownInput.value); dispatch({ type: 'show_copied_image_message', }); } else if (isClipboardSupported()) { navigator.clipboard .writeText(imageMarkdownInput.value) .then(() => { dispatch({ type: 'show_copied_image_message', }); }) .catch((_err) => { execCopyText(); }); } else { execCopyText(); } } function handleInsertionImageUpload(e) { const { files } = e.target; if (files.length > 0 && validateFileInputs()) { const payload = { image: files }; dispatch({ type: 'uploading_image', }); generateMainImage(payload, handleInsertImageUploadSuccess, onUploadError); } } function handleInsertImageUploadSuccess(response) { dispatch({ type: 'upload_image_success', payload: { insertionImageUrls: response.links }, }); } function execCopyText() { imageMarkdownInput.setSelectionRange(0, imageMarkdownInput.value.length); document.execCommand('copy'); dispatch({ type: 'show_copied_image_message', }); } return (
{uploadingImage ? ( Uploading... ) : ( )} {insertionImageUrls.length > 0 && ( )} {uploadError && ( {uploadErrorMessage} )}
); }; ImageUploader.displayName = 'ImageUploader';