Files
cunkebao_v3/Cunkebao/app/workspace/group-push/[id]/edit/page.tsx
2025-04-09 09:31:09 +08:00

194 lines
5.7 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.

"use client"
import { useState, useEffect } from "react"
import { useRouter } from "next/navigation"
import { Button } from "@/components/ui/button"
import { Card, CardContent } from "@/components/ui/card"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { StepIndicator } from "../../components/step-indicator"
import { MessageEditor } from "../../components/message-editor"
import { FriendSelector } from "../../components/friend-selector"
import { ArrowLeft, ArrowRight, Check, Loader2 } from "lucide-react"
import { useToast } from "@/components/ui/use-toast"
const steps = ["推送信息", "选择好友"]
// 模拟数据
const mockPushTasks = {
"1": {
id: "1",
name: "618活动推广消息",
content: {
text: "618年中大促全场商品5折起限时抢购先到先得",
images: ["/placeholder.svg?height=200&width=200"],
video: null,
link: "https://example.com/618",
},
selectedFriends: ["1", "3", "5"],
pushTime: "2025-06-18 10:00:00",
progress: 100,
status: "已完成",
},
"2": {
id: "2",
name: "新品上市通知",
content: {
text: "我们的新产品已经上市,快来体验吧!",
images: [],
video: "/placeholder.svg?height=400&width=400",
link: null,
},
selectedFriends: ["2", "4", "6", "8"],
pushTime: "2025-03-25 09:30:00",
progress: 75,
status: "进行中",
},
}
export default function EditPushPage({ params }: { params: { id: string } }) {
const router = useRouter()
const { toast } = useToast()
const [loading, setLoading] = useState(true)
const [currentStep, setCurrentStep] = useState(0)
const [taskName, setTaskName] = useState("")
const [messageContent, setMessageContent] = useState({
text: "",
images: [],
video: null,
link: null,
})
const [selectedFriends, setSelectedFriends] = useState<string[]>([])
useEffect(() => {
// 模拟加载数据
setTimeout(() => {
const task = mockPushTasks[params.id as keyof typeof mockPushTasks]
if (task) {
setTaskName(task.name)
setMessageContent(task.content)
setSelectedFriends(task.selectedFriends)
}
setLoading(false)
}, 500)
}, [params.id])
const handleNext = () => {
if (currentStep === 0) {
// 验证第一步
if (!taskName.trim()) {
toast({
title: "请输入任务名称",
variant: "destructive",
})
return
}
if (!messageContent.text && messageContent.images.length === 0 && !messageContent.video && !messageContent.link) {
toast({
title: "请添加至少一种消息内容",
variant: "destructive",
})
return
}
}
setCurrentStep((prev) => prev + 1)
}
const handlePrevious = () => {
setCurrentStep((prev) => prev - 1)
}
const handleSubmit = () => {
if (selectedFriends.length === 0) {
toast({
title: "请选择至少一个好友",
variant: "destructive",
})
return
}
// 模拟提交
toast({
title: "推送任务更新成功",
description: `已更新推送任务 "${taskName}"`,
})
// 跳转回列表页
router.push("/workspace/group-push")
}
if (loading) {
return (
<div className="container mx-auto py-6 flex justify-center items-center min-h-[60vh]">
<div className="flex flex-col items-center">
<Loader2 className="h-8 w-8 animate-spin text-blue-500" />
<p className="mt-2 text-gray-500">...</p>
</div>
</div>
)
}
return (
<div className="container mx-auto py-6">
{/* 顶部导航栏 */}
<div className="flex items-center justify-between mb-6 relative">
<Button variant="ghost" size="icon" onClick={() => router.push("/workspace/group-push")} className="mr-auto">
<ArrowLeft className="h-5 w-5" />
</Button>
<h1 className="text-2xl font-bold absolute left-1/2 transform -translate-x-1/2"></h1>
<div className="w-10"></div> {/* 占位元素,保持标题居中 */}
</div>
<StepIndicator currentStep={currentStep} steps={steps} />
<Card>
<CardContent className="pt-6">
{currentStep === 0 ? (
<div className="space-y-6">
<div>
<Label htmlFor="task-name"></Label>
<Input
id="task-name"
placeholder="请输入任务名称"
value={taskName}
onChange={(e) => setTaskName(e.target.value)}
/>
</div>
<div>
<Label></Label>
<MessageEditor onMessageChange={setMessageContent} defaultValues={messageContent} />
</div>
<div className="flex justify-end">
<Button onClick={handleNext}>
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</div>
</div>
) : (
<div className="space-y-6">
<FriendSelector onSelectionChange={setSelectedFriends} defaultSelectedFriendIds={selectedFriends} />
<div className="flex justify-between">
<Button variant="outline" onClick={handlePrevious}>
<ArrowLeft className="mr-2 h-4 w-4" />
</Button>
<Button onClick={handleSubmit}>
<Check className="mr-2 h-4 w-4" />
</Button>
</div>
</div>
)}
</CardContent>
</Card>
</div>
)
}