import React, { useState, useRef, useEffect } from 'react'; import type { FC, KeyboardEvent, MouseEvent } from 'react'; interface KeywordInputProps { keywords: string[]; onChange: (keywords: string[]) => void; getString: (category: string, key: string, fallback?: string) => string; } const KeywordInput: FC = ({ keywords, onChange, getString, }) => { const [inputValue, setInputValue] = useState(''); const [suggestions, setSuggestions] = useState([]); const [showSuggestions, setShowSuggestions] = useState(false); const inputRef = useRef(null); // Common keywords for suggestions - this could be fetched from an API or passed as props const commonKeywords = [ 'SEO', 'Marketing', 'Social Media', 'Content Strategy', 'Analytics', 'Digital Marketing', 'Blogging', 'WordPress', 'Web Design', 'E-commerce', ]; const handleInputChange = (value: string) => { setInputValue(value); // Filter suggestions based on input if (value.trim()) { const filtered = commonKeywords.filter( keyword => keyword.toLowerCase().includes(value.toLowerCase()) && !keywords.includes(keyword) ); setSuggestions(filtered); setShowSuggestions(true); } else { setSuggestions([]); setShowSuggestions(false); } }; const addKeyword = (keyword: string) => { const trimmedKeyword = keyword.trim(); if (trimmedKeyword && !keywords.includes(trimmedKeyword)) { onChange([...keywords, trimmedKeyword]); } setInputValue(''); setSuggestions([]); setShowSuggestions(false); }; const removeKeyword = (indexToRemove: number) => { onChange(keywords.filter((_, index) => index !== indexToRemove)); }; const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ',') { e.preventDefault(); addKeyword(inputValue); } else if ( e.key === 'Backspace' && !inputValue && keywords.length > 0 ) { removeKeyword(keywords.length - 1); } }; const handleSuggestionClick = (suggestion: string) => { addKeyword(suggestion); if (inputRef.current) { inputRef.current.focus(); } }; // Close suggestions when clicking outside useEffect(() => { const handleClickOutside = (event: MouseEvent | any) => { if (inputRef.current && !inputRef.current.contains(event.target)) { setShowSuggestions(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); return (
{keywords.map((keyword, index) => ( {keyword} ))} handleInputChange(e.target.value)} onKeyDown={handleKeyDown} onFocus={() => setShowSuggestions(!!inputValue)} className="cpepai-keyword-input-field" placeholder={ keywords.length === 0 ? getString( 'content_plan_table', 'keywords_placeholder', 'Type keywords and press Enter...' ) : '' } />
{showSuggestions && suggestions.length > 0 && (
{suggestions.map((suggestion, index) => ( ))}
)}
); }; export default KeywordInput;