feat: 本次提交更新内容如下
样式修改完成
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import React, { useState, useCallback } from "react";
|
||||
import React, { useState } from "react";
|
||||
import {
|
||||
ChevronDown,
|
||||
ChevronUp,
|
||||
@@ -7,9 +7,7 @@ import {
|
||||
Edit,
|
||||
Copy,
|
||||
Trash2,
|
||||
Clock,
|
||||
Plus,
|
||||
Filter,
|
||||
Search,
|
||||
RefreshCw,
|
||||
Settings,
|
||||
@@ -92,20 +90,44 @@ export default function AutoLike() {
|
||||
const [expandedTaskId, setExpandedTaskId] = useState<string | null>(null);
|
||||
const [tasks, setTasks] = React.useState<LikeTask[]>([]);
|
||||
const [searchTerm, setSearchTerm] = useState("");
|
||||
const [loading, setLoading] = useState(false);
|
||||
|
||||
const fetchTasks = useCallback(async () => {
|
||||
// 1. fetchTasks 不用 useCallback,直接定义
|
||||
async function fetchTasks() {
|
||||
setLoading(true);
|
||||
try {
|
||||
const list = await fetchAutoLikeTasks();
|
||||
setTasks(list);
|
||||
// 确保数据字段与旧项目一致
|
||||
const mappedTasks = list.map(task => ({
|
||||
...task,
|
||||
// 确保字段名称和格式与旧项目一致
|
||||
status: task.status || 2, // 默认为关闭状态
|
||||
deviceCount: task.deviceCount || 0,
|
||||
targetGroup: task.targetGroup || '默认人群',
|
||||
likeCount: task.todayLikeCount || task.likeCount || 0,
|
||||
creator: task.creator || '未知',
|
||||
lastLikeTime: task.lastLikeTime || '暂无',
|
||||
createTime: task.createTime || '未知',
|
||||
likeInterval: task.likeInterval || 5,
|
||||
maxLikesPerDay: task.maxLikesPerDay || 200,
|
||||
timeRange: task.timeRange || { start: '08:00', end: '22:00' },
|
||||
contentTypes: task.contentTypes || ['text', 'image', 'video'],
|
||||
targetTags: task.targetTags || []
|
||||
}));
|
||||
setTasks(mappedTasks);
|
||||
} catch (error) {
|
||||
toast({ title: "获取任务失败", variant: "destructive" });
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [toast]);
|
||||
}
|
||||
|
||||
// 2. useEffect 里直接调用
|
||||
React.useEffect(() => {
|
||||
fetchTasks();
|
||||
}, [fetchTasks]);
|
||||
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const toggleExpand = (taskId: string) => {
|
||||
setExpandedTaskId(expandedTaskId === taskId ? null : taskId);
|
||||
};
|
||||
@@ -147,10 +169,10 @@ export default function AutoLike() {
|
||||
}
|
||||
};
|
||||
|
||||
const toggleTaskStatus = async (id: string, status: string) => {
|
||||
const toggleTaskStatus = async (id: string, status: number) => {
|
||||
try {
|
||||
// status: 'running' -> 2(要关闭),'paused' -> 1(要开启)
|
||||
const newStatus = status === "running" ? 2 : 1;
|
||||
// status: 1(开启)-> 2(要关闭),2(关闭)-> 1(要开启)
|
||||
const newStatus = status === 1 ? 2 : 1;
|
||||
const response = await toggleAutoLikeTask(id, String(newStatus));
|
||||
if (response.code === 200) {
|
||||
toast({ title: "操作成功" });
|
||||
@@ -193,8 +215,12 @@ export default function AutoLike() {
|
||||
<Search className="absolute left-3 top-2.5 h-4 w-4 text-gray-400" />
|
||||
<Input placeholder="搜索任务名称" className="pl-9" value={searchTerm} onChange={e => setSearchTerm(e.target.value)} />
|
||||
</div>
|
||||
<Button variant="outline" size="icon" onClick={fetchTasks}>
|
||||
<RefreshCw className="h-4 w-4" />
|
||||
<Button variant="outline" size="icon" onClick={fetchTasks} disabled={loading}>
|
||||
{loading ? (
|
||||
<RefreshCw className="h-4 w-4 animate-spin" />
|
||||
) : (
|
||||
<RefreshCw className="h-4 w-4" />
|
||||
)}
|
||||
</Button>
|
||||
</div>
|
||||
</Card>
|
||||
@@ -204,12 +230,12 @@ export default function AutoLike() {
|
||||
<div className="flex items-center justify-between mb-4">
|
||||
<div className="flex items-center space-x-2">
|
||||
<h3 className="font-medium">{task.name}</h3>
|
||||
<Badge variant={task.status === "running" ? "success" : "secondary"}>
|
||||
{task.status === "running" ? "进行中" : "已暂停"}
|
||||
<Badge variant={Number(task.status) === 1 ? "success" : "secondary"}>
|
||||
{Number(task.status) === 1 ? "进行中" : "已暂停"}
|
||||
</Badge>
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
<Switch checked={task.status === "running"} onCheckedChange={() => toggleTaskStatus(task.id, task.status)} />
|
||||
<Switch checked={Number(task.status) === 1} onCheckedChange={() => toggleTaskStatus(task.id, Number(task.status))} />
|
||||
<CardMenu
|
||||
onView={() => handleView(task.id)}
|
||||
onEdit={() => handleEdit(task.id)}
|
||||
@@ -222,18 +248,22 @@ export default function AutoLike() {
|
||||
<div className="text-sm text-gray-500">
|
||||
<div>执行设备:{task.deviceCount} 个</div>
|
||||
<div>目标人群:{task.targetGroup}</div>
|
||||
<div>更新时间:{task.updateTime}</div>
|
||||
|
||||
</div>
|
||||
<div className="text-sm text-gray-500">
|
||||
<div>已点赞:{task.likeCount} 次</div>
|
||||
<div>创建人:{task.creator}</div>
|
||||
<div>点赞间隔:{task.likeInterval} 秒</div>
|
||||
<div>每日上限:{task.maxLikesPerDay} 次</div>
|
||||
<div>创建时间:{task.createTime}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center justify-between text-xs text-gray-500 border-t pt-4">
|
||||
<div className="flex items-center">
|
||||
<Clock className="w-4 h-4 mr-1" />上次点赞:{task.lastLikeTime}
|
||||
<ThumbsUp className="w-4 h-4 mr-1" />今日点赞:{task.lastLikeTime}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<span>创建时间:{task.createTime}</span>
|
||||
<ThumbsUp className="w-4 h-4 mr-1" />
|
||||
<span>总点赞数:{task.createTime}</span>
|
||||
<Button variant="ghost" size="sm" className="ml-2 p-0 h-6 w-6" onClick={() => toggleExpand(task.id)}>
|
||||
{expandedTaskId === task.id ? <ChevronUp className="h-4 w-4" /> : <ChevronDown className="h-4 w-4" />}
|
||||
</Button>
|
||||
|
||||
@@ -97,8 +97,9 @@ export default function AutoLikeDetail() {
|
||||
if (!task) return;
|
||||
|
||||
try {
|
||||
const newStatus = task.status === 'running' ? 'paused' : 'running';
|
||||
const response = await toggleAutoLikeTask(task.id, newStatus);
|
||||
// status: 1(开启)-> 2(要关闭),2(关闭)-> 1(要开启)
|
||||
const newStatus = task.status === 1 ? 2 : 1;
|
||||
const response = await toggleAutoLikeTask(task.id, String(newStatus));
|
||||
|
||||
if (response.code === 200) {
|
||||
setTask(prev => prev ? { ...prev, status: newStatus } : null);
|
||||
@@ -170,27 +171,23 @@ export default function AutoLikeDetail() {
|
||||
}
|
||||
};
|
||||
|
||||
const getStatusColor = (status: string) => {
|
||||
const getStatusColor = (status: number) => {
|
||||
switch (status) {
|
||||
case 'running':
|
||||
case 1:
|
||||
return 'bg-green-100 text-green-800';
|
||||
case 'paused':
|
||||
case 2:
|
||||
return 'bg-gray-100 text-gray-800';
|
||||
case 'completed':
|
||||
return 'bg-blue-100 text-blue-800';
|
||||
default:
|
||||
return 'bg-gray-100 text-gray-800';
|
||||
}
|
||||
};
|
||||
|
||||
const getStatusText = (status: string) => {
|
||||
const getStatusText = (status: number) => {
|
||||
switch (status) {
|
||||
case 'running':
|
||||
case 1:
|
||||
return '进行中';
|
||||
case 'paused':
|
||||
case 2:
|
||||
return '已暂停';
|
||||
case 'completed':
|
||||
return '已完成';
|
||||
default:
|
||||
return '未知';
|
||||
}
|
||||
@@ -264,13 +261,13 @@ export default function AutoLikeDetail() {
|
||||
{task.name}
|
||||
</CardTitle>
|
||||
<div className="flex items-center space-x-2">
|
||||
<Badge className={getStatusColor(task.status)}>
|
||||
{getStatusText(task.status)}
|
||||
<Badge className={getStatusColor(Number(task.status))}>
|
||||
{getStatusText(Number(task.status))}
|
||||
</Badge>
|
||||
<Switch
|
||||
checked={task.status === 'running'}
|
||||
checked={Number(task.status) === 1}
|
||||
onCheckedChange={handleToggleStatus}
|
||||
disabled={task.status === 'completed'}
|
||||
disabled={false}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// 自动点赞任务状态
|
||||
export type LikeTaskStatus = 'running' | 'paused' | 'completed';
|
||||
export type LikeTaskStatus = 1 | 2; // 1: 开启, 2: 关闭
|
||||
|
||||
// 内容类型
|
||||
export type ContentType = 'text' | 'image' | 'video' | 'link';
|
||||
@@ -65,6 +65,7 @@ export interface LikeTask {
|
||||
enableFriendTags: boolean;
|
||||
todayLikeCount: number;
|
||||
totalLikeCount: number;
|
||||
updateTime: string;
|
||||
}
|
||||
|
||||
// 创建任务数据
|
||||
|
||||
Reference in New Issue
Block a user