Skip to content

Commit 64f4a19

Browse files
committed
MP-73 allow members to select how to display names
1 parent c53e4e7 commit 64f4a19

File tree

7 files changed

+165
-24
lines changed

7 files changed

+165
-24
lines changed

src/apps/profiles/src/member-profile/profile-header/ModifyMemberNameModal/ModifyMemberNameModal.module.scss

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,30 @@
66
width: 100%;
77
}
88

9-
.nameToggle {
10-
display: flex;
11-
align-items: center;
12-
justify-content: space-between;
13-
}
9+
.modalContent {
10+
:global(.input-el) {
11+
@include ltelg {
12+
margin-bottom: $sp-4;
13+
}
14+
}
15+
16+
.radioButtons {
17+
display: flex;
18+
align-items: center;
19+
justify-content: flex-start;
20+
margin-top: $sp-4;
21+
22+
@include ltelg {
23+
flex-direction: column;
24+
align-items: flex-start;
25+
}
26+
27+
>div:not(:last-child) {
28+
margin-right: $sp-8;
29+
30+
@include ltelg {
31+
margin-bottom: $sp-2;
32+
}
33+
}
34+
}
35+
}

src/apps/profiles/src/member-profile/profile-header/ModifyMemberNameModal/ModifyMemberNameModal.tsx

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Dispatch, FC, SetStateAction, useState } from 'react'
1+
import { Dispatch, FC, FocusEvent, SetStateAction, useState } from 'react'
22
import { reject, trim } from 'lodash'
33
import { toast } from 'react-toastify'
44

@@ -11,7 +11,9 @@ import {
1111
UserTraitCategoryNames,
1212
UserTraitIds,
1313
} from '~/libs/core'
14-
import { BaseModal, Button, FormToggleSwitch, InputText } from '~/libs/ui'
14+
import { BaseModal, Button, InputRadio, InputText } from '~/libs/ui'
15+
16+
import { NamesAndHandleAppearance } from '../ProfileHeader'
1517

1618
import styles from './ModifyMemberNameModal.module.scss'
1719

@@ -20,7 +22,7 @@ interface ModifyMemberNameModalProps {
2022
onClose: () => void
2123
onSave: () => void
2224
memberPersonalizationTraitsData: UserTrait[] | undefined
23-
hideMyNameInProfile: boolean
25+
namesAndHandleAppearance: NamesAndHandleAppearance | undefined
2426
}
2527

2628
const methodsMap: { [key: string]: any } = {
@@ -47,8 +49,10 @@ const ModifyMemberNameModal: FC<ModifyMemberNameModalProps> = (props: ModifyMemb
4749
const [currentLastName, setCurrentLastName]: [string, Dispatch<SetStateAction<string>>]
4850
= useState<string>(props.profile.lastName)
4951

50-
const [hideMyNameInProfile, setHideMyNameInProfile]: [boolean, Dispatch<SetStateAction<boolean>>]
51-
= useState<boolean>(props.hideMyNameInProfile)
52+
const [namesAndHandleAppearance, setNamesAndHandleAppearance]: [
53+
NamesAndHandleAppearance | undefined, Dispatch<SetStateAction<NamesAndHandleAppearance | undefined>>
54+
]
55+
= useState<NamesAndHandleAppearance | undefined>(props.namesAndHandleAppearance)
5256

5357
function handleFirstNameChange(e: React.ChangeEvent<HTMLInputElement>): void {
5458
setCurrentFirstName(e.target.value)
@@ -60,8 +64,8 @@ const ModifyMemberNameModal: FC<ModifyMemberNameModalProps> = (props: ModifyMemb
6064
setIsFormChanged(true)
6165
}
6266

63-
function handleShowMyNameInProfileToggle(): void {
64-
setHideMyNameInProfile(!hideMyNameInProfile)
67+
function handleShowMyNameInProfileToggle(event: FocusEvent<HTMLInputElement>): void {
68+
setNamesAndHandleAppearance(event.target.value as NamesAndHandleAppearance)
6569
setIsFormChanged(true)
6670
}
6771

@@ -99,9 +103,9 @@ const ModifyMemberNameModal: FC<ModifyMemberNameModalProps> = (props: ModifyMemb
99103
data: [
100104
...reject(
101105
props.memberPersonalizationTraitsData,
102-
(trait: any) => trait.hideNamesOnProfile,
106+
(trait: any) => trait.namesAndHandleAppearance,
103107
),
104-
{ hideNamesOnProfile: hideMyNameInProfile },
108+
{ namesAndHandleAppearance },
105109
],
106110
},
107111
}]),
@@ -121,6 +125,7 @@ const ModifyMemberNameModal: FC<ModifyMemberNameModalProps> = (props: ModifyMemb
121125
onClose={props.onClose}
122126
open
123127
title='My Name'
128+
size='lg'
124129
buttons={(
125130
<div className={styles.modalButtons}>
126131
<Button
@@ -160,12 +165,31 @@ const ModifyMemberNameModal: FC<ModifyMemberNameModalProps> = (props: ModifyMemb
160165
onChange={handleLastNameChange}
161166
value={currentLastName}
162167
/>
163-
<div className={styles.nameToggle}>
164-
<p>Hide my names on profile</p>
165-
<FormToggleSwitch
166-
name='hideMyNameInProfile'
168+
<p className='body-main-bold'>Choose a combination to show:</p>
169+
<div className={styles.radioButtons}>
170+
<InputRadio
171+
name='showMyNameInProfile'
172+
label='First and Last Name Only'
173+
value='namesOnly'
174+
checked={namesAndHandleAppearance === 'namesOnly'}
175+
onChange={handleShowMyNameInProfileToggle}
176+
id='namesOnly'
177+
/>
178+
<InputRadio
179+
name='showMyNameInProfile'
180+
label='Handle Only'
181+
value='handleOnly'
182+
checked={namesAndHandleAppearance === 'handleOnly'}
183+
onChange={handleShowMyNameInProfileToggle}
184+
id='handleOnly'
185+
/>
186+
<InputRadio
187+
name='showMyNameInProfile'
188+
label='Both'
189+
value='namesAndHandle'
190+
checked={namesAndHandleAppearance === 'namesAndHandle'}
167191
onChange={handleShowMyNameInProfileToggle}
168-
value={hideMyNameInProfile}
192+
id='namesAndHandle'
169193
/>
170194
</div>
171195
</div>

src/apps/profiles/src/member-profile/profile-header/ProfileHeader.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ interface ProfileHeaderProps {
2727
refreshProfile: (handle: string) => void
2828
}
2929

30+
export type NamesAndHandleAppearance = 'namesOnly' | 'handleOnly' | 'namesAndHandle'
31+
3032
const ProfileHeader: FC<ProfileHeaderProps> = (props: ProfileHeaderProps) => {
3133
const isMobile: boolean = useCheckIsMobile()
3234

@@ -56,9 +58,9 @@ const ProfileHeader: FC<ProfileHeaderProps> = (props: ProfileHeaderProps) => {
5658
(trait: UserTrait) => trait.availableForGigs,
5759
), [memberPersonalizationTraits])
5860

59-
const hideNamesOnProfile: UserTrait | undefined
61+
const namesAndHandleAppearanceData: UserTrait | undefined
6062
= useMemo(() => memberPersonalizationTraits?.[0]?.traits?.data?.find(
61-
(trait: UserTrait) => trait.hideNamesOnProfile,
63+
(trait: UserTrait) => trait.namesAndHandleAppearance,
6264
), [memberPersonalizationTraits])
6365

6466
useEffect(() => {
@@ -172,7 +174,7 @@ const ProfileHeader: FC<ProfileHeaderProps> = (props: ProfileHeaderProps) => {
172174
<div className={styles.nameWrap}>
173175
<p>
174176
{
175-
hideNamesOnProfile
177+
namesAndHandleAppearanceData?.namesAndHandleAppearance === 'handleOnly'
176178
? props.profile.handle
177179
: `${props.profile.firstName} ${props.profile.lastName}`
178180
}
@@ -188,7 +190,7 @@ const ProfileHeader: FC<ProfileHeaderProps> = (props: ProfileHeaderProps) => {
188190

189191
<p className={styles.memberSince}>
190192
{
191-
!hideNamesOnProfile ? (
193+
namesAndHandleAppearanceData?.namesAndHandleAppearance === 'namesAndHandle' ? (
192194
<>
193195
<span>{props.profile.handle}</span>
194196
{' '}
@@ -220,7 +222,7 @@ const ProfileHeader: FC<ProfileHeaderProps> = (props: ProfileHeaderProps) => {
220222
onSave={handleModifyNameModalSave}
221223
profile={props.profile}
222224
memberPersonalizationTraitsData={memberPersonalizationTraits?.[0]?.traits?.data}
223-
hideMyNameInProfile={hideNamesOnProfile?.hideNamesOnProfile || false}
225+
namesAndHandleAppearance={namesAndHandleAppearanceData?.namesAndHandleAppearance}
224226
/>
225227
)
226228
}

src/libs/ui/lib/components/form/form-groups/form-input/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ export * from './input-text'
88
export * from './input-textarea'
99
export { inputOptional, InputWrapper } from './input-wrapper'
1010
export * from './input-date-picker'
11+
export * from './input-radio'
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
@import '../../../../../styles/includes';
2+
3+
.container {
4+
display: flex;
5+
align-items: center;
6+
7+
input[type="radio"] {
8+
-webkit-appearance: none;
9+
appearance: none;
10+
/* For iOS < 15 to remove gradient background */
11+
background-color: #fff;
12+
/* Not removed via appearance */
13+
margin: 0;
14+
font: inherit;
15+
color: $black-60;
16+
width: 20px;
17+
height: 20px;
18+
border: 1.5px solid $black-60;
19+
border-radius: 50%;
20+
transform: translateY(-0.075em);
21+
display: grid;
22+
place-content: center;
23+
}
24+
25+
input[type="radio"]::before {
26+
content: "";
27+
width: 0.65em;
28+
height: 0.65em;
29+
border-radius: 50%;
30+
transform: scale(0);
31+
transition: 120ms transform ease-in-out;
32+
box-shadow: inset 1em 1em $turq-160;
33+
}
34+
35+
input[type="radio"]:checked::before {
36+
transform: scale(1);
37+
}
38+
39+
&:has(input[disabled]) {
40+
input[type="radio"] {
41+
border-color: $black-20;
42+
43+
&::before {
44+
box-shadow: inset 1em 1em $black-20;
45+
}
46+
}
47+
48+
label {
49+
color: $black-60;
50+
}
51+
}
52+
53+
label {
54+
color: $black-100;
55+
margin-left: $sp-2;
56+
}
57+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { FC, FocusEvent } from 'react'
2+
3+
import styles from './InputRadio.module.scss'
4+
5+
interface InputRadioProps {
6+
readonly checked?: boolean
7+
readonly disabled?: boolean
8+
readonly name: string
9+
readonly onChange: (event: FocusEvent<HTMLInputElement>) => void
10+
readonly value: string
11+
readonly id: string
12+
readonly label?: string
13+
}
14+
15+
const InputRadio: FC<InputRadioProps> = (props: InputRadioProps) => (
16+
<div className={styles.container}>
17+
<input
18+
checked={props.checked}
19+
disabled={!!props.disabled}
20+
name={props.name}
21+
onChange={props.onChange}
22+
type='radio'
23+
value={props.value}
24+
id={props.id}
25+
/>
26+
{
27+
props.label && (
28+
<label htmlFor={props.id}>{props.label}</label>
29+
)
30+
}
31+
</div>
32+
)
33+
34+
export default InputRadio
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as InputRadio } from './InputRadio'

0 commit comments

Comments
 (0)