import React, { useEffect, useMemo, useState } from 'react' import { __, sprintf } from '@wordpress/i18n' export interface LanguageDropdownComponentProps { languages: Record isOpen: boolean appliedCodes: string[] onToggle: () => void onApply: (codes: string[]) => void } const SearchGlyph = () => ( ) const LanguageDropdownComponent = ({ languages, isOpen, appliedCodes, onToggle, onApply }: LanguageDropdownComponentProps) => { const [filterText, setFilterText] = useState('') const [pending, setPending] = useState(appliedCodes) const allCodes = useMemo(() => Object.keys(languages), [languages]) const filteredEntries = useMemo(() => { const q = filterText.toLowerCase().trim() return Object.entries(languages).filter(([, data]) => { if (!q) { return true } return data.name.toLowerCase().includes(q) || data.native.toLowerCase().includes(q) }) }, [languages, filterText]) const filteredCodes = useMemo(() => filteredEntries.map(([code]) => code), [filteredEntries]) const prevOpen = React.useRef(false) useEffect(() => { if (isOpen && !prevOpen.current) { setPending([...appliedCodes]) setFilterText('') } prevOpen.current = isOpen }, [isOpen, appliedCodes]) const toggleCode = (code: string) => { setPending(pending.includes(code) ? pending.filter((c) => c !== code) : [...pending, code]) } const toggleSelectAll = () => { if (filterText.trim() === '') { setPending(pending.length === allCodes.length ? [] : [...allCodes]) return } const allFilteredSelected = filteredCodes.length > 0 && filteredCodes.every((c) => pending.includes(c)) if (allFilteredSelected) { setPending(pending.filter((c) => !filteredCodes.includes(c))) } else { setPending([...new Set([...pending, ...filteredCodes])]) } } const selectedCount = pending.length const countLabel = selectedCount === 0 ? __('No languages selected', 'textdomain') : sprintf( /* translators: %d: number of languages */ __('%d Languages Selected', 'textdomain'), selectedCount ) const selectAllChecked = filterText.trim() === '' ? pending.length === allCodes.length && allCodes.length > 0 : filteredCodes.length > 0 && filteredCodes.every((c) => pending.includes(c)) return ( <> {isOpen && (
{__('Languages', 'textdomain')}

{__('Choose the languages you would like to search', 'textdomain')}

{countLabel}

setFilterText(e.target.value)} aria-label={__('Find language', 'textdomain')} />
{filteredEntries.map(([code, data]) => ( ))}
)} ) } export default LanguageDropdownComponent