import React, { useState, useEffect, useRef } from 'react'; import { useGSCBrainstorm } from '../../hooks/useGSCBrainstorm'; import { GSCBrainstormModal } from './GSCBrainstormModal'; interface BrainstormButtonProps { keywords: string; onKeywordsChange: (val: string) => void; onBrainstormResult?: (result: import('../../api/gscBrainstorm').BrainstormResult) => void; disabled?: boolean; } export const BrainstormButton: React.FC = ({ keywords, onKeywordsChange, onBrainstormResult, disabled = false, }) => { const [showModal, setShowModal] = useState(false); const [showConnectOverlay, setShowConnectOverlay] = useState(false); const pendingBrainstormRef = useRef(false); const { gscConnected, isConnecting, connectError, isBrainstorming, brainstormError, contentOpportunities, keywordGaps, quickWins, pageOpportunities, aiRecommendations, summary, progressMessage, connectGSC, brainstorm, reset, } = useGSCBrainstorm(); const wordCount = keywords.trim().split(/\s+/).filter(Boolean).length; const isVisible = wordCount >= 3; useEffect(() => { if (gscConnected && pendingBrainstormRef.current && !isConnecting) { pendingBrainstormRef.current = false; brainstorm(keywords).then((result) => { if (result && onBrainstormResult) { onBrainstormResult(result); } }); } }, [gscConnected, isConnecting]); const handleClick = async () => { if (!gscConnected) { setShowConnectOverlay(true); return; } setShowModal(true); const result = await brainstorm(keywords); if (result && onBrainstormResult) { onBrainstormResult(result); } }; const handleSelectSuggestion = (suggestion: string) => { onKeywordsChange(suggestion); setShowModal(false); reset(); }; const handleConnectGSC = async () => { pendingBrainstormRef.current = true; await connectGSC(); }; const handleConnectSuccess = async () => { setShowConnectOverlay(false); setShowModal(true); const result = await brainstorm(keywords); if (result && onBrainstormResult) { onBrainstormResult(result); } }; const handleConnectCancel = () => { setShowConnectOverlay(false); pendingBrainstormRef.current = false; }; if (!isVisible) return null; return ( <> { setShowModal(false); reset(); }} contentOpportunities={contentOpportunities} keywordGaps={keywordGaps} quickWins={quickWins} pageOpportunities={pageOpportunities} aiRecommendations={aiRecommendations} summary={summary} error={brainstormError} isBrainstorming={isBrainstorming} progressMessage={progressMessage} onSelectSuggestion={handleSelectSuggestion} /> {showConnectOverlay && ( )} ); }; const GSConnectOverlay: React.FC<{ isConnecting: boolean; connectError: string | null; gscConnected: boolean; onConnect: () => void; onSuccess: () => void; onCancel: () => void; }> = ({ isConnecting, connectError, gscConnected, onConnect, onSuccess, onCancel }) => { if (gscConnected && !isConnecting) { onSuccess(); return null; } return (
📊

Connect Google Search Console

Brainstorm Topics uses your Google Search Console data to suggest blog topics based on what your audience is actually searching for.

{connectError && (

{connectError}

)} {isConnecting ? (
Opening Google sign-in...
) : (

You'll be redirected to Google to authorize access. Your data stays private.

)}
); }; export default BrainstormButton;