diff --git a/apps/backend/config/middlewares.js b/apps/backend/config/middlewares.js
index 70a54a2a1..077124c4e 100644
--- a/apps/backend/config/middlewares.js
+++ b/apps/backend/config/middlewares.js
@@ -5,8 +5,18 @@ module.exports = [
"strapi::poweredBy",
"strapi::logger",
"strapi::query",
- "strapi::body",
"strapi::session",
"strapi::favicon",
"strapi::public",
+ {
+ name: "strapi::body",
+ config: {
+ formLimit: "256mb",
+ jsonLimit: "256mb",
+ textLimit: "256mb",
+ formidable: {
+ maxFileSize: 250 * 1024 * 1024,
+ },
+ },
+ },
];
diff --git a/apps/backend/config/plugins.js b/apps/backend/config/plugins.js
new file mode 100644
index 000000000..b86c0907c
--- /dev/null
+++ b/apps/backend/config/plugins.js
@@ -0,0 +1,9 @@
+module.exports = () => ({
+ upload: {
+ config: {
+ provider: "local",
+ // 250MB
+ sizeLimit: 250 * 1024 * 1024,
+ },
+ },
+});
diff --git a/apps/backend/package.json b/apps/backend/package.json
index 7efd9ce22..c892540f0 100644
--- a/apps/backend/package.json
+++ b/apps/backend/package.json
@@ -22,6 +22,7 @@
"@strapi/plugin-i18n": "4.15.0",
"@strapi/plugin-users-permissions": "4.15.4",
"@strapi/provider-email-nodemailer": "^4.12.4",
+ "@strapi/provider-upload-local": "^4.15.4",
"@strapi/strapi": "4.15.4",
"nanoid": "^3.3.6",
"pg": "^8.11.3",
diff --git a/apps/frontend/src/components/tiptap.jsx b/apps/frontend/src/components/tiptap.jsx
index 40a4b07ec..cfee70416 100644
--- a/apps/frontend/src/components/tiptap.jsx
+++ b/apps/frontend/src/components/tiptap.jsx
@@ -26,21 +26,12 @@ import Placeholder from "@tiptap/extension-placeholder";
import Link from "@tiptap/extension-link";
import { EditorContent, useEditor } from "@tiptap/react";
import StarterKit from "@tiptap/starter-kit";
-import { useCallback } from "react";
import Youtube from "@tiptap/extension-youtube";
import { Markdown } from "tiptap-markdown";
import Code from "@tiptap/extension-code";
import CharacterCount from "@tiptap/extension-character-count";
-function ToolBar({ editor }) {
- const addImage = useCallback(() => {
- const url = window.prompt("URL");
-
- if (url) {
- editor.chain().focus().setImage({ src: url, alt: "" }).run();
- }
- }, [editor]);
-
+function ToolBar({ editor, user }) {
const addYoutubeEmbed = () => {
const url = window.prompt("URL");
@@ -61,6 +52,35 @@ function ToolBar({ editor }) {
}
};
+ const handleImageSubmit = async (event) => {
+ event.preventDefault();
+
+ const apiBase = process.env.NEXT_PUBLIC_STRAPI_BACKEND_URL;
+
+ const formData = new FormData();
+ const image = document.getElementById("feature-image").files;
+
+ // Handle the case where the user opts not to submit an image.
+ if (!image) return;
+ formData.append("files", image[0]);
+
+ const res = await fetch(new URL("api/upload", apiBase), {
+ method: "post",
+ headers: {
+ Accept: "application/json",
+ Authorization: `Bearer ${user.jwt}`,
+ },
+ body: formData,
+ });
+
+ const data = await res.json();
+
+ editor.commands.setImage({
+ src: new URL(data[0].url, apiBase),
+ alt: "image",
+ });
+ };
+
return (