import { redirect, unstable_createFileUploadHandler, unstable_parseMultipartFormData, json } from "@remix-run/node"; import { useLocation } from "@remix-run/react"; import { useLoaderData, Form, useActionData, Link } from "@remix-run/react"; import { useEffect, useState } from "react"; import Overlay from "~/components/Overlay"; import prisma from "~/utils/db.server"; export async function action({ request, params }) { const threadId = params.threadId; const clonedData = request.clone(); const formData = await clonedData.formData(); const post = formData.get("post"); const replying = formData.get("replying"); const fileUploadHandler = unstable_createFileUploadHandler({ directory: './public/uploads/', maxPartSize: 500000, file: ({ filename }) => filename, }); const errors = {}; let imageName; let multiPartformdata; try { multiPartformdata = await unstable_parseMultipartFormData(request, fileUploadHandler); multiPartformdata.get("image") !== null ? imageName = multiPartformdata.get("image").name : imageName = null; } catch (err) { errors.image = "Image size too big"; } if (typeof post !== "string" || post.length > 50 || post.length < 3) { errors.post = "Post too long or short"; }; if (Object.keys(errors).length) { return json(errors, { status: 422 }); } const createPost = await prisma.post.create({ data: { comment: post, imageName: imageName, replyingTo: replying ? parseInt(replying) : null, postId: parseInt(threadId), }, }); return redirect(`/threads/${threadId}`); }; export async function loader({ params }) { const threadId = params.threadId; const thread = await prisma.thread.findUnique({ where: { id: parseInt(threadId), }, include: { posts: { include: { replies: true, }, }, }, }); return thread; } export default function Thread() { const data = useLoaderData(); const actionData = useActionData(); const [replying, setReplying] = useState(); return (
{data.title} Post id: {data.id} Created at: {data.createdAt} Reply count: {data.posts.length}
post image

{data.post}