/* global Runtime */ import { Fragment, h } from 'preact'; import { useReducer, useEffect, useState } from 'preact/hooks'; import { generateMainImage } from '../actions'; import { validateFileInputs } from '../../packs/validateFileInputs'; import { addSnackbarItem } from '../../Snackbar'; import { ClipboardButton } from './ClipboardButton'; import { ButtonNew as Button, Spinner, Icon } from '@crayons'; import ImageIcon from '@images/image.svg'; import CancelIcon from '@images/x.svg'; const SpinnerOrCancel = () => ( ); function imageUploaderReducer(state, action) { const { type, payload } = action; switch (type) { case 'uploading_image': return { ...state, uploadErrorMessage: null, uploadingImage: true, insertionImageUrls: [], }; case 'upload_error': return { ...state, insertionImageUrls: [], uploadErrorMessage: payload.errorMessage, uploadingImage: false, }; case 'upload_image_success': return { ...state, insertionImageUrls: payload.insertionImageUrls, uploadingImage: false, uploadErrorMessage: null, }; default: return state; } } function initNativeImagePicker(e) { e.preventDefault(); window.ForemMobile?.injectNativeMessage('imageUpload', { action: 'imageUpload', }); } const NativeIosV1ImageUpload = ({ uploadingImage }) => ( {!uploadingImage && ( )} ); /** * The V2 editor uses a toolbar button press to trigger a visually hidden file input. * * @param {object} props * @param {object} props.buttonProps Any props to be added to the trigger button * @param {function} props.handleInsertionImageUpload Callback to handle image upload * @param {boolean} props.uploadingImage Is an image currently being uploaded * @param {boolean} props.useNativeUpload Should iOS native upload functionality be used * @param {function} props.handleNativeMessage Callback for iOS native upload message handling * @param {string} props.uploadErrorMessage Error message to be displayed * */ const V2EditorImageUpload = ({ buttonProps, handleInsertionImageUpload, uploadingImage, useNativeUpload, handleNativeMessage, uploadErrorMessage, }) => { useEffect(() => { if (uploadErrorMessage) { addSnackbarItem({ message: uploadErrorMessage, addCloseButton: true, }); } }, [uploadErrorMessage]); const [abortRequestController, setAbortRequestController] = useState(null); const startNewRequest = (e) => { const controller = new AbortController(); setAbortRequestController(controller); handleInsertionImageUpload(e, controller.signal); }; const cancelRequest = () => { abortRequestController.abort(); setAbortRequestController(null); }; const { tooltip: actionTooltip } = buttonProps; return ( {useNativeUpload ? ( ) : ( )} {uploadingImage ? (