trainingForm.js 2.8 KB

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