From 4ce8f9f7568fefab15523df7ee24f436c46a6001 Mon Sep 17 00:00:00 2001 From: Caihaohan Date: Tue, 27 Jan 2026 20:19:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E8=AF=8D=E8=AF=8D=E4=BA=91=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=8E=B7=E5=8F=96=20Hook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useKeywordCloudClient.ts | 65 ++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/hooks/useKeywordCloudClient.ts diff --git a/src/hooks/useKeywordCloudClient.ts b/src/hooks/useKeywordCloudClient.ts new file mode 100644 index 0000000..8fce05d --- /dev/null +++ b/src/hooks/useKeywordCloudClient.ts @@ -0,0 +1,65 @@ +'use client'; + +import { useState, useEffect } from 'react'; + +interface KeywordData { + id: number; + word: string; + trendScore: number; + description: string; + detailPoints: string[]; + visualConfig: { + color: string; + size: string; + border: string; + rotation?: string; + }; +} + +interface QuarterData { + quarter: string; + title: string; + titleEn?: string; + subtitle?: string; + subtitleEn?: string; + keywords: KeywordData[]; +} + +export function useKeywordCloud(quarter: string) { + const [data, setData] = useState(null); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + async function fetchData() { + setIsLoading(true); + setError(null); + + try { + const response = await fetch(`/api/keyword-cloud/keywords/${quarter}`); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const json = await response.json(); + + if (!json.success) { + throw new Error(json.error || 'Unknown error'); + } + + setData(json); + } catch (err) { + setError(err instanceof Error ? err : new Error('Unknown error')); + } finally { + setIsLoading(false); + } + } + + if (quarter) { + fetchData(); + } + }, [quarter]); + + return { data, isLoading, error }; +}