feat: 本次提交更新内容如下

样式修改完成
This commit is contained in:
笔记本里的永平
2025-07-08 14:16:35 +08:00
parent f0d10e12ab
commit d5387398e5
3 changed files with 64 additions and 36 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -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;
}
// 创建任务数据