Skip to content

Commit 38ab51a

Browse files
committed
MP-5 languages update
1 parent 72ddadf commit 38ab51a

File tree

8 files changed

+117
-211
lines changed

8 files changed

+117
-211
lines changed

src/apps/profiles/src/member-profile/languages/LanguageCard/LanguageCard.tsx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { compact } from 'lodash'
21
import { FC } from 'react'
32

43
import { UserTrait } from '~/libs/core'
@@ -11,14 +10,7 @@ interface LanguageCardProps {
1110

1211
const LanguageCard: FC<LanguageCardProps> = (props: LanguageCardProps) => (
1312
<div className={styles.language}>
14-
<p className='body-main-medium'>{props.trait.language}</p>
15-
<p className='body-small'>
16-
{compact([
17-
props.trait.spokenLevel ? `Spoken: ${props.trait.spokenLevel}` : undefined,
18-
props.trait.writtenLevel ? `Written: ${props.trait.writtenLevel}` : undefined,
19-
])
20-
.join(' | ')}
21-
</p>
13+
<p className='body-main-bold'>{props.trait.language}</p>
2214
</div>
2315
)
2416

src/apps/profiles/src/member-profile/languages/MemberLanguages.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { EDIT_MODE_QUERY_PARAM, profileEditModes } from '../../config'
99
import { notifyUniNavi } from '../../lib'
1010

1111
import { ModifyLanguagesModal } from './ModifyLanguagesModal'
12-
import { LanguageCard } from './LanguageCard'
1312
import styles from './MemberLanguages.module.scss'
1413

1514
interface MemberLanguagesProps {
@@ -73,8 +72,11 @@ const MemberLanguages: FC<MemberLanguagesProps> = (props: MemberLanguagesProps)
7372

7473
<div className={styles.languages}>
7574
{
76-
memberLanguages?.map((trait: UserTrait) => (
77-
<LanguageCard trait={trait} key={`member-lan-${trait.language}`} />
75+
memberLanguages?.map((trait: UserTrait, indx: number) => (
76+
<span key={`member-lan-${trait.language}`}>
77+
{trait.language}
78+
{indx < memberLanguages.length - 1 && ', '}
79+
</span>
7880
))
7981
}
8082
</div>

src/apps/profiles/src/member-profile/languages/ModifyLanguagesModal/ModifyLanguagesModal.module.scss

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,50 +14,49 @@
1414
.formWrap {
1515
display: flex;
1616
flex-direction: column;
17-
min-height: 500px;
1817
margin-top: $sp-2;
1918

2019
@include ltelg {
2120
:global(.input-wrapper) {
2221
margin-bottom: $sp-2;
2322
}
2423
}
25-
26-
.formCTAs {
27-
display: flex;
28-
align-items: center;
29-
30-
svg {
31-
width: 14px;
32-
height: 14px;
33-
margin-right: $sp-1;
34-
}
35-
36-
.ctaBtnCancel {
37-
margin-left: $sp-8;
38-
}
39-
}
4024
}
4125

4226
.languages {
43-
margin-bottom: $sp-15;
44-
45-
&.noLanguages {
46-
margin-bottom: 0;
47-
}
27+
margin: $sp-4 0 $sp-6;
28+
padding-bottom: $sp-4;
29+
display: grid;
30+
grid-template-columns: repeat(2, 1fr);
31+
grid-gap: $sp-4;
32+
border-bottom: 1px solid $black-20;
4833

4934
.languageItemWrap {
5035
display: flex;
5136
align-items: center;
5237
justify-content: space-between;
5338
margin-bottom: $sp-2;
5439
border-radius: 8px;
55-
padding: $sp-2;
40+
padding: $sp-5 $sp-6;
5641
border: 1px solid $black-10;
5742

58-
button svg {
59-
width: 16px;
60-
height: 16px;
43+
button {
44+
padding-right: 0;
45+
46+
svg {
47+
width: 24px;
48+
height: 24px;
49+
}
6150
}
6251
}
52+
}
53+
54+
.langModal {
55+
@include gtemd {
56+
overflow: visible !important;
57+
}
58+
}
59+
60+
.langModalBody {
61+
overflow: visible !important;
6362
}

src/apps/profiles/src/member-profile/languages/ModifyLanguagesModal/ModifyLanguagesModal.tsx

Lines changed: 73 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { bind, sortBy } from 'lodash'
1+
import { bind, compact, sortBy, values } from 'lodash'
22
import { Dispatch, FC, MutableRefObject, SetStateAction, useMemo, useRef, useState } from 'react'
33
import { toast } from 'react-toastify'
44
import 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

Comments
 (0)