From ef67b54090f47395a053a622c8a922c12851e4bb Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Thu, 16 Nov 2023 10:33:52 +0200 Subject: [PATCH 1/2] TAL-93 - update member profiles to use member.availableForGigs --- .../OpenForGigs/OpenForGigs.tsx | 26 ++++----------- .../OpenForGigsModifyModal.tsx | 32 +++---------------- .../lib/profile/modify-user-profile.model.ts | 1 + .../core/lib/profile/user-profile.model.ts | 1 + 4 files changed, 14 insertions(+), 46 deletions(-) diff --git a/src/apps/profiles/src/member-profile/profile-header/OpenForGigs/OpenForGigs.tsx b/src/apps/profiles/src/member-profile/profile-header/OpenForGigs/OpenForGigs.tsx index d3e70563d..a7092513c 100644 --- a/src/apps/profiles/src/member-profile/profile-header/OpenForGigs/OpenForGigs.tsx +++ b/src/apps/profiles/src/member-profile/profile-header/OpenForGigs/OpenForGigs.tsx @@ -1,9 +1,8 @@ -import { Dispatch, FC, SetStateAction, useEffect, useMemo, useState } from 'react' +import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react' import { useSearchParams } from 'react-router-dom' -import { KeyedMutator } from 'swr' import classNames from 'classnames' -import { useMemberTraits, UserProfile, UserTrait, UserTraitIds, UserTraits } from '~/libs/core' +import { UserProfile } from '~/libs/core' import { EditMemberPropertyBtn } from '../../../components' import { OpenForGigsModifyModal } from '../OpenForGigsModifyModal' @@ -26,6 +25,8 @@ const OpenForGigs: FC = (props: OpenForGigsProps) => { const [isEditMode, setIsEditMode]: [boolean, Dispatch>] = useState(false) + const openForWork = props.profile.availableForGigs + useEffect(() => { if (props.authProfile && editMode === profileEditModes.openForWork) { setIsEditMode(true) @@ -33,17 +34,6 @@ const OpenForGigs: FC = (props: OpenForGigsProps) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [props.authProfile]) - const { data: memberPersonalizationTraits, mutate: mutateTraits }: { - data: UserTraits[] | undefined, - mutate: KeyedMutator, - } - = useMemberTraits(props.profile.handle, { traitIds: UserTraitIds.personalization }) - - const openForWork: UserTrait | undefined - = useMemo(() => memberPersonalizationTraits?.[0]?.traits?.data?.find( - (trait: UserTrait) => trait.availableForGigs !== undefined, - ), [memberPersonalizationTraits]) - function handleModifyOpenForWorkClick(): void { setIsEditMode(true) } @@ -55,7 +45,6 @@ const OpenForGigs: FC = (props: OpenForGigsProps) => { function handleModifyOpenForWorkSave(): void { setTimeout(() => { setIsEditMode(false) - mutateTraits() props.refreshProfile(props.profile.handle) triggerSurvey() }, 1000) @@ -63,8 +52,8 @@ const OpenForGigs: FC = (props: OpenForGigsProps) => { return props.canEdit || openForWork ? (
-

- {openForWork?.availableForGigs ? 'open to work' : 'not open to work'} +

+ {openForWork ? 'open to work' : 'not open to work'}

{ props.canEdit && ( @@ -78,8 +67,7 @@ const OpenForGigs: FC = (props: OpenForGigsProps) => { ) diff --git a/src/apps/profiles/src/member-profile/profile-header/OpenForGigsModifyModal/OpenForGigsModifyModal.tsx b/src/apps/profiles/src/member-profile/profile-header/OpenForGigsModifyModal/OpenForGigsModifyModal.tsx index b500c0a46..dfe8e38c9 100644 --- a/src/apps/profiles/src/member-profile/profile-header/OpenForGigsModifyModal/OpenForGigsModifyModal.tsx +++ b/src/apps/profiles/src/member-profile/profile-header/OpenForGigsModifyModal/OpenForGigsModifyModal.tsx @@ -1,15 +1,8 @@ import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react' import { toast } from 'react-toastify' -import { reject } from 'lodash' import { BaseModal, Button, InputText } from '~/libs/ui' -import { - updateOrCreateMemberTraitsAsync, - UserProfile, - UserTrait, - UserTraitCategoryNames, - UserTraitIds, -} from '~/libs/core' +import { updateMemberProfileAsync, UserProfile } from '~/libs/core' import styles from './OpenForGigsModifyModal.module.scss' @@ -17,7 +10,6 @@ interface OpenForGigsModifyModalProps { onClose: () => void onSave: () => void openForWork: boolean - memberPersonalizationTraitsFullData: UserTrait[] | undefined profile: UserProfile } @@ -35,24 +27,10 @@ const OpenForGigsModifyModal: FC = (props: OpenForG function handleOpenForWorkSave(): void { setIsSaving(true) - const updatedPersonalizationTraits: UserTrait[] - = reject( - props.memberPersonalizationTraitsFullData, - (trait: UserTrait) => trait.availableForGigs !== undefined, - ) - - updateOrCreateMemberTraitsAsync(props.profile.handle, [{ - categoryName: UserTraitCategoryNames.personalization, - traitId: UserTraitIds.personalization, - traits: { - data: [ - ...(updatedPersonalizationTraits || []), - { - availableForGigs: openForWork, - }, - ], - }, - }]) + updateMemberProfileAsync( + props.profile.handle, + { availableForGigs: openForWork }, + ) .then(() => { toast.success('Work availability updated successfully.', { position: toast.POSITION.BOTTOM_RIGHT }) props.onSave() diff --git a/src/libs/core/lib/profile/modify-user-profile.model.ts b/src/libs/core/lib/profile/modify-user-profile.model.ts index 238ecfbab..ac85292d8 100644 --- a/src/libs/core/lib/profile/modify-user-profile.model.ts +++ b/src/libs/core/lib/profile/modify-user-profile.model.ts @@ -8,6 +8,7 @@ export interface UpdateProfileRequest { streetAddr2?: string zip?: string }> + availableForGigs?: boolean, competitionCountryCode?: string homeCountryCode?: string firstName?: string diff --git a/src/libs/core/lib/profile/user-profile.model.ts b/src/libs/core/lib/profile/user-profile.model.ts index 7b22bca31..788b7e114 100644 --- a/src/libs/core/lib/profile/user-profile.model.ts +++ b/src/libs/core/lib/profile/user-profile.model.ts @@ -10,6 +10,7 @@ export interface UserProfile { streetAddr2?: string zip?: string }> + availableForGigs: boolean competitionCountryCode: string createdAt: number description: string From ec44f653c27249528498fca7bd2c2ebcbaf27733 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Thu, 16 Nov 2023 10:34:19 +0200 Subject: [PATCH 2/2] TAL-93 - update onboarding to use member.availableForGigs --- src/apps/onboarding/src/config/index.ts | 16 +-- src/apps/onboarding/src/models/MemberInfo.ts | 1 + .../src/models/PersonalizationInfo.ts | 2 - .../src/pages/open-to-work/index.tsx | 99 +++++-------------- .../onboarding/src/redux/actions/member.ts | 20 +++- .../onboarding/src/redux/reducers/member.ts | 7 ++ 6 files changed, 56 insertions(+), 89 deletions(-) diff --git a/src/apps/onboarding/src/config/index.ts b/src/apps/onboarding/src/config/index.ts index 3719f2aa5..bbf6909a1 100644 --- a/src/apps/onboarding/src/config/index.ts +++ b/src/apps/onboarding/src/config/index.ts @@ -1,17 +1,4 @@ -export const ACTIONS: { - MEMBER: { - GET_MEMBER: string; - UPDATE_MEMBER_PHOTO_URL: string; - SET_WORKS: string; - SET_EDUCATIONS: string; - SET_PERSONALIZATIONS: string; - SET_ADDRESS: string; - SET_CONNECT_INFO: string; - SET_DESCRIPTION: string; - SET_LOADING_MEMBER_TRAITS: string; - SET_LOADING_MEMBER_INFO: string; - }; -} = { +export const ACTIONS = { MEMBER: { GET_MEMBER: 'GET_MEMBER', SET_ADDRESS: 'SET_ADDRESS', @@ -20,6 +7,7 @@ export const ACTIONS: { SET_EDUCATIONS: 'SET_EDUCATIONS', SET_LOADING_MEMBER_INFO: 'SET_LOADING_MEMBER_INFO', SET_LOADING_MEMBER_TRAITS: 'SET_LOADING_MEMBER_TRAITS', + SET_OPEN_FOR_WORK: 'SET_OPEN_FOR_WORK', SET_PERSONALIZATIONS: 'SET_PERSONALIZATIONS', SET_WORKS: 'SET_WORKS', UPDATE_MEMBER_PHOTO_URL: 'UPDATE_MEMBER_PHOTO_URL', diff --git a/src/apps/onboarding/src/models/MemberInfo.ts b/src/apps/onboarding/src/models/MemberInfo.ts index 34181f86b..23de4ea8a 100644 --- a/src/apps/onboarding/src/models/MemberInfo.ts +++ b/src/apps/onboarding/src/models/MemberInfo.ts @@ -15,6 +15,7 @@ export default interface MemberInfo { maxRating: MemberMaxRating skills: Array stats: Array + availableForGigs: boolean addresses?: MemberAddress[] country: string photoURL: string diff --git a/src/apps/onboarding/src/models/PersonalizationInfo.ts b/src/apps/onboarding/src/models/PersonalizationInfo.ts index e23a7752f..8ed82ec47 100644 --- a/src/apps/onboarding/src/models/PersonalizationInfo.ts +++ b/src/apps/onboarding/src/models/PersonalizationInfo.ts @@ -2,11 +2,9 @@ export default interface PersonalizationInfo { referAs?: string profileSelfTitle?: string shortBio?: string - availableForGigs?: boolean } export const emptyPersonalizationInfo: () => PersonalizationInfo = () => ({ - availableForGigs: true, profileSelfTitle: '', referAs: '', shortBio: '', diff --git a/src/apps/onboarding/src/pages/open-to-work/index.tsx b/src/apps/onboarding/src/pages/open-to-work/index.tsx index 7219ec831..817cebfd9 100644 --- a/src/apps/onboarding/src/pages/open-to-work/index.tsx +++ b/src/apps/onboarding/src/pages/open-to-work/index.tsx @@ -1,58 +1,32 @@ import { useNavigate } from 'react-router-dom' -import { FC, MutableRefObject, useEffect, useMemo, useRef } from 'react' +import { FC, MutableRefObject, useEffect, useRef, useState } from 'react' import { connect } from 'react-redux' +import { pick } from 'lodash' import classNames from 'classnames' import { Button, IconOutline, PageDivider } from '~/libs/ui' import { FormInputCheckbox } from '~/apps/self-service/src/components/form-elements' -import { createMemberPersonalizations, updateMemberPersonalizations } from '../../redux/actions/member' import { ProgressBar } from '../../components/progress-bar' -import { useAutoSavePersonalization, useAutoSavePersonalizationType } from '../../hooks/useAutoSavePersonalization' -import PersonalizationInfo, { emptyPersonalizationInfo } from '../../models/PersonalizationInfo' +import { updateMemberOpenForWork } from '../../redux/actions/member' import styles from './styles.module.scss' const FormInputCheckboxMiddleware: any = FormInputCheckbox as any -const blankPersonalizationInfo: PersonalizationInfo = emptyPersonalizationInfo() - -interface PageOpenToWorkContentReduxProps { - reduxPersonalizations: PersonalizationInfo[] | undefined - loadingMemberTraits: boolean -} - -interface PageOpenToWorkContentProps extends PageOpenToWorkContentReduxProps { - updateMemberPersonalizations: (infos: PersonalizationInfo[]) => void - createMemberPersonalizations: (infos: PersonalizationInfo[]) => void +interface PageOpenToWorkContentProps { + availableForGigs: boolean + updateMemberOpenForWork: (isOpenForWork: boolean) => void } export const PageOpenToWorkContent: FC = props => { const navigate: any = useNavigate() + const [loading, setLoading] = useState(false) + const shouldSavingData: MutableRefObject = useRef(false) const shouldNavigateTo: MutableRefObject = useRef('') - const { - loading, - personalizationInfo, - setPersonalizationInfo, - }: useAutoSavePersonalizationType = useAutoSavePersonalization( - props.reduxPersonalizations, - ['availableForGigs'], - props.updateMemberPersonalizations, - props.createMemberPersonalizations, - shouldSavingData, - ) - - const availableForGigsValue: boolean | undefined = useMemo(() => { - if (!personalizationInfo || personalizationInfo.availableForGigs === undefined) { - return blankPersonalizationInfo.availableForGigs - } - - return personalizationInfo.availableForGigs - }, [personalizationInfo]) - useEffect(() => { if (!loading && !shouldSavingData.current && !!shouldNavigateTo.current) { navigate(shouldNavigateTo.current) @@ -60,16 +34,18 @@ export const PageOpenToWorkContent: FC = props => { /* eslint-disable react-hooks/exhaustive-deps */ }, [loading]) - function checkToNavigateNextPage(pageUrl: string): void { - if (!personalizationInfo || personalizationInfo.availableForGigs === undefined) { - shouldNavigateTo.current = pageUrl - setPersonalizationInfo({ - ...(personalizationInfo || {}), - availableForGigs: blankPersonalizationInfo.availableForGigs, - }) - } else { - navigate(pageUrl) - } + function goToPreviousStep(): void { + navigate('../skills') + } + + function goToNextStep(): void { + navigate('../works') + } + + async function handleSaveAvailableForGigs(e: any): Promise { + setLoading(true) + await props.updateMemberOpenForWork(e.target.checked) + setLoading(false) } return ( @@ -90,15 +66,10 @@ export const PageOpenToWorkContent: FC = props => {
@@ -117,18 +88,14 @@ export const PageOpenToWorkContent: FC = props => { iconToLeft disabled={loading} icon={IconOutline.ChevronLeftIcon} - onClick={function previousPage() { - checkToNavigateNextPage('../skills') - }} + onClick={goToPreviousStep} /> @@ -137,22 +104,10 @@ export const PageOpenToWorkContent: FC = props => { ) } -const mapStateToProps: (state: any) => PageOpenToWorkContentReduxProps - = (state: any): PageOpenToWorkContentReduxProps => { - const { - loadingMemberTraits, - personalizations, - }: any = state.member - - return { - loadingMemberTraits, - reduxPersonalizations: personalizations, - } - } +const mapStateToProps: any = (state: any) => pick(state.member, 'availableForGigs') const mapDispatchToProps: any = { - createMemberPersonalizations, - updateMemberPersonalizations, + updateMemberOpenForWork, } export const PageOpenToWork: any = connect(mapStateToProps, mapDispatchToProps)(PageOpenToWorkContent) diff --git a/src/apps/onboarding/src/redux/actions/member.ts b/src/apps/onboarding/src/redux/actions/member.ts index 6f5809c26..1f3b506d5 100644 --- a/src/apps/onboarding/src/redux/actions/member.ts +++ b/src/apps/onboarding/src/redux/actions/member.ts @@ -1,6 +1,6 @@ import _ from 'lodash' -import { TokenModel, UserTraitCategoryNames, UserTraitIds } from '~/libs/core' +import { TokenModel, updateMemberProfileAsync, UserTraitCategoryNames, UserTraitIds } from '~/libs/core' import { getAsync as getAsyncToken } from '~/libs/core/lib/auth/token-functions/token.functions' import { createMemberTraits, @@ -396,6 +396,11 @@ export const setMemberPhotoUrl: any = (photoUrl: string) => ({ type: ACTIONS.MEMBER.UPDATE_MEMBER_PHOTO_URL, }) +export const setMemberOpenForWork: any = (isOpenForWork: boolean) => ({ + payload: isOpenForWork, + type: ACTIONS.MEMBER.SET_OPEN_FOR_WORK, +}) + export const updateMemberHomeAddresss: any = (addresses: MemberAddress[]) => async (dispatch: any) => { try { const tokenInfo: TokenModel = await getAsyncToken() @@ -436,3 +441,16 @@ export const updateMemberPhotoUrl: any = (photoURL: string) => async (dispatch: } catch (error) { } } + +export const updateMemberOpenForWork: any = (isOpenForWork: boolean) => async (dispatch: any) => { + try { + const tokenInfo: TokenModel = await getAsyncToken() + + await updateMemberProfileAsync( + tokenInfo.handle || '', + { availableForGigs: isOpenForWork }, + ) + dispatch(setMemberOpenForWork(isOpenForWork)) + } catch (error) { + } +} diff --git a/src/apps/onboarding/src/redux/reducers/member.ts b/src/apps/onboarding/src/redux/reducers/member.ts index 642ccf62f..f1d7442be 100644 --- a/src/apps/onboarding/src/redux/reducers/member.ts +++ b/src/apps/onboarding/src/redux/reducers/member.ts @@ -1,3 +1,4 @@ +/* eslint-disable complexity */ import _ from 'lodash' import { notifyUniNavi } from '~/apps/profiles/src/lib' @@ -19,6 +20,7 @@ const initialState: { connectInfo?: ConnectInfo loadingMemberTraits?: boolean loadingMemberInfo?: boolean + availableForGigs?: boolean } = { } @@ -35,6 +37,11 @@ const memberReducer: any = ( ...state, memberInfo: action.payload, } + case ACTIONS.MEMBER.SET_OPEN_FOR_WORK: + return { + ...state, + availableForGigs: action.payload, + } case ACTIONS.MEMBER.SET_WORKS: return { ...state,