Skip to content

Commit

Permalink
chore(merge): merge conflicts
Browse files Browse the repository at this point in the history
  • Loading branch information
TheLeoB committed Dec 19, 2023
2 parents f37befc + 26ba9f3 commit 925b70f
Show file tree
Hide file tree
Showing 22 changed files with 214 additions and 216 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "blockchain-wallet-v4",
"version": "4.96.7",
"version": "4.96.10",
"license": "AGPL-3.0-or-later",
"private": true,
"author": {
Expand Down
18 changes: 13 additions & 5 deletions packages/blockchain-wallet-v4-frontend/src/assets/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
"buttons.edit": "Edit",
"buttons.go": "Go",
"buttons.go_back": "Go Back",
"buttons.go_to_bc_app": "Continue to Blockchain.com App",
"buttons.go_to_my_portfolio": "Go To My Portfolio",
"buttons.google_pay": "Google Pay",
"buttons.hide": "Hide",
Expand Down Expand Up @@ -2178,6 +2179,7 @@
"scenes.earn.table.type": "{product} Rewards",
"scenes.earnhistory.empty.description": "Once you start earning, those details will show up here.",
"scenes.earnhistory.empty.title": "Your transactions go here",
"scenes.email.login.lowercase": "Email addresses are case sensitive",
"scenes.exchange.changeinput": "Change Input",
"scenes.exchange.confirm.oopsheader": "Oops! Something went wrong.",
"scenes.exchange.connectnow": "Connect Now",
Expand Down Expand Up @@ -2257,11 +2259,12 @@
"scenes.login._device_verification_expired.copy": "The device approval link has expired, please try again.",
"scenes.login.account_recovery_options.title": "Account Recovery Options",
"scenes.login.account_signup": "Don't have a Blockchain Account?",
"scenes.login.checkemail": "If you have an account registered with this email address, you will receive an email with a link to verify your device.",
"scenes.login.checkemail": "Check your email and click the button or link to verify your email address. Open the link on this device.",
"scenes.login.checkemail_2": "Come back here after verifying your email.",
"scenes.login.device_verification_expired": "Verification link expired.",
"scenes.login.device_verification_rejected": "Device verification rejected.",
"scenes.login.device_verified": "Your device is verified!",
"scenes.login.device_verified.copy": "Return to previous browser to continue logging in.",
"scenes.login.device_verified": "Device verified!",
"scenes.login.device_verified.copy": "You can safely close this tab or page. Go back to the other Blockchain.com tab or page to continue.",
"scenes.login.email_guid": "Email or Wallet ID",
"scenes.login.enter_password.setting_goal.title": "Log Into Your Wallet to Continue",
"scenes.login.enter_password.settings_goal.subtitle": "For your security, we ask you to enter your password to continue to update your settings.",
Expand Down Expand Up @@ -2733,7 +2736,9 @@
"scenes.sofi.signup.success.mobile.title": "Your account was created successfully. Go to the Blockchain.com App to keep enjoying your crypto experience.",
"scenes.sofi.signup.success.title": "Your account was successfully created. Your crypto balances have been migrated.",
"scenes.sofi.signup.welcome.body": "Migrating your crypto from SoFi is super quick. Choose how you’d like to continue. We’ll take care of migrating your crypto.",
"scenes.sofi.signup.welcome.body.pending": "Your account migration is already pending.",
"scenes.sofi.signup.welcome.existing": "Already have a Blockchain account?",
"scenes.sofi.signup.welcome.existing.login": "Log into your account",
"scenes.sofi.signup.welcome.new": "New to Blockchain.com?",
"scenes.sofi.welcome.header": "Welcome to Blockchain.com!",
"scenes.sofi.welcome.modal.awaiting": "You`re almost there! We have just verify your SoFi account before the migration is finished.",
Expand Down Expand Up @@ -2826,15 +2831,18 @@
"scenes.verifyaccountrecovery.loading": "We're approving your request. Please wait...",
"scenes.verifyaccountrecovery.previous": "Return to the previous tab to continue recovering your Blockchain.com Account.",
"scenes.verifyemail.description": "We sent a verification email to <b>{email}</b>. Please click the link in the email to continue.",
"scenes.verifyemail.description_1": "Check your email and click the button or link to verify your email address.",
"scenes.verifyemail.description_2": "Come back here after verifying your email.",
"scenes.verifyemail.do_it_later": "I’ll Do This Later.",
"scenes.verifyemail.title": "Verify Your Email",
"scenes.verifyemailtoken.error": "Something went wrong.",
"scenes.verifyemailtoken.error.alreadyverified.message": "If this was not you, feel free to contact us.",
"scenes.verifyemailtoken.error.alreadyverified.title": "Your email is already verified.",
"scenes.verifyemailtoken.error.tryagain": "Try logging in again or contact support.",
"scenes.verifyemailtoken.loading": "We're verifying your email address. Please wait...",
"scenes.verifyemailtoken.return_new": "Return to the previous tab to access your Blockchain.com Account.",
"scenes.verifyemailtoken.verified": "Your email is verified!",
"scenes.verifyemailtoken.return_mobile_new": "Continue to the Blockchain.com app to access your account",
"scenes.verifyemailtoken.return_new": "You can safely close this tab or page. Go back to the other Blockchain.com tab or page to continue.",
"scenes.verifyemailtoken.verified": "Email Verified",
"scenes.wallet.menutop.balance.totalbalance": "Total Balance",
"scenes.wallet.menutop.balance.totalbalance.total": "Total Balance",
"scenes.walletguidreminder.error": "We were unable to process your request at this time. Please try again or contact support if the issue persists.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,9 @@ export default ({ api, coreSagas, networks }) => {
if (userEligibility?.useExternalTradingAccount?.enabled && !isSofi) {
return yield put(actions.router.push('/continue-on-phone'))
}
if (!isSofi) {
yield put(actions.modules.profile.fetchSofiUserStatus())
}

const guid = yield select(selectors.core.wallet.getGuid)
const isAccountReset: boolean = yield select(selectors.signup.getAccountReset)
Expand Down Expand Up @@ -434,7 +437,7 @@ export default ({ api, coreSagas, networks }) => {
} else {
yield put(actions.router.push('/home'))
}
yield put(actions.modules.profile.fetchSofiUserStatus())

yield call(fetchBalances)
yield call(saveGoals, firstLogin)
// We run goals in accountResetSaga in this case
Expand Down Expand Up @@ -960,6 +963,9 @@ export default ({ api, coreSagas, networks }) => {
if (isGuid(guidOrEmail) && product === ProductAuthOptions.WALLET) {
yield put(actions.form.change(LOGIN_FORM, 'guid', guidOrEmail))
yield put(actions.form.change(LOGIN_FORM, 'step', LoginSteps.ENTER_PASSWORD_WALLET))
} else if (isGuid(sofiLoginEmail) && product === ProductAuthOptions.WALLET) {
yield put(actions.form.change(LOGIN_FORM, 'guid', sofiLoginEmail))
yield put(actions.form.change(LOGIN_FORM, 'step', LoginSteps.ENTER_PASSWORD_WALLET))
} else if (product === ProductAuthOptions.EXCHANGE) {
// trigger email for exchange form
yield put(actions.form.change(LOGIN_FORM, 'exchangeEmail', exchangeEmail))
Expand Down
43 changes: 6 additions & 37 deletions packages/blockchain-wallet-v4-frontend/src/data/goals/sagas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,34 +48,6 @@ export default ({ api, coreSagas, networks }) => {
.getOrElse(false)
}

const sofiMigrationStatusCheck = function* () {
// If user is coming from sofi migration, awaiting user or pending, don't them this modal
const sofiMigrationInitialStatus = (yield select(
selectors.modules.profile.getSofiUserData
)).getOrElse(null)
const sofiMigrationStatus = (yield select(
selectors.modules.profile.getSofiMigrationStatus
)).getOrElse(null)
const sofiMigrationStatusFromPolling = (yield select(
selectors.modules.profile.getSofiMigrationStatusFromPolling
)).getOrElse(null)

if (
sofiMigrationInitialStatus ||
sofiMigrationStatusFromPolling ||
sofiMigrationInitialStatus === 'AWAITING_USER'
) {
return 'AWAITING_USER'
}
if (
sofiMigrationInitialStatus ||
sofiMigrationStatusFromPolling ||
sofiMigrationInitialStatus === 'PENDING'
) {
return 'PENDING'
}
}

// TODO: use new world deeplinking once merged
const defineExchangeSettingsGoal = function* (search) {
const params = new URLSearchParams(search)
Expand Down Expand Up @@ -860,13 +832,11 @@ export default ({ api, coreSagas, networks }) => {
const { isSofi: isSofiSignup } = yield select(selectors.signup.getProductSignupMetadata)
const isSofiAuth = yield select(selectors.auth.getIsSofi)
const isSofi = isSofiSignup || isSofiAuth
const sofiMigrationStatusFromPolling = (yield select(
selectors.modules.profile.getSofiMigrationStatusFromPolling
)).getOrElse(null)
const sofiMigrationStatus = yield select(selectors.modules.profile.getSofiUserMigrationStatus)
// the purpose of this modal is only to show it if
// user is logging in without sofi deeplink but needs to finish
// migratioon process
if (sofiMigrationStatusFromPolling === SofiUserMigrationStatus.AWAITING_USER && !isSofi) {
if (sofiMigrationStatus === SofiUserMigrationStatus.AWAITING_USER && !isSofi) {
yield put(
actions.goals.addInitialModal({
data: { origin },
Expand Down Expand Up @@ -1088,15 +1058,14 @@ export default ({ api, coreSagas, networks }) => {
kycVerification: { enabled: false }
} as ProductEligibilityForUser)

const sofiStatus = yield call(sofiMigrationStatusCheck)
const sofiPending = sofiStatus === 'PENDING'
const sofiAwaitingUser = sofiStatus === 'AWAITING_USER'
const { isSofi: isSofiSignup } = yield select(selectors.signup.getProductSignupMetadata)
const isSofiAuth = yield select(selectors.auth.getIsSofi)
const isSofi = isSofiSignup || isSofiAuth

if (
current < 2 &&
!hasCowboysTag &&
!sofiPending &&
!sofiAwaitingUser &&
!isSofi &&
products?.kycVerification?.enabled &&
kycState !== KYC_STATES.REJECTED
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ export const INITIATE_SOFI_LANDING = '@DATA.INITIATE_SOFI_LANDING'

export const SET_SOFI_LINK_DATA = '@DATA.SET_SOFI_LINK_DATA'
export const FETCH_SOFI_USER_STATUS = '@DATA.FETCH_SOFI_USER_STATUS'
export const SET_SOFI_USER_STATUS = '@DATA.SET_SOFI_USER_STATUS'
export const SET_SOFI_USER_STATUS_FROM_POLLING = '@DATA.SET_SOFI_USER_STATUS_FROM_POLLING'
export const SET_SOFI_MIGRATED_BALANCES = '@DATA.SET_SOFI_MIGRATED_BALANCES'
export const SOFI_REDIRECT_AFTER_EMAIL_VERIFICATION = '@DATA.SOFI_REDIRECT_AFTER_EMAIL_VERIFICATION'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,3 +242,8 @@ export const setSofiMigratedBalances = (balances) => ({
export const sofiRedirectAfterEmailVerification = () => ({
type: AT.SOFI_REDIRECT_AFTER_EMAIL_VERIFICATION
})

export const setSofiUserStatus = (sofiUserStatus) => ({
payload: { sofiUserStatus },
type: AT.SET_SOFI_USER_STATUS
})
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const INITIAL_STATE: ProfileState = {
sofiMigrationStatus: Remote.NotAsked,
sofiMigrationStatusFromPolling: Remote.NotAsked,
sofiMigrationTransferedBalances: Remote.NotAsked,
sofiUserMigrationStatus: null,
userCampaigns: Remote.NotAsked,
userData: Remote.NotAsked,
userRiskSettings: Remote.NotAsked,
Expand Down Expand Up @@ -284,6 +285,13 @@ export function profileReducer(state = INITIAL_STATE, action: ProfileActionTypes
}
}

case AT.SET_SOFI_USER_STATUS: {
return {
...state,
sofiUserMigrationStatus: action.payload.sofiUserStatus
}
}

default:
return state
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,12 +263,17 @@ export default ({ api, coreSagas, networks }) => {

const generateAuthCredentials = function* () {
const retailToken = yield call(generateRetailToken)
const { isSofi } = yield select(selectors.signup.getProductSignupMetadata)
const cookies = new Cookies()
const partnerReferralCode = cookies.get('partnerReferralCode')
const partnerReferralCodeFromCookie = cookies.get('partnerReferralCode')
const { token: nabuLifetimeToken, userId: nabuUserId } = yield call(
api.createOrGetUser,
retailToken,
partnerReferralCode
isSofi
? 'SOFI_MIGRATION'
: partnerReferralCodeFromCookie === 'sofi'
? 'SOFI_MIGRATION'
: partnerReferralCodeFromCookie
)
// write to both to support legacy mobile clients
// TODO: in future, consider just writing to unifiedCredentials entry
Expand Down Expand Up @@ -742,6 +747,10 @@ export default ({ api, coreSagas, networks }) => {

let sofiUserState = response.sofiJwtPayload?.state
let sofiUserCountry = response.sofiJwtPayload?.country || 'US'
if (!sofiUserState) {
yield put(A.fetchSofiMigrationStatusFailure('missing US state'))
return yield put(actions.router.push('/sofi'))
}
if (sofiUserState.substring(0, 2) !== 'US') {
sofiUserState = 'US-' + sofiUserState
}
Expand Down Expand Up @@ -770,16 +779,22 @@ export default ({ api, coreSagas, networks }) => {

const fetchSofiUserStatus = function* () {
try {
yield call(waitForUserData)
const response = yield call(api.sofiMigrationStatusNabuToken)
yield put(A.setSofiUserStatusFromPolling(response?.migrationStatus))
yield put(A.setSofiUserStatus(response.migrationStatus))

if (response.migrationStatus === 'SUCCESS' || response.migrationStatus === 'PENDING') {
if (response.migrationStatus === 'SUCCESS') {
yield put(A.setSofiMigratedBalances(response?.balances))
return true
}
if (response.migrationStatus === 'AWAITING_USER') {
return true

if (response.migrationStatus === 'PENDING') {
yield put(A.setSofiMigratedBalances(response?.balances))
}
// i don't think i want to dot his
// if (response.migrationStatus === 'AWAITING_USER') {
// return true
// }
if (response?.migrationStatus === 'FAILURE' || !response?.migrationStatus) {
return true
}
Expand All @@ -802,10 +817,15 @@ export default ({ api, coreSagas, networks }) => {

const userStatusResponse = yield call(api.sofiMigrationStatusNabuToken)

if (userStatusResponse.migration_status === SofiUserMigrationStatus.SUCCESS) {
yield put(A.setSofiMigratedBalances(response.balances))
if (userStatusResponse.migrationStatus === SofiUserMigrationStatus.SUCCESS) {
yield put(A.setSofiMigratedBalances(userStatusResponse.balances))
}
if (userStatusResponse.migrationStatus === SofiUserMigrationStatus.PENDING) {
yield put(A.setSofiMigratedBalances(userStatusResponse?.balances))
yield put(A.fetchSofiUserStatus())
}
yield put(A.migrateSofiUserSuccess(response))
yield put(A.setSofiUserStatus(response.migration_status))
} catch (e) {
yield put(
A.migrateSofiUserFailure({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,9 @@ export const getSofiAssociateNabuUserStatus = (state: RootState) =>
export const getSofiMigrationStatusFromPolling = (state: RootState) =>
state.profile.sofiMigrationStatusFromPolling

export const getSofiUserMigrationStatus = (state: RootState) =>
state.profile.sofiUserMigrationStatus

export const getSofiMigrationTransferedBalances = (state: RootState) =>
state.profile.sofiMigrationTransferedBalances

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ export interface ProfileState {
sofiMigrationStatus: RemoteDataType<SofiMigrationErrorType, any>
sofiMigrationStatusFromPolling: RemoteDataType<string, SofiUserMigrationStatus>
sofiMigrationTransferedBalances: RemoteDataType<string, SofiMigratedBalances>
sofiUserMigrationStatus: SofiUserMigrationStatus | null
userCampaigns: RemoteDataType<NabuApiErrorType, UserCampaignsType>
userData: RemoteDataType<NabuApiErrorType, UserDataType>
userRiskSettings: RemoteDataType<NabuApiErrorType, UserRiskSettings>
Expand Down Expand Up @@ -468,6 +469,11 @@ interface SetSofiMigratedBalancesAction {
type: typeof AT.SET_SOFI_MIGRATED_BALANCES
}

interface SetSofiUserStatusAction {
payload: { sofiUserStatus: SofiUserMigrationStatus }
type: typeof AT.SET_SOFI_USER_STATUS
}

export type ProfileActionTypes =
| AssociateSofiUserSignupAction
| AssociateSofiUserLoginAction
Expand Down Expand Up @@ -513,6 +519,7 @@ export type ProfileActionTypes =
| SetLinkToExchangeAccountDeeplinkAction
| SetSofiLinkDataAction
| SetSofiMigratedBalancesAction
| SetSofiUserStatusAction
| SetSofiUserStatusFromPollingAction
| ShareWalletAddressesWithExchange
| ShareWalletAddressWithExchangeFailureAction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,14 @@ import NoAssetsMigrated from './template.noassets'

const SofiMigratedBalances = (props: Props) => {
const dispatch = useDispatch()

const balances = useSelector(
selectors.modules.profile.getSofiMigrationTransferedBalances
).getOrElse([]) as Array<{ amount: number; currency: string }>
const sofiMigrationUserStatus = useSelector(
(state: RootState) => state.profile.sofiUserMigrationStatus
)

const sofiMigrationStatus = useSelector(
(state: RootState) => state.profile.sofiMigrationStatus
).getOrElse(null)
const sofiMigrationStatusFromPolling = useSelector(
(state: RootState) => state.profile.sofiMigrationStatusFromPolling
).getOrElse(null)

const statusPending =
sofiMigrationStatus === SofiUserMigrationStatus.PENDING ||
sofiMigrationStatusFromPolling === SofiUserMigrationStatus.PENDING
const statusPending = sofiMigrationUserStatus === SofiUserMigrationStatus.PENDING

const viewAccountClick = () => {
dispatch(actions.modals.closeModal(ModalName.SOFI_MIGRATED_BALANCES))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,28 +21,18 @@ const Body = styled(ModalBody)`
const SofiWelcome = (props: Props) => {
const dispatch = useDispatch()
const sofiMigrationStatus = useSelector(
(state: RootState) => state.profile.sofiMigrationStatus
).getOrElse(null)
const sofiMigrationStatusFromPolling = useSelector(
(state: RootState) => state.profile.sofiMigrationStatusFromPolling
).getOrElse(null)
(state: RootState) => state.profile.sofiUserMigrationStatus
)

// TODO: may need to optimize this to load if both statuses are null
// so it doesn't start as one or finish in another.
// i don't think this will happen in real cases since migration since this
// modal shows only after ssn verification
const statusPending =
sofiMigrationStatus === SofiUserMigrationStatus.PENDING ||
sofiMigrationStatusFromPolling === SofiUserMigrationStatus.PENDING
const statusSuccess =
sofiMigrationStatus === SofiUserMigrationStatus.SUCCESS ||
sofiMigrationStatusFromPolling === SofiUserMigrationStatus.SUCCESS
const statusFailure =
sofiMigrationStatus === SofiUserMigrationStatus.FAILURE ||
sofiMigrationStatusFromPolling === SofiUserMigrationStatus.FAILURE
const statusPending = sofiMigrationStatus === SofiUserMigrationStatus.PENDING

const statusAwaitingUser =
sofiMigrationStatus === SofiUserMigrationStatus.AWAITING_USER ||
sofiMigrationStatusFromPolling === SofiUserMigrationStatus.AWAITING_USER
const statusSuccess = sofiMigrationStatus === SofiUserMigrationStatus.SUCCESS
const statusFailure = sofiMigrationStatus === SofiUserMigrationStatus.FAILURE
const statusAwaitingUser = sofiMigrationStatus === SofiUserMigrationStatus.AWAITING_USER

const continueButtonClick = () => {
dispatch(actions.modals.closeModal(ModalName.SOFI_BLOCKCHAIN_WELCOME))
Expand Down
Loading

0 comments on commit 925b70f

Please sign in to comment.