Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 2 additions & 7 deletions src/apps/profiles/src/member-profile/about-me/AboutMe.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useSearchParams } from 'react-router-dom'
import { KeyedMutator } from 'swr'
import classNames from 'classnames'

import { useMemberTraits, UserProfile, UserTrait, UserTraitIds, UserTraits } from '~/libs/core'
import { NamesAndHandleAppearance, useMemberTraits, UserProfile, UserTraitIds, UserTraits } from '~/libs/core'

import { AddButton, EditMemberPropertyBtn, EmptySection } from '../../components'
import { EDIT_MODE_QUERY_PARAM, profileEditModes } from '../../config'
Expand Down Expand Up @@ -38,11 +38,6 @@ const AboutMe: FC<AboutMeProps> = (props: AboutMeProps) => {
props.profile && !props.profile.description
), [props.profile])

const namesAndHandleAppearanceData: UserTrait | undefined
= useMemo(() => memberPersonalizationTraits?.[0]?.traits?.data?.find(
(trait: UserTrait) => trait.namesAndHandleAppearance,
), [memberPersonalizationTraits])

useEffect(() => {
if (props.authProfile && editMode === profileEditModes.aboutMe) {
setIsEditMode(true)
Expand Down Expand Up @@ -76,7 +71,7 @@ const AboutMe: FC<AboutMeProps> = (props: AboutMeProps) => {
I&apos;m
{' '}
{
namesAndHandleAppearanceData?.namesAndHandleAppearance === 'handleOnly'
props.profile.namesAndHandleAppearance === NamesAndHandleAppearance.handleOnly
? props.profile?.handle
: props.profile?.firstName
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,20 @@
import { Dispatch, FC, FocusEvent, SetStateAction, useState } from 'react'
import { reject, trim } from 'lodash'
import { trim } from 'lodash'
import { toast } from 'react-toastify'

import {
NamesAndHandleAppearance,
updateMemberProfileAsync,
updateOrCreateMemberTraitsAsync,
UserProfile,
UserTrait,
UserTraitCategoryNames,
UserTraitIds,
} from '~/libs/core'
import { BaseModal, Button, InputRadio, InputText } from '~/libs/ui'

import { NamesAndHandleAppearance } from '../ProfileHeader'

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

interface ModifyMemberNameModalProps {
profile: UserProfile
onClose: () => void
onSave: () => void
memberPersonalizationTraitsData: UserTrait[] | undefined
namesAndHandleAppearance: NamesAndHandleAppearance | undefined
}

const ModifyMemberNameModal: FC<ModifyMemberNameModalProps> = (props: ModifyMemberNameModalProps) => {
Expand All @@ -43,10 +36,8 @@ const ModifyMemberNameModal: FC<ModifyMemberNameModalProps> = (props: ModifyMemb
const [currentLastName, setCurrentLastName]: [string, Dispatch<SetStateAction<string>>]
= useState<string>(props.profile.lastName)

const [namesAndHandleAppearance, setNamesAndHandleAppearance]: [
NamesAndHandleAppearance | undefined, Dispatch<SetStateAction<NamesAndHandleAppearance | undefined>>
]
= useState<NamesAndHandleAppearance | undefined>(props.namesAndHandleAppearance)
const [namesAndHandleAppearance, setNamesAndHandleAppearance]
= useState<NamesAndHandleAppearance | undefined>(props.profile.namesAndHandleAppearance)

function handleFirstNameChange(e: React.ChangeEvent<HTMLInputElement>): void {
setCurrentFirstName(e.target.value)
Expand Down Expand Up @@ -88,21 +79,12 @@ const ModifyMemberNameModal: FC<ModifyMemberNameModalProps> = (props: ModifyMemb
Promise.all([
updateMemberProfileAsync(
props.profile.handle,
{ firstName: updatedFirstName, lastName: updatedLastName },
),
updateOrCreateMemberTraitsAsync(props.profile.handle, [{
categoryName: UserTraitCategoryNames.personalization,
traitId: UserTraitIds.personalization,
traits: {
data: [
...reject(
props.memberPersonalizationTraitsData,
(trait: any) => trait.namesAndHandleAppearance,
),
{ namesAndHandleAppearance },
],
{
firstName: updatedFirstName,
lastName: updatedLastName,
namesAndHandleAppearance: namesAndHandleAppearance as NamesAndHandleAppearance,
},
}]),
),
])
.then(() => {
toast.success('Your profile has been updated.', { position: toast.POSITION.BOTTOM_RIGHT })
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
/* eslint-disable complexity */
import { Dispatch, FC, SetStateAction, useEffect, useMemo, useState } from 'react'
import { Location, useLocation, useSearchParams } from 'react-router-dom'
import { KeyedMutator } from 'swr'
import moment from 'moment'

import {
useMemberTraits,
NamesAndHandleAppearance,
UserProfile,
UserTrait,
UserTraitIds,
UserTraits,
} from '~/libs/core'
import { ProfilePicture, useCheckIsMobile } from '~/libs/shared'
import { Button } from '~/libs/ui'
Expand All @@ -30,8 +26,6 @@ interface ProfileHeaderProps {
refreshProfile: (handle: string) => void
}

export type NamesAndHandleAppearance = 'namesOnly' | 'handleOnly' | 'namesAndHandle'

const ProfileHeader: FC<ProfileHeaderProps> = (props: ProfileHeaderProps) => {
const isMobile: boolean = useCheckIsMobile()

Expand All @@ -48,18 +42,6 @@ const ProfileHeader: FC<ProfileHeaderProps> = (props: ProfileHeaderProps) => {
const [queryParams]: [URLSearchParams, any] = useSearchParams()
const editMode: string | null = queryParams.get(EDIT_MODE_QUERY_PARAM)

const { data: memberPersonalizationTraits, mutate: mutateTraits, loading: traitsLoading }: {
data: UserTraits[] | undefined,
mutate: KeyedMutator<any>,
loading: boolean,
}
= useMemberTraits(props.profile.handle, { traitIds: UserTraitIds.personalization })

const namesAndHandleAppearanceData: UserTrait | undefined
= useMemo(() => memberPersonalizationTraits?.[0]?.traits?.data?.find(
(trait: UserTrait) => trait.namesAndHandleAppearance,
), [memberPersonalizationTraits])

const [isHiringFormOpen, setIsHiringFormOpen]: [boolean, Dispatch<SetStateAction<boolean>>]
= useState<boolean>(false)

Expand Down Expand Up @@ -95,7 +77,6 @@ const ProfileHeader: FC<ProfileHeaderProps> = (props: ProfileHeaderProps) => {
setTimeout(() => {
setIsNameEditMode(false)
props.refreshProfile(props.profile.handle)
mutateTraits()
}, 1000)
}

Expand Down Expand Up @@ -159,60 +140,58 @@ const ProfileHeader: FC<ProfileHeaderProps> = (props: ProfileHeaderProps) => {
!isMobile ? renderMemberPhotoWrap() : undefined
}

{!traitsLoading && (
<div className={styles.profileHeaderWrap}>
<div className={styles.profileInfo}>
<div className={styles.nameWrap}>
<p>
{
namesAndHandleAppearanceData?.namesAndHandleAppearance === 'handleOnly'
? props.profile.handle
: `${props.profile.firstName} ${props.profile.lastName?.slice(0, 1) ?? ''}`
}
</p>
<div className={styles.profileHeaderWrap}>
<div className={styles.profileInfo}>
<div className={styles.nameWrap}>
<p>
{
canEdit && (
<EditMemberPropertyBtn
onClick={handleModifyNameClick}
/>
)
props.profile.namesAndHandleAppearance === NamesAndHandleAppearance.handleOnly
? props.profile.handle
: `${props.profile.firstName} ${props.profile.lastName?.slice(0, 1) ?? ''}`
}
</div>

<p className={styles.memberSince}>
{
// If the user hasn't set a name and handle appareance, display both name and handle
(namesAndHandleAppearanceData?.namesAndHandleAppearance === 'namesAndHandle'
|| !namesAndHandleAppearanceData) ? (
// eslint-disable-next-line react/jsx-indent
<>
<span>{props.profile.handle}</span>
{' '}
|
{' '}
</>
) : undefined
}
Member Since
{' '}
{moment(props.profile.createdAt)
.format('MMM YYYY')}
</p>
</div>
{
!canEdit && isTalentSearch ? (
<div className={styles.hiringClickWrap}>
<Button
label='Hire Topcoder Talent'
primary
size='lg'
onClick={handleStartHiringToggle}
{
canEdit && (
<EditMemberPropertyBtn
onClick={handleModifyNameClick}
/>
</div>
) : undefined
}
)
}
</div>

<p className={styles.memberSince}>
{
// If the user hasn't set a name and handle appareance, display both name and handle
(props.profile.namesAndHandleAppearance === NamesAndHandleAppearance.both
|| !props.profile.namesAndHandleAppearance) ? (
// eslint-disable-next-line react/jsx-indent
<>
<span>{props.profile.handle}</span>
{' '}
|
{' '}
</>
) : undefined
}
Member Since
{' '}
{moment(props.profile.createdAt)
.format('MMM YYYY')}
</p>
</div>
)}
{
!canEdit && isTalentSearch ? (
<div className={styles.hiringClickWrap}>
<Button
label='Hire Topcoder Talent'
primary
size='lg'
onClick={handleStartHiringToggle}
/>
</div>
) : undefined
}
</div>

{
// Showing only when they can edit until we have the talent search app
Expand Down Expand Up @@ -241,8 +220,6 @@ const ProfileHeader: FC<ProfileHeaderProps> = (props: ProfileHeaderProps) => {
onClose={handleModifyNameModalClose}
onSave={handleModifyNameModalSave}
profile={props.profile}
memberPersonalizationTraitsData={memberPersonalizationTraits?.[0]?.traits?.data}
namesAndHandleAppearance={namesAndHandleAppearanceData?.namesAndHandleAppearance}
/>
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import codes from 'country-calling-code'

import { IconSolid } from '~/libs/ui'
import { isSkillVerified, ProfilePicture, SkillPill } from '~/libs/shared'
import { UserSkill } from '~/libs/core'
import { NamesAndHandleAppearance, UserSkill } from '~/libs/core'

import { ProfileMatch } from '../profile-match'
import { Member, MemberDisplayName } from '../../lib/models'
import { Member } from '../../lib/models'
import { TALENT_SEARCH_PATHS } from '../../talent-search.routes'
import { useIsMatchingSkill } from '../../lib/utils'

Expand Down Expand Up @@ -94,14 +94,14 @@ const TalentCard: FC<TalentCardProps> = props => {
<ProfilePicture member={props.member} className={styles.profilePic} />
<div className={styles.detailsContainer}>
<div className={styles.talentInfo}>
{props.member.namesAndHandleAppearance !== MemberDisplayName.handleOnly && (
{props.member.namesAndHandleAppearance !== NamesAndHandleAppearance.handleOnly && (
<div className={styles.talentInfoName}>
{props.member.firstName}
{' '}
{props.member.lastName?.slice(0, 1) || ''}
</div>
)}
{props.member.namesAndHandleAppearance !== MemberDisplayName.nameOnly && (
{props.member.namesAndHandleAppearance !== NamesAndHandleAppearance.nameOnly && (
<div className={styles.talentInfoHandle}>
<span className='body-medium-normal'>
{props.member.handle}
Expand Down
5 changes: 2 additions & 3 deletions src/apps/talent-search/src/lib/models/Member.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { UserSkill } from '~/libs/core'
import { NamesAndHandleAppearance, UserSkill } from '~/libs/core'

import { MemberDisplayName } from './MemberDisplayName'
import MemberAddress from './MemberAddress'
import MemberMaxRating from './MemberMaxRating'
import MemberStats from './MemberStats'
Expand All @@ -18,7 +17,7 @@ export default interface Member {
handle: string;
homeCountryCode: string;
lastName: string;
namesAndHandleAppearance: MemberDisplayName
namesAndHandleAppearance: NamesAndHandleAppearance
maxRating: MemberMaxRating;
numberOfChallengesPlaced: number;
numberOfChallengesWon: number;
Expand Down
1 change: 0 additions & 1 deletion src/apps/talent-search/src/lib/models/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export type { default as Member } from './Member'
export type { default as MemberMaxRating } from './MemberMaxRating'
export type { default as MemberStats } from './MemberStats'
export { MemberDisplayName } from './MemberDisplayName'
3 changes: 2 additions & 1 deletion src/libs/core/lib/profile/modify-user-profile.model.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { TC_TRACKS } from './user-profile.model'
import { NamesAndHandleAppearance, TC_TRACKS } from './user-profile.model'

export interface UpdateProfileRequest {
addresses?: Array<{
Expand All @@ -15,6 +15,7 @@ export interface UpdateProfileRequest {
lastName?: string
tracks?: TC_TRACKS[],
description?: string
namesAndHandleAppearance?: NamesAndHandleAppearance
}

export interface UserPhotoUpdateResponse {
Expand Down
7 changes: 7 additions & 0 deletions src/libs/core/lib/profile/user-profile.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@ import { UserSkill } from './user-skill.model'

export type TC_TRACKS = 'DEVELOP' | 'DESIGN' | 'DATA_SCIENCE'

export enum NamesAndHandleAppearance {
both = 'namesAndHandle',
handleOnly = 'handleOnly',
nameOnly = 'namesOnly',
}

export interface UserProfile {
addresses?: Array<{
city?: string
Expand Down Expand Up @@ -34,4 +40,5 @@ export interface UserProfile {
tracks?: Array<TC_TRACKS>
updatedAt: number
userId: number
namesAndHandleAppearance: NamesAndHandleAppearance
}