import { useRouter } from 'next/router'; import React, { useState, useMemo } from 'react'; import { Toaster } from 'react-hot-toast'; import { useQuery } from 'react-query'; import { FixedSizeList as List, ListChildComponentProps } from 'react-window'; import { useAddKeywords } from '../../services/keywords'; import Icon from '../common/Icon'; import KeywordIdea from './KeywordIdea'; import useWindowResize from '../../hooks/useWindowResize'; import useIsMobile from '../../hooks/useIsMobile'; import { IdeasSortKeywords, IdeasfilterKeywords } from '../../utils/client/IdeasSortFilter'; import IdeasFilters from './IdeasFilter'; import { useMutateFavKeywordIdeas } from '../../services/adwords'; import IdeaDetails from './IdeaDetails'; import { fetchDomains } from '../../services/domains'; import SelectField from '../common/SelectField'; type IdeasKeywordsTableProps = { domain: DomainType | null, keywords: IdeaKeyword[], favorites: IdeaKeyword[], noIdeasDatabase: boolean, isLoading: boolean, showFavorites: boolean, setShowFavorites: Function, isAdwordsIntegrated: boolean, } const IdeasKeywordsTable = ({ domain, keywords = [], favorites = [], isLoading = true, isAdwordsIntegrated = true, setShowFavorites, showFavorites = false, noIdeasDatabase = false }: IdeasKeywordsTableProps) => { const router = useRouter(); const [selectedKeywords, setSelectedKeywords] = useState([]); const [showKeyDetails, setShowKeyDetails] = useState(null); const [filterParams, setFilterParams] = useState({ countries: [], tags: [], search: '' }); const [sortBy, setSortBy] = useState('imp_desc'); const [listHeight, setListHeight] = useState(500); const [addKeywordDevice, setAddKeywordDevice] = useState<'desktop'|'mobile'>('desktop'); const [addKeywordDomain, setAddKeywordDomain] = useState(''); const { mutate: addKeywords } = useAddKeywords(() => { if (domain && domain.slug) router.push(`/domain/${domain.slug}`); }); const { mutate: faveKeyword, isLoading: isFaving } = useMutateFavKeywordIdeas(router); const [isMobile] = useIsMobile(); const isResearchPage = router.pathname === '/research'; const { data: domainsData } = useQuery('domains', () => fetchDomains(router, false), { enabled: selectedKeywords.length > 0, retry: false }); const theDomains: DomainType[] = (domainsData && domainsData.domains) || []; useWindowResize(() => setListHeight(window.innerHeight - (isMobile ? 200 : 400))); const finalKeywords: IdeaKeyword[] = useMemo(() => { const filteredKeywords = IdeasfilterKeywords(showFavorites ? favorites : keywords, filterParams); const sortedKeywords = IdeasSortKeywords(filteredKeywords, sortBy); return sortedKeywords; }, [keywords, showFavorites, favorites, filterParams, sortBy]); const favoriteIDs: string[] = useMemo(() => favorites.map((fav) => fav.uid), [favorites]); const allTags:string[] = useMemo(() => { const wordTags: Map = new Map(); keywords.forEach((k) => { const keywordsArray = k.keyword.split(' '); const keywordFirstTwoWords = keywordsArray.slice(0, 2).join(' '); const keywordFirstTwoWordsReversed = keywordFirstTwoWords.split(' ').reverse().join(' '); if (!wordTags.has(keywordFirstTwoWordsReversed)) { wordTags.set(keywordFirstTwoWords, 0); } }); [...wordTags].forEach((tag) => { const foundTags = keywords.filter((kw) => kw.keyword.includes(tag[0]) || kw.keyword.includes(tag[0].split(' ').reverse().join(' '))); if (foundTags.length < 3) { wordTags.delete(tag[0]); } else { wordTags.set(tag[0], foundTags.length); } }); const finalWordTags = [...wordTags].sort((a, b) => (a[1] > b[1] ? -1 : 1)).map((t) => `${t[0]} (${t[1]})`); return finalWordTags; }, [keywords]); const selectKeyword = (keywordID: string) => { let updatedSelectd = [...selectedKeywords, keywordID]; if (selectedKeywords.includes(keywordID)) { updatedSelectd = selectedKeywords.filter((keyID) => keyID !== keywordID); } setSelectedKeywords(updatedSelectd); }; const favoriteKeyword = (keywordID: string) => { if (!isFaving) { faveKeyword({ keywordID, domain: isResearchPage ? 'research' : domain?.slug }); } }; const addKeywordIdeasToTracker = () => { const selectedkeywords:KeywordAddPayload[] = []; keywords.forEach((kitem:IdeaKeyword) => { if (selectedKeywords.includes(kitem.uid)) { const { keyword, country } = kitem; selectedkeywords.push({ keyword, device: addKeywordDevice, country, domain: isResearchPage ? addKeywordDomain : (domain?.domain || ''), tags: '', }); } }); addKeywords(selectedkeywords); setSelectedKeywords([]); }; const selectedAllItems = selectedKeywords.length === finalKeywords.length; const Row = ({ data, index, style }:ListChildComponentProps) => { const keyword: IdeaKeyword = data[index]; return ( favoriteKeyword(keyword.uid)} showKeywordDetails={() => setShowKeyDetails(keyword)} isFavorite={favoriteIDs.includes(keyword.uid)} keywordData={keyword} lastItem={index === (finalKeywords.length - 1)} /> ); }; return (
{selectedKeywords.length > 0 && (
Add Keywords to Tracker
{isResearchPage && ( ({ label: d.domain, value: d.domain }))} defaultLabel={'Select a Domain'} updateField={(updated:string[]) => updated[0] && setAddKeywordDomain(updated[0])} emptyMsg="No Domains Found" multiple={false} inline={true} rounded='rounded' /> )}
addKeywordIdeasToTracker()} > + Add Keywords
)} {selectedKeywords.length === 0 && ( setFilterParams(params)} updateSort={(sorted:string) => setSortBy(sorted)} sortBy={sortBy} keywords={keywords} favorites={favorites} showFavorites={(show:boolean) => { setShowFavorites(show); }} /> )}
{!isLoading && finalKeywords && finalKeywords.length > 0 && ( {Row} )} {isAdwordsIntegrated && isLoading && (

Loading Keywords Ideas...

)} {isAdwordsIntegrated && noIdeasDatabase && !isLoading && (

{'No keyword Ideas has been generated for this domain yet. Click the "Load Ideas" button to generate keyword ideas.'}

)} {isAdwordsIntegrated && !isLoading && finalKeywords.length === 0 && !noIdeasDatabase && (

{'No Keyword Ideas found. Please try generating Keyword Ideas again by clicking the "Load Ideas" button.'}

)} {!isAdwordsIntegrated && (

Google Ads has not been Integrated yet. Please follow These Steps to integrate Google Ads.

)}
{showKeyDetails && showKeyDetails.uid && ( setShowKeyDetails(null)} /> )}
); }; export default IdeasKeywordsTable;