import { Play, RefreshCw, Save, Settings2 } from "lucide-react"; import { useCallback, useEffect, useState, type FormEvent, type ReactNode, } from "react"; import { toast } from "sonner"; import { adminApi, ApiError } from "../../api/client"; import type { HintFeedGenerationStatus, HintFeedSettings, UpdateHintFeedSettingsRequest, } from "../../api/types"; import { Badge, Button, Card, Input, LoadingState, Textarea, } from "../../components/primitives"; interface HintAutoSectionProps { canEdit: boolean; } export function HintAutoSection({ canEdit }: HintAutoSectionProps) { const [settings, setSettings] = useState(); const [status, setStatus] = useState(); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [generating, setGenerating] = useState(false); const load = useCallback(async () => { setLoading(true); try { const [nextSettings, nextStatus] = await Promise.all([ adminApi.hintFeedSettings(), adminApi.hintFeedStatus(), ]); setSettings(nextSettings); setStatus(nextStatus); } catch (error) { toast.error(message(error, "Hint 自动生成状态加载失败")); } finally { setLoading(false); } }, []); useEffect(() => { void load(); }, [load]); async function save(event: FormEvent) { event.preventDefault(); if (!settings) return; setSaving(true); try { const payload: UpdateHintFeedSettingsRequest = { generationIntervalHours: settings.generationIntervalHours, holidayCountriesZh: settings.holidayCountriesZh, holidayCountriesEn: settings.holidayCountriesEn, weatherCitiesZh: settings.weatherCitiesZh, weatherCitiesEn: settings.weatherCitiesEn, googleTrendsGeos: settings.googleTrendsGeos, }; setSettings(await adminApi.updateHintFeedSettings(payload)); setStatus(await adminApi.hintFeedStatus()); toast.success("Hint 自动生成配置已保存"); } catch (error) { toast.error(message(error, "Hint 自动生成配置保存失败")); } finally { setSaving(false); } } async function regenerate() { if ( !window.confirm( "将立即抓取外部数据,并原子覆盖 zh/en 提示包。旧版本会保留到新一代全部生成成功。是否继续?", ) ) { return; } setGenerating(true); try { const result = await adminApi.regenerateHintFeed(); toast.success( `生成完成:zh ${result.zh.cardCount} 条,en ${result.en.cardCount} 条`, ); await load(); } catch (error) { toast.error(message(error, "Hint 提示包生成失败,旧版本仍保持可用")); } finally { setGenerating(false); } } if (loading || !settings || !status) { return ; } return (

Hint 自动生成

从 TopHub、Google Trends、Google News、节日和天气来源生成双语提示包。 任一来源失败不会影响其他来源,整代生成失败时继续提供旧版本。

{canEdit ? ( ) : null}
void save(event)}>

生成设置

TopHub Key {settings.topHubApiKeyConfigured ? "已配置" : "未配置"}
setSettings({ ...settings, generationIntervalHours: Number(event.target.value), }) } /> setSettings({ ...settings, holidayCountriesZh: event.target.value }) } /> setSettings({ ...settings, holidayCountriesEn: event.target.value }) } />
setSettings({ ...settings, googleTrendsGeos: event.target.value }) } />