import { memo, useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { Avatar, Card, Col, Empty, Flex, Input, type InputRef, Row, Tag, Typography } from "antd"; import Show from "@/components/Show"; import { ACCESS_USAGES, type AccessProvider, type AccessUsageType, accessProvidersMap } from "@/domain/provider"; import { mergeCls } from "@/utils/css"; export type AccessProviderPickerProps = { className?: string; style?: React.CSSProperties; autoFocus?: boolean; filter?: (record: AccessProvider) => boolean; placeholder?: string; showOptionTags?: boolean | { [key in AccessUsageType]?: boolean }; onSelect?: (value: string) => void; }; const AccessProviderPicker = ({ className, style, autoFocus, filter, placeholder, showOptionTags, onSelect }: AccessProviderPickerProps) => { 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(accessProvidersMap.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 showOptionTagForDNS = useMemo(() => { return typeof showOptionTags === "object" ? !!showOptionTags[ACCESS_USAGES.DNS] : !!showOptionTags; }, [showOptionTags]); const showOptionTagForHosting = useMemo(() => { return typeof showOptionTags === "object" ? !!showOptionTags[ACCESS_USAGES.HOSTING] : !!showOptionTags; }, [showOptionTags]); const showOptionTagForCA = useMemo(() => { return typeof showOptionTags === "object" ? !!showOptionTags[ACCESS_USAGES.CA] : !!showOptionTags; }, [showOptionTags]); const showOptionTagForNotification = useMemo(() => { return typeof showOptionTags === "object" ? !!showOptionTags[ACCESS_USAGES.NOTIFICATION] : !!showOptionTags; }, [showOptionTags]); const handleProviderTypeSelect = (value: string) => { onSelect?.(value); }; return (
setKeyword(e.target.value.trim())} />
0} fallback={}> {providers.map((provider, index) => { return ( { if (provider.builtin) { return; } handleProviderTypeSelect(provider.type); }} >
{t(provider.name)}
{t("access.props.provider.builtin")} {t("access.props.provider.usage.dns")} {t("access.props.provider.usage.hosting")} {t("access.props.provider.usage.ca")} {t("access.props.provider.usage.notification")}
); })}
); }; export default memo(AccessProviderPicker);