import React, { useState, useMemo } from 'react'; import { Toaster } from 'react-hot-toast'; import { CSSTransition } from 'react-transition-group'; import AddKeywords from './AddKeywords'; import { filterKeywords, keywordsByDevice, sortKeywords } from '../../utils/sortFilter'; import Icon from '../common/Icon'; import Keyword from './Keyword'; import KeywordDetails from './KeywordDetails'; import KeywordFilters from './KeywordFilter'; import Modal from '../common/Modal'; import { useDeleteKeywords, useFavKeywords, useRefreshKeywords } from '../../services/keywords'; import KeywordTagManager from './KeywordTagManager'; type KeywordsTableProps = { domain: Domain | null, keywords: KeywordType[], isLoading: boolean, showAddModal: boolean, setShowAddModal: Function } const KeywordsTable = ({ domain, keywords = [], isLoading = true, showAddModal = false, setShowAddModal }: KeywordsTableProps) => { const [device, setDevice] = useState('desktop'); const [selectedKeywords, setSelectedKeywords] = useState([]); const [showKeyDetails, setShowKeyDetails] = useState(null); const [showRemoveModal, setShowRemoveModal] = useState(false); const [showTagManager, setShowTagManager] = useState(null); const [filterParams, setFilterParams] = useState({ countries: [], tags: [], search: '' }); const [sortBy, setSortBy] = useState('date_asc'); const { mutate: deleteMutate } = useDeleteKeywords(() => {}); const { mutate: favoriteMutate } = useFavKeywords(() => {}); const { mutate: refreshMutate } = useRefreshKeywords(() => {}); const processedKeywords: {[key:string] : KeywordType[]} = useMemo(() => { const procKeywords = keywords.filter((x) => x.device === device); const filteredKeywords = filterKeywords(procKeywords, filterParams); const sortedKeywords = sortKeywords(filteredKeywords, sortBy); return keywordsByDevice(sortedKeywords, device); }, [keywords, device, sortBy, filterParams]); const allDomainTags: string[] = useMemo(() => { const allTags = keywords.reduce((acc: string[], keyword) => [...acc, ...keyword.tags], []); return [...new Set(allTags)]; }, [keywords]); const selectKeyword = (keywordID: number) => { console.log('Select Keyword: ', keywordID); let updatedSelectd = [...selectedKeywords, keywordID]; if (selectedKeywords.includes(keywordID)) { updatedSelectd = selectedKeywords.filter((keyID) => keyID !== keywordID); } setSelectedKeywords(updatedSelectd); }; const selectedAllItems = selectedKeywords.length === processedKeywords[device].length; return (
{selectedKeywords.length > 0 && ( )} {selectedKeywords.length === 0 && ( setFilterParams(params)} updateSort={(sorted:string) => setSortBy(sorted)} sortBy={sortBy} keywords={keywords} device={device} setDevice={setDevice} /> )}
{processedKeywords[device] && processedKeywords[device].length > 0 && processedKeywords[device].map((keyword, index) => refreshMutate({ ids: [keyword.ID] })} favoriteKeyword={favoriteMutate} manageTags={() => setShowTagManager(keyword.ID)} removeKeyword={() => { setSelectedKeywords([keyword.ID]); setShowRemoveModal(true); }} showKeywordDetails={() => setShowKeyDetails(keyword)} lastItem={index === (processedKeywords[device].length - 1)} />)} {!isLoading && processedKeywords[device].length === 0 && (

No Keywords Added for this Device Type.

)} {isLoading && (

Loading Keywords...

)}
{showKeyDetails && showKeyDetails.ID && ( setShowKeyDetails(null)} /> )} {showRemoveModal && selectedKeywords.length > 0 && ( { setSelectedKeywords([]); setShowRemoveModal(false); }} title={'Remove Keywords'}>

Are you sure you want to remove {selectedKeywords.length > 1 ? 'these' : 'this'} Keyword?

)} setShowAddModal(false)} /> {showTagManager && ( k.ID === showTagManager)} closeModal={() => setShowTagManager(null)} /> )}
); }; export default KeywordsTable;