docbrown/app/javascript/article-form/components/EditorBody.jsx
Rajat Talesra 8fa4f8f7b0
Image uploading progress in comments editor + post editor (#18369)
* Image upload loading all cases covered

* Image upload failure added to EditorBody

* Created imageUploadHelpers file

* Minor changes

* Nit fixes

* Error fix

* Added documentation

* Added/Updated tests
2022-08-29 16:01:40 +05:30

87 lines
2.6 KiB
JavaScript

import { h } from 'preact';
import PropTypes from 'prop-types';
import { useLayoutEffect, useRef } from 'preact/hooks';
import { Toolbar } from './Toolbar';
import { handleImagePasted } from './pasteImageHelpers';
import {
handleImageUploadSuccess,
handleImageUploading,
handleImageUploadFailure,
} from './imageUploadHelpers';
import { handleImageDrop, onDragOver, onDragExit } from './dragAndDropHelpers';
import { usePasteImage } from '@utilities/pasteImage';
import { useDragAndDrop } from '@utilities/dragAndDrop';
import { fetchSearch } from '@utilities/search';
import { AutocompleteTriggerTextArea } from '@crayons/AutocompleteTriggerTextArea';
export const EditorBody = ({
onChange,
defaultValue,
switchHelpContext,
version,
}) => {
const textAreaRef = useRef(null);
const { setElement } = useDragAndDrop({
onDrop: handleImageDrop(
handleImageUploading(textAreaRef),
handleImageUploadSuccess(textAreaRef),
handleImageUploadFailure(textAreaRef),
),
onDragOver,
onDragExit,
});
const setPasteElement = usePasteImage({
onPaste: handleImagePasted(
handleImageUploading(textAreaRef),
handleImageUploadSuccess(textAreaRef),
handleImageUploadFailure(textAreaRef),
),
});
useLayoutEffect(() => {
if (textAreaRef.current) {
setElement(textAreaRef.current);
setPasteElement(textAreaRef.current);
}
});
return (
<div
data-testid="article-form__body"
className="crayons-article-form__body drop-area text-padding"
>
<Toolbar version={version} textAreaId="article_body_markdown" />
<AutocompleteTriggerTextArea
triggerCharacter="@"
maxSuggestions={6}
searchInstructionsMessage="Type to search for a user"
ref={textAreaRef}
fetchSuggestions={(username) =>
fetchSearch('usernames', { username }).then(({ result }) =>
result.map((user) => ({ ...user, value: user.username })),
)
}
autoResize
onChange={onChange}
onFocus={switchHelpContext}
aria-label="Post Content"
name="body_markdown"
id="article_body_markdown"
defaultValue={defaultValue}
placeholder="Write your post content here..."
className="crayons-textfield crayons-textfield--ghost crayons-article-form__body__field ff-monospace fs-l h-100"
/>
</div>
);
};
EditorBody.propTypes = {
onChange: PropTypes.func.isRequired,
defaultValue: PropTypes.string.isRequired,
switchHelpContext: PropTypes.func.isRequired,
version: PropTypes.string.isRequired,
};
EditorBody.displayName = 'EditorBody';