私域操盘手 - 新建获客场景对每一步的参数进行校验,更友好的交互和提示

This commit is contained in:
柳清爽
2025-05-19 17:25:31 +08:00
parent 1a9afdd58e
commit 672b6ba89f
3 changed files with 22 additions and 27 deletions

View File

@@ -6,7 +6,7 @@ import ErrorBoundary from "./components/ErrorBoundary"
import { AuthProvider } from "@/app/components/AuthProvider"
import LayoutWrapper from "./components/LayoutWrapper"
import { AuthCheck } from "@/app/components/auth-check"
import { Toaster } from "sonner"
import { Toaster } from "react-hot-toast"
export const metadata: Metadata = {
title: "存客宝",

View File

@@ -294,7 +294,7 @@ export default function NewAcquisitionPlan() {
<div className="w-full bg-white min-h-screen flex flex-col">
<header className="sticky top-0 z-10 bg-white border-b">
<div className="flex items-center h-14 px-4">
<Button variant="ghost" size="icon" onClick={() => router.push("/")}>
<Button variant="ghost" size="icon" onClick={() => router.push("/scenarios")}>
<ChevronLeft className="h-5 w-5" />
</Button>
<h1 className="ml-2 text-lg font-medium">{formData.sourceWechatId ? "好友转移" : "新建获客计划"}</h1>

View File

@@ -169,12 +169,11 @@ export function BasicSettings({ formData, onChange, onNext }: BasicSettingsProps
const response = await fetchScenes({ limit: 30 })
if (response.code === 200 && Array.isArray(response.data)) {
const formattedScenes = response.data.map(scene => ({
id: scene.id.toString(),
const formattedScenes = response.data.map((scene: SceneItem) => ({
id: scene.id,
name: scene.name,
image: scene.image,
status: scene.status,
sort: scene.sort,
createTime: scene.createTime,
updateTime: scene.updateTime,
deleteTime: scene.deleteTime
@@ -196,23 +195,6 @@ export function BasicSettings({ formData, onChange, onNext }: BasicSettingsProps
loadScenes()
}, [])
// 初始化时,如果没有选择场景,默认选择海报获客
useEffect(() => {
if (!formData.scenario) {
onChange({ ...formData, scenario: "haibao" })
}
// 只在初始化时设置默认计划名称
if (!formData.planName && !formData._initialized) {
if (formData.materials?.length > 0) {
const today = new Date().toLocaleDateString("zh-CN").replace(/\//g, "")
onChange({ ...formData, planName: `海报${today}`, _initialized: true })
} else {
onChange({ ...formData, planName: "场景", _initialized: true })
}
}
}, []) // 移除 formData 依赖,只在组件挂载时执行一次
// 处理本地场景选择
const handleScenarioSelect = (scenarioId: string) => {
onChange({ ...formData, scenario: scenarioId })
@@ -268,10 +250,6 @@ export function BasicSettings({ formData, onChange, onNext }: BasicSettingsProps
setSelectedMaterials(updatedMaterials)
onChange({ ...formData, materials: updatedMaterials })
setIsMaterialDialogOpen(false)
// 更新计划名称
const today = new Date().toLocaleDateString("zh-CN").replace(/\//g, "")
onChange({ ...formData, planName: `海报${today}`, materials: updatedMaterials })
}
const handleRemoveAccount = (accountId: string) => {
@@ -377,6 +355,23 @@ export function BasicSettings({ formData, onChange, onNext }: BasicSettingsProps
}
};
// 下一步校验逻辑
const handleNextStep = () => {
if (!formData.scenario) {
toast.error("请选择获客场景")
return
}
if (!formData.planName || !formData.planName.trim()) {
toast.error("请输入计划名称")
return
}
if (formData.scenario === "haibao" && (!formData.materials || formData.materials.length === 0)) {
toast.error("请选择海报")
return
}
onNext && onNext()
}
return (
<div className="w-full p-4 bg-gray-50">
{/* 错误提示,只在 sceneError 存在且不为 'success' 时显示 */}
@@ -685,7 +680,7 @@ export function BasicSettings({ formData, onChange, onNext }: BasicSettingsProps
/>
</div>
<Button className="w-full h-12 text-base" onClick={onNext}>
<Button className="w-full h-12 text-base" onClick={handleNextStep}>
</Button>
</div>