diff --git a/src/apps/accounts/src/settings/tabs/tools/service-provider/ServiceProvider.module.scss b/src/apps/accounts/src/settings/tabs/tools/service-provider/ServiceProvider.module.scss index 1de4cfa45..791843c2d 100644 --- a/src/apps/accounts/src/settings/tabs/tools/service-provider/ServiceProvider.module.scss +++ b/src/apps/accounts/src/settings/tabs/tools/service-provider/ServiceProvider.module.scss @@ -41,6 +41,10 @@ grid-template-columns: 1fr 1fr; margin: $sp-13 0 $sp-4; + &.formNoTop { + margin-top: 0; + } + .formCTAs { display: flex; align-items: center; diff --git a/src/apps/accounts/src/settings/tabs/tools/service-provider/ServiceProvider.tsx b/src/apps/accounts/src/settings/tabs/tools/service-provider/ServiceProvider.tsx index 53644e14f..05ec76154 100644 --- a/src/apps/accounts/src/settings/tabs/tools/service-provider/ServiceProvider.tsx +++ b/src/apps/accounts/src/settings/tabs/tools/service-provider/ServiceProvider.tsx @@ -1,8 +1,9 @@ import { Dispatch, FC, MutableRefObject, SetStateAction, useEffect, useRef, useState } from 'react' import { bind, isEmpty, reject, trim } from 'lodash' import { toast } from 'react-toastify' +import classNames from 'classnames' -import { updateMemberTraitsAsync, UserProfile, UserTrait } from '~/libs/core' +import { createMemberTraitsAsync, updateMemberTraitsAsync, UserProfile, UserTrait } from '~/libs/core' import { Button, Collapsible, ConfirmModal, IconOutline, InputSelect, InputText } from '~/libs/ui' import { FinancialInstitutionIcon, @@ -21,6 +22,11 @@ interface ServiceProviderProps { profile: UserProfile } +const methodsMap: { [key: string]: any } = { + create: createMemberTraitsAsync, + update: updateMemberTraitsAsync, +} + const ServiceProvider: FC = (props: ServiceProviderProps) => { const formElRef: MutableRefObject = useRef() @@ -92,6 +98,7 @@ const ServiceProvider: FC = (props: ServiceProviderProps) setSelectedServiceProviderType(undefined) setSelectedServiceProviderName(undefined) formElRef.current.reset() + setIsEditMode(false) } function handleFormAction(): void { @@ -157,7 +164,7 @@ const ServiceProvider: FC = (props: ServiceProviderProps) setIsEditMode(false) }) } else { - updateMemberTraitsAsync( + methodsMap[!serviceProviderTypesData || !serviceProviderTypesData.length ? 'create' : 'update']( props.profile.handle, [{ categoryName: 'Service Provider', @@ -200,6 +207,8 @@ const ServiceProvider: FC = (props: ServiceProviderProps) trait.name === itemToRemove?.name && trait.serviceProviderType === itemToRemove?.serviceProviderType )) || [] + resetForm() + updateMemberTraitsAsync( props.profile.handle, [{ @@ -288,7 +297,7 @@ const ServiceProvider: FC = (props: ServiceProviderProps)

Add a new service provider

@@ -300,6 +309,7 @@ const ServiceProvider: FC = (props: ServiceProviderProps) label='Service Provider Type *' error={formErrors.serviceProviderType} dirty + placeholder='Select a Service Provider Type' /> = (props: SoftwareProps) => { const formElRef: MutableRefObject = useRef() @@ -85,6 +91,7 @@ const Software: FC = (props: SoftwareProps) => { setSelectedSoftwareType(undefined) setSelectedSoftwareName(undefined) formElRef.current.reset() + setIsEditMode(false) } function handleFormAction(): void { @@ -146,7 +153,7 @@ const Software: FC = (props: SoftwareProps) => { setIsEditMode(false) }) } else { - updateMemberTraitsAsync( + methodsMap[!softwareTypesData || !softwareTypesData.length ? 'create' : 'update']( props.profile.handle, [{ categoryName: 'Software', @@ -189,6 +196,8 @@ const Software: FC = (props: SoftwareProps) => { trait.name === itemToRemove?.name && trait.softwareType === itemToRemove?.softwareType )) || [] + resetForm() + updateMemberTraitsAsync( props.profile.handle, [{ @@ -267,7 +276,7 @@ const Software: FC = (props: SoftwareProps) => {

Add a new software

@@ -278,6 +287,7 @@ const Software: FC = (props: SoftwareProps) => { name='softwareTypes' label='Software Type *' error={formErrors.softwareType} + placeholder='Select a Software Type' dirty /> = (props: SubscriptionsProps) => { const formElRef: MutableRefObject = useRef() @@ -72,6 +78,7 @@ const Subscriptions: FC = (props: SubscriptionsProps) => { function resetForm(): void { setSelectedSubscriptionName(undefined) formElRef.current.reset() + setIsEditMode(false) } function handleFormAction(): void { @@ -131,7 +138,7 @@ const Subscriptions: FC = (props: SubscriptionsProps) => { setIsEditMode(false) }) } else { - updateMemberTraitsAsync( + methodsMap[!subscriptionsTypesData || !subscriptionsTypesData.length ? 'create' : 'update']( props.profile.handle, [{ categoryName: 'Subscription', @@ -174,6 +181,8 @@ const Subscriptions: FC = (props: SubscriptionsProps) => { trait.name === itemToRemove?.name )) || [] + resetForm() + updateMemberTraitsAsync( props.profile.handle, [{ @@ -251,7 +260,7 @@ const Subscriptions: FC = (props: SubscriptionsProps) => {

Add a new subscription

diff --git a/src/libs/core/lib/profile/profile-functions/index.ts b/src/libs/core/lib/profile/profile-functions/index.ts index 2278bfb47..7db6438ec 100644 --- a/src/libs/core/lib/profile/profile-functions/index.ts +++ b/src/libs/core/lib/profile/profile-functions/index.ts @@ -11,6 +11,7 @@ export { updateMemberMFAStatusAsync, updateMemberPasswordAsync, updateMemberTraitsAsync, + createMemberTraitsAsync, } from './profile.functions' export * from './profile-store' export * from './rating.functions' diff --git a/src/libs/core/lib/profile/profile-functions/profile-store/profile-xhr.store.ts b/src/libs/core/lib/profile/profile-functions/profile-store/profile-xhr.store.ts index 664f2b129..cbee64597 100644 --- a/src/libs/core/lib/profile/profile-functions/profile-store/profile-xhr.store.ts +++ b/src/libs/core/lib/profile/profile-functions/profile-store/profile-xhr.store.ts @@ -85,3 +85,10 @@ export async function updateMemberTraits( ): Promise { return xhrPutAsync(`${profileUrl(handle)}/traits`, traits) } + +export async function createMemberTraits( + handle: string, + traits: UserTraits[], +): Promise { + return xhrPostAsync(`${profileUrl(handle)}/traits`, traits) +} diff --git a/src/libs/core/lib/profile/profile-functions/profile.functions.ts b/src/libs/core/lib/profile/profile-functions/profile.functions.ts index 70f3e8b73..b6c074568 100644 --- a/src/libs/core/lib/profile/profile-functions/profile.functions.ts +++ b/src/libs/core/lib/profile/profile-functions/profile.functions.ts @@ -13,6 +13,7 @@ import { UserVerify } from '../user-verify.model' import { profileFactoryCreate } from './profile-factory' import { getMemberStats, getVerification, profileStoreGet, profileStorePatchName } from './profile-store' import { + createMemberTraits, getCountryLookup, updateMemberEmailPreferences, updateMemberMFA, @@ -108,3 +109,10 @@ export async function updateMemberTraitsAsync( ): Promise { return updateMemberTraits(handle, traits) } + +export async function createMemberTraitsAsync( + handle: string, + traits: UserTraits[], +): Promise { + return createMemberTraits(handle, traits) +} diff --git a/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.module.scss b/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.module.scss index fac611ba4..aa2ab320f 100644 --- a/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.module.scss +++ b/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.module.scss @@ -5,7 +5,7 @@ align-items: center; margin-top: $sp-1; cursor: pointer; - color: $black-100; + color: $black-60; &-icon { margin-left: auto; diff --git a/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.tsx b/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.tsx index d937e4cef..8be26c3d7 100644 --- a/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.tsx +++ b/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.tsx @@ -32,6 +32,7 @@ interface InputSelectProps { readonly name: string readonly onChange: (event: ChangeEvent) => void readonly options: ReadonlyArray + readonly placeholder?: string readonly tabIndex?: number readonly value?: string } @@ -79,6 +80,7 @@ const InputSelect: FC = (props: InputSelectProps) => { >
{selectedOption ? label(selectedOption) : ''} + {!selectedOption && !!props.placeholder ? props.placeholder : ''}