@@ -14,7 +14,7 @@ import {
1414} from '@blueprintjs/core' ;
1515import { IconNames } from '@blueprintjs/icons' ;
1616import { ItemRenderer , Select } from '@blueprintjs/select' ;
17- import * as React from 'react' ;
17+ import React , { useState } from 'react' ;
1818import { NavLink } from 'react-router-dom' ;
1919import Textarea from 'react-textarea-autosize' ;
2020
@@ -38,85 +38,57 @@ type StateProps = {
3838 assessmentTypes : AssessmentType [ ] ;
3939} ;
4040
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 ) ;
6545
66- private saveEditOverview = ( field : keyof AssessmentOverview ) => ( e : any ) => {
46+ const saveEditOverview = ( field : keyof AssessmentOverview ) => ( e : any ) => {
6747 const overview = {
68- ...this . props . overview ,
69- [ field ] : this . state . fieldValue
48+ ...props . overview ,
49+ [ field ] : fieldValue
7050 } ;
71- this . setState ( {
72- editingOverviewField : '' ,
73- fieldValue : ''
74- } ) ;
51+ setEditingOverviewField ( '' ) ;
52+ setFieldValue ( '' ) ;
7553 storeLocalAssessmentOverview ( overview ) ;
76- this . props . updateEditingOverview ( overview ) ;
54+ props . updateEditingOverview ( overview ) ;
7755 } ;
7856
79- private handleEditOverview = ( ) => ( e : any ) => {
80- this . setState ( {
81- fieldValue : e . target . value
82- } ) ;
57+ const handleEditOverview = ( e : any ) => {
58+ setFieldValue ( e . target . value ) ;
8359 } ;
8460
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 ] ) ;
9165 }
9266 } ;
9367
94- private toggleOptionsOverlay = ( ) => {
95- this . setState ( {
96- showOptionsOverlay : ! this . state . showOptionsOverlay
97- } ) ;
68+ const toggleOptionsOverlay = ( ) => {
69+ setShowOptionsOverlay ( ! showOptionsOverlay ) ;
9870 } ;
9971
100- private handleExportXml = ( e : any ) => {
72+ const handleExportXml = ( e : any ) => {
10173 exportXml ( ) ;
10274 } ;
10375
104- private makeEditingOverviewTextarea = ( field : keyof AssessmentOverview ) => (
76+ const makeEditingOverviewTextarea = ( field : keyof AssessmentOverview ) => (
10577 < Textarea
10678 autoFocus = { true }
10779 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 }
11183 />
11284 ) ;
11385
114- private makeEditingOverviewCard = ( overview : AssessmentOverview ) => (
86+ const makeEditingOverviewCard = ( overview : AssessmentOverview ) => (
11587 < div >
11688 < 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' )
12092 ) : (
12193 < img
12294 alt = "Assessment cover"
@@ -127,13 +99,13 @@ export class EditingOverviewCard extends React.Component<EditingOverviewCardProp
12799 </ div >
128100
129101 < div className = "col-xs-9 listing-text" >
130- { this . makeEditingOverviewCardTitle ( overview , overview . title ) }
102+ { makeEditingOverviewCardTitle ( overview , overview . title ) }
131103 < div className = "row listing-xp" >
132104 < H6 > { `Max XP: ${ overview . maxXp } ` } </ H6 >
133105 </ 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' )
137109 ) : (
138110 < Markdown content = { createPlaceholder ( overview . shortSummary ) } />
139111 ) }
@@ -142,26 +114,24 @@ export class EditingOverviewCard extends React.Component<EditingOverviewCardProp
142114 < Text className = "listing-due-date" >
143115 < Icon className = "listing-due-icon" iconSize = { 12 } icon = { IconNames . TIME } />
144116 < 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' )
148120 : `${ getPrettyDate ( overview . openAt ) } ` }
149121 </ div >
150122
151123 < 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' )
155127 : `${ getPrettyDate ( overview . closeAt ) } ` }
156128 </ div >
157129 </ Text >
158- < Button icon = { IconNames . WRENCH } minimal = { true } onClick = { this . toggleOptionsOverlay } >
130+ < Button icon = { IconNames . WRENCH } minimal = { true } onClick = { toggleOptionsOverlay } >
159131 Other Options
160132 </ Button >
161133 < NavLink
162- to = { `${ this . props . listingPath } /${ overview . id . toString ( ) } /${
163- Constants . defaultQuestionId
164- } `}
134+ to = { `${ props . listingPath } /${ overview . id . toString ( ) } /${ Constants . defaultQuestionId } ` }
165135 >
166136 < ControlButton label = "Edit mission" icon = { IconNames . EDIT } />
167137 </ NavLink >
@@ -171,82 +141,77 @@ export class EditingOverviewCard extends React.Component<EditingOverviewCardProp
171141 </ div >
172142 ) ;
173143
174- private makeEditingOverviewCardTitle = ( overview : AssessmentOverview , title : string ) => (
144+ const makeEditingOverviewCardTitle = ( overview : AssessmentOverview , title : string ) => (
175145 < div className = "row listing-title" >
176146 < 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' )
180150 : createPlaceholder ( title ) }
181151 </ H4 >
182152 </ Text >
183- < div className = "col-xs-2" > { this . makeExportButton ( overview ) } </ div >
153+ < div className = "col-xs-2" > { makeExportButton ( overview ) } </ div >
184154 </ div >
185155 ) ;
186156
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 } >
194159 Save as XML
195160 </ Button >
196161 ) ;
197162
198- private saveCategory = ( i : AssessmentType , e : any ) => {
163+ const saveCategory = ( i : AssessmentType , e : any ) => {
199164 const overview = {
200- ...this . props . overview ,
165+ ...props . overview ,
201166 category : i
202167 } ;
203168 storeLocalAssessmentOverview ( overview ) ;
204- this . props . updateEditingOverview ( overview ) ;
169+ props . updateEditingOverview ( overview ) ;
205170 } ;
206171
207- private optionsOverlay = ( ) => (
172+ const optionsOverlay = ( ) => (
208173 < Dialog
209174 canOutsideClickClose = { false }
210175 className = "assessment-reset"
211176 icon = { IconNames . WRENCH }
212177 isCloseButtonShown = { true }
213- isOpen = { this . state . showOptionsOverlay }
214- onClose = { this . toggleOptionsOverlay }
178+ isOpen = { showOptionsOverlay }
179+ onClose = { toggleOptionsOverlay }
215180 title = "Other options"
216181 >
217182 < div className = { Classes . DIALOG_BODY } >
218183 < H3 > Assessment Type</ H3 >
219- { this . assessmentTypeSelect ( this . props . overview . type , this . saveCategory ) }
184+ { assessmentTypeSelect ( props . overview . type , saveCategory ) }
220185 < 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 || '' ) }
225190 </ div >
226191 < 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 || '' ) }
231196 </ div >
232197 < br />
233198 < 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 || '' ) }
238203 </ div >
239204 </ div >
240205 </ Dialog >
241206 ) ;
242207
243- private assessmentTypeSelect = (
208+ const assessmentTypeSelect = (
244209 assessmentType : AssessmentType ,
245210 handleSelect = ( i : AssessmentType , e ?: React . SyntheticEvent < HTMLElement > ) => { }
246211 ) => (
247212 < AssessmentTypeSelectComponent
248213 className = { Classes . MINIMAL }
249- items = { this . props . assessmentTypes }
214+ items = { props . assessmentTypes }
250215 onItemSelect = { handleSelect }
251216 itemRenderer = { assessmentTypeRenderer }
252217 filterable = { false }
@@ -258,7 +223,14 @@ export class EditingOverviewCard extends React.Component<EditingOverviewCardProp
258223 />
259224 </ AssessmentTypeSelectComponent >
260225 ) ;
261- }
226+
227+ return (
228+ < div >
229+ { optionsOverlay ( ) }
230+ { makeEditingOverviewCard ( props . overview ) }
231+ </ div >
232+ ) ;
233+ } ;
262234
263235const createPlaceholder = ( str : string ) : string => {
264236 if ( str . match ( '^(\n| )*$' ) ) {
0 commit comments