diff --git a/src/app/chatbot/components/ChatBot.tsx b/src/app/chatbot/components/ChatBot.tsx index 4ec55bf..87c3a7c 100644 --- a/src/app/chatbot/components/ChatBot.tsx +++ b/src/app/chatbot/components/ChatBot.tsx @@ -16,6 +16,8 @@ export default function ChatBot() { setInput, handleSubmit, handleRecommendationClick, + handlePopularTerms, + handleTodaysTerm, } = useChatBot(); return ( @@ -53,19 +55,14 @@ export default function ChatBot() { } label="인기 용어" - onClick={() => - handleSubmit( - undefined, - "React, Next.js, Docker 이 세 가지 용어를 각각 설명해줘." - ) - } + onClick={handlePopularTerms} /> } label="오늘의 용어" - onClick={() => handleSubmit(undefined, "TypeScript")} + onClick={handleTodaysTerm} /> { + const terms = await getPopularTerms(category, 3); + if (terms.length === 0) { + return "React, Next.js, Docker 이 세 가지 용어를 각각 설명해줘."; + } + return `${terms.join(", ")} 이 세 가지 용어를 각각 설명해줘.`; +} + +/** + * 오늘의 용어 가져오기 + */ +export async function getTodaysTermQuery(): Promise { + const todayTerm = await getTodaysTerm(); + if (!todayTerm) { + return "TypeScript"; + } + return todayTerm.termKo; +} diff --git a/src/hooks/useChatBot.ts b/src/hooks/useChatBot.ts index 90aa2b2..63cad34 100644 --- a/src/hooks/useChatBot.ts +++ b/src/hooks/useChatBot.ts @@ -2,6 +2,11 @@ import { useState, useRef, useEffect, useCallback } from "react"; import { getChatResponse } from "@/app/chatbot/utils/actions"; +import { + getPopularTermsQuery, + getTodaysTermQuery, +} from "@/app/chatbot/utils/quick-actions"; +import { useUserData } from "@/contexts/auth"; interface Message { role: "user" | "bot"; @@ -17,6 +22,8 @@ interface UseChatBotReturn { setInput: (value: string) => void; handleSubmit: (e?: React.FormEvent, customInput?: string) => Promise; handleRecommendationClick: (question: string) => void; + handlePopularTerms: () => Promise; + handleTodaysTerm: () => Promise; } const INITIAL_MESSAGE: Message = { @@ -26,6 +33,7 @@ const INITIAL_MESSAGE: Message = { }; export function useChatBot(): UseChatBotReturn { + const { userData } = useUserData(); const [messages, setMessages] = useState([INITIAL_MESSAGE]); const [input, setInput] = useState(""); const [isLoading, setIsLoading] = useState(false); @@ -68,6 +76,17 @@ export function useChatBot(): UseChatBotReturn { [handleSubmit] ); + const handlePopularTerms = useCallback(async () => { + const category = userData?.selectedCategory || "all"; + const query = await getPopularTermsQuery(category); + await handleSubmit(undefined, query); + }, [userData, handleSubmit]); + + const handleTodaysTerm = useCallback(async () => { + const query = await getTodaysTermQuery(); + await handleSubmit(undefined, query); + }, [handleSubmit]); + return { messages, input, @@ -76,5 +95,7 @@ export function useChatBot(): UseChatBotReturn { setInput, handleSubmit, handleRecommendationClick, + handlePopularTerms, + handleTodaysTerm, }; } diff --git a/src/lib/recommendations.ts b/src/lib/recommendations.ts index 391c6ec..fc6965b 100644 --- a/src/lib/recommendations.ts +++ b/src/lib/recommendations.ts @@ -88,3 +88,19 @@ export async function getRecommendedTerms( return []; } } + +/** + * 인기 용어 가져오기 (카테고리 기반, 새로고침마다 랜덤) + */ +export async function getPopularTerms( + category: CategoryType, + count: number = 3 +): Promise { + try { + const terms = await getRecommendedTerms(category, count); + return terms.map((t) => t.term); + } catch (error) { + console.error("인기 용어 로드 실패:", error); + return []; + } +} diff --git a/src/lib/terms.server.ts b/src/lib/terms.server.ts index b16386a..769821f 100644 --- a/src/lib/terms.server.ts +++ b/src/lib/terms.server.ts @@ -46,3 +46,11 @@ export function getTodaysTermServer(): TermIndexItem | null { return index[todayIndex]; } + +/** + * 서버에서 오늘의 용어 한국어 이름만 가져오기 + */ +export function getTodaysTermNameServer(): string | null { + const term = getTodaysTermServer(); + return term ? term.termKo : null; +}