import React, { useState } from "react"; import { Check, Link2, Plus, Sparkles } from "lucide-react"; const blankForm = { product_link: "", product_name: "", category: "", benefits: "", selling_points: "", language_style: "口语(亲切随性)", target_group: "女性", usage_scene: "居家", purchase_channel: "电商平台", question_count: 5, }; async function readReferenceFile(file) { if (!file) return ""; return (await file.text()).slice(0, 20000); } export default function CreateAskTasksPage({ api }) { const [form, setForm] = useState(blankForm); const [task, setTask] = useState(null); const [questions, setQuestions] = useState([]); const [editing, setEditing] = useState(null); const [busy, setBusy] = useState(false); const [error, setError] = useState(""); const [referenceFile, setReferenceFile] = useState(null); const update = (key, value) => setForm((current) => ({ ...current, [key]: value })); async function generate() { setBusy(true); setError(""); try { const reference_qa = await readReferenceFile(referenceFile); const result = await api("/api/admin/ask-tasks/generate", { method: "POST", body: JSON.stringify({ ...form, question_count: Number(form.question_count), reference_qa, }), }); setTask(result.data); setQuestions( result.data.selected_questions.map((item) => ({ ...item, selected: true, })), ); } catch (err) { setError(err.message); } finally { setBusy(false); } } async function saveQuestion(index, value) { setQuestions((current) => current.map((item, i) => i === index ? { ...item, question: value } : item, ), ); const question = questions[index]; if ( task && question && !String(question.id).startsWith("new-") && value.trim() ) await api(`/api/admin/ask-tasks/${task.id}/questions/${question.id}`, { method: "PATCH", body: JSON.stringify({ question: value.trim() }), }); } async function toggle(index) { const question = questions[index]; const selected = !question.selected; setQuestions((current) => current.map((item, i) => (i === index ? { ...item, selected } : item)), ); if (task && !String(question.id).startsWith("new-")) await api(`/api/admin/ask-tasks/${task.id}/questions/${question.id}`, { method: "PATCH", body: JSON.stringify({ selected }), }); } async function addQuestion() { const value = window.prompt("请输入提问内容"); if (!value?.trim()) return; if (!task) return setQuestions((current) => [ ...current, { id: `new-${Date.now()}`, question: value.trim(), selected: true }, ]); try { const result = await api(`/api/admin/ask-tasks/${task.id}/questions`, { method: "POST", body: JSON.stringify({ question: value.trim() }), }); setQuestions((current) => [...current, result.data]); } catch (err) { setError(err.message); } } async function publish() { if (!task) return setError("请先生成提问"); setBusy(true); setError(""); try { const result = await api(`/api/admin/ask-tasks/${task.id}/publish`, { method: "POST", }); setTask(result.data); } catch (err) { setError(err.message); } finally { setBusy(false); } } if (task?.status === "已发布") return ( <>
提问任务已发布,可在任务看板查看。
任务ID:{task.task_id}
{window.location.origin}/ask/{task.task_id}
当前链接为任务预留入口,后续接入提问用户页面。
通过顶部切换创建「提问任务」或「回答任务」。