import { memo, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { Avatar, Select, type SelectProps, Space, Tag, Typography } from "antd"; import Show from "@/components/Show"; import { ACCESS_USAGES, type AccessProvider, type AccessUsageType, accessProvidersMap } from "@/domain/provider"; export type AccessProviderSelectProps = Omit< SelectProps, "filterOption" | "filterSort" | "labelRender" | "options" | "optionFilterProp" | "optionLabelProp" | "optionRender" > & { filter?: (record: AccessProvider) => boolean; showOptionTags?: boolean | { [key in AccessUsageType]?: boolean }; }; const AccessProviderSelect = ({ filter, showOptionTags, ...props }: AccessProviderSelectProps = { showOptionTags: true }) => { const { t } = useTranslation(); const [options, setOptions] = useState>([]); useEffect(() => { const allItems = Array.from(accessProvidersMap.values()); const filteredItems = filter != null ? allItems.filter(filter) : allItems; setOptions( filteredItems.map((item) => ({ key: item.type, value: item.type, label: t(item.name), disabled: item.builtin, data: item, })) ); }, [filter]); 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 renderOption = (key: string) => { const provider = accessProvidersMap.get(key) ?? ({ type: "", name: "", icon: "", usages: [] } as unknown as AccessProvider); return (
{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")}
); }; return (