Skip to content

Commit 8fcbbb2

Browse files
committed
TSJR-217 - add principal skills section modal
1 parent c53bd00 commit 8fcbbb2

File tree

10 files changed

+147
-11
lines changed

10 files changed

+147
-11
lines changed

src/apps/profiles/src/config/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,5 @@ export enum profileEditModes {
2424
}
2525

2626
export const CES_SURVEY_ID = EnvironmentConfig.USERFLOW_SURVEYS.PROFILES
27+
28+
export const MAX_PRINCIPAL_SKILLS_COUNT = 10

src/apps/profiles/src/member-profile/skills/MemberSkillsInfo.tsx

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ import { useSearchParams } from 'react-router-dom'
33
import { filter, orderBy } from 'lodash'
44

55
import { UserProfile, UserSkill, UserSkillDisplayModes } from '~/libs/core'
6-
import { GroupedSkillsUI, HowSkillsWorkModal, isSkillVerified, SkillPill } from '~/libs/shared'
6+
import { GroupedSkillsUI, HowSkillsWorkModal, isSkillVerified, SkillPill, useLocalStorage } from '~/libs/shared'
77
import { Button } from '~/libs/ui'
88

99
import { AddButton, EditMemberPropertyBtn, EmptySection } from '../../components'
1010
import { EDIT_MODE_QUERY_PARAM, profileEditModes } from '../../config'
1111
import { MemberProfileContextValue, useMemberProfileContext } from '../MemberProfile.context'
1212

1313
import { ModifySkillsModal } from './ModifySkillsModal'
14+
import { PrincipalSkillsModal } from './PrincipalSkillsModal'
1415
import styles from './MemberSkillsInfo.module.scss'
1516

1617
interface MemberSkillsInfoProps {
@@ -24,6 +25,7 @@ const MemberSkillsInfo: FC<MemberSkillsInfoProps> = (props: MemberSkillsInfoProp
2425
const editMode: string | null = queryParams.get(EDIT_MODE_QUERY_PARAM)
2526

2627
const canEdit: boolean = props.authProfile?.handle === props.profile.handle
28+
const [hasSeenPrincipalIntro, setHasSeenPrincipalIntro] = useLocalStorage('seen-principal-intro', {} as any)
2729

2830
const { skillsRenderer, isTalentSearch }: MemberProfileContextValue = useMemberProfileContext()
2931

@@ -46,10 +48,11 @@ const MemberSkillsInfo: FC<MemberSkillsInfoProps> = (props: MemberSkillsInfoProp
4648
const sortedGroupedSkillsByCategory: { [key: string]: UserSkill[] } = {}
4749

4850
additionalSkills.forEach((skill: UserSkill) => {
49-
if (grouped[skill.category.name]) {
50-
grouped[skill.category.name].push(skill)
51+
const categoryName = skill.category?.name ?? ''
52+
if (grouped[categoryName]) {
53+
grouped[categoryName].push(skill)
5154
} else {
52-
grouped[skill.category.name] = [skill]
55+
grouped[categoryName] = [skill]
5356
}
5457
})
5558

@@ -68,6 +71,9 @@ const MemberSkillsInfo: FC<MemberSkillsInfoProps> = (props: MemberSkillsInfoProp
6871
const [howSkillsWorkVisible, setHowSkillsWorkVisible]: [boolean, Dispatch<SetStateAction<boolean>>]
6972
= useState<boolean>(false)
7073

74+
const [principalIntroModalVisible, setPrincipalIntroModalVisible]: [boolean, Dispatch<SetStateAction<boolean>>]
75+
= useState<boolean>(false)
76+
7177
useEffect(() => {
7278
if (props.authProfile && editMode === profileEditModes.skills) {
7379
setIsEditMode(true)
@@ -76,6 +82,19 @@ const MemberSkillsInfo: FC<MemberSkillsInfoProps> = (props: MemberSkillsInfoProp
7682
// eslint-disable-next-line react-hooks/exhaustive-deps
7783
}, [props.authProfile])
7884

85+
useEffect(() => {
86+
if (
87+
!canEdit
88+
|| !props.authProfile
89+
|| hasSeenPrincipalIntro[props.authProfile.handle]
90+
|| isTalentSearch
91+
) {
92+
return
93+
}
94+
95+
setPrincipalIntroModalVisible(true)
96+
}, [hasSeenPrincipalIntro, canEdit, isTalentSearch, props.authProfile, setHasSeenPrincipalIntro])
97+
7998
function handleEditSkillsClick(): void {
8099
setIsEditMode(true)
81100
}
@@ -99,6 +118,19 @@ const MemberSkillsInfo: FC<MemberSkillsInfoProps> = (props: MemberSkillsInfoProp
99118
setHowSkillsWorkVisible(false)
100119
}
101120

121+
function handlePrincipalIntroShow(): void {
122+
setPrincipalIntroModalVisible(true)
123+
}
124+
125+
function handlePrincipalIntroClose(): void {
126+
setHasSeenPrincipalIntro((prevValue: any) => ({
127+
...prevValue,
128+
[props.authProfile?.handle ?? '']: true,
129+
}))
130+
131+
setPrincipalIntroModalVisible(false)
132+
}
133+
102134
return (
103135
<div className={styles.container}>
104136
<div className={styles.titleWrap}>
@@ -185,6 +217,7 @@ const MemberSkillsInfo: FC<MemberSkillsInfoProps> = (props: MemberSkillsInfoProp
185217
<ModifySkillsModal
186218
onClose={handleModyfSkillsModalClose}
187219
onSave={handleModyfSkillsSave}
220+
showPrincipalIntroModal={handlePrincipalIntroShow}
188221
/>
189222
)
190223
}
@@ -198,6 +231,14 @@ const MemberSkillsInfo: FC<MemberSkillsInfoProps> = (props: MemberSkillsInfoProp
198231
/>
199232
)
200233
}
234+
235+
{
236+
principalIntroModalVisible && (
237+
<PrincipalSkillsModal
238+
onClose={handlePrincipalIntroClose}
239+
/>
240+
)
241+
}
201242
</div>
202243
)
203244
}

src/apps/profiles/src/member-profile/skills/ModifySkillsModal/ModifySkillsModal.module.scss

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
1010
display: flex;
1111
flex-direction: column;
1212

13-
.skillPicker {
14-
margin-top: $sp-4;
15-
}
16-
1713
:global(.input-wrapper) {
1814
margin-top: $sp-2;
1915
}
@@ -34,3 +30,15 @@
3430
.skillsModalBody {
3531
overflow: visible !important;
3632
}
33+
34+
.principalIntroLink {
35+
display: flex;
36+
justify-content: flex-end;
37+
> span {
38+
color: $link-blue-dark;
39+
cursor: pointer;
40+
&:hover {
41+
color: darken($link-blue-dark, 5);
42+
}
43+
}
44+
}

src/apps/profiles/src/member-profile/skills/ModifySkillsModal/ModifySkillsModal.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import styles from './ModifySkillsModal.module.scss'
99
interface ModifySkillsModalProps {
1010
onClose: () => void
1111
onSave: () => void
12+
showPrincipalIntroModal: () => void
1213
}
1314

1415
const ModifySkillsModal: FC<ModifySkillsModalProps> = (props: ModifySkillsModalProps) => {
@@ -44,7 +45,7 @@ const ModifySkillsModal: FC<ModifySkillsModalProps> = (props: ModifySkillsModalP
4445
<div className={styles.skillsModalHeader}>
4546
<h3>Your skills</h3>
4647
<p className='body-main-normal'>
47-
We use your skills to connect you to the right opportunities.
48+
We use your skills to connect you to the best opportunities.
4849
</p>
4950
</div>
5051
)}
@@ -68,6 +69,14 @@ const ModifySkillsModal: FC<ModifySkillsModalProps> = (props: ModifySkillsModalP
6869
<div className={styles.skillPicker}>
6970
{editor.formInput}
7071
</div>
72+
<div
73+
className={styles.principalIntroLink}
74+
onClick={props.showPrincipalIntroModal}
75+
>
76+
<span className='body-main-link'>
77+
See what Principal skills are
78+
</span>
79+
</div>
7180
</div>
7281
</BaseModal>
7382
)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
@import '@libs/ui/styles/includes';
2+
3+
.verified {
4+
display: inline-flex;
5+
6+
svg {
7+
margin: 0 $sp-2;
8+
color: $turq-120;
9+
}
10+
}
11+
12+
.container {
13+
strong {
14+
font-weight: bold;
15+
}
16+
}
17+
18+
.mb1 {
19+
margin-bottom: $sp-2;
20+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { FC } from 'react'
2+
3+
import { BaseModal, IconOutline } from '~/libs/ui'
4+
5+
import styles from './PrincipalSkillsModal.module.scss'
6+
import { MAX_PRINCIPAL_SKILLS_COUNT } from '../../../config'
7+
import principalSectionImg from './principal-section.png'
8+
import principalInputImg from './principal-input.png'
9+
10+
interface PrincipalSkillsModalProps {
11+
onClose: () => void
12+
}
13+
14+
const PrincipalSkillsModal: FC<PrincipalSkillsModalProps> = (props: PrincipalSkillsModalProps) => (
15+
<BaseModal
16+
onClose={props.onClose}
17+
open
18+
title='Highlight your Principal skills'
19+
size='lg'
20+
>
21+
<div className={styles.container}>
22+
<p>
23+
<div className={styles.mb1}>
24+
Now you can highlight your most important skills using the&nbsp;
25+
<strong>Principal skills</strong>
26+
&nbsp;section!
27+
</div>
28+
<img src={principalSectionImg} alt="" />
29+
</p>
30+
<br />
31+
<p>
32+
<div className={styles.mb1}>
33+
Just move the skills you want to highlight by typing them in the&nbsp;
34+
<strong>principal skills input</strong>
35+
&nbsp;when you edit your skills.
36+
</div>
37+
<img src={principalInputImg} alt="" />
38+
</p>
39+
<br />
40+
<p>
41+
<strong>NOTE:</strong>
42+
&nbsp;You can add up to {MAX_PRINCIPAL_SKILLS_COUNT} skills to your principal section.
43+
</p>
44+
<br />
45+
<p>
46+
To move a skill back to the <strong>additional section</strong>, just type it in the <strong>additional skills input</strong>.
47+
</p>
48+
</div>
49+
</BaseModal>
50+
)
51+
52+
export default PrincipalSkillsModal
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as PrincipalSkillsModal } from './PrincipalSkillsModal'
6.19 KB
Loading
22 KB
Loading

src/libs/shared/lib/components/member-skill-editor/use-member-skill-editor.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
UserSkillDisplayModes,
99
useUserSkillsDisplayModes,
1010
} from '~/libs/core'
11+
import { MAX_PRINCIPAL_SKILLS_COUNT } from '~/apps/profiles/src/config'
1112

1213
import {
1314
createMemberSkills,
@@ -149,21 +150,23 @@ export const useMemberSkillEditor = ({
149150
These will be showcased at the top of your profile.
150151
</p>
151152
<InputSkillSelector
153+
label='Select Principal skills'
152154
value={principalSkills}
153155
onChange={handleOnChange(UserSkillDisplayModes.principal)}
154156
loading={loading}
155-
limit={10}
157+
limit={MAX_PRINCIPAL_SKILLS_COUNT}
156158
/>
157159

158160
<p className='body-main-bold'>Additional skills</p>
159161
<p>
160162
All your other skills that make you a valuable asset on a project or a team.
161163
</p>
162164
<InputSkillSelector
165+
label='Select Additional skills'
163166
value={additionalSkills}
164167
onChange={handleOnChange(UserSkillDisplayModes.additional)}
165168
loading={loading}
166-
limit={limit ? limit - 10 : 0}
169+
limit={limit ? limit - MAX_PRINCIPAL_SKILLS_COUNT : 0}
167170
/>
168171
</>
169172
), [principalSkills, handleOnChange, loading, additionalSkills, limit])

0 commit comments

Comments
 (0)