244 lines
9.3 KiB
TypeScript
244 lines
9.3 KiB
TypeScript
|
|
"use client"
|
|||
|
|
|
|||
|
|
import { useState } from "react"
|
|||
|
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
|
|||
|
|
import { Label } from "@/components/ui/label"
|
|||
|
|
import { Switch } from "@/components/ui/switch"
|
|||
|
|
import { Slider } from "@/components/ui/slider"
|
|||
|
|
import { Input } from "@/components/ui/input"
|
|||
|
|
import { Button } from "@/components/ui/button"
|
|||
|
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"
|
|||
|
|
import { Info, Plus, Trash2 } from "lucide-react"
|
|||
|
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
|
|||
|
|
|
|||
|
|
export interface TimeRange {
|
|||
|
|
id: string
|
|||
|
|
start: string
|
|||
|
|
end: string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export interface TimeSettingsData {
|
|||
|
|
enableAutoLike: boolean
|
|||
|
|
timeRanges: TimeRange[]
|
|||
|
|
likeInterval: number
|
|||
|
|
randomizeInterval: boolean
|
|||
|
|
minInterval?: number
|
|||
|
|
maxInterval?: number
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
interface TimeSettingsProps {
|
|||
|
|
initialData?: Partial<TimeSettingsData>
|
|||
|
|
onSave: (data: TimeSettingsData) => void
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function TimeSettings({ initialData, onSave }: TimeSettingsProps) {
|
|||
|
|
const [formData, setFormData] = useState<TimeSettingsData>({
|
|||
|
|
enableAutoLike: initialData?.enableAutoLike ?? true,
|
|||
|
|
timeRanges: initialData?.timeRanges ?? [{ id: "1", start: "06:00", end: "08:00" }],
|
|||
|
|
likeInterval: initialData?.likeInterval ?? 15,
|
|||
|
|
randomizeInterval: initialData?.randomizeInterval ?? false,
|
|||
|
|
minInterval: initialData?.minInterval ?? 5,
|
|||
|
|
maxInterval: initialData?.maxInterval ?? 30,
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 添加时间范围
|
|||
|
|
const addTimeRange = () => {
|
|||
|
|
const newId = String(formData.timeRanges.length + 1)
|
|||
|
|
setFormData({
|
|||
|
|
...formData,
|
|||
|
|
timeRanges: [...formData.timeRanges, { id: newId, start: "12:00", end: "14:00" }],
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 删除时间范围
|
|||
|
|
const removeTimeRange = (id: string) => {
|
|||
|
|
setFormData({
|
|||
|
|
...formData,
|
|||
|
|
timeRanges: formData.timeRanges.filter((range) => range.id !== id),
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新时间范围
|
|||
|
|
const updateTimeRange = (id: string, field: "start" | "end", value: string) => {
|
|||
|
|
setFormData({
|
|||
|
|
...formData,
|
|||
|
|
timeRanges: formData.timeRanges.map((range) => (range.id === id ? { ...range, [field]: value } : range)),
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 处理表单提交
|
|||
|
|
const handleSubmit = () => {
|
|||
|
|
onSave(formData)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return (
|
|||
|
|
<div className="space-y-6">
|
|||
|
|
<Card>
|
|||
|
|
<CardHeader>
|
|||
|
|
<CardTitle>点赞时间设置</CardTitle>
|
|||
|
|
<CardDescription>设置自动点赞的时间段和间隔</CardDescription>
|
|||
|
|
</CardHeader>
|
|||
|
|
<CardContent className="space-y-6">
|
|||
|
|
{/* 基本设置 */}
|
|||
|
|
<div className="space-y-4">
|
|||
|
|
<div className="flex items-center justify-between">
|
|||
|
|
<div className="flex items-center space-x-2">
|
|||
|
|
<Label htmlFor="enableAutoLike" className="font-medium">
|
|||
|
|
启用自动点赞
|
|||
|
|
</Label>
|
|||
|
|
<TooltipProvider>
|
|||
|
|
<Tooltip>
|
|||
|
|
<TooltipTrigger asChild>
|
|||
|
|
<Info className="h-4 w-4 text-muted-foreground" />
|
|||
|
|
</TooltipTrigger>
|
|||
|
|
<TooltipContent>
|
|||
|
|
<p>开启后系统将根据设置自动为朋友圈点赞</p>
|
|||
|
|
</TooltipContent>
|
|||
|
|
</Tooltip>
|
|||
|
|
</TooltipProvider>
|
|||
|
|
</div>
|
|||
|
|
<Switch
|
|||
|
|
id="enableAutoLike"
|
|||
|
|
checked={formData.enableAutoLike}
|
|||
|
|
onCheckedChange={(checked) => setFormData({ ...formData, enableAutoLike: checked })}
|
|||
|
|
/>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
{/* 时间范围设置 */}
|
|||
|
|
<div className="space-y-3 pt-4">
|
|||
|
|
<div className="flex items-center justify-between">
|
|||
|
|
<Label className="font-medium">点赞时间段</Label>
|
|||
|
|
<Button
|
|||
|
|
variant="outline"
|
|||
|
|
size="sm"
|
|||
|
|
onClick={addTimeRange}
|
|||
|
|
disabled={!formData.enableAutoLike || formData.timeRanges.length >= 5}
|
|||
|
|
>
|
|||
|
|
<Plus className="h-4 w-4 mr-1" />
|
|||
|
|
添加时间段
|
|||
|
|
</Button>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div className="space-y-3">
|
|||
|
|
{formData.timeRanges.map((range) => (
|
|||
|
|
<div key={range.id} className="flex items-center space-x-2">
|
|||
|
|
<Input
|
|||
|
|
type="time"
|
|||
|
|
value={range.start}
|
|||
|
|
onChange={(e) => updateTimeRange(range.id, "start", e.target.value)}
|
|||
|
|
className="w-32"
|
|||
|
|
disabled={!formData.enableAutoLike}
|
|||
|
|
/>
|
|||
|
|
<span>至</span>
|
|||
|
|
<Input
|
|||
|
|
type="time"
|
|||
|
|
value={range.end}
|
|||
|
|
onChange={(e) => updateTimeRange(range.id, "end", e.target.value)}
|
|||
|
|
className="w-32"
|
|||
|
|
disabled={!formData.enableAutoLike}
|
|||
|
|
/>
|
|||
|
|
{formData.timeRanges.length > 1 && (
|
|||
|
|
<Button
|
|||
|
|
variant="ghost"
|
|||
|
|
size="icon"
|
|||
|
|
onClick={() => removeTimeRange(range.id)}
|
|||
|
|
disabled={!formData.enableAutoLike}
|
|||
|
|
>
|
|||
|
|
<Trash2 className="h-4 w-4 text-destructive" />
|
|||
|
|
</Button>
|
|||
|
|
)}
|
|||
|
|
</div>
|
|||
|
|
))}
|
|||
|
|
</div>
|
|||
|
|
<p className="text-xs text-muted-foreground">设置点赞的时间段,系统将在这些时间段内执行点赞任务</p>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div className="space-y-2 pt-4">
|
|||
|
|
<div className="flex items-center justify-between">
|
|||
|
|
<Label htmlFor="intervalType" className="font-medium">
|
|||
|
|
点赞间隔设置
|
|||
|
|
</Label>
|
|||
|
|
<Select
|
|||
|
|
value={formData.randomizeInterval ? "random" : "fixed"}
|
|||
|
|
onValueChange={(value) => setFormData({ ...formData, randomizeInterval: value === "random" })}
|
|||
|
|
disabled={!formData.enableAutoLike}
|
|||
|
|
>
|
|||
|
|
<SelectTrigger className="w-[180px]">
|
|||
|
|
<SelectValue placeholder="选择间隔类型" />
|
|||
|
|
</SelectTrigger>
|
|||
|
|
<SelectContent>
|
|||
|
|
<SelectItem value="fixed">固定间隔</SelectItem>
|
|||
|
|
<SelectItem value="random">随机间隔</SelectItem>
|
|||
|
|
</SelectContent>
|
|||
|
|
</Select>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
{formData.randomizeInterval ? (
|
|||
|
|
<div className="space-y-4">
|
|||
|
|
<div className="space-y-2">
|
|||
|
|
<div className="flex items-center justify-between">
|
|||
|
|
<Label htmlFor="minInterval" className="text-sm">
|
|||
|
|
最小间隔(分钟)
|
|||
|
|
</Label>
|
|||
|
|
<span className="text-sm text-muted-foreground">{formData.minInterval}分钟</span>
|
|||
|
|
</div>
|
|||
|
|
<Slider
|
|||
|
|
id="minInterval"
|
|||
|
|
min={1}
|
|||
|
|
max={30}
|
|||
|
|
step={1}
|
|||
|
|
value={[formData.minInterval || 5]}
|
|||
|
|
onValueChange={(value) => setFormData({ ...formData, minInterval: value[0] })}
|
|||
|
|
disabled={!formData.enableAutoLike}
|
|||
|
|
/>
|
|||
|
|
</div>
|
|||
|
|
<div className="space-y-2">
|
|||
|
|
<div className="flex items-center justify-between">
|
|||
|
|
<Label htmlFor="maxInterval" className="text-sm">
|
|||
|
|
最大间隔(分钟)
|
|||
|
|
</Label>
|
|||
|
|
<span className="text-sm text-muted-foreground">{formData.maxInterval}分钟</span>
|
|||
|
|
</div>
|
|||
|
|
<Slider
|
|||
|
|
id="maxInterval"
|
|||
|
|
min={formData.minInterval || 5}
|
|||
|
|
max={120}
|
|||
|
|
step={1}
|
|||
|
|
value={[formData.maxInterval || 30]}
|
|||
|
|
onValueChange={(value) => setFormData({ ...formData, maxInterval: value[0] })}
|
|||
|
|
disabled={!formData.enableAutoLike}
|
|||
|
|
/>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
) : (
|
|||
|
|
<div className="space-y-2">
|
|||
|
|
<div className="flex items-center justify-between">
|
|||
|
|
<Label htmlFor="likeInterval" className="text-sm">
|
|||
|
|
点赞间隔(分钟)
|
|||
|
|
</Label>
|
|||
|
|
<span className="text-sm text-muted-foreground">{formData.likeInterval}分钟</span>
|
|||
|
|
</div>
|
|||
|
|
<Slider
|
|||
|
|
id="likeInterval"
|
|||
|
|
min={1}
|
|||
|
|
max={60}
|
|||
|
|
step={1}
|
|||
|
|
value={[formData.likeInterval]}
|
|||
|
|
onValueChange={(value) => setFormData({ ...formData, likeInterval: value[0] })}
|
|||
|
|
disabled={!formData.enableAutoLike}
|
|||
|
|
/>
|
|||
|
|
</div>
|
|||
|
|
)}
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</CardContent>
|
|||
|
|
</Card>
|
|||
|
|
|
|||
|
|
<div className="flex justify-end">
|
|||
|
|
<Button onClick={handleSubmit}>下一步</Button>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
|