import { useRouter } from 'next/router'; import React, { useState, useMemo, useEffect } from 'react'; import { Toaster } from 'react-hot-toast'; import { FixedSizeList as List, ListChildComponentProps } from 'react-window'; import { useAddKeywords, useFetchKeywords } from '../../services/keywords'; import { SCfilterKeywords, SCkeywordsByDevice, SCsortKeywords } from '../../utils/SCsortFilter'; import Icon from '../common/Icon'; import KeywordFilters from './KeywordFilter'; import SCKeyword from './SCKeyword'; type SCKeywordsTableProps = { domain: DomainType | null, keywords: SearchAnalyticsItem[], isLoading: boolean, isConsoleIntegrated: boolean, } type SCCountryDataType = { keywords: number, impressions: number, visits: number } const SCKeywordsTable = ({ domain, keywords = [], isLoading = true, isConsoleIntegrated = true }: SCKeywordsTableProps) => { const router = useRouter(); const [device, setDevice] = useState('desktop'); const [selectedKeywords, setSelectedKeywords] = useState([]); const [filterParams, setFilterParams] = useState({ countries: [], tags: [], search: '' }); const [sortBy, setSortBy] = useState('imp_desc'); const [isMobile, setIsMobile] = useState(false); const [SCListHeight, setSCListHeight] = useState(500); const { keywordsData } = useFetchKeywords(router); const addedkeywords: string[] = keywordsData?.keywords?.map((key: KeywordType) => `${key.keyword}:${key.country}:${key.device}`) || []; const { mutate: addKeywords } = useAddKeywords(() => { if (domain && domain.slug) router.push(`/domain/${domain.slug}`); }); const finalKeywords: {[key:string] : SCKeywordType[] } = useMemo(() => { const procKeywords = keywords.filter((x) => x.device === device); const filteredKeywords = SCfilterKeywords(procKeywords, filterParams); const sortedKeywords = SCsortKeywords(filteredKeywords, sortBy); return SCkeywordsByDevice(sortedKeywords, device); }, [keywords, device, filterParams, sortBy]); const SCCountryData: {[key:string] : SCCountryDataType } = useMemo(() => { const countryData:{[key:string] : SCCountryDataType } = {}; Object.keys(finalKeywords).forEach((dateKey) => { finalKeywords[dateKey].forEach((keyword) => { const kCountry = keyword.country; if (!countryData[kCountry]) { countryData[kCountry] = { keywords: 0, impressions: 0, visits: 0 }; } countryData[kCountry].keywords += 1; countryData[kCountry].visits += (keyword.clicks || 0); countryData[kCountry].impressions += (keyword.impressions || 0); }); }); return countryData; }, [finalKeywords]); const viewSummary: {[key:string] : number } = useMemo(() => { const keyCount = finalKeywords[device].length; const kwSummary = { position: 0, impressions: 0, visits: 0, ctr: 0 }; finalKeywords[device].forEach((k) => { kwSummary.position += k.position; kwSummary.impressions += k.impressions; kwSummary.visits += k.clicks; kwSummary.ctr += k.ctr; }); return { ...kwSummary, position: Math.round(kwSummary.position / keyCount), ctr: kwSummary.ctr / keyCount, }; }, [finalKeywords, device]); useEffect(() => { setIsMobile(!!(window.matchMedia('only screen and (max-width: 760px)').matches)); const resizeList = () => setSCListHeight(window.innerHeight - (isMobile ? 200 : 400)); resizeList(); window.addEventListener('resize', resizeList); return () => { window.removeEventListener('resize', resizeList); }; }, [isMobile]); const selectKeyword = (keywordID: string) => { console.log('Select Keyword: ', keywordID); let updatedSelectd = [...selectedKeywords, keywordID]; if (selectedKeywords.includes(keywordID)) { updatedSelectd = selectedKeywords.filter((keyID) => keyID !== keywordID); } setSelectedKeywords(updatedSelectd); }; const addSCKeywordsToTracker = () => { const selectedkeywords:KeywordAddPayload[] = []; keywords.forEach((kitem:SCKeywordType) => { if (selectedKeywords.includes(kitem.uid)) { const { keyword, country } = kitem; selectedkeywords.push({ keyword, device, country, domain: domain?.domain || '', tags: '' }); } }); addKeywords(selectedkeywords); setSelectedKeywords([]); }; const selectedAllItems = selectedKeywords.length === finalKeywords[device].length; const Row = ({ data, index, style }:ListChildComponentProps) => { const keyword = data[index]; return ( ); }; return (
{selectedKeywords.length > 0 && ( )} {selectedKeywords.length === 0 && ( setFilterParams(params)} updateSort={(sorted:string) => setSortBy(sorted)} sortBy={sortBy} keywords={keywords} device={device} setDevice={setDevice} isConsole={true} integratedConsole={isConsoleIntegrated} SCcountries={Object.keys(SCCountryData)} /> )}
{!isLoading && finalKeywords[device] && finalKeywords[device].length > 0 && ( {Row} )} {!isLoading && finalKeywords[device] && finalKeywords[device].length > 0 && ( )} {isConsoleIntegrated && !isLoading && finalKeywords[device].length === 0 && (

Could Not fetch Keyword Data for this Domain from Google Search Console.

)} {isConsoleIntegrated && isLoading && (

Loading Keywords...

)} {!isConsoleIntegrated && (

Google Search has not been Integrated yet. Please follow These Steps to integrate Google Search Data for this Domain.

)}
); }; export default SCKeywordsTable;