import { useEffect, useRef } from "react"; import { Form, redirect, useNavigation } from "react-router"; import type { Route } from "./+types/home"; import { createPost, listPosts } from "~/lib/db.server"; import { renderMarkdown } from "~/lib/md.server"; export async function loader() { const posts = listPosts(); return { posts: posts.map((p) => ({ ...p, html: renderMarkdown(p.content) })) }; } export async function action({ request }: Route.ActionArgs) { const form = await request.formData(); const content = String(form.get("content") ?? "").trim(); if (!content) { return { error: "内容を入力してください", content }; } if (content.length > 10000) { return { error: "投稿が長すぎます(最大10,000文字)", content }; } createPost({ id: crypto.randomUUID(), content }); return redirect("/"); } export default function Home({ loaderData, actionData }: Route.ComponentProps) { const { posts } = loaderData; const navigation = useNavigation(); const isSubmitting = navigation.state === "submitting"; const formRef = useRef(null); const wasSubmitting = useRef(false); useEffect(() => { if (navigation.state === "submitting") wasSubmitting.current = true; if (wasSubmitting.current && navigation.state === "idle" && !actionData?.error) { formRef.current?.reset(); wasSubmitting.current = false; } }, [navigation.state, actionData?.error]); return (

log