mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-07-21 14:17:11 +08:00
refactor(scheduler): move manual runs to console controls
This commit is contained in:
@@ -372,6 +372,13 @@ class ApiClient {
|
||||
return data.tasks
|
||||
}
|
||||
|
||||
async runTask(taskId: string): Promise<ApiResult> {
|
||||
return this.request('/api/scheduler/run', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({ task_id: taskId }),
|
||||
})
|
||||
}
|
||||
|
||||
async toggleTask(taskId: string, enabled: boolean): Promise<{ status: string; task: SchedulerTask }> {
|
||||
return this.request('/api/scheduler/toggle', {
|
||||
method: 'POST',
|
||||
|
||||
@@ -352,6 +352,10 @@ const translations: Record<string, Record<string, string>> = {
|
||||
task_delete: '删除',
|
||||
task_delete_confirm: '确定删除该任务吗?此操作不可撤销。',
|
||||
task_save_error: '保存失败',
|
||||
task_run_now: '立即执行',
|
||||
task_run_confirm: '该任务会立即向已配置的通道和接收者发送内容。是否继续?',
|
||||
task_run_started: '任务已开始执行',
|
||||
task_run_error: '执行失败',
|
||||
logs_title: '日志',
|
||||
logs_desc: '实时日志输出 (run.log)',
|
||||
logs_live: '实时',
|
||||
@@ -740,6 +744,10 @@ const translations: Record<string, Record<string, string>> = {
|
||||
task_delete: 'Delete',
|
||||
task_delete_confirm: 'Delete this task? This cannot be undone.',
|
||||
task_save_error: 'Failed to save',
|
||||
task_run_now: 'Run now',
|
||||
task_run_confirm: 'This task will immediately send to its configured channel and receiver. Continue?',
|
||||
task_run_started: 'Task run started',
|
||||
task_run_error: 'Failed to run task',
|
||||
logs_title: 'Logs',
|
||||
logs_desc: 'Real-time log output (run.log)',
|
||||
logs_live: 'Live',
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React, { useEffect, useState } from 'react'
|
||||
import { Loader2, Clock, CalendarClock } from 'lucide-react'
|
||||
import { Loader2, Clock, CalendarClock, Play } from 'lucide-react'
|
||||
import { useNavigate } from 'react-router-dom'
|
||||
import { t } from '../i18n'
|
||||
import apiClient from '../api/client'
|
||||
@@ -165,6 +165,8 @@ const TaskEditModal: React.FC<{
|
||||
const [actionType, setActionType] = useState<TaskAction['type']>(task.action.type || 'send_message')
|
||||
const [content, setContent] = useState(task.action.content || task.action.task_description || '')
|
||||
const [saving, setSaving] = useState(false)
|
||||
const [running, setRunning] = useState(false)
|
||||
const [runStatus, setRunStatus] = useState('')
|
||||
const [error, setError] = useState('')
|
||||
|
||||
const buildSchedule = (): TaskSchedule => {
|
||||
@@ -209,6 +211,22 @@ const TaskEditModal: React.FC<{
|
||||
}
|
||||
}
|
||||
|
||||
const runNow = async () => {
|
||||
if (!window.confirm(t('task_run_confirm'))) return
|
||||
setRunning(true)
|
||||
setRunStatus('')
|
||||
setError('')
|
||||
try {
|
||||
const result = await apiClient.runTask(task.id)
|
||||
if (result.status !== 'success') throw new Error(result.message || t('task_run_error'))
|
||||
setRunStatus(t('task_run_started'))
|
||||
} catch (e) {
|
||||
setError(e instanceof Error ? e.message : t('task_run_error'))
|
||||
} finally {
|
||||
setRunning(false)
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Modal
|
||||
open
|
||||
@@ -219,6 +237,10 @@ const TaskEditModal: React.FC<{
|
||||
<Btn variant="danger" onClick={del} disabled={saving} className="mr-auto">
|
||||
{t('task_delete')}
|
||||
</Btn>
|
||||
<Btn variant="ghost" onClick={runNow} disabled={saving || running}>
|
||||
{running ? <Loader2 size={14} className="inline animate-spin mr-1" /> : <Play size={14} className="inline mr-1" />}
|
||||
{t('task_run_now')}
|
||||
</Btn>
|
||||
<Btn variant="ghost" onClick={onClose} disabled={saving}>
|
||||
{t('task_cancel')}
|
||||
</Btn>
|
||||
@@ -298,6 +320,7 @@ const TaskEditModal: React.FC<{
|
||||
)}
|
||||
<p className="text-xs text-content-tertiary">{t('task_channel_locked')}</p>
|
||||
|
||||
{runStatus && <p className="text-xs text-success">{runStatus}</p>}
|
||||
{error && <p className="text-xs text-danger">{error}</p>}
|
||||
</Modal>
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user