'use client' import type { FC } from 'react' import React, { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import useSWR from 'swr' import { RiArrowDownSLine, } from '@remixicon/react' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem' import Avatar from '@/app/components/base/avatar' import Input from '@/app/components/base/input' import { fetchMembers } from '@/service/common' import cn from '@/utils/classnames' type Props = { value?: any onSelect: (value: any) => void exclude?: string[] } const MemberSelector: FC = ({ value, onSelect, exclude = [], }) => { const { t } = useTranslation() const [open, setOpen] = useState(false) const [searchValue, setSearchValue] = useState('') const { data } = useSWR( { url: '/workspaces/current/members', params: {}, }, fetchMembers, ) const currentValue = useMemo(() => { if (!data?.accounts) return null const accounts = data.accounts || [] if (!value) return null return accounts.find(account => account.id === value) }, [data, value]) const filteredList = useMemo(() => { if (!data?.accounts) return [] const accounts = data.accounts if (!searchValue) return accounts.filter(account => !exclude.includes(account.id)) return accounts.filter((account) => { const name = account.name || '' const email = account.email || '' return name.toLowerCase().includes(searchValue.toLowerCase()) || email.toLowerCase().includes(searchValue.toLowerCase()) }).filter(account => !exclude.includes(account.id)) }, [data, searchValue, exclude]) return ( setOpen(v => !v)} >
{!currentValue && (
{t('common.members.transferModal.transferPlaceholder')}
)} {currentValue && ( <>
{currentValue.name}
{currentValue.email}
)}
setSearchValue(e.target.value)} />
{filteredList.map(account => (
{ onSelect(account.id) setOpen(false) }} >
{account.name}
{account.email}
))}
) } export default MemberSelector