"use client"; import React, { useState, useEffect, useCallback, useMemo } from "react"; import { SuggestedQuestion, DEFAULT_QUESTIONS, CONTEXTUAL_QUESTIONS, QuestionAnalytics, } from "./suggested-questions-config"; interface SuggestedQuestionsProps { onQuestionSelect: (question: string) => void; context?: string; maxQuestions?: number; showCategories?: boolean; className?: string; variant?: "chips" | "list" | "grid"; disabled?: boolean; animateIn?: boolean; } export function SuggestedQuestions({ onQuestionSelect, context = "welcome", maxQuestions = 3, showCategories = false, className = "", variant = "chips", disabled = false, animateIn = true, }: SuggestedQuestionsProps) { const [selectedCategory, setSelectedCategory] = useState(""); const [isVisible, setIsVisible] = useState(false); // Animation effect useEffect(() => { if (animateIn) { const timer = setTimeout(() => setIsVisible(true), 100); return () => clearTimeout(timer); } else { setIsVisible(true); } }, [animateIn]); // Get suggested questions based on context const suggestedQuestions = useMemo(() => { let questions: SuggestedQuestion[] = []; // Try to get contextual questions first if (context && CONTEXTUAL_QUESTIONS[context]) { questions = [...CONTEXTUAL_QUESTIONS[context]]; } // If no contextual questions or not enough, add from defaults if (questions.length < maxQuestions) { const remainingSlots = maxQuestions - questions.length; const defaultQuestions = DEFAULT_QUESTIONS.filter( (q) => !questions.some((cq) => cq.id === q.id) ).slice(0, remainingSlots); questions = [...questions, ...defaultQuestions]; } // Sort by priority questions.sort((a, b) => a.priority - b.priority); return questions.slice(0, maxQuestions); }, [context, maxQuestions]); const handleQuestionClick = useCallback( (question: SuggestedQuestion) => { if (disabled) return; // Track analytics QuestionAnalytics.trackQuestionClick(question.id); // Execute callback onQuestionSelect(question.text); }, [onQuestionSelect, disabled] ); const handleKeyDown = useCallback( (event: React.KeyboardEvent, question: SuggestedQuestion) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); handleQuestionClick(question); } }, [handleQuestionClick] ); const renderChips = () => (
{suggestedQuestions.map((question, index) => ( ))}
); const renderList = () => (
{suggestedQuestions.map((question, index) => ( ))}
); const renderGrid = () => (
{suggestedQuestions.map((question, index) => ( ))}
); if (suggestedQuestions.length === 0) { return null; } return (
{showCategories && (

추천 질문

)} {variant === "chips" && renderChips()} {variant === "list" && renderList()} {variant === "grid" && renderGrid()}
); } // Hook for managing suggested questions state export function useSuggestedQuestions(initialContext: string = "welcome") { const [context, setContext] = useState(initialContext); const [isVisible, setIsVisible] = useState(true); const updateContext = useCallback((newContext: string) => { setContext(newContext); }, []); const hideQuestions = useCallback(() => { setIsVisible(false); }, []); const showQuestions = useCallback(() => { setIsVisible(true); }, []); const resetQuestions = useCallback(() => { setContext("welcome"); setIsVisible(true); }, []); return { context, isVisible, updateContext, hideQuestions, showQuestions, resetQuestions, }; } export default SuggestedQuestions;