import * as React from 'react'; import Gravatar from 'react-gravatar'; import { useForm } from 'react-hook-form'; import I18n from 'i18n-js'; import Box from '../../common/Box'; import Button from '../../common/Button'; import { DangerText, SmallMutedText, SuccessText } from '../../common/CustomTexts'; import buildRequestHeaders from '../../../helpers/buildRequestHeaders'; import HttpStatus from '../../../constants/http_status'; import { isValidEmail } from '../../../helpers/regex'; import IInvitation from '../../../interfaces/IInvitation'; import friendlyDate from '../../../helpers/datetime'; import ActionLink from '../../common/ActionLink'; import { TestIcon } from '../../common/Icons'; interface Props { siteName: string; invitations: Array; currentUserEmail: string; authenticityToken: string; } interface IFormData { to: string; subject: string; body: string; } const MAX_INVITATIONS = 20; const LINK_PLACEHOLDER = '%link%'; const Invitations = ({ siteName, invitations, currentUserEmail, authenticityToken }: Props) => { const { register, handleSubmit, formState: {}, watch, } = useForm({ defaultValues: { to: '', subject: I18n.t('site_settings.invitations.subject_default', { name: siteName }), body: I18n.t('site_settings.invitations.body_default', { name: siteName }), }, }); const to = watch('to'); const emailList = to.split(','); const subject = watch('subject') const body = watch('body') const [successMessage, setSuccessMessage] = React.useState(null); const [errorMessage, setErrorMessage] = React.useState(null); const [filter, setFilter] = React.useState<'all' | 'pending' | 'accepted'>('pending'); const pendingInvitations = invitations.filter((invitation) => !invitation.accepted_at); const acceptedInvitations = invitations.filter((invitation) => invitation.accepted_at); let invitationsToDisplay = invitations; if (filter === 'pending') invitationsToDisplay = pendingInvitations; if (filter === 'accepted') invitationsToDisplay = acceptedInvitations; return ( <>

{ I18n.t('site_settings.invitations.new_invitations_title') }

{ const emailToList = formData.to.split(',').map((email) => email.trim()); const invalidEmails = emailToList.filter((email) => !isValidEmail(email)); if (emailList.length > MAX_INVITATIONS) { alert(I18n.t('site_settings.invitations.too_many_emails', { count: MAX_INVITATIONS })); return; } if (invalidEmails.length > 0) { alert(I18n.t('site_settings.invitations.invalid_emails', { emails: invalidEmails.join(', ').replace(/, $/, '') })); return; } if (!formData.body.includes(LINK_PLACEHOLDER)) { alert(I18n.t('site_settings.invitations.invitation_link_not_found')); return; } const res = await fetch(`/invitations`, { method: 'POST', headers: buildRequestHeaders(authenticityToken), body: JSON.stringify({ invitations: { to: formData.to, subject: formData.subject, body: formData.body, } }), }); if (res.status === HttpStatus.OK) { setSuccessMessage(I18n.t('site_settings.invitations.submit_success')); setErrorMessage(null); setTimeout(() => window.location.reload(), 2000); } else { setErrorMessage(I18n.t('site_settings.invitations.submit_failure')); } } )}>
{ I18n.t('site_settings.invitations.to_help') }