11import React , { Component } from 'react'
2+ import * as Yup from 'yup'
23import { Formik , Field , Form } from 'formik'
34import APIClient from '../../lib/api-client'
45import Button from '../../components/button'
@@ -39,13 +40,13 @@ function Section ({ children }) {
3940 )
4041}
4142
42- export default class AssignBadge extends Component {
43+ export default class EditBadgeAssignment extends Component {
4344 static async getInitialProps ( { query } ) {
4445 if ( query ) {
4546 return {
4647 orgId : query . id ,
47- badgeId : query . badgeId ,
48- userId : query . userId
48+ badgeId : parseInt ( query . badgeId ) ,
49+ userId : parseInt ( query . userId )
4950 }
5051 }
5152 }
@@ -64,22 +65,26 @@ export default class AssignBadge extends Component {
6465 }
6566
6667 async loadData ( ) {
67- const { orgId, badgeId } = this . props
68+ const { orgId, badgeId, userId } = this . props
6869
6970 try {
7071 const org = await apiClient . get ( `/organizations/${ orgId } ` )
71- let badge , badges
72+ const badge = await apiClient . get (
73+ `/organizations/${ orgId } /badges/${ badgeId } `
74+ )
75+ let assignment
76+ if ( badge && badge . users ) {
77+ assignment = badge . users . find ( ( u ) => u . id === parseInt ( userId ) )
78+ }
7279
73- if ( badgeId ) {
74- badge = await apiClient . get ( `/organizations/${ orgId } /badges/${ badgeId } ` )
75- } else {
76- badges = await apiClient . get ( `/organizations/${ orgId } /badges` )
80+ if ( ! assignment ) {
81+ throw Error ( 'Badge assignment not found.' )
7782 }
7883
7984 this . setState ( {
8085 org,
8186 badge,
82- badges
87+ assignment
8388 } )
8489 } catch ( error ) {
8590 console . error ( error )
@@ -99,8 +104,8 @@ export default class AssignBadge extends Component {
99104 return < div > Loading...</ div >
100105 }
101106
102- const { orgId, userId } = this . props
103- const { badges , badge, user } = this . state
107+ const { orgId, userId, badgeId } = this . props
108+ const { badge, assignment } = this . state
104109
105110 return (
106111 < >
@@ -111,73 +116,67 @@ export default class AssignBadge extends Component {
111116 < Formik
112117 initialValues = { {
113118 assignedAt :
114- ( user && user . assignedAt && user . assignedAt . substring ( 0 , 10 ) ) ||
119+ ( assignment &&
120+ assignment . assignedAt &&
121+ assignment . assignedAt . substring ( 0 , 10 ) ) ||
115122 format ( Date . now ( ) , 'yyyy-MM-dd' ) ,
116123 validUntil :
117- ( user && user . validUntil && user . validUntil . substring ( 0 , 10 ) ) ||
124+ ( assignment &&
125+ assignment . validUntil &&
126+ assignment . validUntil . substring ( 0 , 10 ) ) ||
118127 ''
119128 } }
120- onSubmit = { async ( { assignedAt, validUntil, badgeId } ) => {
129+ validationSchema = { Yup . object ( ) . shape ( {
130+ assignedAt : Yup . date ( ) . required (
131+ 'Please select an assignment date.'
132+ ) ,
133+ validUntil : Yup . date ( ) . when (
134+ 'assignedAt' ,
135+ ( assignedAt , schema ) =>
136+ assignedAt &&
137+ schema . min (
138+ assignedAt ,
139+ 'End date must be after the start date.'
140+ )
141+ )
142+ } ) }
143+ onSubmit = { async ( { assignedAt, validUntil } ) => {
121144 try {
122145 const payload = {
123146 assigned_at : assignedAt ,
124147 valid_until : validUntil !== '' ? validUntil : null
125148 }
126149
127- if ( ! user ) {
128- await apiClient . post (
129- `/organizations/${ orgId } /badges/${ badgeId } /assign/${ userId } ` ,
130- payload
131- )
132- Router . push (
133- join (
134- URL ,
135- `/organizations/${ orgId } /badges/${ badgeId } /assign/${ userId } `
136- )
137- )
138- } else {
139- await apiClient . patch (
140- `/organizations/${ orgId } /member/${ userId } /badge/${ badgeId } ` ,
141- payload
142- )
143- toast . info ( 'Badge updated successfully.' )
144- }
150+ await apiClient . patch (
151+ `/organizations/${ orgId } /member/${ userId } /badge/${ badgeId } ` ,
152+ payload
153+ )
154+ toast . info ( 'Badge updated successfully.' )
145155 this . loadData ( )
146156 } catch ( error ) {
147157 console . log ( error )
148158 toast . error ( `Unexpected error, please try again later.` )
149159 }
150160 } }
151- render = { ( { isSubmitting, values } ) => {
161+ render = { ( { isSubmitting, values, errors } ) => {
152162 return (
153163 < Form >
154164 < div className = 'page__heading' >
155165 < h2 > User: { userId } (OSM id)</ h2 >
156166 </ div >
157- { badge ? (
158- < div className = 'page__heading' >
159- < h2 > Badge: { badge && badge . name } </ h2 >
160- </ div >
161- ) : (
162- < div className = 'form-control form-control__vertical' >
163- < label htmlFor = 'badgeId' > Badge:</ label >
164- < Field as = 'select' name = 'badgeId' >
165- < option value = '' > Select a badge</ option >
166- { badges . map ( ( b ) => (
167- < option key = { b . id } value = { b . id } >
168- { b . name }
169- </ option >
170- ) ) }
171- </ Field >
172- </ div >
173- ) }
167+ < div className = 'page__heading' >
168+ < h2 > Badge: { badge && badge . name } </ h2 >
169+ </ div >
174170 < div className = 'form-control form-control__vertical' >
175171 < label htmlFor = 'assignedAt' > Assigned At (required)</ label >
176172 < Field
177173 name = 'assignedAt'
178174 type = 'date'
179175 value = { values . assignedAt }
180176 />
177+ { errors . assignedAt && (
178+ < div className = 'form--error' > { errors . assignedAt } </ div >
179+ ) }
181180 </ div >
182181 < div className = 'form-control form-control__vertical' >
183182 < label htmlFor = 'validUntil' > Valid Until</ label >
@@ -186,6 +185,9 @@ export default class AssignBadge extends Component {
186185 type = 'date'
187186 value = { values . validUntil }
188187 />
188+ { errors . validUntil && (
189+ < div className = 'form--error' > { errors . validUntil } </ div >
190+ ) }
189191 </ div >
190192 < ButtonWrapper >
191193 < Button
0 commit comments