import { Form, Link, redirect, useLoaderData, useNavigation } from "react-router"; import type { ActionFunctionArgs } from "react-router"; import { createParseJob, getIpAddress, listRecentParseJobs } from "~/lib/db.server"; export function loader() { return { jobs: listRecentParseJobs(10) }; } export async function action({ request }: ActionFunctionArgs) { const fd = await request.formData(); const liveText = (fd.get("liveText") as string | null)?.trim() ?? ""; if (!liveText) return { error: "テキストを入力してください" }; const job = createParseJob(liveText); void getIpAddress(request); // unused but kept for symmetry return redirect(`/bands/auto-register/jobs/${job.id}`); } const STATUS_LABEL: Record = { pending: "待機中", processing: "解析中", done: "完了", error: "エラー", }; const STATUS_COLOR: Record = { pending: "#6b7280", processing: "#fbbf24", done: "#34d399", error: "#f87171", }; export default function BandAutoRegister() { const { jobs } = useLoaderData(); const nav = useNavigation(); const busy = nav.state !== "idle"; return (

ライブ情報から自動登録