thread-master/apps/web/src/lib/mockViral.ts

48 lines
2.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { Persona, ViralAnalysis } from "../domain/types";
import { mockDelay } from "./mockAi";
import { toneOf } from "./personaPrompt";
export async function mockAnalyzeViral(text: string): Promise<ViralAnalysis> {
await mockDelay(600);
const t = text.trim() || "(空文)";
const hasQ = /|\?/.test(t);
const hasPain = /卡|煩|雷|痛|敏感|不會|怎麼/.test(t);
return {
hooks: hasQ
? "用真心疑問收尾,降低回覆門檻"
: hasPain
? "先丟具體痛點,讀者有代入感"
: "開場用生活情境,不像廣告",
structure: "情境/痛點 → 自己經驗一句 → 邀請補充(或輕 CTA",
emotion: hasPain ? "共感 + 一點焦慮釋放" : "好奇/認同",
copyable: "可複製:短段落、一個明確條件、結尾問句;勿整段抄原文",
risks: "勿保證效果、勿硬廣、勿嘲諷留言者",
summary: `這則之所以有互動潛力:${hasPain ? "痛點具體" : "情境清楚"}${hasQ ? " + 好回的問題" : ""}。改寫時保留結構,換成你的經驗與人設語氣。`,
};
}
export async function mockMimicPost(sourceText: string, persona?: Persona | null): Promise<string> {
await mockDelay(550);
const tone = toneOf(persona);
const clip = sourceText.trim().slice(0, 80) || "某個生活卡關";
const name = persona?.name || "預設";
return [
`(仿寫 · ${name} · ${tone}`,
`最近也卡在類似情況:${clip}${sourceText.length > 80 ? "…" : ""}`,
``,
`我自己目前是先抓「使用情境」再對規格,比較不會越研究越焦慮。`,
`有人也這樣嗎?歡迎補一句你的實際經驗。`,
].join("\n");
}
export function formatViralAnalysis(a: ViralAnalysis): string {
return [
`【為什麼可能爆】${a.summary}`,
`【鉤子】${a.hooks}`,
`【結構】${a.structure}`,
`【情緒】${a.emotion}`,
`【可複製】${a.copyable}`,
`【風險】${a.risks}`,
].join("\n");
}