This repository has been archived on 2022-08-14. You can view files and clone it, but cannot push or open issues or pull requests.
outline/app/components/Editor/insertImage.js

58 lines
1.5 KiB
JavaScript

// @flow
import uuid from 'uuid';
import uploadFile from 'utils/uploadFile';
import { Editor } from 'slate-react';
import type { change } from 'slate-prop-types';
export default async function insertImageFile(
change: change,
file: window.File,
editor: Editor,
onImageUploadStart: () => void,
onImageUploadStop: () => void
) {
onImageUploadStart();
try {
// load the file as a data URL
const id = uuid.v4();
const alt = '';
const reader = new FileReader();
reader.addEventListener('load', () => {
const src = reader.result;
// insert into document as uploading placeholder
const state = change
.insertBlock({
type: 'image',
isVoid: true,
data: { src, id, alt, loading: true },
})
.apply();
editor.onChange(state);
});
reader.readAsDataURL(file);
// now we have a placeholder, start the upload
const asset = await uploadFile(file);
const src = asset.url;
// we dont use the original change provided to the callback here
// as the state may have changed significantly in the time it took to
// upload the file.
const state = editor.getState();
const finalTransform = state.change();
const placeholder = state.document.findDescendant(
node => node.data && node.data.get('id') === id
);
return finalTransform.setNodeByKey(placeholder.key, {
data: { src, alt, loading: false },
});
} catch (err) {
throw err;
} finally {
onImageUploadStop();
}
}