diff --git a/serve/frontend/src/pages/Review.tsx b/serve/frontend/src/pages/Review.tsx index d61ed6e..056b050 100644 --- a/serve/frontend/src/pages/Review.tsx +++ b/serve/frontend/src/pages/Review.tsx @@ -9,10 +9,10 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { Link } from 'react-router-dom' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' -import { motion, AnimatePresence } from 'framer-motion' +import { motion } from 'framer-motion' import { BookOpenCheck, RefreshCw, Sparkles, Trash2, History, ChevronRight, AlertTriangle, - Database, Wand2, Copy, Download, Clock, X, Check, + Database, Wand2, Copy, Download, } from 'lucide-react' import { api, type OverviewMarket, type AiReviewReport } from '@/lib/api' @@ -22,7 +22,6 @@ import { fmtBigNum } from '@/lib/format' import { PageHeader } from '@/components/PageHeader' import { MarkdownRenderer } from '@/components/financials/MarkdownRenderer' import { toast } from '@/components/Toast' -import { usePreferences } from '@/lib/useSharedQueries' import { useReviewState } from '@/lib/useReviewStore' import { startReviewGeneration, resetReview, isReviewGenerating, @@ -99,45 +98,8 @@ export function Review() { onError: () => { /* request() 已 toast */ }, }) - // ===== 定时复盘 ===== - const [showSchedule, setShowSchedule] = useState(false) - const prefs = usePreferences() - const reviewSched = prefs.data?.review_schedule ?? { enabled: false, hour: 15, minute: 10 } - const feishuConfigured = !!((prefs.data as any)?.feishu_webhook_url) - // 推送渠道是独立的顶层偏好(多选), 与定时 / 实时行情无关, 常驻可单独设置 - // []=不推送, ['feishu']=飞书(微信开发中, 仅占位) - const reviewPushChannels = prefs.data?.review_push_channels ?? [] - // 弹窗内的本地草稿: 开关和时间都在本地改, 点「保存」才真正提交(避免开关一拨就关弹窗) - const [draft, setDraft] = useState(reviewSched) - const openSchedule = useCallback(() => { - setDraft(reviewSched) // 每次打开同步最新服务端值 - setShowSchedule(true) - }, [reviewSched]) - const reviewMut = useMutation({ - mutationFn: ({ enabled, hour, minute }: { enabled: boolean; hour: number; minute: number }) => - api.updateReviewSchedule(enabled, hour, minute), - onSuccess: (_data, vars) => { - qc.invalidateQueries({ queryKey: QK.preferences }) - setShowSchedule(false) - toast(vars.enabled ? '已开启定时复盘' : '已关闭定时复盘', 'success') - }, - onError: () => { /* request() 已 toast */ }, - }) - // 推送渠道(多选): 独立常驻, 即时生效(勾选渠道即开关, 改了立刻提交) - const pushMut = useMutation({ - mutationFn: (channels: string[]) => api.updateReviewPush(channels), - onSuccess: (_data, vars) => { - qc.invalidateQueries({ queryKey: QK.preferences }) - toast(vars.length === 0 ? '已关闭复盘推送' : '已更新复盘推送渠道', 'success') - }, - onError: () => { /* request() 已 toast */ }, - }) - const togglePushChannel = useCallback((ch: string) => { - const next = reviewPushChannels.includes(ch) - ? reviewPushChannels.filter(c => c !== ch) - : [...reviewPushChannels, ch] - pushMut.mutate(next) - }, [reviewPushChannels, pushMut]) + + // 自动滚动到报告底部(streaming 时) useEffect(() => { @@ -236,18 +198,6 @@ export function Review() { > 刷新 - - - -

- 开启后,每个交易日到点自动生成大盘复盘报告并归档,静默执行。 - 下次打开本页即可在历史列表看到新报告;也可选推送到飞书。 -

- - {/* 开关(只改本地草稿, 不提交) */} - - - {/* 时间设置(仅开启时可编辑, 本地草稿) */} - {draft.enabled && ( -
- 每日 - setDraft(d => ({ ...d, hour: Math.max(0, Math.min(23, Number(e.target.value))) }))} - className="w-12 px-1.5 py-1 rounded-btn bg-base border border-border text-xs font-mono text-foreground text-center focus:outline-none focus:border-accent/50" - /> - : - setDraft(d => ({ ...d, minute: Math.max(0, Math.min(59, Number(e.target.value))) }))} - className="w-12 px-1.5 py-1 rounded-btn bg-base border border-border text-xs font-mono text-foreground text-center focus:outline-none focus:border-accent/50" - /> - 不早于 15:00 · 工作日执行 -
- )} - - {/* 推送渠道(多选, 独立常驻, 与定时无关, 即时生效) */} -
-
- 生成后推送完整报告 - {reviewPushChannels.length === 0 ? '未开启' : `${reviewPushChannels.length} 个渠道`} -
-
- {/* 飞书(可用, 多选) */} - - {/* 微信(开发中, 占位不可选) */} -
- - 微信 - 公众号/企业微信 - 开发中 -
-
-

- 手动或定时生成的复盘都会以卡片消息推送完整报告。复用「设置 → 实时监控」的飞书 Webhook。 - {reviewPushChannels.includes('feishu') && !feishuConfigured && ( - setShowSchedule(false)}> - 前往配置 → - - )} -

-
- - {!draft.enabled && ( -

- 当前: 已关闭。开启后将按设定时间自动复盘。 -

- )} - - {/* 操作区: 取消 + 保存(统一提交开关+时间) */} -
- - -
- - - )} - ) }