import { memo, useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { Avatar, Card, Col, Empty, Flex, Input, type InputRef, Row, Typography } from "antd"; import Show from "@/components/Show"; import { type ACMEDns01Provider, acmeDns01ProvidersMap } from "@/domain/provider"; export type ACMEDns01ProviderPickerProps = { className?: string; style?: React.CSSProperties; autoFocus?: boolean; filter?: (record: ACMEDns01Provider) => boolean; placeholder?: string; onSelect?: (value: string) => void; }; const ACMEDns01ProviderPicker = ({ className, style, autoFocus, filter, placeholder, onSelect }: ACMEDns01ProviderPickerProps) => { const { t } = useTranslation(); const [keyword, setKeyword] = useState(); const keywordInputRef = useRef(null); useEffect(() => { if (autoFocus) { setTimeout(() => keywordInputRef.current?.focus(), 1); } }, []); const providers = useMemo(() => { return Array.from(acmeDns01ProvidersMap.values()) .filter((provider) => { if (filter) { return filter(provider); } return true; }) .filter((provider) => { if (keyword) { const value = keyword.toLowerCase(); return provider.type.toLowerCase().includes(value) || t(provider.name).toLowerCase().includes(value); } return true; }); }, [filter, keyword]); const handleProviderTypeSelect = (value: string) => { onSelect?.(value); }; return (
setKeyword(e.target.value.trim())} />
0} fallback={}> {providers.map((provider, index) => { return ( { handleProviderTypeSelect(provider.type); }} > {t(provider.name)} ); })}
); }; export default memo(ACMEDns01ProviderPicker);