1- import { bind , sortBy } from 'lodash'
1+ import { bind , compact , sortBy , values } from 'lodash'
22import { Dispatch , FC , MutableRefObject , SetStateAction , useMemo , useRef , useState } from 'react'
33import { toast } from 'react-toastify'
44import classNames from 'classnames'
@@ -39,64 +39,53 @@ const ModifyLanguagesModal: FC<ModifyLanguagesModalProps> = (props: ModifyLangua
3939 const [ isFormChanged , setIsFormChanged ] : [ boolean , Dispatch < SetStateAction < boolean > > ]
4040 = useState < boolean > ( false )
4141
42- const [ isEditMode , setIsEditMode ] : [ boolean , Dispatch < SetStateAction < boolean > > ] = useState < boolean > ( false )
43-
44- const [ formErrors , setFormErrors ] : [
45- { [ key : string ] : string } ,
46- Dispatch < SetStateAction < { [ key : string ] : string } > >
47- ]
48- = useState < { [ key : string ] : string } > ( { } )
49-
50- const [ selectedLanguage , setSelectedLanguage ] : [
51- string | undefined ,
52- Dispatch < SetStateAction < string | undefined > >
53- ]
54- = useState < string | undefined > ( )
55-
56- const [ selectedSpokenLevel , setSelectedSpokenLevel ] : [
57- string | undefined ,
58- Dispatch < SetStateAction < string | undefined > >
59- ]
60- = useState < string | undefined > ( )
61-
62- const [ selectedWrittenLevel , setSelectedWrittenLevel ] : [
63- string | undefined ,
64- Dispatch < SetStateAction < string | undefined > >
65- ]
66- = useState < string | undefined > ( )
67-
6842 const languages : any = useMemo ( ( ) => sortBy (
6943 dropDowns . language . map ( lang => ( { label : lang . label , value : lang . label } ) ) ,
7044 'label' ,
7145 ) , [ ] )
7246
73- const spokenLevel : any = useMemo ( ( ) => dropDowns . spokenLevel . map (
74- lang => ( { label : lang . label , value : lang . label } ) ,
75- ) , [ ] )
76-
77- const writtenLevel : any = useMemo ( ( ) => dropDowns . writtenLevel . map (
78- lang => ( { label : lang . label , value : lang . label } ) ,
79- ) , [ ] )
80-
8147 const [ currentMemberLanguages , setCurrentMemberLanguages ] : [
8248 UserTrait [ ] | undefined ,
8349 Dispatch < SetStateAction < UserTrait [ ] | undefined > >
8450 ]
8551 = useState < UserTrait [ ] | undefined > ( props . memberLanguages )
8652
87- function handleSelectedLanguageChange ( event : React . ChangeEvent < HTMLInputElement > ) : void {
88- setSelectedLanguage ( event . target . value )
53+ const [ formValues , setFormValues ] : [
54+ { [ key : string ] : string | boolean | Date | undefined } ,
55+ Dispatch < SetStateAction < { [ key : string ] : string | boolean | Date | undefined } > >
56+ ]
57+ = useState < { [ key : number ] : string | boolean | Date | undefined } > ( {
58+ 1 : undefined ,
59+ } )
60+
61+ function handleSelectedLanguageChange ( key : string , event : React . ChangeEvent < HTMLInputElement > ) : void {
62+ setFormValues ( {
63+ ...formValues ,
64+ [ key ] : event . target . value ,
65+ } )
66+ setIsFormChanged ( true )
8967 }
9068
91- function handleSelectedSpokenLevelChange ( event : React . ChangeEvent < HTMLInputElement > ) : void {
92- setSelectedSpokenLevel ( event . target . value )
93- }
69+ function handleLanguagesSave ( ) : void {
70+ const formLanguages = compact ( values ( formValues ) )
9471
95- function handleSelectedWrittenLevelChange ( event : React . ChangeEvent < HTMLInputElement > ) : void {
96- setSelectedWrittenLevel ( event . target . value )
97- }
72+ if ( formLanguages . length ) {
73+ const filteredLanguages = formLanguages
74+ . filter ( ( item : any ) => ! currentMemberLanguages ?. find ( ( trait : UserTrait ) => trait . language === item ) )
75+
76+ if ( filteredLanguages . length ) {
77+ setCurrentMemberLanguages ( [
78+ ...( currentMemberLanguages || [ ] ) ,
79+ ...filteredLanguages . map ( ( item : any ) => ( {
80+ language : item ,
81+ } ) ) ,
82+ ] )
83+ }
84+
85+ resetForm ( )
86+ return
87+ }
9888
99- function handleLanguagesSave ( ) : void {
10089 setIsSaving ( true )
10190
10291 methodsMap [ ! ! props . memberLanguages ? 'update' : 'create' ] ( props . profile . handle , [ {
@@ -116,51 +105,11 @@ const ModifyLanguagesModal: FC<ModifyLanguagesModalProps> = (props: ModifyLangua
116105 } )
117106 }
118107
119- function handleFormAction ( ) : void {
120- if ( ! selectedLanguage ) {
121- setFormErrors ( { selectedLanguage : 'Please select a language' } )
122- return
123- }
124-
125- if ( ! selectedSpokenLevel ) {
126- setFormErrors ( { selectedSpokenLevel : 'Please select a spoken level' } )
127- return
128- }
129-
130- if ( ! selectedWrittenLevel ) {
131- setFormErrors ( { selectedWrittenLevel : 'Please select a written level' } )
132- return
133- }
134-
135- if ( currentMemberLanguages ?. find ( ( item : UserTrait ) => item . language === selectedLanguage ) ) {
136- toast . info ( 'Language already exists' , { position : toast . POSITION . BOTTOM_RIGHT } )
137- resetForm ( )
138- return
139- }
140-
141- setCurrentMemberLanguages ( [
142- ...( currentMemberLanguages || [ ] ) ,
143- {
144- language : selectedLanguage ,
145- spokenLevel : selectedSpokenLevel ,
146- writtenLevel : selectedWrittenLevel ,
147- } ,
148- ] )
149- setIsFormChanged ( true )
150- resetForm ( )
151- }
152-
153- function handleCancelEditMode ( ) : void {
154- resetForm ( )
155- }
156-
157108 function resetForm ( ) : void {
158109 formElRef . current . reset ( )
159- setIsEditMode ( false )
160- setSelectedLanguage ( undefined )
161- setSelectedSpokenLevel ( undefined )
162- setSelectedWrittenLevel ( undefined )
163- setFormErrors ( { } )
110+ setFormValues ( {
111+ 1 : undefined ,
112+ } )
164113 }
165114
166115 function handleRemoveLanguage ( trait : UserTrait ) : void {
@@ -170,8 +119,23 @@ const ModifyLanguagesModal: FC<ModifyLanguagesModalProps> = (props: ModifyLangua
170119 setIsFormChanged ( true )
171120 }
172121
122+ function handleAddAdditionalLanguage ( ) : void {
123+ const keys = Object . keys ( formValues )
124+
125+ if ( keys . length < 5 ) {
126+ setFormValues ( {
127+ ...formValues ,
128+ [ keys . length + 1 ] : undefined ,
129+ } )
130+ }
131+ }
132+
173133 return (
174134 < BaseModal
135+ bodyClassName = { styles . langModalBody }
136+ classNames = { {
137+ modal : styles . langModal ,
138+ } }
175139 onClose = { props . onClose }
176140 open
177141 size = 'lg'
@@ -193,75 +157,47 @@ const ModifyLanguagesModal: FC<ModifyLanguagesModalProps> = (props: ModifyLangua
193157 ) }
194158 >
195159 < div className = { styles . container } >
196- < div className = { classNames ( styles . languages , currentMemberLanguages ?. length ? '' : styles . noLanguages ) } >
160+ < p > What languages do you speak?</ p >
161+
162+ < div className = { classNames ( styles . languages ) } >
197163 {
198164 currentMemberLanguages ?. map ( ( trait : UserTrait ) => (
199165 < div className = { styles . languageItemWrap } key = { `member-lan-${ trait . language } ` } >
200166 < LanguageCard trait = { trait } />
201167 < Button
202168 icon = { IconOutline . TrashIcon }
203169 onClick = { bind ( handleRemoveLanguage , this , trait ) }
170+ size = 'lg'
204171 />
205172 </ div >
206173 ) )
207174 }
208175 </ div >
209176
210- < p > Add Languages</ p >
211177 < form
212178 ref = { formElRef }
213179 className = { classNames ( styles . formWrap ) }
214180 >
215181 < div className = { styles . form } >
216- < InputSelect
217- options = { languages }
218- value = { selectedLanguage }
219- onChange = { handleSelectedLanguageChange }
220- name = 'languages'
221- label = 'Language *'
222- error = { formErrors . selectedLanguage }
223- placeholder = 'Select a Language'
224- dirty
182+ {
183+ Object . keys ( formValues )
184+ . map ( ( key : string ) => (
185+ < InputSelect
186+ options = { languages }
187+ value = { formValues [ key ] as string }
188+ onChange = { bind ( handleSelectedLanguageChange , this , key ) }
189+ name = 'languages'
190+ label = 'Language'
191+ placeholder = 'Select a language from the list'
192+ key = { `language-${ key } ` }
193+ />
194+ ) )
195+ }
196+ < Button
197+ label = '+ Additional Language'
198+ secondary
199+ onClick = { handleAddAdditionalLanguage }
225200 />
226-
227- < InputSelect
228- options = { spokenLevel }
229- value = { selectedSpokenLevel }
230- onChange = { handleSelectedSpokenLevelChange }
231- name = 'spokenLevel'
232- label = 'Spoken Level *'
233- error = { formErrors . selectedSpokenLevel }
234- placeholder = 'Select a Spoken Level'
235- dirty
236- />
237-
238- < InputSelect
239- options = { writtenLevel }
240- value = { selectedWrittenLevel }
241- onChange = { handleSelectedWrittenLevelChange }
242- name = 'writtenLevel'
243- label = 'Written Level *'
244- error = { formErrors . selectedWrittenLevel }
245- placeholder = 'Select a Written Level'
246- dirty
247- />
248-
249- < div className = { styles . formCTAs } >
250- { ! isEditMode && < IconOutline . PlusCircleIcon /> }
251- < Button
252- link
253- label = { `${ isEditMode ? 'Edit' : 'Add' } Language to your List` }
254- onClick = { handleFormAction }
255- />
256- { isEditMode && (
257- < Button
258- className = { styles . ctaBtnCancel }
259- link
260- label = 'Cancel'
261- onClick = { handleCancelEditMode }
262- />
263- ) }
264- </ div >
265201 </ div >
266202 </ form >
267203 </ div >
0 commit comments