trainingForm.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { Formik, Form } from 'formik'
  2. import { Mutation } from 'react-apollo'
  3. import { adopt } from 'react-adopt'
  4. import { useMutation } from '@apollo/react-hooks'
  5. import * as Yup from 'yup'
  6. import { TextInput } from '../../lib/forms'
  7. import TrainingTypeInput from './trainingType'
  8. import { CREATE_TRAINING } from '../../lib/graphql'
  9. const TrainingAdoption = adopt({
  10. mutation: ({ render }) => (
  11. <Mutation mutation={CREATE_TRAINING}>
  12. {(createTraining, { loading, data, error }) => render({ createTraining, loading, data, error })}
  13. </Mutation>
  14. ),
  15. formik: ({ mutation: { createTraining }, render }) => (
  16. <Formik
  17. initialValues={{
  18. title: 'Winter HIIT 7',
  19. type: 'HIIT',
  20. content: [],
  21. trainingDate: Date.now(),
  22. location: 'Yoga room',
  23. attendance: 0,
  24. published: false
  25. }}
  26. validationSchema={Yup.object({
  27. title: Yup.string()
  28. .required('required'),
  29. type: Yup.string(),
  30. trainingDate: Yup.date()
  31. .required('required'),
  32. location: Yup.string()
  33. .required('required'),
  34. attendance: Yup.number()
  35. .integer('integer number'),
  36. published: Yup.bool()
  37. })}
  38. onSubmit={values => console.log(values)}
  39. >
  40. {render}
  41. </Formik>
  42. )
  43. })
  44. const TrainingForm = props => (
  45. <TrainingAdoption>
  46. {({ mutation: { createTraining, data, loading, error }, formik }) => (
  47. <section>
  48. <Form>
  49. <h2>Create Training</h2>
  50. <TextInput
  51. label='Title'
  52. name='title'
  53. type='text'
  54. placeholder='title'
  55. />
  56. <TrainingTypeInput
  57. label='Type'
  58. name='type'
  59. />
  60. <ContentInput
  61. label='Content'
  62. name='content'
  63. />
  64. <TextInput
  65. label='Training date'
  66. name='trainingDate'
  67. type='date'
  68. />
  69. <TextInput
  70. label='Location'
  71. name='location'
  72. type='text'
  73. placeholder='location'
  74. />
  75. <TextInput
  76. label='Attendance'
  77. name='attendance'
  78. type='number'
  79. placeholder='attendance'
  80. />
  81. <TextInput
  82. label='Published'
  83. name='published'
  84. type='text'
  85. placeholder='published'
  86. />
  87. <button type='submit'>Create!</button>
  88. </Form>
  89. <style jsx>{`
  90. section > :global(form) {
  91. display: grid;
  92. grid-template-columns: 1fr 2fr;
  93. }
  94. section :global(label) {
  95. grid-column: 1/2;
  96. }
  97. section :global(input),
  98. section :global(text) {
  99. grid-column: 2/3;
  100. }
  101. section :global(h2) {
  102. grid-column: 1/3;
  103. }
  104. `}</style>
  105. </section>
  106. )}
  107. </TrainingAdoption>
  108. )
  109. export default TrainingForm