| | |
| | | 'use client' |
| | | import { useCallback, useState } from 'react' |
| | | import { useContext } from 'use-context-selector' |
| | | import { RiCloseLine } from '@remixicon/react' |
| | | import { XMarkIcon } from '@heroicons/react/24/outline' |
| | | import { useTranslation } from 'react-i18next' |
| | | import { ReactMultiEmail } from 'react-multi-email' |
| | | import { RiErrorWarningFill } from '@remixicon/react' |
| | |
| | | import { ToastContext } from '@/app/components/base/toast' |
| | | import type { InvitationResult } from '@/models/common' |
| | | import I18n from '@/context/i18n' |
| | | import 'react-multi-email/dist/style.css' |
| | | import { noop } from 'lodash-es' |
| | | |
| | | import 'react-multi-email/dist/style.css' |
| | | type IInviteModalProps = { |
| | | isEmailSetup: boolean |
| | | onCancel: () => void |
| | |
| | | onSend(invitation_results) |
| | | } |
| | | } |
| | | catch { } |
| | | catch (e) { } |
| | | } |
| | | else { |
| | | notify({ type: 'error', message: t('common.members.emailInvalid') }) |
| | |
| | | |
| | | return ( |
| | | <div className={cn(s.wrap)}> |
| | | <Modal overflowVisible isShow onClose={noop} className={cn(s.modal)}> |
| | | <div className='mb-2 flex justify-between'> |
| | | <div className='text-xl font-semibold text-text-primary'>{t('common.members.inviteTeamMember')}</div> |
| | | <RiCloseLine className='h-4 w-4 cursor-pointer text-text-tertiary' onClick={onCancel} /> |
| | | <Modal overflowVisible isShow onClose={() => { }} className={cn(s.modal)}> |
| | | <div className='flex justify-between mb-2'> |
| | | <div className='text-xl font-semibold text-gray-900'>{t('common.members.inviteTeamMember')}</div> |
| | | <XMarkIcon className='w-4 h-4 cursor-pointer' onClick={onCancel} /> |
| | | </div> |
| | | <div className='mb-3 text-[13px] text-text-tertiary'>{t('common.members.inviteTeamMemberTip')}</div> |
| | | <div className='mb-3 text-[13px] text-gray-500'>{t('common.members.inviteTeamMemberTip')}</div> |
| | | {!isEmailSetup && ( |
| | | <div className='grow basis-0 overflow-y-auto pb-4'> |
| | | <div className='relative mb-1 rounded-xl border border-components-panel-border p-2 shadow-xs'> |
| | | <div className='absolute left-0 top-0 h-full w-full rounded-xl opacity-40' style={{ background: 'linear-gradient(92deg, rgba(255, 171, 0, 0.25) 18.12%, rgba(255, 255, 255, 0.00) 167.31%)' }}></div> |
| | | <div className='relative flex h-full w-full items-start'> |
| | | <div className='mr-0.5 shrink-0 p-0.5'> |
| | | <RiErrorWarningFill className='h-5 w-5 text-text-warning' /> |
| | | <div className='relative mb-1 p-2 rounded-xl border border-components-panel-border shadow-xs'> |
| | | <div className='absolute top-0 left-0 w-full h-full rounded-xl opacity-40' style={{ background: 'linear-gradient(92deg, rgba(255, 171, 0, 0.25) 18.12%, rgba(255, 255, 255, 0.00) 167.31%)' }}></div> |
| | | <div className='relative flex items-start w-full h-full'> |
| | | <div className='shrink-0 mr-0.5 p-0.5'> |
| | | <RiErrorWarningFill className='w-5 h-5 text-text-warning' /> |
| | | </div> |
| | | <div className='system-xs-medium text-text-primary'> |
| | | <div className='text-text-primary system-xs-medium'> |
| | | <span>{t('common.members.emailNotSetup')}</span> |
| | | </div> |
| | | </div> |
| | |
| | | )} |
| | | |
| | | <div> |
| | | <div className='mb-2 text-sm font-medium text-text-primary'>{t('common.members.email')}</div> |
| | | <div className='mb-8 flex h-36 items-stretch'> |
| | | <div className='mb-2 text-sm font-medium text-gray-900'>{t('common.members.email')}</div> |
| | | <div className='mb-8 h-36 flex items-stretch'> |
| | | <ReactMultiEmail |
| | | className={cn('w-full border-components-input-border-active !bg-components-input-bg-normal px-3 pt-2 outline-none', |
| | | 'appearance-none overflow-y-auto rounded-lg text-sm !text-text-primary', |
| | | className={cn('w-full pt-2 px-3 outline-none border-none', |
| | | 'appearance-none text-sm text-gray-900 rounded-lg overflow-y-auto', |
| | | s.emailsInput, |
| | | )} |
| | | autoFocus |
| | | emails={emails} |
| | | inputClassName='bg-transparent' |
| | | onChange={setEmails} |
| | | getLabel={(email, index, removeEmail) => |
| | | <div data-tag key={index} className={cn('bg-components-button-secondary-bg')}> |
| | | <div data-tag key={index} className={cn(s.emailBackground)}> |
| | | <div data-tag-item>{email}</div> |
| | | <span data-tag-handle onClick={() => removeEmail(index)}> |
| | | × |