From b6cf87a4b895e7b693779ade09571fb2795fb26b Mon Sep 17 00:00:00 2001 From: SangwanYu Date: Mon, 1 Dec 2025 16:26:30 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=B1=97=EB=B4=87=20=ED=95=98=EB=8B=A8?= =?UTF-8?q?=20=EB=B2=84=ED=8A=BC=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?(=EA=B8=B0=EC=A1=B4=20=ED=95=98=EB=93=9C=EC=BD=94=EB=94=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/chatbot/components/ChatBot.tsx | 11 ++++----- src/app/chatbot/utils/quick-actions.ts | 31 ++++++++++++++++++++++++++ src/hooks/useChatBot.ts | 21 +++++++++++++++++ src/lib/recommendations.ts | 16 +++++++++++++ src/lib/terms.server.ts | 8 +++++++ 5 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 src/app/chatbot/utils/quick-actions.ts 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; +}