register-form.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import PropTypes from 'prop-types'
  2. import { postJSON } from '../../../../../frontend/js/infrastructure/fetch-json'
  3. function RegisterForm({
  4. setRegistrationSuccess,
  5. setEmails,
  6. setRegisterError,
  7. setFailedEmails,
  8. }) {
  9. function handleRegister(event) {
  10. event.preventDefault()
  11. const formData = new FormData(event.target)
  12. const formDataAsEntries = formData.entries()
  13. const formDataAsObject = Object.fromEntries(formDataAsEntries)
  14. const emailString = formDataAsObject.email
  15. setRegistrationSuccess(false)
  16. setRegisterError(false)
  17. setEmails([])
  18. registerGivenUsers(parseEmails(emailString))
  19. }
  20. async function registerGivenUsers(emails) {
  21. const registeredEmails = []
  22. const failingEmails = []
  23. for (const email of emails) {
  24. try {
  25. const result = await registerUser(email)
  26. registeredEmails.push(result)
  27. } catch {
  28. failingEmails.push(email)
  29. }
  30. }
  31. if (registeredEmails.length > 0) setRegistrationSuccess(true)
  32. if (failingEmails.length > 0) {
  33. setRegisterError(true)
  34. setFailedEmails(failingEmails)
  35. }
  36. setEmails(registeredEmails)
  37. }
  38. function registerUser(email) {
  39. const options = { email }
  40. const url = `/admin/register`
  41. return postJSON(url, { body: options })
  42. }
  43. return (
  44. <form onSubmit={handleRegister}>
  45. <div className="row">
  46. <div className="col-md-4 col-xs-8">
  47. <input
  48. className="form-control"
  49. name="email"
  50. type="text"
  51. placeholder="jane@example.com, joe@example.com"
  52. aria-label="emails to register"
  53. aria-describedby="input-details"
  54. />
  55. <p id="input-details" className="sr-only">
  56. Enter the emails you would like to register and separate them using
  57. commas
  58. </p>
  59. </div>
  60. <div className="col-md-8 col-xs-4">
  61. <button className="btn btn-primary">Register</button>
  62. </div>
  63. </div>
  64. </form>
  65. )
  66. }
  67. function parseEmails(emailsText) {
  68. const regexBySpaceOrComma = /[\s,]+/
  69. let emails = emailsText.split(regexBySpaceOrComma)
  70. emails.map(email => email.trim())
  71. emails = emails.filter(email => email.indexOf('@') !== -1)
  72. return emails
  73. }
  74. RegisterForm.propTypes = {
  75. setRegistrationSuccess: PropTypes.func,
  76. setEmails: PropTypes.func,
  77. setRegisterError: PropTypes.func,
  78. setFailedEmails: PropTypes.func,
  79. }
  80. export default RegisterForm