@@ -14,7 +14,7 @@ import {
14
14
} from '@blueprintjs/core' ;
15
15
import { IconNames } from '@blueprintjs/icons' ;
16
16
import { ItemRenderer , Select } from '@blueprintjs/select' ;
17
- import * as React from 'react' ;
17
+ import React , { useState } from 'react' ;
18
18
import { NavLink } from 'react-router-dom' ;
19
19
import Textarea from 'react-textarea-autosize' ;
20
20
@@ -38,85 +38,57 @@ type StateProps = {
38
38
assessmentTypes : AssessmentType [ ] ;
39
39
} ;
40
40
41
- type State = {
42
- editingOverviewField : string ;
43
- fieldValue : any ;
44
- showOptionsOverlay : boolean ;
45
- } ;
46
-
47
- export class EditingOverviewCard extends React . Component < EditingOverviewCardProps , State > {
48
- public constructor ( props : EditingOverviewCardProps ) {
49
- super ( props ) ;
50
- this . state = {
51
- editingOverviewField : '' ,
52
- fieldValue : '' ,
53
- showOptionsOverlay : false
54
- } ;
55
- }
56
-
57
- public render ( ) {
58
- return (
59
- < div >
60
- { this . optionsOverlay ( ) }
61
- { this . makeEditingOverviewCard ( this . props . overview ) }
62
- </ div >
63
- ) ;
64
- }
41
+ export const EditingOverviewCard : React . FC < EditingOverviewCardProps > = props => {
42
+ const [ editingOverviewField , setEditingOverviewField ] = useState ( '' ) ;
43
+ const [ fieldValue , setFieldValue ] = useState < any > ( '' ) ;
44
+ const [ showOptionsOverlay , setShowOptionsOverlay ] = useState ( false ) ;
65
45
66
- private saveEditOverview = ( field : keyof AssessmentOverview ) => ( e : any ) => {
46
+ const saveEditOverview = ( field : keyof AssessmentOverview ) => ( e : any ) => {
67
47
const overview = {
68
- ...this . props . overview ,
69
- [ field ] : this . state . fieldValue
48
+ ...props . overview ,
49
+ [ field ] : fieldValue
70
50
} ;
71
- this . setState ( {
72
- editingOverviewField : '' ,
73
- fieldValue : ''
74
- } ) ;
51
+ setEditingOverviewField ( '' ) ;
52
+ setFieldValue ( '' ) ;
75
53
storeLocalAssessmentOverview ( overview ) ;
76
- this . props . updateEditingOverview ( overview ) ;
54
+ props . updateEditingOverview ( overview ) ;
77
55
} ;
78
56
79
- private handleEditOverview = ( ) => ( e : any ) => {
80
- this . setState ( {
81
- fieldValue : e . target . value
82
- } ) ;
57
+ const handleEditOverview = ( e : any ) => {
58
+ setFieldValue ( e . target . value ) ;
83
59
} ;
84
60
85
- private toggleEditField = ( field : keyof AssessmentOverview ) => ( e : any ) => {
86
- if ( this . state . editingOverviewField !== field ) {
87
- this . setState ( {
88
- editingOverviewField : field ,
89
- fieldValue : this . props . overview [ field ]
90
- } ) ;
61
+ const toggleEditField = ( field : keyof AssessmentOverview ) => ( e : any ) => {
62
+ if ( editingOverviewField !== field ) {
63
+ setEditingOverviewField ( field ) ;
64
+ setFieldValue ( props . overview [ field ] ) ;
91
65
}
92
66
} ;
93
67
94
- private toggleOptionsOverlay = ( ) => {
95
- this . setState ( {
96
- showOptionsOverlay : ! this . state . showOptionsOverlay
97
- } ) ;
68
+ const toggleOptionsOverlay = ( ) => {
69
+ setShowOptionsOverlay ( ! showOptionsOverlay ) ;
98
70
} ;
99
71
100
- private handleExportXml = ( e : any ) => {
72
+ const handleExportXml = ( e : any ) => {
101
73
exportXml ( ) ;
102
74
} ;
103
75
104
- private makeEditingOverviewTextarea = ( field : keyof AssessmentOverview ) => (
76
+ const makeEditingOverviewTextarea = ( field : keyof AssessmentOverview ) => (
105
77
< Textarea
106
78
autoFocus = { true }
107
79
className = { 'editing-textarea' }
108
- onChange = { this . handleEditOverview ( ) }
109
- onBlur = { this . saveEditOverview ( field ) }
110
- value = { this . state . fieldValue }
80
+ onChange = { handleEditOverview }
81
+ onBlur = { saveEditOverview ( field ) }
82
+ value = { fieldValue }
111
83
/>
112
84
) ;
113
85
114
- private makeEditingOverviewCard = ( overview : AssessmentOverview ) => (
86
+ const makeEditingOverviewCard = ( overview : AssessmentOverview ) => (
115
87
< div >
116
88
< Card className = "row listing" elevation = { Elevation . ONE } >
117
- < div className = "col-xs-3 listing-picture" onClick = { this . toggleEditField ( 'coverImage' ) } >
118
- { this . state . editingOverviewField === 'coverImage' ? (
119
- this . makeEditingOverviewTextarea ( 'coverImage' )
89
+ < div className = "col-xs-3 listing-picture" onClick = { toggleEditField ( 'coverImage' ) } >
90
+ { editingOverviewField === 'coverImage' ? (
91
+ makeEditingOverviewTextarea ( 'coverImage' )
120
92
) : (
121
93
< img
122
94
alt = "Assessment cover"
@@ -127,13 +99,13 @@ export class EditingOverviewCard extends React.Component<EditingOverviewCardProp
127
99
</ div >
128
100
129
101
< div className = "col-xs-9 listing-text" >
130
- { this . makeEditingOverviewCardTitle ( overview , overview . title ) }
102
+ { makeEditingOverviewCardTitle ( overview , overview . title ) }
131
103
< div className = "row listing-xp" >
132
104
< H6 > { `Max XP: ${ overview . maxXp } ` } </ H6 >
133
105
</ div >
134
- < div className = "row listing-description" onClick = { this . toggleEditField ( 'shortSummary' ) } >
135
- { this . state . editingOverviewField === 'shortSummary' ? (
136
- this . makeEditingOverviewTextarea ( 'shortSummary' )
106
+ < div className = "row listing-description" onClick = { toggleEditField ( 'shortSummary' ) } >
107
+ { editingOverviewField === 'shortSummary' ? (
108
+ makeEditingOverviewTextarea ( 'shortSummary' )
137
109
) : (
138
110
< Markdown content = { createPlaceholder ( overview . shortSummary ) } />
139
111
) }
@@ -142,26 +114,24 @@ export class EditingOverviewCard extends React.Component<EditingOverviewCardProp
142
114
< Text className = "listing-due-date" >
143
115
< Icon className = "listing-due-icon" iconSize = { 12 } icon = { IconNames . TIME } />
144
116
< div className = "date-container" > Opens at: </ div >
145
- < div className = "date-container" onClick = { this . toggleEditField ( 'openAt' ) } >
146
- { this . state . editingOverviewField === 'openAt'
147
- ? this . makeEditingOverviewTextarea ( 'openAt' )
117
+ < div className = "date-container" onClick = { toggleEditField ( 'openAt' ) } >
118
+ { editingOverviewField === 'openAt'
119
+ ? makeEditingOverviewTextarea ( 'openAt' )
148
120
: `${ getPrettyDate ( overview . openAt ) } ` }
149
121
</ div >
150
122
151
123
< div className = "date-container" > Due: </ div >
152
- < div className = "date-container" onClick = { this . toggleEditField ( 'closeAt' ) } >
153
- { this . state . editingOverviewField === 'closeAt'
154
- ? this . makeEditingOverviewTextarea ( 'closeAt' )
124
+ < div className = "date-container" onClick = { toggleEditField ( 'closeAt' ) } >
125
+ { editingOverviewField === 'closeAt'
126
+ ? makeEditingOverviewTextarea ( 'closeAt' )
155
127
: `${ getPrettyDate ( overview . closeAt ) } ` }
156
128
</ div >
157
129
</ Text >
158
- < Button icon = { IconNames . WRENCH } minimal = { true } onClick = { this . toggleOptionsOverlay } >
130
+ < Button icon = { IconNames . WRENCH } minimal = { true } onClick = { toggleOptionsOverlay } >
159
131
Other Options
160
132
</ Button >
161
133
< NavLink
162
- to = { `${ this . props . listingPath } /${ overview . id . toString ( ) } /${
163
- Constants . defaultQuestionId
164
- } `}
134
+ to = { `${ props . listingPath } /${ overview . id . toString ( ) } /${ Constants . defaultQuestionId } ` }
165
135
>
166
136
< ControlButton label = "Edit mission" icon = { IconNames . EDIT } />
167
137
</ NavLink >
@@ -171,82 +141,77 @@ export class EditingOverviewCard extends React.Component<EditingOverviewCardProp
171
141
</ div >
172
142
) ;
173
143
174
- private makeEditingOverviewCardTitle = ( overview : AssessmentOverview , title : string ) => (
144
+ const makeEditingOverviewCardTitle = ( overview : AssessmentOverview , title : string ) => (
175
145
< div className = "row listing-title" >
176
146
< Text ellipsize = { true } className = { 'col-xs-10' } >
177
- < H4 onClick = { this . toggleEditField ( 'title' ) } >
178
- { this . state . editingOverviewField === 'title'
179
- ? this . makeEditingOverviewTextarea ( 'title' )
147
+ < H4 onClick = { toggleEditField ( 'title' ) } >
148
+ { editingOverviewField === 'title'
149
+ ? makeEditingOverviewTextarea ( 'title' )
180
150
: createPlaceholder ( title ) }
181
151
</ H4 >
182
152
</ Text >
183
- < div className = "col-xs-2" > { this . makeExportButton ( overview ) } </ div >
153
+ < div className = "col-xs-2" > { makeExportButton ( overview ) } </ div >
184
154
</ div >
185
155
) ;
186
156
187
- private makeExportButton = ( overview : AssessmentOverview ) => (
188
- < Button
189
- icon = { IconNames . EXPORT }
190
- intent = { Intent . DANGER }
191
- minimal = { true }
192
- onClick = { this . handleExportXml }
193
- >
157
+ const makeExportButton = ( overview : AssessmentOverview ) => (
158
+ < Button icon = { IconNames . EXPORT } intent = { Intent . DANGER } minimal = { true } onClick = { handleExportXml } >
194
159
Save as XML
195
160
</ Button >
196
161
) ;
197
162
198
- private saveCategory = ( i : AssessmentType , e : any ) => {
163
+ const saveCategory = ( i : AssessmentType , e : any ) => {
199
164
const overview = {
200
- ...this . props . overview ,
165
+ ...props . overview ,
201
166
category : i
202
167
} ;
203
168
storeLocalAssessmentOverview ( overview ) ;
204
- this . props . updateEditingOverview ( overview ) ;
169
+ props . updateEditingOverview ( overview ) ;
205
170
} ;
206
171
207
- private optionsOverlay = ( ) => (
172
+ const optionsOverlay = ( ) => (
208
173
< Dialog
209
174
canOutsideClickClose = { false }
210
175
className = "assessment-reset"
211
176
icon = { IconNames . WRENCH }
212
177
isCloseButtonShown = { true }
213
- isOpen = { this . state . showOptionsOverlay }
214
- onClose = { this . toggleOptionsOverlay }
178
+ isOpen = { showOptionsOverlay }
179
+ onClose = { toggleOptionsOverlay }
215
180
title = "Other options"
216
181
>
217
182
< div className = { Classes . DIALOG_BODY } >
218
183
< H3 > Assessment Type</ H3 >
219
- { this . assessmentTypeSelect ( this . props . overview . type , this . saveCategory ) }
184
+ { assessmentTypeSelect ( props . overview . type , saveCategory ) }
220
185
< H3 > Number</ H3 >
221
- < div onClick = { this . toggleEditField ( 'number' ) } >
222
- { this . state . editingOverviewField === 'number'
223
- ? this . makeEditingOverviewTextarea ( 'number' )
224
- : createPlaceholder ( this . props . overview . number || '' ) }
186
+ < div onClick = { toggleEditField ( 'number' ) } >
187
+ { editingOverviewField === 'number'
188
+ ? makeEditingOverviewTextarea ( 'number' )
189
+ : createPlaceholder ( props . overview . number || '' ) }
225
190
</ div >
226
191
< H3 > Story</ H3 >
227
- < div onClick = { this . toggleEditField ( 'story' ) } >
228
- { this . state . editingOverviewField === 'story'
229
- ? this . makeEditingOverviewTextarea ( 'story' )
230
- : createPlaceholder ( this . props . overview . story || '' ) }
192
+ < div onClick = { toggleEditField ( 'story' ) } >
193
+ { editingOverviewField === 'story'
194
+ ? makeEditingOverviewTextarea ( 'story' )
195
+ : createPlaceholder ( props . overview . story || '' ) }
231
196
</ div >
232
197
< br />
233
198
< H3 > Filename</ H3 >
234
- < div onClick = { this . toggleEditField ( 'fileName' ) } >
235
- { this . state . editingOverviewField === 'fileName'
236
- ? this . makeEditingOverviewTextarea ( 'fileName' )
237
- : createPlaceholder ( this . props . overview . fileName || '' ) }
199
+ < div onClick = { toggleEditField ( 'fileName' ) } >
200
+ { editingOverviewField === 'fileName'
201
+ ? makeEditingOverviewTextarea ( 'fileName' )
202
+ : createPlaceholder ( props . overview . fileName || '' ) }
238
203
</ div >
239
204
</ div >
240
205
</ Dialog >
241
206
) ;
242
207
243
- private assessmentTypeSelect = (
208
+ const assessmentTypeSelect = (
244
209
assessmentType : AssessmentType ,
245
210
handleSelect = ( i : AssessmentType , e ?: React . SyntheticEvent < HTMLElement > ) => { }
246
211
) => (
247
212
< AssessmentTypeSelectComponent
248
213
className = { Classes . MINIMAL }
249
- items = { this . props . assessmentTypes }
214
+ items = { props . assessmentTypes }
250
215
onItemSelect = { handleSelect }
251
216
itemRenderer = { assessmentTypeRenderer }
252
217
filterable = { false }
@@ -258,7 +223,14 @@ export class EditingOverviewCard extends React.Component<EditingOverviewCardProp
258
223
/>
259
224
</ AssessmentTypeSelectComponent >
260
225
) ;
261
- }
226
+
227
+ return (
228
+ < div >
229
+ { optionsOverlay ( ) }
230
+ { makeEditingOverviewCard ( props . overview ) }
231
+ </ div >
232
+ ) ;
233
+ } ;
262
234
263
235
const createPlaceholder = ( str : string ) : string => {
264
236
if ( str . match ( '^(\n| )*$' ) ) {
0 commit comments