ImageDropNPaste.jsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import React from "react";
  2. import { useDropzone } from "react-dropzone";
  3. import { useTranslation } from "react-i18next";
  4. import { useItemActions } from "react-sync-board";
  5. import { uid } from "../utils";
  6. import { useMediaLibrary } from "./MediaLibraryProvider";
  7. import Waiter from "../ui/Waiter";
  8. const ImageDropNPaste = ({ children }) => {
  9. const { t } = useTranslation();
  10. const [uploading, setUploading] = React.useState(false);
  11. const { pushItem } = useItemActions();
  12. const { addMedia, libraries } = useMediaLibrary();
  13. const addImageItem = React.useCallback(
  14. async (media) => {
  15. pushItem({
  16. type: "image",
  17. id: uid(),
  18. content: media,
  19. });
  20. },
  21. [pushItem]
  22. );
  23. const onDrop = React.useCallback(
  24. async (acceptedFiles) => {
  25. setUploading(true);
  26. await Promise.all(
  27. acceptedFiles.map(async (file) => {
  28. const media = await addMedia(libraries[0], file);
  29. await addImageItem(media);
  30. })
  31. );
  32. setUploading(false);
  33. },
  34. [addImageItem, addMedia, libraries]
  35. );
  36. const { getRootProps } = useDropzone({ onDrop });
  37. const onPaste = React.useCallback(
  38. async (e) => {
  39. const { items } = e.clipboardData;
  40. setUploading(true);
  41. // eslint-disable-next-line no-plusplus
  42. for (let i = 0; i < items.length; i++) {
  43. const item = items[i];
  44. if (item.type.indexOf("image") !== -1) {
  45. const file = item.getAsFile();
  46. // eslint-disable-next-line no-await-in-loop
  47. const location = await addMedia(libraries[0], file);
  48. // eslint-disable-next-line no-await-in-loop
  49. await addImageItem(location);
  50. }
  51. }
  52. setUploading(false);
  53. },
  54. [addImageItem, addMedia, libraries]
  55. );
  56. React.useEffect(() => {
  57. window.addEventListener("paste", onPaste, false);
  58. return () => {
  59. window.removeEventListener("paste", onPaste);
  60. };
  61. }, [onPaste]);
  62. return (
  63. <div {...getRootProps()}>
  64. {children}
  65. {uploading && <Waiter message={t("Uploading image(s)...")} />}
  66. </div>
  67. );
  68. };
  69. export default ImageDropNPaste;