{"version":3,"sources":["v2/api/rest/banking.ts","reducers/auth/common.js","reducers/auth/mfa.js","reducers/account.js","lib/urls.js","api/rest.js","reducers/auth/signup.js","api/index.js","v2/utils/index.ts","components/LoadingSpinner.js","v2/pages/dashboard/entityOnboarding/constants.ts","v2/api/rest/data.ts","v2/api/hooks/useGetLiveAccounts.tsx","v2/api/hooks/useGetPaperAccountsWithDetails.tsx","v2/providers/AccountProvider.tsx","reducers/profile.js","AuthCheck.js","pages/RootRedirect/index.js","authMethods.js","Intercom.tsx","Wireframe.tsx","components/AlpacaComponents/Text/Subtitle.js","components/AlpacaComponents/Text/LargeParagraph.js","components/AlpacaComponents/Text/Link.js","components/AlpacaComponents/Text/Text.js","components/AlpacaComponents/Text/Title.js","reducers/app.js","reducers/userData.js","reducers/transfer.js","reducers/profitloss/profitloss.js","reducers/index.js","store.js","websocket.js","shims.ts","Sentry.js","index.tsx","v2/api/rest/onboarding.ts","v2/api/hooks/useRequest.tsx","selectors/index.js","v2/path.ts","reducers/auth/accountList.js","v2/components/Layout.tsx","v2/api/auth/index.ts","v2/utils/cookies.ts","v2/api/rest/elite.ts","v2/api/rest/currencyCloud.ts","pages/User/ProfilePage/ProfileContainer/common.js","utils/intercom.js","v2/api/rest/billing.ts","v2/api/rest/account.ts","v2/utils/formatting.tsx","v2/pages/dashboard/entityOnboarding/timer.ts","utils/index.js","reducers/auth/cognito.js","v2/api/hooks/useMutationRequest.tsx","v2/api/rest/index.ts","v2/helpers/flags.ts","reducers/alpacaAuth/session.js","v2/api/rest/relationships.ts","reducers/accessKeys.js","v2/api/hooks/useGetMargin.tsx","hooks/useLocalStorage.tsx","v2/pages/dashboard/entityOnboarding/util.ts","v2/api/rest/plaid.ts","AmplitudeProvider.js","utils/isNotFullActiveAccount.js","v2/api/hooks/useGetCitizenship.tsx","v2/api/hooks/useGetCryptoEnabled.tsx","v2/api/hooks/useGetAccountDetails.tsx","v2/api/hooks/useGetCountryInfos.tsx","v2/api/hooks/useLock.tsx","v2/api/rest/portfolio.ts","v2/api/hooks/useGetPortfolioHistory.tsx","v2/api/hooks/useGetPositions.tsx","v2/api/hooks/useGetStatus.tsx","v2/api/hooks/useGetAsset.tsx","v2/api/hooks/useGetOrderbooks.tsx","v2/api/hooks/useGetPosition.tsx","v2/api/hooks/useGetClock.tsx","v2/api/hooks/useGetOrders.tsx","v2/api/hooks/useGetCryptoSnapshots.tsx","v2/api/hooks/useGetAccessKeys.tsx","v2/api/hooks/usePlaid.ts","v2/api/hooks/useGetCountries.tsx","v2/api/hooks/useGetTrustedAccount.tsx","v2/api/hooks/useGetActivities.tsx","v2/api/hooks/useGetAchRelationships.tsx","v2/api/hooks/useGetCashWithdrawable.tsx","v2/api/hooks/useGetAllTransfers.tsx","v2/api/hooks/useGetAllRelationships.tsx","v2/api/hooks/useGetWatchlists.tsx","v2/api/hooks/useGetWatchlist.tsx","v2/api/hooks/useGetQuotes.tsx","v2/api/rest/ip.ts","v2/api/hooks/useGetIpAddress.tsx","v2/api/hooks/useGetOptionsApprovalStatus.ts","v2/api/hooks/useGetOwnerDocuments.tsx","v2/api/hooks/useGetEliteNetDeposits.tsx","v2/api/hooks/useGetEliteAlgoRouting.tsx","v2/api/hooks/useGetElitePerks.tsx","v2/api/hooks/usePostAccountDocument.tsx","v2/api/hooks/usePostW8Ben.tsx","v2/api/hooks/useGetAccountDocumentRequests.tsx","v2/api/hooks/useGetAccountDocumentUploads.tsx","v2/api/hooks/useGetCurrencyCloud.tsx","v2/api/hooks/index.tsx","components/common/card.tsx","v2/components/Card.tsx","v2/pages/dashboard/optionsOptIn/util.ts","v2/api/rest/entityOnboarding.ts","v2/components/Page.tsx","v2/pages/index.tsx","v2/api/hooks/useDarkMode.tsx","v2/api/hooks/useGetAssets.tsx","v2/components/common/topbar/OptionsTopBarButton.tsx","v2/components/common/topbar/index.tsx","v2/pages/dashboard/home/paperBanner.tsx","v2/components/Sidebar/SidebarAccountItem.tsx","v2/components/Sidebar/CreatePaperAccountModal.tsx","v2/components/Sidebar/SidebarAccountSwitcher.tsx","v2/components/Sidebar/SidebarItem.tsx","v2/components/Sidebar/SidebarSettings.tsx","v2/components/Sidebar/SidebarToggle.tsx","v2/components/Sidebar/Sidebar.tsx","v2/components/common/page.tsx","utils/crypto.js","v2/theme.ts","v2/api/hooks/useGetBillingOverview.tsx","v2/api/hooks/useGetOwners.tsx","utils/clearingBroker.js","reducers/billing.js","v2/api/hooks/useGetCryptoFeeStructure.tsx","v2/api/hooks/useGetCryptoMonthlyVolume.tsx","MFAGuard.js","components/Utilities/AntPhoneInput.js","components/Utilities/Markdown.js","reducers/auth/logout.js","v2/api/hooks/useGetAccount.tsx","pages/User/ProfilePage/ProfileContainer/AccountSecurity.js","reducers/accountDocuments.js","reducers/position/position.js","reducers/order/order.js","reducers/countryInfo.js","v2/api/hooks/useOnfido.ts","v2/api/rest/onfido.ts","v2/api/index.ts","utils/eventTracker.js","lib/cookies.js","reducers/trade/trade.js"],"names":["getAchTransfers","async","instance","get","concat","accountId","data","deleteAchTransfer","transferId","delete","createAchTransfer","req","post","getRapydTransfers","res","forEach","t","status","transfer_status","type","direction","getAchRelationships","deleteAchRelationship","relationshipId","getBankInstitution","institutionId","institution","getCashWithdrawable","_res$data$cash_withdr","Number","cash_withdrawable","postFundingSurvey","accountID","survey","NS","_setFrom","createAction","_setPasswordWasReset","setUserState","setAccountVerificationRequired","setResentAccountVerification","setAccountVerificationError","setEmailUpdateVerificationRequired","initAmplify","Amplify","configure","Auth","identityPoolId","window","env","COGNITO_IDENTITY_POOL_ID","region","COGNITO_REGION","userPoolId","COGNITO_USER_POOL_ID","userPoolWebClientId","COGNITO_CLIENT_ID","endpoint","COGNITO_ENDPOINT","authenticationFlowType","COGNITO_AUTH_FLOW","mandatorySignIn","cookieStorage","domain","location","hostname","path","expires","secure","ENV","Storage","bucket","COGNITO_BUCKET","initUser","refreshAccountInfo","arguments","length","undefined","dispatch","getState","getCookieValue","a","b","document","cookie","match","pop","getCurrentAuthenticatedUser","then","userState","setDomainJWT","account","id","getAccount","action","payload","cognitoAccountIdAttr","attributes","accountEmail","email","cognitoAccountEmail","updateUserAttributes","toLowerCase","setTimeout","retryGbEmail","retryCognitoEmail","updateAccountOwner","Promise","all","loadAccountDetails","state","age","details","Date","getFullYear","date_of_birth","algoId","trade","ownerRefId","sha1","owner_id","substring","traits","createdAt","created_at","apexApprovalStatus","apex_approval_status","ownerId","refId","name","firstName","given_name","lastName","family_name","buyingPower","parseFloat","buying_power","cash","portfolioValue","portfolio_value","tradingBlocked","trading_blocked","transfersBlocked","transfers_blocked","country","address","clearing_broker","referrerCampaignName","referrerCampaignSource","referrerCampaignMedium","referrerCampaignContent","referrerCampaignTerm","referrerURL","updateIntercom","catch","err","console","error","reject","user","jwt","join","createReducer","from","param","passwordWasReset","_ref","accountVerificationRequired","submitForms","accountVerificationError","resentAccountVerification","emailUpdateVerificationRequired","failedLogin","forgotPasswordVerification","isHideLogin","_setCurrentMFAMethod","_setTOTPQRCode","_setTOTSetupVerificationError","MFAMethods","SOFTWARE_TOKEN_MFA","method","displayName","SMS_MFA","NOMFA","enableMFA","getUserData","setPreferredMFA","currentMFAMethod","bypassCache","disableMFA","notification","open","message","getPreferredMFA","response","debug","setupTOTP","code","authCode","verifyTOTPToken","challengeAnswer","verifyTotpToken","TOTPQRCode","TOTPSetupVerificationError","TOTPQRVerificationError","baseCreateAction","_setAccount","_setAccountDetails","_setTrustedContact","_setPaperAccount","unsetPaperAccount","_setPaperAccounts","_setSyncAccounts","_setRelationships","_setWireBanks","_setInstitution","_setCreateRelationshipStatus","_setCreateWireBankStatus","clearCreateRelationshipStatus","clearCreateWireBankStatus","_setPlaidToken","_setTransfers","_setActivities","_setDocuments","_setAffiliates","_setOnfidoSDKToken","_setOnfidoApplicantID","_reqConfigs","_setConfigs","_setOwnerProps","onboardingApiAction","fn","_len","args","Array","_key","token","getSessionJWT","handleSessionExpire","ok","getAlpacaAccountId","auth","signInUserSession","idToken","associatedAccountId","accountList","Error","resolve","accounts","cognitoUser","e","kyc","JSON","parse","localStorage","getItem","setItem","stringify","source","api","create","list","ownerDetails","patchAccountDetail","params","patch","postTrustedContact","resetOnboarding","relationships","map","relationship","transfers","transfer","accessKeys","key","push","trustedContact","result","listAffiliates","affiliates","getOnfidoSDKToken","onfidoSdkToken","description","patchOnfidoOutcome","_","body","createOnfidoApplicant","onfidoApplicant","onfido_details","applicant_id","updateOnfidoApplicant","postAffiliate","deleteAffiliate","affiliateId","postDataAgreement","agreementName","agreementText","dataAgreement","postTaxForm","formName","taxForm","updateAccountDetails","getAccountIdAndJWT","owner","loadOwnerProps","level","download","ownerProps","Body","_err$response","put","listTransfers","xfers","syncAccounts","newAccountState","listDocuments","documents","getDocumentUrl","documentId","url","Accept","_ref2","_ref3","props","paper","current","paper_account_id","docs","x","dup","y","date","mergeDocuments","wireBanks","createRelationshipStatus","createWireBankStatus","plaidToken","institutions","institution_id","logoUrl","logo","activities","is_fetching","configs","Object","assign","onfido_sdk_token","_payload$onfido_detai","onfido_applicant_id","parameterizeUrl","urlDescriptor","keys","reduce","replace","indexOf","TypeError","apiAction","options","public","populateUrl","urlParams","headers","logout","populatedUrl","REST","GET","POST","PATCH","DELETE","InvalidCredentialException","constructor","super","this","NotFoundException","ApiException","endpointOverride","API_URL","requestHeaders","process","Authorization","request","test","query","querystring","toString","includes","fetch","resp","_resp$headers$get","startsWith","blob","json","errValues","log","finally","Sentry","scope","setExtras","requestEmail","verifyEmail","joinCryptoWaitlist","refBy","getCookie","eraseCookie","referralSucceededOrUndefined","referredBy","eventTracker","category","referralErrorMessage","accountCreated","resetPassword","requestResetPassword","requestVerifyEmail","tradeAccount","getETC","getETCLast","paperTradeAccount","paperAccounts","paperId","reset","patchESign","recovery","accessToken","keyId","paperAccessKeys","paperAccountId","addresses","positions","symbol","liquidate","liquidatePosition","paperPositions","orders","listBySymbol","cancelAll","getOrder","cancelOrder","replaceOrder","paperOrders","rapyd","wallet","countries","paymentMethods","getForCountry","exchange","calculate","currencyCloud","beneficiary","rewards","view","verify","plaidStripe","paperActivities","accountDocuments","listRequests","listUploads","upload","docId","subType","formData","uploadByDocType","docType","docSubType","profitloss","paperProfitloss","portfolio","paperPortfolio","agreement","agreement_text","dataAgreementV2","onfidoResubmission","resubmit","paperConfigs","billing","plans","coupon","overview","stripe","update","cancel","alpaca","assets","search","quotes","contests","enrollment","leaderboard","getAllTime","getParticipant","getRestrictedCountries","getCountryInfos","crypto","createFee","getMonthlyVolume","weakEncrypt","str","CryptoJS","AES","encrypt","SHARED_SECRET","parseAddress","geocode","getGeocode","components","address_components","getField","entry","types","short_name","long_name","street_address","trim","city","postal_code","isDisclosed","some","isPaperOrOnboarding","getPercentageChange","oldNumber","newNumber","parsedOldNumber","percentage","isFinite","isNaN","renameFile","file","File","lastModified","useArrayToMap","values","property","useMemo","curr","set","Map","LoadingSpinner","styled","div","withConfig","componentId","ENTITY_TYPES","FUNDING_SOURCES","value","label","startCase","FUNDING_SOURCES_OPTIONS","BUSINESS_TYPES","INTENDED_ACCOUNT_USES","INTENDED_ACCOUNT_USES_OPTIONS","RANGES","setFullYear","min","max","RANGE_OPTIONS","entries","toLocaleString","REQUIRED_ERR_MSG","USA","USA_STATES_MAP","AL","AK","AS","AZ","AR","CA","CO","CT","DE","DC","FM","FL","GA","GU","HI","ID","IL","IN","IA","KS","KY","LA","ME","MH","MD","MA","MI","MN","MS","MO","MT","NE","NV","NH","NJ","NM","NY","NC","ND","MP","OH","OK","OR","PW","PA","PR","RI","SC","SD","TN","TX","UT","VT","VI","VA","WA","WV","WI","WY","FILE_MAX_SIZE","FILE_SIZE_LABEL","FILE_SIZE_ERR_MSG","FILE_ACCEPTED_TYPES","FILE_TYPE_ERR_MSG","DEFAULT_BUSINESS_INFO_VALUES","is_legal_entity","legal_name","entity_type","entity_type_other_description","is_exempt_from_tax_under_501a","is_participating_fatca","type_of_business","type_of_business_other_free_text","country_of_incorporation","state_of_incorporation","date_of_incorporation","business_registration_number","country_of_tax_residence","tax_id","tax_id_type","phone_number","unit","intended_use_of_account","liquid_net_worth_min","liquid_net_worth_max","total_net_worth_min","total_net_worth_max","annual_income_min","annual_income_max","funding_source","DEFAULT_ACCOUNT_OPENER_VALUES","is_legal_account_opener","title_at_company","country_of_citizenship","middle_name","is_affiliated_exchange_or_finra","affiliated_firm","is_control_person","controlling_firms","is_politically_exposed","immediate_family_exposed","DEFAULT_AUTHORIZED_INDIVIDUAL_VALUES","is_authorized_individual","DEFAULT_UBO_VALUES","is_ubo","percentage_ownership","DEFAULT_DOCUMENTS_VALUES","entity_operating_confirmed","authorized_individual_id_confirmed","ubo_id_confirmed","entity_operating_uploaded","entity_registration_confirmed","entity_registration_uploaded","w9_uploaded","w_8ben_uploaded","w_8bene_uploaded","entity_formation_confirmed","entity_formation_uploaded","DEFAULT_AGREEMENTS_VALUES","certifications_and_resolutions_accepted","ubo_acknowledged","customer_agreement_acknowledged","digital_signature_acknowledged","id_verification_acknowledged","TAX_FORM_URLS","W9","W8_BENE","CUSTOMER_AGREEMENT_URL","NOT_ALLOWED_LEGAL_ENTITY_TAX_ID_TYPES","NOT_ALLOWED_OWNER_TAX_ID_TYPES","NOT_SPECIFIC_TAX_ID_TYPE","id_type","regexp","getQuotes","symbols","getClock","getOrderbooks","baseURL","CRYPTO_DATA_API_URL","getCryptoSnapshots","getCryptoAssets","getOptionsContracts","underlying_symbol","expiration_date_gte","moment","format","expiration_date","product","PAPER_API_ENDPOINT","URLSearchParams","limit","getOptionsContract","getOptionChainSnapshots","_ref6","OPTION_CHAIN_DATA_API_URL","useGetLiveAccounts","isLoading","refetch","useRequest","getLiveAccounts","refetchInterval","useGetPaperAccountsWithDetails","_paper_accounts$map","paper_accounts","getPaperAccounts","paperAccountsWithDetails","isDetailLoading","p","getPaperAccountsWithDetails","ACCOUNT_CONTEXT_DEFAULTS","liveAccounts","paperAccountsNoDetail","refetchLiveAccounts","refetchPaperAccounts","currentAccount","setCurrentAccount","setProduct","AccountContext","createContext","AccountProvider","children","cognito","useState","lastUpdatedAt","setLastUpdatedAt","savedAccountId","setSavedAccountId","useLocalStorage","isLiveAccountsLoading","enabled","isPaperAccountsLoading","handleSetCurrentAccount","getAccountReduxStoreFormat","handleSyncRedux","useEffect","currentProduct","_window$localStorage$","getCurrentProduct","initialAccount","find","liveAccount","paperAccount","_liveAccounts$find","React","createElement","Provider","resetAccount","useAccountContext","useContext","_currentAccount$id","_paperAccountsNoDetai","REDUCER","_setPhoneNumberToVerify","_setPhoneNumberVerificationError","submit","updateInCognito","old_password","new_password","changePassword","refreshUserAttributes","resendAttributeVerification","attribute","verifyCurrentUserAttribute","freshUser","phoneNumberToVerify","phoneNumberVerificationError","AuthCheck","connect","_dec","_class","Component","load","cognitoActions","cognitoResponse","accountListActions","attrs","utm_params","crypto_broker","componentDidMount","componentDidUpdate","render","_accountList$error","routeProps","Redirect","to","Fragment","destination","redirector","pathname","prevPathname","fireLinkedInPixel","partnerId","_linkedin_partner_id","element","alt","height","width","src","component","RootRedirect","accountState","setRequestedPath","sessionStorage","requireLogin","email_verified","requireLiveActive","loginCheck","requireCrytpoActive","_window$env$ENABLE_CO","ENABLE_COIN_TRANSFERS","crypto_status","checkLogin","Intercom","useGetAccount","useGetAccountDetails","getIntercomUserHash","userHash","initializeIntercom","Wireframe","toggle","event","ctrlKey","documentElement","classList","addEventListener","removeEventListener","Link","margin","fontSize","h2","_setLoading","setFormInvalid","setUpdatingContent","setActiveDialog","deleteDialogForm","addSubmitForm","deleteSubmitForm","setLayoutState","setOpenKeys","invalidForms","isUpdatingContent","layoutState","newState","openKeys","activeDialog","dialogForms","isMenuTop","disableAppMenu","menuMobileOpened","menuCollapsed","menuShadow","showBrandInHeader","themeLight","settingsOpened","_setUserData","loaded","_upsertTransfer","_setStatus","clearTransferRequest","transferCreator","bankId","amount","relationship_id","bank_id","transfer_type","AmplitudeProvider","_setProfitLoss","_newState$accountId","previousRetrieval","profitLossDay","day_plpc","profitLossTotal","total_plpc","createRootReducer","history","combineReducers","router","connectRouter","pendingTasks","pendingTasksReducer","app","mfa","profile","userData","position","order","form","formReducer","countryInfo","actions","Subject","middlewares","store","next","routerMiddleware","thunk","createStore","composeWithDevTools","applyMiddleware","liveEndpoint","STREAM_ENDPOINT","paperEndpoint","PAPER_STREAM_ENDPOINT","subjects","sockets","authMsg","cognito_token","send","socket","WebSocket","onmessage","reader","FileReader","onload","stream","streams","readAsText","onerror","onclose","onopen","union","intersection","difference","dsn","SENTRY_DSN","release","environment","integrations","Integrations","BrowserTracing","SecondaryIntegrations","ignoreErrors","version","AuthCheckRoute","useCallback","Route","subscribe","getApiToken","getAccountIdForProduct","initWebsocket","queryClient","QueryClient","ConnectedRoutes","cognitoStatus","NewAccountV2Importer","NewAccount","Layout","showSearchInHeader","noHeader","importer","ConnectedRouter","Toaster","CookieConsent","buttonText","cookieName","style","background","buttonStyle","color","marginRight","href","Switch","loadable","exact","split","filter","ReactDOM","QueryClientProvider","client","ConfigProvider","locale","enGB","getElementById","acceptW8","createAffiliate","addressPatch","disclosuresPatch","confirmDetails","kycPatch","getCountries","previousStepPatch","resetPatch","queryKey","queryFn","toast","useToast","defaultQueryOptions","onError","isActive","getErrorMessage","defaultToastSettings","useQuery","isAlpacaAccountCreated","getAlpacaAccount","getPaperAccountId","isLiveAccountActive","_account$account","_liveAccount$status","isLiveAccountClosedOrDisabled","Path","ROUTE_LOGIN","ROUTE_DASHBOARD","ROUTE_POSITIONS","ROUTE_ORDERS","ROUTE_TRADE","ROUTE_ACCOUNT_ACTIVITIES","ROUTE_DOCUMENTS","ROUTE_BALANCES","ROUTE_CONFIGURATION","ROUTE_IP_ALLOWLIST","ROUTE_CRYPTO_TRANSFERS","ROUTE_ALPACA_CONNECT","ROUTE_ALPACA_CONNECT_SUBMIT","ROUTE_ALPACA_CONNECT_APP","ROUTE_ALPACA_PROFILE","ROUTE_NEW_ACCOUNT","ROUTE_USER_SUBSCRIPTION","ROUTE_PLANS_AND_FEATURES","ROUTE_USER_SUBSCRIPTION_NEW","ROUTE_OPTIONS_OPT_IN_FINANCIAL_PROFILE","ROUTE_OPTIONS_OPT_IN_INVESTMENT_EXPERIENCE","ROUTE_OPTIONS_OPT_IN_SPREADS","ROUTE_OPTIONS_OPT_IN_AGREEMENT","ROUTE_OPTIONS_OPT_IN_STATUS","ROUTE_OPTIONS_OPT_IN_ENTITY_ACCOUNT","ROUTE_ENTITY_ONBOARDING_BUSINESS_INFO","ROUTE_ENTITY_ONBOARDING_ACCOUNT_OPENER","ROUTE_ENTITY_ONBOARDING_AUTH_INDIVIDUALS_UBOS","ROUTE_ENTITY_ONBOARDING_DOCUMENTS","ROUTE_ENTITY_ONBOARDING_AGREEMENTS","ROUTE_ENTITY_ONBOARDING_COMPLETED","ROUTE_ALPACA_TRADING_PLAN","ROUTE_FUNDING","ROUTE_FUNDING_HISTORY","ROUTE_FUNDING_LINK","ROUTE_FUNDING_LINK_ACH","ROUTE_FUNDING_LINK_WIRE","ROUTE_FUNDING_LINK_CURRENCYCLOUD","ROUTE_FUNDING_DEPOSIT","ROUTE_FUNDING_DEPOSIT_ACH","ROUTE_FUNDING_DEPOSIT_WIRE","ROUTE_FUNDING_DEPOSIT_CURRENCYCLOUD","ROUTE_FUNDING_WITHDRAW","ROUTE_FUNDING_WITHDRAW_ACH","ROUTE_FUNDING_WITHDRAW_WIRE","ROUTE_FUNDING_WITHDRAW_CURRENCYCLOUD","ROUTE_HIGH_YIELD_ONBOARDING","URL_BUG_REPORT","URL_DOCS","URL_DOCS_ACCOUNT_ACTIVITIES","URL_SLACK","URL_FORUM","URL_SUPPORT","URL_DISCLOSURES","acc","_receive","_fetch","_error","_invalidate","_reset","initialState","reload","isMobile","enquireScreen","DEFAULT_PROPS","headerContent","partialProps","initialProduct","LoadableChild","setLoadableChild","loadComponent","LoadableComponent","fallback","className","Spinner","savedProduct","App","Page","MFAGuard","getAttributes","getUserAttributes","getCustomAttribute","attr","defaultValue","Name","Value","UserActions","getCurrentUser","currentAuthenticatedUser","confirmMultiFactorAuth","mfaType","confirmSignIn","Boolean","verifyRecoveryCode","cognitoId","verifyId","userPool","errorData","password","countryOfCitizenship","validationResponse","signupIPAddress","utmParams","parseUtmParams","clientId","getSignUpSourceClientId","_window","_window$sessionStorag","requestedPath","signUp","username","has","userLogin","signIn","signOut","clear","ignore","ignoreStartsWith","prefix","toUTCString","clearCookies","confirmSignUp","forceAliasCreation","resendSignUp","getAttr","first_name","last_name","rememberDevice","forgetDevice","fetchDevices","devices","currentUser","keyPrefix","getUsername","device","forgetSpecificDevice","onSuccess","onFailure","confirmMFA","isLoggedIn","checkLoggedInStatus","register","registerUser","login","userLogout","confirmUserSignUp","resendUserSignUp","createAccountIfNotExist","createUserAccountIfNotExist","getCustomAttr","getSavedDevices","isDeviceRemembered","forgetAllDevices","AuthService","getEliteNetDeposits","getEliteAlgoRouting","applyEliteAlgoRouting","model","getElitePerks","applyEliteMarketData","getCurrencyCloudAccount","createCurrencyCloudAccount","getCurrencyCloudStatus","getCurrencyCloudTransfers","createCurrencyCloudTransfer","getCurrencyCloudBeneficiaryRequiredDetails","createCurrencyCloudBeneficiary","SmallCard","Caption","Text","Agreement","button","span","Markdown","onboarding","CryptoCard","highlightCrypto","CardTitle","CollapseText","AgreeBtn","Button","AgreeCheckbox","Checkbox","FloatText","right","AddressConfirmRow","Row","AgreeBox","MFASubCard","Table","MFAText","ErrorText","MFATitleCard","SecurityLevelText","ModalScreenCard","MFACodeInput","Input","MFAModalTitle","MFAModalSubtitle","ModalButtonRow","ModalButton","ModalButtonPrev","CompletionCheck","img","disabled","RecoveryCode","RecoveryContainer","getIconName","ProfileMFA","title","securityLevel","onClick","Card","boxShadow","border","CardBody","display","justifyContent","alignItems","padding","Icon","TOTPScreen","totpQRCode","onCancel","onNext","isText","setIsText","textCode","getTOTPPlainTextCode","onCopyTextClicked","copy","QRCode","onToggleText","size","SMSScreen","onSubmit","phoneNumer","setPhoneNumber","AntPhoneInput","placeholder","onChange","marginTop","MFAChallenge","_ref4","activating","onVerify","onBack","buttonCopy","setCode","target","CompletedView","_ref5","onLoad","recoveryCode","setRecoveryCode","creating","createRecoveryCode","deleteRecoveryCode","handleRecovery","MFAModalContents","step","setStep","app_id","user_id","equity","user_hash","getBillingOverview","getCryptoFeeStructure","getCryptoMonthlyVolume","live","getDetails","patchDetails","patchAccount","patchEsign","esign_audit","getOwners","owners","setUserConfigurations","getPathForProduct","getUserConfigurations","patchFinancialProfile","patchEmploymentStatus","cancelOrders","allow_out_of_markets","exerciseOption","orderID","getTrustedAccount","postTrustedAccount","getNonIdentityAccountDocumentURL","documentID","getNonIdentityAccountDocuments","subtract","getAccountDocuments","getAccountDocumentRequests","uploadAccountDocumentByDocType","FormData","append","content","doc_type","doc_sub_type","uploadAccountDocument","docID","fetchAccountAgreement","responseType","confirmEmail","getCountryOfCitizenship","getWatchlist","addSymbolToWatchlist","_ref7","removeSymbolFromWatchlist","_ref8","createWatchlist","_ref9","getWatchlists","_ref10","paperAccountIds","promises","allSettled","reason","createPaperAccount","editPaperAccount","deletePaperAccount","getMargin","last","startPath","endPath","last_effective_buying_power","last_buying_power","last_maintenance_margin","last_excess_margin","last_equity","getOrders","side","_ref12","ORDER_LIMIT","Math","LIMIT","allOrders","fetchDate","add","toISOString","fetching","requestCount","_res$data","_orders$sort","_orders$sort$","earliestSubmittedOrderDate","sort","submitted_at","valueOf","isSame","uniqBy","getPosition","_ref13","getPositions","_ref14","getActivities","activityTypes","after","until","page_size","page_token","_ref15","base","queryParams","activity_types","getBanks","_ref16","createBank","bank","_ref17","uploadBankStatement","_ref18","now","bankStatement","deleteBank","bankID","_ref19","getAccessKeys","deleteAccessKey","accessKeyID","_ref20","createNewAccessKey","intercom_id","OPTIONS_LEVELS","getOptionsApprovalStatus","postOptionsApproval","getIPAllowlist","FRACTION_DIGITS_CONFIG","threshold","digits","getPrettyDate","isValid","getPrettyDateFormatted","getMaxFractionDigits","num","abs","config","getQuoteCurrency","assetClass","quote","getPrettyPrice","_value$toString","minimumFractionDigits","maximumFractionDigits","parsed","currency","getPrettyCash","acceptZero","sign","withPrefix","absValue","forcePrecision","getPrettyAmount","_value$toString2","getPrettyPercent","noPrefix","multiply","getProfitLossColor","getISO3166Alpha3FormatMapping","iso3166Alpha3FormatMapping","iso3166","codes","TOTAL_TIME_KEY","timer","start","_window$localStorage","end","_window2","_window2$localStorage","duration","parseInt","remove","_window3","_window3$localStorage","removeItem","isSet","_window4","_window4$localStorage","createBrowserHistory","goBack","UserNotAuthenticated","session","currentSession","getIdToken","getJwtToken","utm_key","_data$attributes","useMutationRequest","useMutation","getAssets","getAsset","setFlag","flag","getFlag","useFlag","featureFlagManager","_getFlag","_flagObject","_flagObject2","flagString","flagObject","isEmpty","random","isFeatureAccessible","_getFlag2","_flagObject$status","promise","getBankRelationships","createBankRelationship","verifyBankRelationship","relationshipID","_setAccessKeys","unsetAccessKeys","listAccessKeys","nakedEyes","currentKeys","account_id","useGetMargin","useGetMargins","m","getValue","String","isValueRetrieved","setIsValueRetrieved","setValue","getMinMaxFromRangeOptions","rangeOption","hasOwnProperty","getRangeKeyFromValues","range","getDefaultFormValues","obj","transforms","defaultObj","fromEntries","k","condition","transform","isArray","transformAll","transformObject","zAffiliationsRefinement","percentageOwnershipAvailable","refinementContext","_country$nameToAlpha","_country$infos$countr","nameToAlpha3","addIssue","z","ZodIssueCode","custom","countryOfTaxResidenceAlpha3","countryTaxIdTypes","infos","tax_id_types","taxIdTypeMatch","RegExp","zNonEmptyString","string","refine","s","zPhoneNumber","errorMap","regex","zIsoDate","d","year","month","day","n","isLeapYear","axios","isAxiosError","logAmplitudeEvent","onboardingStarted","onboardingCompleted","nextClicked","backClicked","invalidInput","addOwnerClicked","editOwnerClicked","pageCompleted","onTaxIdKeyDown","taxIDType","evt","currentTarget","getPlaidLinkToken","getPlaidAuthStatus","plaidAcconutID","eventTypes","eventHistory","eventHistoryTimeout","handleEvent","bind","_this$eventHistory$ge","eventName","getEventName","eventData","getEventData","is_paper","rateExceeded","getAmplitude","logEvent","timestamp","detail","getAttribute","dispatchEvent","CustomEvent","setAccount","_acc$details","_acc$details2","_acc$account","_acc$account2","_acc$account3","setUserId","setUserProperties","account_status","account_number","algodash_v2","_window$amplitude","amplitude","getInstance","isNotFullActiveAccount","useGetCitizenship","useGetCryptoEnabled","infoMap","_infoMap$country","crypto_enabled","SUPPORTED_CRYPTO_STATES","toUpperCase","useGetCountryInfos","setInfos","canLimitedFund","alpha3","useLock","initialLocked","locked","setLocked","lock","unlock","lockFor","lockUntil","useGetPortfolioHistory","rest","restResponse","pnl_reset","period","intraday_reporting","getPortfolioHistory","useGetPositions","useGetStatus","useGetAsset","useGetOrderbooks","staleTime","orderbooks","useGetPosition","useGetClock","clock","useGetOrders","emptyOrders","useGetCryptoSnapshots","snapshots","useGetAccessKeys","cacheTime","access_keys","usePlaid","useGetCountries","Infinity","countriesRaw","alpha3ToName","_countries$find","short","_countries$find2","useGetTrustedContact","isFetched","trusted_contact","useGetActivities","useGetCashWithdrawable","useGetAllTransfers","isCurrencyCloudEnabled","refetchOnMount","achAndWire","ccTransfers","_currencyCloud$data$m","_currencyCloud$data","cc","useGetAllRelationships","_account$id","_account$is_legal_ent","_ccStatus$data","countryOfTaxResidence","isLegalEntity","ach","_relationship$account","plaid_institution","brand_name","account_name","bankInstitution","_relationship$account2","banks","_countryInfo$countryO","_countryInfo$countryO2","currencycloud_enabled","ccStatus","useGetCurrencyCloudStatus","ccAccount","useGetCurrencyCloudAccount","beneficiary_exists","wire","isEnabled","refetchAccount","refetchStatus","useGetWatchlists","watchlists","useGetWatchlist","watchlist","useGetQuotes","getIpAddress","useGetIpAddress","ipAddress","setIpAddress","ip_address","useGetOptionsApprovalStatus","useGetOwnerDocuments","useGetEliteNetDeposits","netDeposit","useGetEliteAlgoRouting","useGetElitePerks","perks","usePostAccountDocument","onMutate","onSettled","mutationFn","usePostW8Ben","useGetAccountDocumentRequests","useGetAccountDocumentUploads","useGetCurrencyCloudBeneficiaryRequiredDetails","isClosable","_templateObject","_taggedTemplateLiteral","CardHeader","_templateObject2","_templateObject3","_templateObject4","tools","more","cn","isLocalStorageAvailable","storage","setUTMs","utms","getUTMs","removeUTMs","setTier","tier","getTier","removeTier","startTimer","endTimer","started","completed","isOptionsOnboardingAvailable","optionsApprovalStatus","_optionsApprovalStatu","options_approved_level","allowLegalEntities","OptionsRequestStatus","ReapplyAvailableDate","isAfter","getUTMsFromSearch","medium","campaign","term","utm_source","utm_medium","utm_campaign","utm_term","utm_content","toEntityAccount","toIndividualAccount","getOwnerTransforms","postOwner","patchOwner","deleteOwner","getOwnerDocuments","postFileUpload","deleteFileUpload","getTaxFileForm","acceptTaxFileForm","submitEntityAccount","postAgreement","revision","patchOwnerType","isUBO","isAuthorizedIndividual","ErrorBoundary","hasError","errorMessage","componentDidCatch","info","Alert","variant","subtitle","breadcrumbs","classes","defaultOptions","queries","useDarkModeValue","useDarkMode","darkMode","setDarkMode","newValue","useHistory","dispatchPageVisit","UI","ChakraProvider","theme","customTheme","Box","useGetAssets","OptionsTopBarButton","isUpgrade","OptionsMobileButton","BANKING_AND_ONBOARDING_PATHS","TopBar","_account$options_appr","setAssets","sidebarState","setSidebarState","UIContext","isAuthenticated","equities","normalize","filtered","asset","assetMap","prev","keyForSymbol","keyForName","onSearch","normalized","charAt","matched","_a$symbol","_b$symbol","matchA","matchB","_a$symbol2","_b$symbol2","slice","onDepositOrOpenAccountClick","isDepositOrOpenAccountBtnDisplayed","isOptionsUpgradable","isOptionsButtonDisplayed","isOptionsUpgrading","onOptionsClick","w","zIndex","flexDir","SidebarState","HIDDEN","currentSidebarState","MOBILE","EXPANDED","COLLAPSED","handleSidebarState","Combobox","getOptionKey","o","getOptionLabel","getOptionSecondary","optionSpacing","icon","PaperBanner","SidebarAccountItem","number","active","clsx","SidebarAccountItemDivider","SidebarAccountMenuItem","schema","object","coerce","gte","lte","optional","boolean","CreatePaperAccountModal","_liveAccounts$","isOpen","onClose","createPaperAccountMutation","formValues","useUIForm","resolver","zodResolver","defaultValues","matchLiveEquity","watch","handleSubmit","_margin$equity","mutate","Modal","isModalOpen","useModal","Form","formMethods","TextInput","isDisabled","CheckboxState","Checked","Unchecked","controls","getSidebarAccountItemProperties","margins","_margins$map","dashboardTradeAccountMap","getName","index","_dashboardMargin$equi","_dashboardMargin$last","dashboardMargin","displayedEquity","displayedLastEquity","SidebarAccountSwitcher","darkLogo","setIsSidebarBlurred","setIsOpen","dropdownOpacity","setDropdownOpacity","forceUpdate","setForceUpdate","isCreationModalOpen","setIsCreationModalOpen","_savedAccountId","isPaper","liveMargin","paperMargins","handleSwitchAccount","newAccount","liveAccountItems","paperAccountItems","currentSidebarAccount","pa","isCollapsed","handleClickOutside","toggleOpen","stopPropagation","handleUpdate","TetherComponent","attachment","targetAttachment","offset","onUpdate","renderTarget","ref","Logo","classNames","renderElement","opacity","tab","SidebarItem","leftIcon","subItems","divider","newTab","unresponsive","checkIsActive","item","manualCollapseTriggered","setManualCollapseTriggered","filteredSubItems","setFilteredSubItems","Tooltip","hidden","placement","subItem","getHashCode","SidebarSettings","settings","SidebarToggle","iconName","handleClick","Sidebar","items","isSidebarBlurred","sidebarItems","WIDE_PAGES","FDIC_SWEEP_FEATURE_FLAG","heights","sidebar","topbar","apply","Container","_URLSearchParams$get","_URLSearchParams","_window$location$sear","_window$location","_liveAccount$id","_liveAccount$crypto_t","isDebugMode","setAccountContextProduct","updatedProduct","isWidePage","_window2$location","_window2$location$pat","useGetBillingOverview","isSubscribed","lifetimeSubCount","market_data","cryptoTier","crypto_tier","cryptoTierProgress","canTransferCrypto","inSupportedLocation","sidebarProps","is_professional","h","Progress","bg","hasStripe","isAnimated","rounded","marginLeft","overflowY","flexGrow","isCryptoEnabled","countryCode","_infoMap$countryCode","accountDetails","_window$env$SUPPORTED","_window$env$SUPPORTED2","_window$env$SUPPORTED3","_window$env$SUPPORTED4","supportedCountries","SUPPORTED_CRYPTO_TRANSFER_COUNTRIES","supportedStates","_inSupportedLocation","TOAST_THEME","borderRadius","paddingTop","paddingBottom","gap","maxWidth","mode","extendTheme","styles","global","html","fontFamily","lineHeight","textRendering","WebkitFontSmoothing","borderColor","hr","fontWeight","_focus","fonts","heading","mono","space","xxs","xs","sm","md","lg","xl","fontSizes","colors","pastel","green","red","black","gray","90","20","15","10","Radio","baseStyle","control","_checked","_hover","textDecoration","track","defaultProps","variants","flushed","field","borderBottom","_focused","_placeholder","skeleton","filled2","filled","shadow","Select","lightGray","yellow","skeleton__light_gray","solid","backgroundColor","minWidth","primary","_disabled","sizes","isError","isSuccess","useGetOwners","isETC","clearingBroker","_setPlans","_billingCreated","_billingCanceled","_billingUpdated","_getOverview","_processStripeResponse","paymentIntentSecret","setupIntentSecret","paymentIntent","confirmCardPayment","last_payment_error","setupIntent","confirmCardSetup","last_setup_error","getPlans","createStripeSubscription","plan","createAlpacaSubscription","cancelStripeSubscription","cancelAlpacaSubscription","updateStripeSubscription","useGetCryptoFeeStructure","useGetCryptoMonthlyVolume","MFA_DUE_DATE","canRenderWarning","preferredMFA","setCognitoUser","canRenderMFAGuard","isSameOrAfter","EditProfileForm","showSMSOption","forwardRef","PhoneInput","inputClass","phone","onScroll","dangerouslySetInnerHTML","__html","signOutGlobal","cleanUpAndRedirect","signOutLocal","clearCookieStorage","setAuthed","select","_options$onSuccess","call","_options$onError","handleRefetch","Wrapper","isSubmitForm","mfaMethod","_dec2","_class2","preventDefault","validateFields","toggleExpand","resetFields","onSubmitPhoneNumberVerification","verifyCurrentUserAttributeSubmit","setState","challengeModalVisible","handlePasswordToggle","passwordExpand","onSubmitPhoneNumber","phoneNumber","onSubmitTOTPTokenVerification","completeTOTPChallenge","mfaExpand","mfaModalVisible","smsModalVisible","disablingMfa","validMFAMethods","onCancelMFA","layout","hideRequiredMark","marginBottom","visible","footer","_setDocumentRequests","_setDocumentUploads","listAccountDocumentUploads","documentUploads","documentRequests","currentDocuments","requests","uploads","_setPositions","_setPlacedLiquidationOrders","listPositions","positionsEndPoint","placedLiquidationOrders","_setOrderHistory","_setOrderNotFound","_setOrderStream","_setCanceledOrders","_requestOrderHistory","_requestOrderStream","_clearOrderHistory","listOrders","keyByStatus","initializeOpen","currentAccountOrders","awaitingStream","ordersEndPoint","hasMoreHistory","cancelSelectedOrders","orderIds","orderId","canceledOrders","orderDetails","clearCanceledOrders","notFound","existingOrders","newOrders","concatOrders","unionBy","isInitialized","lastStreamTime","openStatusList","openOrders","closedOrders","_setCountryInfo","hasOnfidoApplicant","_JSON$parse","_account$onfido_detai","defaultOnfidoOptions","containerId","customUI","fontFamilyTitle","fontFamilySubtitle","fontFamilyBody","fontSizeTitle","fontSizeSubtitle","fontSizeBody","fontWeightSubtitle","colorContentButtonPrimaryText","colorBackgroundButtonPrimary","useOnfidoToken","getOnfidoSdkToken","useOnfido","steps","onComplete","completeCb","errorCb","onOpen","useDisclosure","createApplicant","createdOnfido","updateApplicant","updatedOnfido","sdkResponse","refetchToken","patchSDKToken","patchOnfidoSdkToken","firstTime","useRef","opts","onfido_id","outcome","onModalRequestClose","onfido","init","tearDown","isReadyToStart","openModal","interceptors","use","trackingID","GOOGLE_ANALYTICS_ID","ReactGA","initialize","setCookie","days","setTime","getTime","nameEQ","cookies","i","_setTradeDetails","loadTradeDetails","getLast","tradeEndPoint"],"mappings":"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","file":"static/js/main.f69f2bc1.chunk.js","sourcesContent":["import instance from \"..\";\n\nexport interface Transfer {\n id: string;\n status: string;\n amount: number;\n created_at: string;\n direction: string;\n type: string;\n}\nexport interface AchTransfer extends Transfer {}\n\nexport const getAchTransfers = async (\n accountId: string\n): Promise<Transfer[]> => {\n const res = await instance.get<Transfer[]>(\n `/accounts/${accountId}/transfers`\n );\n return res.data;\n};\n\nexport const deleteAchTransfer = async (\n accountId: string,\n transferId: string\n): Promise<void> => {\n const res = await instance.delete<void>(\n `/accounts/${accountId}/transfers/${transferId}`\n );\n return res.data;\n};\n\nexport interface CreateTransferRequest {\n amount: string;\n direction: string;\n relationship_id?: string;\n bank_id?: string;\n transfer_type: string;\n}\n\nexport const createAchTransfer = async (\n accountId: string,\n req: CreateTransferRequest\n): Promise<Transfer> => {\n const res = await instance.post<Transfer>(\n `/accounts/${accountId}/transfers`,\n req\n );\n return res.data;\n};\n\nexport interface RapydTransfer extends Transfer {\n transfer_status: string;\n}\n\nexport const getRapydTransfers = async (\n accountId: string\n): Promise<Transfer[]> => {\n const res = await instance.get<RapydTransfer[]>(\n `/rapyd/${accountId}/transfers`\n );\n\n // standardize to fit the abstract transfer object\n res.data.forEach((t) => {\n t.status = t.transfer_status;\n t.type = \"rapyd\";\n t.direction = \"INCOMING\";\n });\n return res.data;\n};\n\nexport interface AchRelationship {\n id: string;\n account_id: string;\n status: string;\n approval_method: string;\n account_name: string;\n plaid_institution: string;\n plaid_verification_status?: string;\n}\n\nexport const getAchRelationships = async (\n accountId: string\n): Promise<AchRelationship[]> => {\n const res = await instance.get<AchRelationship[]>(\n `/accounts/${accountId}/relationships`\n );\n return res.data;\n};\n\nexport const deleteAchRelationship = async (\n accountId: string,\n relationshipId: string\n): Promise<void> => {\n const res = await instance.delete<void>(\n `/accounts/${accountId}/relationships/${relationshipId}`\n );\n return res.data;\n};\n\nexport interface BankInstitutionResponse {\n institution: BankInstitution;\n}\n\nexport interface BankInstitution {\n logo: string;\n brand_name: string;\n}\n\nexport const getBankInstitution = async (\n institutionId: string\n): Promise<BankInstitution> => {\n const res = await instance.get<BankInstitutionResponse>(\n `/institutions/${institutionId}`\n );\n return res.data.institution;\n};\n\nexport const getCashWithdrawable = async (accountId: string) => {\n const res = await instance.get<{ cash_withdrawable: number }>(\n `/accounts/${accountId}/trade_account/margin`\n );\n return Number(res.data.cash_withdrawable ?? 0);\n};\n\nexport const postFundingSurvey = async (\n accountID: string,\n survey: Record<string, any>\n) => {\n const res = await instance.post(`/accounts/${accountID}/survey/funding`, survey);\n return res.data;\n};\n","import { createAction, createReducer } from \"redux-act\";\nimport Auth from \"@aws-amplify/auth\";\nimport Amplify from \"@aws-amplify/core\";\nimport { get } from \"lodash\";\nimport { getCurrentAuthenticatedUser } from \"../../utils\";\n\nimport { getAccount, loadAccountDetails, updateAccountOwner } from \"../account\";\nimport sha1 from \"js-sha1\";\nimport { updateIntercom } from \"src/utils/intercom\";\n\nconst REDUCER = \"auth\";\nconst NS = `@@${REDUCER}/`;\n\nconst _setFrom = createAction(`${NS}SET_FROM`);\nconst _setPasswordWasReset = createAction(`${NS}SET_PASSWORD_WAS_RESET`);\n// TODO: Implement this.\n// const _setNewPasswordRequired = createAction(`${NS}SET_NEW_PASSWORD`)\nexport const setUserState = createAction(`${NS}SET_USER_STATE`);\nexport const setAccountVerificationRequired = createAction(\n `${NS}SET_ACCOUNT_VERIFICATION_REQUIRED`\n);\nexport const setResentAccountVerification = createAction(\n `${NS}SET_RESENT_ACCOUNT_VERIFICATION`\n);\nexport const setAccountVerificationError = createAction(\n `${NS}SET_ACCOUNT_VERIFICATION_ERROR`\n);\nexport const setEmailUpdateVerificationRequired = createAction(\n `${NS}SET_EMAIL_UPDATE_VERIFICATION_REQUIRED`\n);\n\nexport const initAmplify = () => {\n Amplify.configure({\n Auth: {\n // REQUIRED only for Federated Authentication - Amazon Cognito Identity Pool ID\n // (for accessing services like Storage)\n // (Federated Identities > Selected Identity Pool/Create new > Sample code > Select Javascript > Get AWS Credentials)\n identityPoolId: window.env.COGNITO_IDENTITY_POOL_ID,\n\n // REQUIRED - Amazon Cognito Region\n region: window.env.COGNITO_REGION,\n\n // OPTIONAL - Amazon Cognito User Pool ID\n // (User pools > General Settings > Pool Id)\n userPoolId: window.env.COGNITO_USER_POOL_ID,\n\n // OPTIONAL - Amazon Cognito Web Client ID (26-char alphanumeric string)\n // (User pools > General Settings > App clients > App client id)\n userPoolWebClientId: window.env.COGNITO_CLIENT_ID,\n\n endpoint: window.env.COGNITO_ENDPOINT,\n\n authenticationFlowType: window.env.COGNITO_AUTH_FLOW,\n\n // OPTIONAL - Enforce user authentication prior to accessing AWS resources or not\n mandatorySignIn: false,\n\n // OPTIONAL - Configuration for cookie storage\n cookieStorage: {\n // REQUIRED - Cookie domain (only required if cookieStorage is provided)\n domain: window.location.hostname,\n // OPTIONAL - Cookie path\n path: \"/\",\n // OPTIONAL - Cookie expiration in days\n expires: 7,\n // OPTIONAL - Cookie secure flag\n secure: window.env.ENV === \"PROD\",\n },\n },\n Storage: {\n bucket: window.env.COGNITO_BUCKET,\n },\n // AppSync can power the API with GraphQL simply by proxying HTTP requests to the REST API\n // 'aws_appsync_graphqlEndpoint': 'https://xxxxxx.appsync-api.us-east-1.amazonaws.com/graphql',\n // 'aws_appsync_region': 'us-east-1',\n // 'aws_appsync_authenticationType': 'AMAZON_COGNITO_USER_POOLS', // You have configured Auth with Amazon Cognito User Pool ID and Web Client Id\n });\n};\n\n/**\n * initUser will initialize a new user, setting up their account for\n * the first time if necessary. It will also identify the user in Segment.\n * Mandatory to call after first login. Good to always call after login\n * or after any change in user data so it can report to Segment.\n *\n * @param {Boolean} refreshAccountInfo Pass true to get updated account info\n */\nexport const initUser =\n (refreshAccountInfo = false) =>\n (dispatch, getState) => {\n const getCookieValue = (a) => {\n var b = document.cookie.match(\"(^|;)\\\\s*\" + a + \"\\\\s*=\\\\s*([^;]+)\");\n return b ? b.pop() : \"\";\n };\n\n // Just call this to get the session.\n // Note: Unless `allowAccess` is given, access will be permitted if `getCurrentAuthenticatedUser()`\n // comes back with a response/user.\n return getCurrentAuthenticatedUser()\n .then((data) => {\n dispatch(\n setUserState({\n userState: data,\n })\n );\n\n setDomainJWT(data);\n // Don't fetch account more than necessary\n const { account = false } = getState().account;\n\n // Note: One challenge is that in order to redirect, we need to have the account details.\n // So if we do not have account info, return the dispatch(getAccount()) and within there, get details.\n // Then check auth after having those details.\n // This is a good bit of info that needs to be retrieved before a user gets redirected.\n // Given how much gets loaded anyway, this may not even be needed. We might just dispatch getAccount()\n // all the time.\n if (!account || !account.id || refreshAccountInfo) {\n return dispatch(getAccount()).then(async (action) => {\n // Sync tasks.\n const accountId =\n (action &&\n action.payload &&\n action.payload.account &&\n action.payload.account.id) ||\n false;\n const cognitoAccountIdAttr =\n (data &&\n data.attributes &&\n data.attributes[\"custom:account_id\"]) ||\n false;\n const accountEmail =\n (action &&\n action.payload &&\n action.payload.account &&\n action.payload.account.email) ||\n false;\n const cognitoAccountEmail =\n (data && data.attributes && data.attributes[\"email\"]) || false;\n if (accountId) {\n // If, for some reason, the Cognito user does not have its account_id attribute set, do so.\n // This should never be the case. It was the case during testing/migration. It's harmless to set.\n // Maybe a migration script failed to update the account id? This would catch it.\n if (!cognitoAccountIdAttr) {\n Auth.updateUserAttributes(data, {\n \"custom:account_id\": accountId,\n });\n }\n\n // In the case where a cognito email is not synced up with the email for this account in GoBroker:\n // Sleep the thread for a moment and then retry to see if it resolves a potential race case that happened,\n // If it's still happening, update the email, which will set the status as ACCOUNT_UPDATED and we will need to resolve the issue.\n if (\n accountEmail &&\n cognitoAccountEmail &&\n accountEmail.toLowerCase() !== cognitoAccountEmail.toLowerCase()\n ) {\n setTimeout(() => {\n // retry call after sleep\n dispatch(getAccount()).then((action) => {\n const retryGbEmail =\n (action &&\n action.payload &&\n action.payload.account &&\n action.payload.account.email) ||\n false;\n const retryCognitoEmail =\n (data && data.attributes && data.attributes[\"email\"]) ||\n false;\n\n // if still out of sync, update mark as needing attention\n if (\n retryGbEmail &&\n retryCognitoEmail &&\n retryGbEmail.toLowerCase() !==\n retryCognitoEmail.toLowerCase()\n ) {\n dispatch(\n updateAccountOwner({ email: retryCognitoEmail })\n );\n }\n });\n }, 5000);\n }\n }\n\n // Once the account has been retrieved (and possibly created for first time users)\n // The account_id will be set in the state. The following calls are useful for all areas\n // of the dashboard (and for segment), so retrieve the data from them now.\n return Promise.all([dispatch(loadAccountDetails())])\n .then(() => {\n const state = getState();\n const account = state.account || false;\n\n // TODO: track the following:\n // last order executed date (*not currently sent, may not come from dashboard)\n // first order executed date (*not currently sent, may not come from dashboard)\n\n if (account) {\n // Age\n let age = 0;\n if (account.details) {\n const thisYear = new Date().getFullYear();\n const birthYear = new Date(\n account.details.date_of_birth\n ).getFullYear();\n age = thisYear - birthYear;\n }\n\n // The algoId in this case will just be the current account\n // We won't report the paper account's trade details (portfolio_value, cash, buying_power to Segment)\n const algoId = account.account.id;\n const trade = state.trade || {};\n const ownerIdHash = sha1(account.details.owner_id) || \"\";\n const ownerRefId = ownerIdHash.substring(0, 10);\n // refBy will be pushed during new account sign up\n // This way it doesn't always get applied even for existing accounts\n\n // Follow the spec. Segment has to properly map attributes to various destinations.\n // https://segment.com/docs/spec/identify/#traits\n let traits = {\n // Technically, this may not matter. Segment should be good with snake or camel case.\n createdAt: account.account.created_at,\n apexApprovalStatus: account.account.apex_approval_status,\n status: account.account.status,\n ownerId: account.details.owner_id,\n // The user's referrer ID is first 10 of sha1 of their owner_id\n refId: ownerRefId,\n email: account.account.email,\n name: account.account.name,\n firstName: account.details.given_name,\n lastName: account.details.family_name,\n age,\n buyingPower: Number.parseFloat(\n (trade && trade[algoId] && trade[algoId].buying_power) ||\n 0\n ),\n cash: Number.parseFloat(\n (trade && trade[algoId] && trade[algoId].cash) || 0\n ),\n portfolioValue: Number.parseFloat(\n (trade &&\n trade[algoId] &&\n trade[algoId].portfolio_value) ||\n 0\n ),\n tradingBlocked: account.account.trading_blocked,\n transfersBlocked: account.account.transfers_blocked,\n // Want both the address object (as per Segment spec) as well as easier to target fields (for now).\n country: \"US\",\n state: account.details.state,\n address: {\n country: \"US\",\n state: account.details.state,\n },\n };\n\n // Optional clearing broker\n if (account.account && account.account.clearing_broker) {\n traits.clearing_broker = account.account.clearing_broker;\n }\n\n // This will be recorded by another call under the profitloss reducer. No need to always load profit loss.\n // May also move paper account identify call as well.\n // traits.profitLossDay = profitloss.day_plpc;\n // traits.profitLossTotal = profitloss.total_plpc;\n\n // IMPORTANT: From where did our users come from?\n // These come from cookies. These only get sent while the user's status is not 'ACTIVE'\n // Note on attribution: This models a \"last click/came from\" type of model. Meaning, a user\n // could come from one ad campaign, sign up, then come back from another ad later before\n // being approved. In this case, it would be the second ad that was attributed with the conversion.\n // Unless cookies aren't overwritten/set again. Could control that outside of here.\n // Note: These are also tracked as events during onboarding. However, this allows us to target users\n // based on this information.\n if (account.account.status !== \"ACTIVE\") {\n traits.referrerCampaignName = getCookieValue(\n \"alpaca_referrer_campaign_name\"\n );\n traits.referrerCampaignSource = getCookieValue(\n \"alpaca_referrer_campaign_source\"\n );\n traits.referrerCampaignMedium = getCookieValue(\n \"alpaca_referrer_campaign_medium\"\n );\n traits.referrerCampaignContent = getCookieValue(\n \"alpaca_referrer_campaign_content\"\n );\n traits.referrerCampaignTerm = getCookieValue(\n \"alpaca_referrer_campaign_term\"\n );\n traits.referrerURL = getCookieValue(\"alpaca_referrer_url\");\n }\n\n // NOTE: Segment is given our ownerId for the user id.\n // This does mean any user signing up for a newsletter, handled by Intercom, could have two records.\n // Once they are converted to an Alpaca user, the old entry in Intercom can be archived.\n // Easy to filter out that \"old\" record with any of the above props too (since it won't have them).\n updateIntercom(traits.ownerId, traits);\n }\n return;\n }) // end then() for Promise.all() - retrieval of account info\n .catch((err) => {\n console.error(err);\n }); // end catch() for Proimise.all() - retrieval of account info\n }); // end dispatch getAccount()\n }\n return;\n })\n .catch(() => {\n return Promise.reject();\n });\n };\n\n// Copy JWT cookie to the current domain to share the\n// login info to the subdomain apps such as zaam.\nconst setDomainJWT = (user) => {\n const jwt = get(user, \"signInUserSession.idToken.jwtToken\", user);\n if (jwt) {\n document.cookie = [\n \"dashboard.authtoken=\" + jwt,\n // needs to have this leading dot to propagate to subdomain\n \"domain=.\" + location.hostname,\n \"max-age=\" + 30 * 24 * 60 * 60,\n \"path=/\",\n ].join(\"; \");\n }\n};\n\n// Export this reducer\nconst initialState = {\n // an initial account verification\n accountVerificationRequired: {},\n accountVerificationError: false,\n // when updating email Cognito attributes, user must re-verify (the email part triggers it)\n emailUpdateVerificationRequired: false,\n resentAccountVerification: false,\n failedLogin: false,\n forgotPasswordVerification: false,\n passwordWasReset: false,\n isHideLogin: false,\n // USER STATE\n userState: {},\n};\nexport default createReducer(\n {\n [_setFrom]: (state, from) => ({ ...state, from }),\n [_setPasswordWasReset]: (state, param) => ({\n ...state,\n passwordWasReset: param,\n }),\n [setUserState]: (state, { userState }) => ({ ...state, userState }),\n [setAccountVerificationRequired]: (state, param) => {\n // like invalid forms, this requires a form id and (otherwise default 'all' forms)\n // however the key value here will be whatever was passed\n const accountVerificationRequired = param\n ? {\n ...state.submitForms,\n [param.id || \"all\"]: param,\n }\n : false;\n return { ...state, accountVerificationRequired };\n },\n [setAccountVerificationError]: (state, param) => {\n return { ...state, accountVerificationError: param };\n },\n [setResentAccountVerification]: (state, param) => ({\n ...state,\n resentAccountVerification: param,\n }),\n [setEmailUpdateVerificationRequired]: (state, param) => ({\n ...state,\n emailUpdateVerificationRequired: param,\n }),\n // TODO: There will be a case where Cognito requires users to set a new password.\n // It could perhaps be if an admin sets up an account with the requirement for the user to set a new password on first login.\n // Implement this.\n // [_setNewPasswordRequired]: (state, needsNewPassword) => ({ ...state, needsNewPassword }),\n },\n initialState\n);\n","import { createAction, createReducer } from \"redux-act\";\nimport { notification } from \"antd\";\nimport Auth from \"@aws-amplify/auth\";\nimport { getCurrentAuthenticatedUser } from \"../../utils\";\n\nexport const REDUCER = \"mfa\";\nconst NS = `@@${REDUCER}/`;\n\nconst _setCurrentMFAMethod = createAction(`${NS}SET_CURRENT_MFA_METHOD`);\nconst _setTOTPQRCode = createAction(`${NS}SET_TOTP_QR_CODE`);\nconst _setTOTSetupVerificationError = createAction(\n `${NS}SET_TOTP_SETUP_VERIFICATION_ERROR`\n);\n\n// Helper to remove magic, note that `SOFTWARE_TOKEN_MFA` is newer than `TOTP` though both\n// work for SETTING the MFA method with `setPreferredMFA()` but, `getPreferredMFA()`\n// returns `SOFTWARE_TOKEN_MFA` - there was some deprecation and changes going on in Amplify.\n// Similar for `SMS_MFA` vs. older `SMS`.\nexport const MFAMethods = {\n SOFTWARE_TOKEN_MFA: {\n method: \"SOFTWARE_TOKEN_MFA\",\n displayName: \"time-based one-time password (TOTP)\",\n },\n SMS_MFA: {\n method: \"SMS_MFA\",\n displayName: \"text-message (SMS)\",\n },\n NOMFA: {\n method: \"NOMFA\",\n displayName: \"\",\n },\n};\n\n/**\n * Enables MFA and shows a notification to the user.\n *\n * @param {string} method The 2FA method, \"SMS_MFA\", \"SOFTWARE_TOKEN_MFA\", \"NOMFA\"\n */\nexport const enableMFA = (method = MFAMethods[\"SMS_MFA\"].method) => (\n dispatch\n) => {\n getCurrentAuthenticatedUser().then((user) => {\n // Note: As of March 14th, 2019, AWS Amplify JS documentation shows\n // `SMS`, `TOTP`, or `NOMFA` as options. In their GitHub, it shows\n // either those OR the newer `SOFTWARE_TOKEN_MFA` and `SMS_MFA` options.\n // Our code will standardize on the newer values. However, this method\n // will temporarily need to catch this until AWS updates.\n if (method === MFAMethods[\"SMS_MFA\"].method) {\n method = \"SMS\";\n }\n if (method === MFAMethods[\"SOFTWARE_TOKEN_MFA\"].method) {\n method = \"TOTP\";\n }\n\n // NOTE: The same bug afflicting `getPreferredMFA()` below\n // https://github.com/aws-amplify/amplify-js/issues/2627\n user.getUserData(\n () => {\n // The part we care about\n Auth.setPreferredMFA(user, method)\n .then(() => {\n dispatch(currentMFAMethod());\n })\n .catch((err) => {\n console.error(\"error setting MFA method:\", err);\n });\n //\n },\n { bypassCache: true }\n );\n });\n};\n\n/**\n * Disables MFA and shows a notification to the user.\n */\nexport const disableMFA = () => (dispatch) => {\n return getCurrentAuthenticatedUser().then((user) => {\n // NOTE: The same bug afflicting `getPreferredMFA()` below\n // https://github.com/aws-amplify/amplify-js/issues/2627\n return user.getUserData(\n () => {\n // The part we care about\n return Auth.setPreferredMFA(user, MFAMethods[\"NOMFA\"].method).then(\n () => {\n notification.open({\n type: \"success\",\n message: \"You have disabled MFA for your account.\",\n });\n return dispatch(currentMFAMethod());\n }\n );\n //\n },\n { bypassCache: true }\n );\n });\n};\n\n/**\n * Gets the user's preferred MFA method.\n *\n * NOTE: There is currently a bug https://github.com/aws-amplify/amplify-js/issues/2627\n * An old, cached, MFA method will be returned when enabling/disabling MFA methods.\n * That is to say, changing MFA methods does not update the cache on AWS end.\n * Calling `getUserData()` with `byPassCache` param true will ensure it's fresh.\n * Once this is fixed, the getUserData call below can be removed.\n */\nexport const currentMFAMethod = () => (dispatch) => {\n return getCurrentAuthenticatedUser().then((user) => {\n // Temporary work around for known AWS bug\n return user.getUserData(\n () => {\n // The part we care about\n return Auth.getPreferredMFA(user)\n .then((response) => {\n dispatch(_setCurrentMFAMethod(response));\n return response;\n })\n .catch((err) => {\n console.debug(err);\n });\n //\n },\n { bypassCache: true }\n );\n });\n};\n\n/**\n * Gets the TOTP code from Cognito to allow a user to set up\n * software based MFA. Note that the code must be converted to\n * a QR code in order for it to be scanned.\n *\n * Note: https://github.com/aws-amplify/amplify-js/issues/1226\n * If a user goes to set up a new TOTP application, it will silently disable TOTP MFA.\n * We should first make the user disable TOTP MFA before setting up a new application.\n * This way, if a user abandons the set up process, they won't disable their existing TOTP MFA\n * without knowing. The user needs to first disable TOTP MFA, verify a new one, and that verification\n * will then re-enable the TOTP MFA.\n */\nexport const setupTOTP = () => (dispatch) => {\n getCurrentAuthenticatedUser().then((user) => {\n Auth.setupTOTP(user).then((code) => {\n const authCode = `otpauth://totp/${\n user.attributes.email || \"\"\n }?secret=${code}&issuer=Alpaca`;\n dispatch(_setTOTPQRCode(authCode));\n });\n });\n};\n\n/**\n * Verifies a TOTP token generated by an TOTP-generating application.\n * TOTP MFA Will then be enabled for the user upon success.\n */\nexport const verifyTOTPToken = (challengeAnswer) => (dispatch) => {\n getCurrentAuthenticatedUser().then((user) => {\n Auth.verifyTotpToken(user, challengeAnswer)\n .then(() => {\n // Note that there is a resonse, it's {Status: \"SUCCESS\"}\n // It should always be a succes, it will throw errors.\n dispatch(_setTOTPQRCode(null));\n dispatch(enableMFA(MFAMethods[\"SOFTWARE_TOKEN_MFA\"].method));\n })\n .catch((err) => {\n console.error(err);\n dispatch(_setTOTSetupVerificationError(err));\n });\n });\n};\n\nconst initialState = {\n method: null,\n TOTPQRCode: null,\n TOTPQRVerificationError: null,\n};\nexport default createReducer(\n {\n [_setCurrentMFAMethod]: (state, method) => ({ ...state, method }),\n [_setTOTPQRCode]: (state, TOTPQRCode) => ({ ...state, TOTPQRCode }),\n [_setTOTSetupVerificationError]: (state, TOTPSetupVerificationError) => ({\n ...state,\n TOTPSetupVerificationError,\n }),\n },\n initialState\n);\n","import { createAction as baseCreateAction, createReducer } from \"redux-act\";\nimport api from \"api\";\nimport { handleSessionExpire } from \"./alpacaAuth/session\";\nimport Auth from \"@aws-amplify/auth\";\nimport Storage from \"@aws-amplify/storage\";\nimport \"fast-text-encoding\";\nimport {\n getAccountIdAndJWT,\n getAlpacaAccountId,\n getAccountIdForProduct,\n} from \"selectors\";\nimport { unsetAccessKeys } from \"reducers/accessKeys\";\nimport { notification } from \"antd\";\nimport { push } from \"connected-react-router\";\nimport { setEmailUpdateVerificationRequired } from \"../reducers/auth/common\";\nimport { getCookie } from \"src/lib/cookies\";\nimport { getCurrentAuthenticatedUser } from \"../utils\";\nimport { getSessionJWT, weakEncrypt } from \"../utils\";\nimport { eventTracker } from \"src/utils/eventTracker\";\n\nconst REDUCER = \"account\";\nconst NS = `@@${REDUCER}/`;\nconst createAction = (name) => baseCreateAction(NS + name);\n\n// accounts\nexport const SET_ACCOUNT = \"SET_ACCOUNT\";\nconst _setAccount = createAction(SET_ACCOUNT);\nconst _setAccountDetails = createAction(\"SET_DETAILS\");\nconst _setTrustedContact = createAction(\"SET_TRUSTED_CONTACT\");\nconst _setPaperAccount = createAction(\"SET_PAPER_ACCOUNT\");\nexport const unsetPaperAccount = createAction(\"UNSET_PAPER_ACCOUNT\");\nconst _setPaperAccounts = createAction(\"SET_PAPER_ACCOUNTS\");\nconst _setSyncAccounts = createAction(\"SET_SYNC_ACCOUNTS\");\n\n// relationships\nconst _setRelationships = createAction(\"SET_RELATIONSHIPS\");\nconst _setWireBanks = createAction(\"SET_WIRE_BANKS\");\nconst _setInstitution = createAction(\"SET_INSTITUTION\");\nconst _setCreateRelationshipStatus = createAction(\n \"SET_CREATE_RELATIONSHIP_STATUS\"\n);\nconst _setCreateWireBankStatus = createAction(\"SET_CREATE_WIRE_BANK_STATUS\");\nexport const clearCreateRelationshipStatus = createAction(\n \"CLEAR_CREATE_RELATIONSHIP_STATUS\"\n);\nexport const clearCreateWireBankStatus = createAction(\n \"CLEAR_CREATE_WIRE_BANK_STATUS\"\n);\nconst _setPlaidToken = createAction(\"SET_PLAID_TOKEN\");\n\n// transfers\nconst _setTransfers = createAction(\"SET_TRANSFERS\");\n\n// activities\nconst _setActivities = createAction(\"SET_ACTIVITIES\");\n\n// documents\nconst _setDocuments = createAction(\"SET_DOCUMENTS\");\n\n// affiliates\nconst _setAffiliates = createAction(\"SET_AFFILIATES\");\n// onfido sdk token\nconst _setOnfidoSDKToken = createAction(\"SET_ONFIDO_SDK_TOKEN\");\n// onfido applicant id\nconst _setOnfidoApplicantID = createAction(\"SET_ONFIDO_APPLICANT_ID\");\n\n// configs\nconst _reqConfigs = createAction(\"REQ_CONFIGS\");\nconst _setConfigs = createAction(\"SET_CONFIGS\");\n\n// \"props\" stored to S3 as JSON\nconst _setOwnerProps = createAction(`SET_OWNER_PROPS`);\n\nconst onboardingApiAction =\n (fn) =>\n (...args) =>\n async (dispatch, getState) => {\n const { token } = await getSessionJWT();\n let accountId = args[\"accountId\"];\n\n // This might occur on page reload, the account is not retrieved all the time.\n // It is passed through props. So not coming back to the onboarding flow is fine,\n // but when coming back (hard browser reload, etc.), the minimum amount of info we\n // need is the account ID.\n if (!accountId) {\n return dispatch(getAccount()).then(() => {\n accountId = getAlpacaAccountId(getState()) || null;\n return handleSessionExpire(\n fn(dispatch, getState, accountId, token, ...args).then(() => ({\n ok: true,\n })),\n dispatch\n ).catch((error) => ({ error }));\n });\n } else {\n return handleSessionExpire(\n fn(dispatch, getState, accountId, token, ...args).then(() => ({\n ok: true,\n })),\n dispatch\n ).catch((error) => ({ error }));\n }\n };\n\nexport const getAccount = () => (dispatch, getState) => {\n const state = getState();\n\n const userState = (state && state.auth && state.auth.userState) || {};\n\n const token =\n (userState.signInUserSession && userState.signInUserSession.idToken) || {};\n\n const associatedAccountId =\n (userState.attributes && userState.attributes[\"custom:account_id\"]) ||\n false;\n\n const accountList = getState().accountList.payload;\n if (!accountList) {\n throw Error(\"accountList not available yet\");\n }\n return Promise.resolve(accountList)\n .then((accounts) => {\n if (accounts && accounts[0]) {\n // If there was no associated account id yet, update the Cognito user attribute\n if (!associatedAccountId) {\n getCurrentAuthenticatedUser()\n .then((cognitoUser) => {\n Auth.updateUserAttributes(cognitoUser, {\n \"custom:account_id\": accounts[0].id || \"\",\n });\n })\n .catch((e) =>\n console.error(`Error updating cognito attributes: ${e}`)\n );\n }\n // if account is activated remove it from kyc localstore\n if (accounts[0].status === \"ACTIVE\") {\n let kyc = JSON.parse(window.localStorage.getItem(\"kyc\"));\n if (kyc) {\n if (accounts[0].id in kyc) delete kyc?.[accounts[0].id];\n window.localStorage.setItem(\"kyc\", JSON.stringify(kyc));\n }\n }\n\n // Set the account info in state, then get the account details and load the trade account\n return dispatch(\n _setAccount({\n account: accounts[0] || {},\n })\n );\n }\n return;\n })\n .catch((err) => {\n console.error(\"error getting list of accounts:\", err);\n\n // If no account for the Cognito user, it will return a 401\n // Create an account in gobroker\n const email = (token.payload && token.payload.email) || \"\";\n const clearing_broker =\n (token.payload && token.payload[\"custom:clearing_broker\"]) || \"\";\n const source =\n (token.payload && token.payload[\"custom:signup_source\"]) || null;\n\n return api.account\n .create({ email, clearing_broker, source }, token)\n .then((details) => {\n // Update Cognito user attribute to associate account id\n return Auth.updateUserAttributes(state.auth.userState, {\n \"custom:account_id\": details.id || \"\",\n }).then(() => {\n // success, try getting the account again now\n return api.account.list({}, token).then((accounts) => {\n return dispatch(\n _setAccount({\n account: accounts[0] || {},\n })\n );\n });\n });\n })\n .catch((err) => {\n // It could fail to create an account if the email already exists.\n // In that case, it's possible something is wrong with the JWT or it's expired.\n // Should not happen, but if so, ensure the user is logged out. they can login again.\n console.error(\"failed to create account:\", err);\n // return dispatch(logout())\n });\n });\n};\n\nexport const loadAccountDetails = () => async (dispatch, getState) => {\n const token = await getSessionJWT();\n const accountId = getAlpacaAccountId(getState());\n\n if (accountId) {\n return handleSessionExpire(\n api.ownerDetails\n .get(accountId, token)\n .then((details) => dispatch(_setAccountDetails({ details }))),\n dispatch\n );\n }\n return;\n};\n\nexport const patchAccountDetail = onboardingApiAction(\n (dispatch, getState, accountId, token, params) =>\n api.ownerDetails\n .patch(accountId, params, token)\n .then(() => dispatch(loadAccountDetails()))\n);\n\nexport const resetOnboarding = onboardingApiAction(\n (dispatch, getState, accountId, token) =>\n api.ownerDetails\n .resetOnboarding(accountId, token)\n .then(() => dispatch(loadAccountDetails()))\n .then(() => dispatch(api.relationships.list({ accountId })))\n .then((relationships) => {\n if (relationships.length === 0) return;\n return Promise.all(\n relationships.map((relationship) =>\n dispatch(\n api.relationships.delete({\n accountId,\n relationshipId: relationship.id,\n })\n )\n )\n );\n })\n .then(() => dispatch(api.transfers.list({ accountId })))\n .then((transfers) => {\n if (transfers.length === 0) return;\n return Promise.all(\n transfers.map((transfer) =>\n dispatch(\n api.transfers.delete({\n accountId,\n transferId: transfer.id,\n })\n )\n )\n );\n })\n .then(() =>\n api.accessKeys.list(accountId, token).then((accessKeys) => {\n if (accessKeys.length === 0) return;\n return Promise.all(\n accessKeys.map((key) => api.accessKeys.delete(accountId, key.id))\n );\n })\n )\n .then(() => dispatch(push(\"/brokerage/new-account\")))\n);\n\nexport const postTrustedContact = onboardingApiAction(\n (dispatch, getState, accountId, token, params) =>\n api.trustedContact\n .post(accountId, token, params)\n .then((result) => dispatch(_setTrustedContact(result)))\n);\n\nexport const listAffiliates = onboardingApiAction(\n (dispatch, getState, accountId, token) =>\n api.affiliates\n .list(accountId, token)\n .then((result) => dispatch(_setAffiliates(result)))\n);\n\nexport const getOnfidoSDKToken = onboardingApiAction(\n (dispatch, getState, accountId, token) =>\n api.onfidoSdkToken\n .get(accountId, token)\n .then((result) => dispatch(_setOnfidoSDKToken(result)))\n .catch((e) => {\n notification.open({\n type: \"error\",\n message: \"Could not create Token for KYC\",\n description: \"Please contact support.\",\n });\n throw e;\n })\n);\n\nexport const patchOnfidoOutcome = onboardingApiAction(\n (dispatch, getState, accountId, _, body) =>\n dispatch(api.onfidoSdkToken.patch({ accountId }, body)).catch((e) => {\n notification.open({\n type: \"error\",\n message: \"Could not save Onfido SDK outcome\",\n description: \"Please contact support.\",\n });\n })\n);\n\nexport const createOnfidoApplicant = onboardingApiAction(\n (dispatch, getState, accountId, _) =>\n dispatch(api.onfidoApplicant.post({ accountId }))\n .then((result) => {\n const kyc = JSON.parse(window.localStorage.getItem(\"kyc\")) || {};\n window.localStorage.setItem(\n \"kyc\",\n JSON.stringify({\n ...kyc,\n [accountId]: result.onfido_details.applicant_id,\n })\n );\n dispatch(_setOnfidoApplicantID(result));\n })\n .catch((e) => {\n notification.open({\n type: \"error\",\n message: \"Could not create Applicant for KYC\",\n description: \"Please contact support.\",\n });\n throw e;\n })\n);\n\nexport const updateOnfidoApplicant = onboardingApiAction(\n (dispatch, getState, accountId, _) =>\n dispatch(api.onfidoApplicant.patch({ accountId })).catch((e) => {\n notification.open({\n type: \"error\",\n message: \"Could not update Applicant for KYC\",\n description: \"Please contact support.\",\n });\n throw e;\n })\n);\n\nexport const postAffiliate = onboardingApiAction(\n (dispatch, getState, accountId, token, params) =>\n api.affiliates\n .post(accountId, token, params)\n .then(() => dispatch(listAffiliates()))\n);\n\nexport const patchAffiliate = onboardingApiAction(\n (dispatch, getState, accountId, token, affiliateId, params) =>\n api.affiliates\n .patch(accountId, affiliateId, token, params)\n .then(() => dispatch(listAffiliates()))\n);\n\n//user configurations\nexport const listConfigs = (product) => (dispatch, getState) => {\n let { accountId, paperAccountId } = getAccountIdAndJWT(getState());\n\n if (!accountId) {\n dispatch(getAccount()).then(() => {\n accountId = getAlpacaAccountId(getState()) || null;\n });\n }\n\n if (product === \"paper\") {\n dispatch(_reqConfigs());\n return dispatch(api.paperConfigs.list({ paperAccountId }))\n .then((result) => {\n result.accounts = { paper: paperAccountId, live: accountId };\n dispatch(_setConfigs(result));\n })\n .catch((e) => {\n console.error(e);\n notification.open({\n type: \"error\",\n message: \"Could not load configurations\",\n description:\n \"There was a problem trying to load your account configurations. Please try again.\",\n });\n });\n }\n\n dispatch(_reqConfigs());\n return dispatch(api.configs.list({ accountId }))\n .then((result) => {\n result.accounts = { paper: paperAccountId, live: accountId };\n dispatch(_setConfigs(result));\n })\n .catch((e) => {\n console.error(e);\n notification.open({\n type: \"error\",\n message: \"Could not load configurations\",\n description:\n \"There was a problem trying to load your account configurations. Please try again.\",\n });\n });\n};\n\nexport const patchConfig = (params, product) => (dispatch, getState) => {\n let { accountId, paperAccountId } = getAccountIdAndJWT(getState());\n\n if (product === \"paper\") {\n dispatch(_reqConfigs());\n return dispatch(api.paperConfigs.patch({ paperAccountId }, params)).then(\n () => {\n dispatch(listConfigs(\"paper\"));\n },\n (err) => {\n console.log(err);\n notification.open({\n type: \"error\",\n message: \"Could not save configurations\",\n description:\n \"There was a problem trying to change your account configurations. Please try again.\",\n });\n }\n );\n }\n\n dispatch(_reqConfigs());\n return dispatch(api.configs.patch({ accountId }, params))\n .then(() => dispatch(listConfigs(\"live\")))\n .catch((err) => {\n console.error(err);\n notification.open({\n type: \"error\",\n message: \"Could not save configurations\",\n description:\n \"There was a problem trying to change your account configurations. Please try again.\",\n });\n });\n};\n\nexport const deleteAffiliate = onboardingApiAction(\n (dispatch, getState, accountId, token, affiliateId) =>\n api.affiliates\n .delete(accountId, token, affiliateId)\n .then(() => dispatch(listAffiliates()))\n);\n\nexport const loadDataAgreement = (agreementName) => (dispatch, getState) => {\n const { accountId, token } = getAccountIdAndJWT(getState());\n return api.dataAgreement\n .get(accountId, agreementName, token)\n .then((agreement) => {\n dispatch({\n type: \"app/RECEIVE_DATA_AGREEMENT\",\n payload: {\n name: agreementName,\n agreement,\n },\n });\n });\n};\n\nexport const postDataAgreement = onboardingApiAction(\n (dispatch, getState, accountId, token, agreementName, agreementText) =>\n api.dataAgreement\n .post(accountId, agreementName, token, agreementText)\n .then(() =>\n dispatch({\n type: \"app/AGREEMENT_ACCEPTED\",\n payload: { name: agreementName },\n })\n )\n);\n\nexport const postTaxForm = onboardingApiAction(\n (dispatch, getState, accountId, token, formName) =>\n api.taxForm.post(accountId, formName, token).then(() =>\n dispatch({\n type: \"app/TAXFORM_ACCEPTED\",\n payload: { name: formName },\n })\n )\n);\n\nexport const postApiAgreement =\n (agreementName, agreementText) => (dispatch, getState) => {\n const { accountId, token } = getAccountIdAndJWT(getState());\n return api.dataAgreement\n .post(accountId, agreementName, token, agreementText)\n .then(() =>\n api.ownerDetails\n .get(accountId, token)\n .then((details) =>\n Promise.all([dispatch(_setAccountDetails({ details }))])\n )\n );\n };\n\n/**\n * Updates account info such as phone number and address.\n * Note: This action will trigger a review for the account owner.\n *\n * @param {Object} params\n */\nexport const updateAccountDetails = (params) => async (dispatch, getState) => {\n const { accountId } = getAccountIdAndJWT(getState());\n const token = await getSessionJWT();\n\n return api.ownerDetails.patch(accountId, params, token).then(() => {\n return api.ownerDetails.get(accountId, token).then((details) =>\n Promise.all([\n dispatch(_setAccountDetails({ details })),\n // also get new account info (this is where the email comes in)\n dispatch(getAccount()),\n ])\n );\n });\n};\n\n/**\n * Updates owner attributes such as email\n * Note: any update will set account status to ACCOUNT_UPDATED\n * Fully-Disclosed Correspondents can modify email without status change\n *\n * @param {Object} params\n */\nexport const updateAccountOwner = (params) => async (dispatch, getState) => {\n const { accountId } = getAccountIdAndJWT(getState());\n const token = await getSessionJWT();\n\n return api.owner.patch(params, token).then(() => {\n return api.owner.get(accountId, token).then((owner) =>\n Promise.all([\n dispatch(_setOwnerProps(owner)),\n // also get new account info (this is where the email comes in)\n dispatch(getAccount()),\n ])\n );\n });\n};\n\n/**\n * Updates account with an additional e-signature record.\n *\n * @param {Object} params\n */\nexport const addESignDetail = (params) => (dispatch, getState) => {\n const { accountId, token } = getAccountIdAndJWT(getState());\n return api.ownerDetails.patchESign(accountId, params, token).then(() => {\n return api.ownerDetails\n .get(accountId, token)\n .then((details) =>\n Promise.all([dispatch(_setAccountDetails({ details }))])\n );\n });\n};\n\n/**\n * Loads owner props from S3. These are useful for persisting dashboard/UX needs.\n * This information is not stored in gobroker.\n */\nexport const loadOwnerProps = () => (dispatch) => {\n return handleSessionExpire(\n Storage.get(\"props.json\", {\n level: \"private\",\n region: \"us-east-1\",\n download: true,\n })\n .then((result) => {\n let ownerProps = {};\n if (result && result.Body) {\n ownerProps = result.Body;\n }\n\n return dispatch(_setOwnerProps(ownerProps));\n })\n .catch((err) => {\n if (err.response?.status === 404) {\n // If the key did not exist, create it for the first time. It'll be empty for now.\n // This will remove 404 errors in the console for subsequent requests.\n // This file could be missing for existing users that have been migrated. Others should have the file.\n Storage.put(\"props.json\", JSON.stringify({}), {\n level: \"private\",\n region: \"us-east-1\",\n });\n }\n // If file does not exist or there was some other problem.\n return dispatch(_setOwnerProps({}));\n }),\n dispatch\n );\n};\n\n/**\n * createWireBank will create a wire bank\n */\nexport const createWireBank = (metadata) => (dispatch, getState) => {\n dispatch(\n api.wireBanks.create(\n {\n accountId: getAlpacaAccountId(getState()),\n },\n metadata\n )\n )\n .then(() => {\n eventTracker(\"Linked Bank Account\", {\n category: \"Banking\",\n label: window.location.pathname,\n });\n dispatch(clearCreateWireBankStatus());\n dispatch(_setCreateWireBankStatus({ error: null, metadata }));\n return dispatch(loadWireBanks());\n })\n .catch((error) => {\n dispatch(_setCreateWireBankStatus({ error, metadata }));\n });\n};\n/**\n * createRelationship will link a new bank account\n * given metadata from Plaid\n */\nexport const createRelationship = (metadata) => (dispatch, getState) => {\n const accountId = getAlpacaAccountId(getState());\n\n return dispatch(api.relationships.create({ accountId }, metadata))\n .then(() => {\n eventTracker(\"Linked Bank Account\", {\n category: \"Banking\",\n label: window.location.pathname,\n });\n\n dispatch(_setCreateRelationshipStatus({ error: null, metadata }));\n return dispatch(loadRelationships());\n })\n .catch((error) => {\n dispatch(_setCreateRelationshipStatus({ error, metadata }));\n });\n};\n\n/**\n * verifyRelationship will verify a new bank account\n * given metadata from Plaid\n */\nexport const verifyRelationship =\n (relationshipId, metadata) => (dispatch, getState) => {\n const accountId = getAlpacaAccountId(getState());\n\n return dispatch(\n api.relationships.verify({ accountId, relationshipId }, metadata)\n )\n .then(() => {\n eventTracker(\"Linked Bank Account\", {\n category: \"Banking\",\n label: window.location.pathname,\n });\n\n dispatch(_setCreateRelationshipStatus({ error: null, metadata }));\n return dispatch(loadRelationships());\n })\n .catch((error) => {\n dispatch(_setCreateRelationshipStatus({ error, metadata }));\n });\n };\n\n/**\n * loadRelationships will load all linked bank accounts for the account\n */\nexport const loadRelationships = () => (dispatch, getState) =>\n dispatch(\n api.relationships.list({\n accountId: getAlpacaAccountId(getState()),\n })\n ).then((relationships) => {\n dispatch(_setRelationships(relationships));\n if (relationships.length === 0) return;\n return Promise.all(\n relationships.map((relationship) =>\n dispatch(loadInstitution(relationship.plaid_institution))\n )\n );\n });\n\n/**\n * loadWireBanks will load all wire bank for the account\n */\nexport const loadWireBanks = () => (dispatch, getState) =>\n dispatch(\n api.wireBanks.list({\n accountId: getAlpacaAccountId(getState()),\n })\n ).then((wireBanks) => {\n dispatch(_setWireBanks(wireBanks));\n });\n\n/**\n * listActivities will load all account activities for the account\n */\nexport const listActivities =\n (product, date = \"\", types = [], after = \"\", until = \"\") =>\n (dispatch, getState) => {\n const accountId = getAccountIdForProduct(getState(), product);\n const endpoint = product === \"paper\" ? \"paperActivities\" : \"activities\";\n\n return dispatch(\n api[endpoint].list(\n { accountId },\n { date: date, activity_types: types.join(\",\"), after, until }\n )\n ).then((activities) => dispatch(_setActivities({ activities, accountId })));\n };\n\n/**\n * TODO: This is deprecated. Will remove once it's confirmed there is no longer\n * any need to request the public token on the API.\n * getPlaidToken will get the Plaid public token for the relationship\n */\nexport const getPlaidToken =\n (relationshipId = \"\") =>\n async (dispatch, getState) => {\n return await dispatch(\n api.relationships.token({\n accountId: getAlpacaAccountId(getState()),\n relationshipId,\n })\n ).then((result) => dispatch(_setPlaidToken(result)));\n };\n\n/**\n * deleteWireBank will remove a linked bank account\n */\nexport const deleteWireBank =\n (bankId = \"\") =>\n (dispatch, getState) =>\n dispatch(\n api.wireBanks.delete({\n accountId: getAlpacaAccountId(getState()),\n bankId,\n })\n ).then(() => {\n eventTracker(\"Unlinked Bank Account\", {\n category: \"Banking\",\n label: window.location.pathname,\n });\n\n return dispatch(loadWireBanks());\n });\n\n/**\n * deleteRelationship will remove a linked bank account\n */\nexport const deleteRelationship =\n (relationshipId = \"\") =>\n (dispatch, getState) =>\n dispatch(\n api.relationships.delete({\n accountId: getAlpacaAccountId(getState()),\n relationshipId,\n })\n ).then(() => {\n eventTracker(\"Unlinked Bank Account\", {\n category: \"Banking\",\n label: window.location.pathname,\n });\n\n return dispatch(loadRelationships());\n });\n\nexport const loadInstitution = (institutionId) => (dispatch) => {\n if (!institutionId || institutionId == \"micro_deposit\") {\n return Promise.resolve();\n }\n return dispatch(api.institutions.get({ institutionId }))\n .then(({ institution }) => {\n if (institution) {\n dispatch(_setInstitution(institution));\n }\n })\n .catch(console.error);\n};\n\n/**\n * listTransfers will return a list of user's ACH or WIRE transfers.\n */\nexport const listTransfers = () => (dispatch, getState) => {\n const accountId = getAlpacaAccountId(getState());\n return dispatch(api.transfers.list({ accountId }))\n .then((xfers) => dispatch(_setTransfers(xfers)))\n .catch(console.error);\n};\n\n/**\n * loadPaperAccounts will return a list of the user's paper trading accounts.\n */\nexport const loadPaperAccounts = () => async (dispatch, getState) => {\n const { accountId } = getAccountIdAndJWT(getState());\n const token = await getSessionJWT();\n\n return handleSessionExpire(\n api.paperAccounts.list(accountId, token).then((resp) => {\n // If there are no paper accounts yet, create the first one for the user.\n if (resp && resp.length === 0) {\n return Promise.all([dispatch(createPaperAccount())]).then(() => {\n return Promise.all([dispatch(_setPaperAccounts(resp))]);\n });\n }\n\n return Promise.all([dispatch(_setPaperAccounts(resp))]);\n }),\n dispatch\n );\n};\n\n// A way for AccountProvider to sync account store state\nexport const syncAccounts = (newAccountState) => (dispatch) => {\n dispatch(_setSyncAccounts(newAccountState));\n};\n\n/**\n * createPaperAccount will create a new paper account using the user's current live account balance.\n * Only one can be created for now, so ensure there weren't any already.\n * Default cash is $100,000 unless otherwise specified.\n */\nexport const createPaperAccount =\n (recreate = false, cash = 100000) =>\n async (dispatch, getState) => {\n const { accountId } = getAccountIdAndJWT(getState());\n const token = await getSessionJWT();\n\n const account = getState().account;\n const paperAccounts =\n (account && account.paper && account.paper.accounts) || false;\n\n const cashInput = cash > 1000000000 ? 1000000000 : cash;\n\n // If no paper accounts exist or we are recreating one, send the request.\n return !paperAccounts || paperAccounts.length === 0 || recreate\n ? handleSessionExpire(\n api.paperAccounts\n .create(accountId, { cash: Number.parseFloat(cashInput) }, token)\n .then(\n () =>\n Promise.all[\n (dispatch(setPaperAccount()), dispatch(unsetAccessKeys()))\n ]\n ),\n dispatch\n )\n : null;\n };\n\n/**\n * deletePaperAccount will delete a paper account. If no id is provided, all\n * will be removed. There is currently only one paper account, so this is most common.\n */\nexport const deletePaperAccount =\n (paperAccountId) => async (dispatch, getState) => {\n const { accountId } = api.getAccountIdAndJWT(getState());\n const token = await getSessionJWT();\n\n if (paperAccountId) {\n return handleSessionExpire(\n api.paperAccounts\n .delete(accountId, { paperId: paperAccountId }, token)\n .then(() => dispatch(loadPaperAccounts())),\n dispatch\n );\n }\n // Remove all\n const account = getState().account;\n if (account.paper && account.paper.accounts) {\n let deleteOperations = [];\n\n account.paper.accounts.forEach((paperAccount) => {\n if (paperAccount.paper_account_id) {\n deleteOperations.push(\n api.paperAccounts.delete(\n accountId,\n { paperId: paperAccount.paper_account_id },\n token\n )\n );\n }\n });\n\n return handleSessionExpire(\n Promise.all(deleteOperations).then(() => dispatch(loadPaperAccounts())),\n dispatch\n );\n }\n return null;\n };\n\n/**\n * resetPaperAccount will delete the old account associated with the request and create a new one\n * in its place - this consolidates the old frontend paper reset flow and does it all in gobroker now.\n */\n\nexport const resetPaperAccount =\n (cash = 100000) =>\n (dispatch, getState) => {\n const { accountId } = api.getAccountIdAndJWT(getState());\n\n const account = getState().account;\n const paperAccount = account.paper.accounts[0];\n const paperAccountId = paperAccount.paper_account_id;\n\n const cashInput = cash > 1000000000 ? 1000000000 : cash;\n\n return dispatch(\n api.paperAccounts.reset(\n { accountId, paperAccountId },\n { cash: cashInput }\n )\n ).then(() => dispatch(loadPaperAccounts()));\n };\n\n/**\n * setPaperAccount will set the paper account to use (only one for now).\n * If the user has not set up a paper account yet, it will guide them in doing so.\n * Default amount is $100,000. Pass cash value to change.\n */\nexport const setPaperAccount =\n (cash = 100000) =>\n (dispatch, getState) => {\n return dispatch(loadPaperAccounts()).then(() => {\n const account = getState().account;\n let paperAccountId;\n\n if (\n !(account.paper && account.paper.accounts) ||\n account.paper.accounts.length === 0\n ) {\n return dispatch(createPaperAccount(false, cash)).then(() =>\n dispatch(setPaperAccount())\n );\n }\n paperAccountId =\n (account.paper.accounts[0] &&\n account.paper.accounts[0].paper_account_id) ||\n null;\n\n const p = [dispatch(_setPaperAccount(paperAccountId))];\n\n return Promise.all(p);\n });\n };\n\n/**\n * listDocuments\n */\nexport const listDocuments =\n (params = {}) =>\n (dispatch, getState) => {\n // Ok to use live account id (paper accounts have no documents)\n const { token, accountId } = getAccountIdAndJWT(getState());\n\n if (accountId) {\n handleSessionExpire(\n api.documents\n .list(accountId, token, params)\n .then((documents) => dispatch(_setDocuments(documents))),\n dispatch\n );\n }\n };\n\n/**\n * getDocumentUrl will get a presigned S3 temporary URL for a document\n */\nexport const getDocumentUrl =\n (documentId = \"\") =>\n async (dispatch, getState) => {\n const { accountId } = getAccountIdAndJWT(getState());\n return await dispatch(\n api.documents.url({ accountId, documentId }, null, { Accept: \"*/*\" })\n );\n };\n\nexport const resubmitOnfido = () => (dispatch, getState) => {\n const { accountId } = getAccountIdAndJWT(getState());\n return dispatch(api.onfidoResubmission.resubmit({ accountId }))\n .then((account) => dispatch(_setAccount({ account })))\n .catch((e) => {\n notification.open({\n type: \"error\",\n message: \"Could not resubmit account\",\n description: \"Please contact support.\",\n });\n throw e;\n });\n};\n\n// Export this reducer\nconst initialState = {};\nexport default createReducer(\n {\n [_setAccount]: (state, { account }) => ({ ...state, account }),\n [_setAccountDetails]: (state, { details }) => ({ ...state, details }),\n\n [_setOwnerProps]: (state, payload) => {\n return { ...state, props: payload };\n },\n\n [_setTrustedContact]: (state, payload) => {\n return { ...state, trustedContact: payload };\n },\n\n // Paper account\n [_setPaperAccounts]: (state, payload) => {\n const current =\n (payload && payload[0] && payload[0].paper_account_id) || null;\n const paper = {\n current,\n accounts: payload,\n };\n return { ...state, paper };\n },\n [_setPaperAccount]: (state, id) => {\n const paper = { ...state.paper, current: id || null };\n return { ...state, paper };\n },\n [unsetPaperAccount]: (state) => {\n // simply sets the current field to null\n const paper = { ...state.paper, current: null };\n return { ...state, paper };\n },\n\n // Sync Account store to AccountProvider\n [_setSyncAccounts]: (state, payload) => {\n return { ...state, ...payload };\n },\n\n // Documents\n [_setDocuments]: (state, payload) => {\n // Documents may have been previously loaded, additional API requests could load more.\n // For example, pagination or \"load more\" features. Append to the list of documents,\n // but remove any duplicates.\n // TODO: Think about this because if it is for pagination, is it even necessary?\n // Makes more sense for \"load more\" scenario.\n const mergeDocuments = (payload) => {\n const docs = state.documents || [];\n payload.map((x) => {\n let dup = false;\n docs.map((y) => {\n if (y.date === x.date && y.type === x.type) {\n dup = true;\n }\n return docs;\n });\n if (!dup) {\n docs.push(x);\n }\n return docs;\n });\n\n return docs;\n };\n\n return { ...state, documents: mergeDocuments(payload) };\n },\n\n // WireBanks\n [_setWireBanks]: (state, payload) => {\n return { ...state, wireBanks: payload };\n },\n // Relationships\n [_setRelationships]: (state, payload) => {\n return { ...state, relationships: payload };\n },\n [_setCreateRelationshipStatus]: (state, payload) => {\n return { ...state, createRelationshipStatus: payload };\n },\n [_setCreateWireBankStatus]: (state, payload) => {\n return { ...state, createWireBankStatus: payload };\n },\n [clearCreateRelationshipStatus]: (state) => {\n return { ...state, createRelationshipStatus: null };\n },\n [clearCreateWireBankStatus]: (state) => {\n return { ...state, createWireBankStatus: null };\n },\n [_setPlaidToken]: (state, payload) => {\n return { ...state, plaidToken: payload };\n },\n [_setInstitution]: (state, payload) => {\n if (!payload) return state;\n\n return {\n ...state,\n institutions: {\n ...state.institutions,\n [payload.institution_id]: {\n ...payload,\n logoUrl: payload.logo\n ? `data:image/png;base64,${payload.logo}`\n : null,\n },\n },\n };\n },\n [_setTransfers]: (state, payload) => {\n return { ...state, transfers: payload };\n },\n [_setActivities]: (state, payload) => {\n const activities = state.activities || {};\n activities[payload.accountId] = payload.activities;\n return { ...state, activities };\n },\n\n // User Configs\n [_setConfigs]: (state, payload) => {\n payload.is_fetching = false;\n return { ...state, configs: payload };\n },\n [_reqConfigs]: (state) => {\n let configs = Object.assign({}, state.configs);\n configs.is_fetching = true;\n return { ...state, configs };\n },\n\n // Affiliates\n [_setAffiliates]: (state, payload) => {\n return { ...state, affiliates: payload };\n },\n // Onfido SDK Token\n [_setOnfidoSDKToken]: (state, payload) => {\n return { ...state, onfido_sdk_token: payload.onfido_sdk_token };\n },\n // Onfido Applicant ID\n [_setOnfidoApplicantID]: (state, payload) => ({\n ...state,\n onfido_applicant_id: payload.onfido_details?.applicant_id,\n }),\n },\n initialState\n);\n\nexport const requestEmailChange = (params) => (dispatch) => {\n const req = {\n email: params.email.toLowerCase(), // lowercase email\n // Better than nothing ðŸ˜\n a: weakEncrypt(params.password),\n };\n return dispatch(api.owner.requestEmail({}, req)).then(() => {\n dispatch(setEmailUpdateVerificationRequired(true));\n });\n};\n\nexport const verifyEmailChange = (params) => async (dispatch) => {\n const token = await getSessionJWT();\n\n const req = {\n code: params.code,\n };\n\n return dispatch(api.owner.verifyEmail({}, req)).then(() => {\n return Promise.all([\n dispatch(setEmailUpdateVerificationRequired(false)),\n dispatch(api.account.list({}, token)).then((accounts) => {\n return dispatch(\n _setAccount({\n account: accounts[0] || {},\n })\n );\n }),\n ]);\n });\n};\n","// parameterizeUrl takes a url descriptor like:\n// \"xyz/:param1/abc/:myParam\", and { param1, myParam }\n// and injects the params to return a completed url string\nexport const parameterizeUrl = (urlDescriptor) => (params) => {\n const url = Object.keys(params).reduce((url, key) => {\n return url.replace(`:${key}`, params[key]);\n }, urlDescriptor);\n if (url.indexOf(\"/:\") !== -1) {\n throw new TypeError(`Insufficient url params specified: ${url}`);\n }\n return url;\n};\n","import querystring from \"query-string\";\nimport { logout } from \"reducers/auth/logout\";\nimport { parameterizeUrl } from \"lib/urls\";\nimport { getSessionJWT } from \"../utils\";\nimport { clearUnusedCookies } from \"src/utils\";\nimport * as Sentry from \"@sentry/browser\";\n\n/**\n * apiActions are a more streamlined api method declaration.\n * We export handy predefined method types (GET, POST, etc).\n * I recommend using these instead of the more cumbersome REST method.\n *\n * It allows you to define api methods like this:\n *\n * createNote = POST('accounts/:accountId/notebook/:notebookId/notes')\n *\n * And dispatch it like this:\n * dispatch(createNote(\n * { accountId, notebookId },\n * { text: 'Remember to feed Fluffykins' }\n * ))\n *\n * This makes it so that outside code doesn't need to supply a token,\n * and just has a simple action creator which is always called\n * in the same format of (urlParams, payload, headers).\n *\n * NOTE: There is something incomplete about this newer function.\n * There was an idea to abstract REST() and migrate everything to use\n * this wrapper, but your mileage will vary based on the request you need\n * to make and response you're looking for.\n */\nconst apiAction =\n (method) =>\n (url, options = { public: false }) => {\n const populateUrl = typeof url === \"function\" ? url : parameterizeUrl(url);\n\n return (urlParams = {}, payload = {}, headers = {}) =>\n async (dispatch) => {\n let token;\n if (!options.public) {\n try {\n token = await getSessionJWT();\n } catch (err) {\n console.error(err);\n return dispatch(logout());\n }\n }\n const populatedUrl = populateUrl(urlParams);\n return REST(method, populatedUrl)(\n payload,\n token,\n headers,\n null,\n options\n );\n };\n };\n\nexport const GET = apiAction(\"GET\");\nexport const POST = apiAction(\"POST\");\nexport const PATCH = apiAction(\"PATCH\");\nexport const PUT = apiAction(\"PUT\");\nexport const DELETE = apiAction(\"DELETE\");\n\nclass InvalidCredentialException extends Error {\n constructor(message) {\n super(message || \"invalid credentials\");\n this.name = \"InvalidCredentialException\";\n this.status = 401;\n }\n}\n\nclass NotFoundException extends Error {\n constructor(message) {\n super(message || \"data not found\");\n this.name = \"NotFoundException\";\n this.status = 404;\n }\n}\n\nclass ApiException extends Error {\n name = \"ApiException\";\n\n constructor(props) {\n super(props.message || \"Unknown\");\n Object.keys(props).forEach((key) => {\n this[key] = props[key];\n });\n }\n}\n\nconst REST =\n (method, path) =>\n async (\n params = {},\n token = null,\n headers = {},\n endpointOverride = null,\n options = { public: false }\n ) => {\n if (!options.public) {\n token = await getSessionJWT();\n }\n\n // config is set globally in the build process\n const endpoint =\n endpointOverride == null ? window.env.API_URL : endpointOverride;\n\n const requestHeaders = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"X-Dashboard-Version\": process.env.REACT_APP_VERSION || \"dev\",\n ...headers,\n };\n\n if (token) {\n requestHeaders.Authorization = `Bearer ${token}`;\n }\n\n let url = endpoint + path;\n\n const request = {\n method,\n headers: requestHeaders,\n };\n\n if (/GET/i.test(method)) {\n const query = querystring.stringify(params);\n if (query) {\n url += `?${query.toString()}`;\n }\n } else if (request.headers[\"Content-Type\"].includes(\"json\")) {\n request.body = JSON.stringify(params);\n } else {\n request.body = params;\n if (request.headers[\"Content-Type\"].includes(\"multipart/form-data\")) {\n delete request.headers[\"Content-Type\"];\n }\n }\n\n return fetch(url, request)\n .then((resp) => {\n if (resp?.status === 401) throw new InvalidCredentialException();\n if (resp?.status === 404) throw new NotFoundException();\n if (resp?.status === 204) return null;\n\n // status not in the range 200-299\n if (resp && !resp.ok) {\n throw resp;\n }\n\n if (resp.headers.get(\"content-type\")?.startsWith(\"application/pdf\")) {\n // pdfs are blob data, not json data\n return resp.blob();\n }\n\n return resp.json();\n })\n .catch((e) => {\n if (e instanceof Error) {\n throw e;\n }\n\n const errValues = {\n status: e.status,\n method,\n path,\n params,\n };\n\n return e\n .json()\n .then((data) => {\n errValues.response = data;\n errValues.message = data.message;\n })\n .catch((err) => {\n errValues.message = \"error parsing JSON response\";\n console.error(\"api error: \", errValues);\n console.log(err);\n })\n .finally(() => {\n Sentry.withScope((scope) => {\n scope.setExtras(errValues);\n Sentry.captureException(\n `api returned status ${errValues.status}`\n );\n });\n\n throw new ApiException(errValues);\n });\n });\n };\n\nexport default REST;\n","import { createReducer } from \"redux-act\";\n\nimport { eraseCookie } from \"lib/cookies\";\nimport { eventTracker } from \"src/utils/eventTracker\";\n\nexport const REDUCER = \"signup\";\n\nexport const accountCreated = (response) => () => {\n eraseCookie(\"alpaca_ref_by\");\n let referralSucceededOrUndefined = response[\"referral_succeeded\"];\n if (referralSucceededOrUndefined !== undefined) {\n const referredBy = response[\"referred_by\"];\n if (referralSucceededOrUndefined && referredBy) {\n eventTracker(\"Referral Succeeded\", {\n category: \"AccountCreation\",\n referredBy: `${referredBy}`,\n });\n } else {\n const referralErrorMessage = response[\"referral_error\"];\n eventTracker(\"Referral Failed\", {\n category: \"AccountCreation\",\n error: referralErrorMessage,\n });\n }\n } else {\n eventTracker(\"Referral Unknown Status\", {\n category: \"AccountCreation\",\n });\n }\n eventTracker(\"Account Creation Succeeded\", {\n category: \"AccountCreation\",\n });\n};\n\nexport const accountCreationFailed = (err) => () => {\n eventTracker(`Account Creation Failed: ${err.message}`, {\n category: \"AccountCreation\",\n });\n};\n\nconst initialState = {};\nexport default createReducer({}, initialState);\n","import { getAccountIdAndJWT } from \"selectors\";\n\n// REST IS DEPRECATED.\n//\n// GET, POST, DELETE etc. styles are recommended. See rest.js for more info.\n// See the relationship methods for examples.\nimport { default as REST, DELETE, GET, PATCH, POST } from \"./rest\";\nimport { getCookie } from \"lib/cookies\";\nimport { accountCreated, accountCreationFailed } from \"reducers/auth/signup\";\n\nexport const owner = {\n get: REST(\"GET\", \"/owner\"), // TODO use GET() instead of REST()\n patch: (payload, token) => REST(\"PATCH\", \"/owner\")(payload, token), // TODO use PATCH() instead of REST()\n create: POST(\"/owner\", { public: true }),\n requestEmail: POST(\"/owner/email\"),\n verifyEmail: POST(\"/owner/email-confirm\"),\n joinCryptoWaitlist: POST(\"/owner/waitlist/crypto\"),\n};\n\nexport const account = {\n create: (urlParams, payload, token) => {\n // signup_source default value is 'alpaca' in cognito. so if it's 'alpaca'\n // we don't want to send it to gobroker\n if (payload.source === \"alpaca\") payload.source = null;\n const refBy = getCookie(\"alpaca_ref_by\");\n if (refBy) {\n payload[\"referral_code\"] = refBy;\n }\n return async (dispatch) =>\n dispatch(POST(\"/accounts\")(urlParams, payload, token)).then(\n (response) => dispatch(accountCreated(response)),\n (error) => dispatch(accountCreationFailed(error))\n );\n },\n patch: REST(\"PATCH\", \"/accounts\"), // TODO use PATCH() instead of REST()\n list: GET(\"/accounts\"),\n resetPassword: REST(\"POST\", \"/accounts/actions/reset_password\"), // TODO use POST() instead of REST()\n requestResetPassword: REST(\n // TODO use GET() instead of REST()\n \"POST\",\n \"/accounts/actions/request_reset_password\"\n ),\n verifyEmail: REST(\"POST\", \"/accounts/actions/verify_email\"), // TODO use POST() instead of REST()\n requestVerifyEmail: REST(\"POST\", \"/accounts/actions/request_verify_email\"), // TODO use POST() instead of REST()\n};\n\nexport const tradeAccount = {\n get: GET(\"/accounts/:accountId/trade_account/margin\"),\n getETC: GET(\"/accounts/:accountId/trade_account/margin\"),\n getETCLast: GET(\"/accounts/:accountId/trade_account/margin/last\"),\n};\n\nexport const paperTradeAccount = {\n get: GET(\"/paper_accounts/:accountId/trade_account/margin\"),\n getETC: GET(\"/paper_accounts/:accountId/trade_account/margin\"),\n getETCLast: GET(\"/paper_accounts/:accountId/trade_account/margin/last\"),\n};\n\nexport const paperAccounts = {\n list: (id, token) => REST(\"GET\", `/accounts/${id}/paper_accounts`)({}, token), // TODO use GET() instead of REST()\n get: (id, payload, token) =>\n REST(\n // TODO use GET() instead of REST()\n \"GET\",\n `/accounts/${id}/paper_accounts/${(payload && payload.paperId) || \"\"}`\n )({}, token),\n create: (id, payload, token) =>\n REST(\"POST\", `/accounts/${id}/paper_accounts`)(\n // TODO use POST() instead of REST()\n { cash: (payload && payload.cash) || 100000 },\n token\n ),\n delete: (id, payload, token) =>\n REST(\n // TODO use DELETE() instead of REST()\n \"DELETE\",\n `/accounts/${id}/paper_accounts/${(payload && payload.paperId) || \"\"}`\n )({}, token),\n reset: POST(\"/accounts/:accountId/paper_accounts/:paperAccountId\"),\n};\n\nexport const ownerDetails = {\n get: (id, token) => REST(\"GET\", `/accounts/${id}/details`)({}, token), // TODO use GET() instead of REST()\n patch: (id, payload, token) =>\n REST(\"PATCH\", `/accounts/${id}/details`)(payload, token), // TODO use PATCH() instead of REST()\n patchESign: (id, payload, token) =>\n REST(\"PATCH\", `/accounts/${id}/details/esign`)(payload, token),\n // for staging/local only\n resetOnboarding: (id, token) =>\n REST(\"PATCH\", `/accounts/${id}/details/reset`)({}, token),\n};\n\nexport const auth = {\n create: REST(\"POST\", \"/auth\"), // TODO use POST() instead of REST()\n};\n\nexport const recovery = {\n create: POST(\"/accounts/:cognitoId/account-recovery\"),\n delete: DELETE(\"/accounts/:cognitoId/account-recovery\"),\n};\n\nexport const accessKeys = {\n list: (id, token) => REST(\"GET\", `/access_keys`)({}, token), // TODO use GET() instead of REST()\n create: (id, accessToken) => REST(\"POST\", \"/access_keys\")({}, accessToken), // TODO use POST() instead of REST()\n delete: (id, keyId, token) =>\n REST(\"DELETE\", `/access_keys/${keyId}`)({}, token), // TODO use DELETE() instead of REST()\n};\n\nexport const paperAccessKeys = {\n list: (paperAccountId, token) =>\n REST(\"GET\", `/paper_accounts/${paperAccountId}/access_keys`)({}, token), // TODO use GET() instead of REST()\n create: (paperAccountId, accessToken) =>\n REST(\"POST\", `/paper_accounts/${paperAccountId}/access_keys`)(\n {},\n accessToken\n ), // TODO use POST() instead of REST()\n delete: (paperAccountId, keyId, token) =>\n REST(\"DELETE\", `/paper_accounts/${paperAccountId}/access_keys/${keyId}`)(\n {},\n token\n ), // TODO use DELETE() instead of REST()\n};\n\nexport const addresses = {\n list: REST(\"GET\", \"/addresses\"), // TODO use GET() instead of REST()\n get: (id, token) => REST(\"GET\", `/addresses/${id}/details`)({}, token), // TODO use GET() instead of REST()\n};\n\nexport const positions = {\n list: (id, token) => REST(\"GET\", `/accounts/${id}/positions`)({}, token), // TODO use GET() instead of REST()\n symbol: (id, symbol, token) =>\n REST(\"GET\", `/accounts/${id}/positions/${symbol}`)({}, token), // TODO use GET() instead of REST()\n liquidate: POST(\"/accounts/:accountId/positions/liquidate\"),\n liquidatePosition: DELETE(\"/accounts/:accountId/positions/:symbol?qty=:qty\"),\n};\n\nexport const paperPositions = {\n list: (id, token) =>\n REST(\"GET\", `/paper_accounts/${id}/positions`)({}, token), // TODO use GET() instead of REST()\n symbol: (id, symbol, token) =>\n REST(\"GET\", `/paper_accounts/${id}/positions/${symbol}`)({}, token), // TODO use GET() instead of REST()\n liquidate: POST(\"/paper_accounts/:accountId/positions/liquidate\"),\n liquidatePosition: DELETE(\n \"/paper_accounts/:accountId/positions/:symbol?qty=:qty\"\n ),\n};\n\nexport const orders = {\n list: GET(\"/accounts/:accountId/orders\"),\n listBySymbol: GET(\n \"/accounts/:accountId/orders?status=:status&symbols=:symbol\"\n ),\n create: POST(\"/accounts/:accountId/orders\"),\n cancelAll: (id, token, params) =>\n REST(\"DELETE\", `/accounts/${id}/orders`)(params, token),\n getOrder: GET(\"/accounts/:accountId/orders/:orderId\"),\n cancelOrder: DELETE(\"/accounts/:accountId/orders/:orderId\"),\n replaceOrder: PATCH(\"/accounts/:accountId/orders/:orderId\"),\n};\n\n// TODO: Ultimately this should be refactoed to allow one api call, the backend should change to accept an \"accountId\" and \"product\"\nexport const paperOrders = {\n list: GET(\"/paper_accounts/:accountId/orders\"),\n listBySymbol: GET(\n \"/paper_accounts/:accountId/orders?status=:status&symbols=:symbol\"\n ),\n create: POST(`/paper_accounts/:accountId/orders`),\n cancelAll: (id, token, params) =>\n REST(\"DELETE\", `/paper_accounts/${id}/orders`)(params, token),\n getOrder: GET(\"/paper_accounts/:accountId/orders/:orderId\"),\n cancelOrder: DELETE(\"/paper_accounts/:accountId/orders/:orderId\"),\n replaceOrder: PATCH(\"/paper_accounts/:accountId/orders/:orderId\"),\n};\n\nexport const wireBanks = {\n list: GET(\"/accounts/:accountId/banks\"),\n create: POST(\"/accounts/:accountId/banks\"),\n delete: DELETE(\"/accounts/:accountId/banks/:bankId\"),\n};\n\nexport const rapyd = {\n wallet: {\n create: POST(\"/rapyd/:accountId/wallet\"),\n get: GET(\"/rapyd/:accountId/wallet\"),\n },\n transfer: {\n create: POST(\"/rapyd/:accountId/payment\"),\n get: GET(\"/rapyd/:accountId/transfers\"),\n },\n countries: {\n get: GET(\"/rapyd/supported-countries\"),\n },\n paymentMethods: {\n get: GET(\"/rapyd/payment-methods\"),\n getForCountry: GET(\"/rapyd/payment-methods/:country\"),\n },\n exchange: {\n calculate: GET(\"/rapyd/exchange-rate?buy=:buy&sell=:sell\"),\n },\n};\n\nexport const currencyCloud = {\n create: POST(\"/currency_cloud/:accountId/funding_account\"),\n get: GET(\"/currency_cloud/:accountId/funding_account\"),\n status: GET(\"/currency_cloud/:accountId/status\"),\n transfer: {\n get: GET(\"/currency_cloud/:accountId/transfers\"),\n create: POST(\"/currency_cloud/:accountId/transfers\"),\n },\n beneficiary: {\n get: GET(\"/currency_cloud/:accountId/beneficiary_required_details\"),\n create: POST(\"/currency_cloud/:accountId/beneficiary\"),\n },\n};\n\nexport const rewards = {\n get: GET(\"/accounts/:accountId/claim-reward/:rewardName\"),\n view: PATCH(\"/accounts/:accountId/reward-viewed/:rewardName\"),\n};\n\nexport const relationships = {\n list: GET(\"/accounts/:accountId/relationships\"),\n create: POST(\"/accounts/:accountId/relationships\"),\n delete: DELETE(\"/accounts/:accountId/relationships/:relationshipId\"),\n verify: POST(\"/accounts/:accountId/relationships/:relationshipId/verify\"),\n token: GET(\"/accounts/:accountId/relationships/:relationshipId/token\"),\n};\n\nexport const institutions = {\n get: GET(\"/institutions/:institutionId\"),\n};\n\nexport const plaidLinkToken = {\n get: GET(\"/accounts/:accountId/plaid/link/token\"),\n};\n\nexport const plaidAuth = {\n get: GET(\"/accounts/:accountId/plaid/auth_status\"),\n};\n\nexport const plaidStripe = {\n get: GET(\"/plaid/stripe/link/token\"),\n post: POST(\"/plaid/stripe\"),\n};\n\nexport const transfers = {\n list: GET(\"/accounts/:accountId/transfers\"),\n create: POST(\"/accounts/:accountId/transfers\"),\n delete: DELETE(\"/accounts/:accountId/transfers/:transferId\"),\n};\n\nexport const activities = {\n list: GET(\"/accounts/:accountId/activities\"),\n};\n\nexport const paperActivities = {\n list: GET(\"/paper_accounts/:accountId/activities\"),\n};\n\nexport const documents = {\n list: (id, token, params) =>\n REST(\"GET\", `/accounts/${id}/documents`)(params, token), // TODO use GET() instead of REST()\n url: GET(\"/accounts/:accountId/documents/:documentId/url\"),\n};\n\n// New Alpaca account document system\nexport const accountDocuments = {\n listRequests: (id, token) =>\n REST(\"GET\", `/documents/accounts/${id}/requests`)({}, token),\n listUploads: (id, token) =>\n REST(\"GET\", `/documents/accounts/${id}`)({}, token),\n upload: (id, token, payload) =>\n REST(\n \"POST\",\n `/documents/${payload.docId}/upload?sub_type=${payload.subType}`\n )(payload.formData, token, { \"Content-Type\": \"multipart/form-data\" }),\n uploadByDocType: (id, token, payload) =>\n REST(\n \"POST\",\n `/documents/accounts/${id}/upload/${payload.docType}/${payload.docSubType}`\n )(payload.formData, token, { \"Content-Type\": \"multipart/form-data\" }),\n};\n\nexport const profitloss = {\n get: GET(\"/accounts/:accountId/profitloss\"),\n};\n\nexport const paperProfitloss = {\n get: GET(\"/paper_accounts/:accountId/profitloss\"),\n};\n\nexport const portfolio = {\n get: GET(\"/accounts/:accountId/portfolio/history\"),\n};\n\nexport const paperPortfolio = {\n get: GET(\"/paper_accounts/:accountId/portfolio/history\"),\n};\n\nexport const dataAgreement = {\n get: (accountId, agreement, token) =>\n REST(\"GET\", `/accounts/${accountId}/agreements/${agreement}/preview`)(\n // TODO use GET() instead of REST()\n {},\n token\n ),\n post: (accountId, agreement, token, agreementText) =>\n REST(\"POST\", `/accounts/${accountId}/agreements/${agreement}/accept`)(\n // TODO use POST() instead of REST()\n agreementText ? { agreement_text: agreementText } : {},\n token\n ),\n};\n\nexport const taxForm = {\n post: (accountId, formName, token) =>\n REST(\"POST\", `/accounts/${accountId}/taxfiles/${formName}/accept`)(\n {},\n token\n ),\n};\n\nexport const dataAgreementV2 = {\n get: GET(\"/accounts/:accountId/agreements/:agreement/preview\"),\n};\n\nexport const trustedContact = {\n get: (accountId, token) =>\n REST(\"GET\", `/accounts/${accountId}/trusted_contact`)({}, token), // TODO use GET() instead of REST()\n post: (accountId, token, data) =>\n REST(\"POST\", `/accounts/${accountId}/trusted_contact`)(data, token), // TODO use POST() instead of REST()\n};\n\nexport const affiliates = {\n post: (accountId, token, payload) =>\n REST(\"POST\", `/accounts/${accountId}/affiliates`)(payload, token), // TODO use POST() instead of REST()\n list: (accountId, token) =>\n REST(\"GET\", `/accounts/${accountId}/affiliates`)({}, token), // TODO use GET() instead of REST()\n patch: (accountId, affiliateId, token, payload) =>\n REST(\"PATCH\", `/accounts/${accountId}/affiliates/${affiliateId}`)(\n // TODO use PATCH() instead of REST()\n payload,\n token\n ),\n delete: (accountId, token, affiliateId) =>\n REST(\"DELETE\", `/accounts/${accountId}/affiliates/${affiliateId}`)(\n // TODO use DELETE() instead of REST()\n {},\n token\n ),\n};\n\nexport const onfidoApplicant = {\n post: POST(`/accounts/:accountId/onfido/applicant`),\n patch: PATCH(`/accounts/:accountId/onfido/applicant`),\n};\n\nexport const onfidoSdkToken = {\n get: (accountId, token) =>\n REST(\"GET\", `/accounts/${accountId}/onfido/sdk_token`)({}, token),\n patch: PATCH(`/accounts/:accountId/onfido/sdk`),\n};\n\nexport const onfidoResubmission = {\n resubmit: POST(\"/accounts/:accountId/onfido/resubmit\"),\n};\n\nexport const configs = {\n list: GET(`/accounts/:accountId/configurations`),\n patch: PATCH(`/accounts/:accountId/configurations`),\n};\n\nexport const paperConfigs = {\n list: GET(`/paper_accounts/:paperAccountId/configurations`),\n patch: PATCH(`/paper_accounts/:paperAccountId/configurations`),\n};\n\nexport const billing = {\n plans: GET(\"/billing/plans\", { public: true }),\n coupon: GET(\"/billing/coupon/:code\"),\n overview: GET(\"/billing/overview\"),\n stripe: {\n create: POST(\"/billing/stripe\"),\n update: PATCH(\"/billing/stripe\"),\n cancel: DELETE(\"/billing/stripe\"),\n },\n alpaca: {\n create: POST(\"/billing/alpaca\"),\n update: PATCH(\"/billing/alpaca\"),\n cancel: DELETE(\"/billing/alpaca\"),\n },\n};\n\nexport const assets = {\n get: GET(\"/assets/:symbol\"),\n search: GET(\"/assets/search\"),\n list: GET(\"/assets?asset_class=:class\"),\n};\n\nexport const quotes = {\n get: GET(\"/quotes?symbols=:symbols\"),\n};\n\nexport const contests = {\n get: GET(\"/contests/:contestId\", { public: true }),\n list: GET(\"/contests\", { public: true }),\n enrollment: {\n get: GET(`/paper_accounts/:paperAccountId/contests/:contestId/enrollment`),\n post: POST(\n `/paper_accounts/:paperAccountId/contests/:contestId/enrollment`\n ),\n patch: PATCH(\n `/paper_accounts/:paperAccountId/contests/:contestId/enrollment`\n ),\n delete: DELETE(\n `/paper_accounts/:paperAccountId/contests/:contestId/enrollment`\n ),\n },\n leaderboard: {\n getAllTime: GET(\"/contests/leaderboard\", { public: true }),\n get: GET(\"/contests/leaderboard/:contestId\", { public: true }),\n getParticipant: GET(\"/contests/leaderboard/:contestId/:participantId\", {\n public: true,\n }),\n },\n};\n\nexport const countries = {\n getRestrictedCountries: GET(\"/restricted-countries\"),\n getCountryInfos: GET(\"/country-infos\"),\n};\n\nexport const agreement = {\n get: GET(\"/accounts/:accountId/taxfiles/:agreement/preview\"),\n};\n\nexport const crypto = {\n list: GET(\"/crypto/fee-structure\"),\n createFee: POST(\"/accounts/:accountId/crypto/fee\"),\n getMonthlyVolume: GET(\"/accounts/:accountId/crypto/monthly-volume\"),\n};\n\n// don't use this default export, it makes it impossible for tools to figure out what anything is.\nexport default {\n getAccountIdAndJWT, // re-exported from selectors for convenience\n owner,\n account,\n accountDocuments,\n ownerDetails,\n auth,\n accessKeys,\n paperAccessKeys,\n addresses,\n positions,\n paperPositions,\n orders,\n paperOrders,\n wireBanks,\n relationships,\n activities,\n paperActivities,\n institutions,\n transfers,\n documents,\n profitloss,\n paperProfitloss,\n tradeAccount,\n paperTradeAccount,\n paperAccounts,\n portfolio,\n paperPortfolio,\n dataAgreement,\n taxForm,\n trustedContact,\n affiliates,\n onfidoApplicant,\n onfidoSdkToken,\n onfidoResubmission,\n configs,\n paperConfigs,\n assets,\n contests,\n quotes,\n rapyd,\n countries,\n rewards,\n currencyCloud,\n recovery,\n agreement,\n dataAgreementV2,\n};\n","// todo: move this into formatting utils file\n\nimport CryptoJS from \"crypto-js\";\nimport { get } from \"lodash\";\nimport { useMemo } from \"react\";\n\nimport { GeocodeResult, getGeocode } from \"use-places-autocomplete\";\nimport { Account, OwnerDetails } from \"../api/rest/account\";\n\nexport interface ParsedAddress {\n street_address?: string;\n city?: string;\n state?: string;\n country?: string;\n postal_code?: string;\n}\n\nexport const emailIsValid = (email: string) => {\n return /\\S+@\\S+\\.\\S+/.test(email);\n};\n\nexport const weakEncrypt = (str: any) => {\n const encrypted = CryptoJS.AES.encrypt(str, window.env.SHARED_SECRET);\n return encrypted.toString();\n};\n\nexport const parseAddress = async (address: string): Promise<ParsedAddress> => {\n const geocode: GeocodeResult[] = await getGeocode({ address });\n if (geocode.length === 0) {\n throw new Error(\"could not find address\");\n }\n\n const components = geocode[0].address_components;\n\n const getField = (name: string) => {\n for (const entry of components) {\n if (entry.types.includes(name)) {\n // State has to be the 2 or 3 character long version\n if (name === \"administrative_area_level_1\") {\n return entry.short_name;\n }\n return entry.long_name;\n }\n }\n console.error(\n `parse address: ${name} cannot be parsed. Please try another address.`\n );\n return null;\n };\n\n return {\n street_address: [getField(\"street_number\"), getField(\"route\")]\n .join(\" \")\n .trim(),\n city: getField(\"locality\") || getField(\"administrative_area_level_3\"),\n state: getField(\"administrative_area_level_1\"),\n country: getField(\"country\"),\n postal_code: getField(\"postal_code\"),\n } as ParsedAddress;\n};\n\nexport const normalizeTaxID = (\n val: string,\n country: string | undefined | null\n) => {\n if (country !== \"USA\") return val.replace(/\\W/g, \"\");\n const stripped = val.replace(/\\D/g, \"\");\n return `${stripped.slice(0, 3)}-${stripped.slice(3, 5)}-${stripped.slice(\n 5,\n 9\n )}`.replace(/-+$/, \"\");\n};\n\nexport const isDisclosed = (details: OwnerDetails) => {\n // possible fields\n const keys: Array<keyof OwnerDetails> = [\n \"is_politically_exposed\",\n \"is_discretionary\",\n \"is_affiliated_exchange_or_finra\",\n \"immediate_family_exposed\",\n \"is_control_person\",\n ];\n\n // are some or all of the fields populated\n return keys.some((key) => !!details[key]);\n};\n\nexport const isPaperOrOnboarding = (account: Account | undefined) => {\n switch (account?.status) {\n case \"ONBOARDING\":\n case \"PAPER_ONLY\":\n return true;\n default:\n return false;\n }\n};\n\nexport function getPercentageChange(\n oldNumber: string | number,\n newNumber: string | number\n) {\n const parsedOldNumber =\n typeof oldNumber === \"string\" ? parseFloat(oldNumber) : oldNumber;\n const parsedNewNumber =\n typeof newNumber === \"string\" ? parseFloat(newNumber) : newNumber;\n\n const percentage = (parsedNewNumber - parsedOldNumber) / parsedOldNumber;\n if (!isFinite(percentage) || isNaN(percentage)) {\n return 0;\n }\n\n return percentage * 100;\n}\n\nexport const renameFile = (file: File, name: string) =>\n new File([file], name, {\n type: file.type,\n lastModified: file.lastModified,\n });\n\nexport const useArrayToMap = <T>(values: T[], property: string = \"id\") => {\n return useMemo(() => {\n return values.reduce((map, curr) => {\n const key = get(curr, property);\n\n if (typeof key == \"string\") {\n map.set(key, curr);\n }\n\n return map;\n }, new Map<string, T>());\n }, [values, property]);\n};\n","import \"react\";\nimport styled from \"styled-components\";\n\nconst LoadingSpinner = styled.div`\n width: 100%;\n height: 100%;\n background-position: center center;\n background-repeat: no-repeat;\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTBweCIgIGhlaWdodD0iNTBweCIgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIiBjbGFzcz0ibGRzLXJvbGxpbmciIHN0eWxlPSJiYWNrZ3JvdW5kOiBub25lOyI+PGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgbmctYXR0ci1zdHJva2U9Int7Y29uZmlnLmNvbG9yfX0iIG5nLWF0dHItc3Ryb2tlLXdpZHRoPSJ7e2NvbmZpZy53aWR0aH19IiBuZy1hdHRyLXI9Int7Y29uZmlnLnJhZGl1c319IiBuZy1hdHRyLXN0cm9rZS1kYXNoYXJyYXk9Int7Y29uZmlnLmRhc2hhcnJheX19IiBzdHJva2U9IiNmY2Q1MDMiIHN0cm9rZS13aWR0aD0iMTAiIHI9IjM1IiBzdHJva2UtZGFzaGFycmF5PSIxNjQuOTMzNjE0MzEzNDY0MTUgNTYuOTc3ODcxNDM3ODIxMzgiIHRyYW5zZm9ybT0icm90YXRlKDI4Ny45NiA1MCA1MCkiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0icm90YXRlIiBjYWxjTW9kZT0ibGluZWFyIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIiBkdXI9IjJzIiBiZWdpbj0iMHMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIj48L2FuaW1hdGVUcmFuc2Zvcm0+PC9jaXJjbGU+PC9zdmc+\");\n`;\n\nexport default LoadingSpinner;\n","import { startCase } from \"lodash\";\nimport { BusinessInfo } from \"./pages/businessInfo/schema\";\nimport { AccountOpener } from \"./pages/accountOpener/schema\";\nimport {\n AuthorizedIndividual,\n UltimateBeneficialOwner,\n} from \"./pages/authIndividualsUBOs/schema\";\nimport { Nullable } from \"./util\";\nimport { Documents } from \"./pages/documents/schema\";\nimport { CountryInfo } from \"src/v2/types\";\nimport { Agreements } from \"./pages/agreements/schema\";\n\n// Add \"other\" back when it is supported by back end\nexport const ENTITY_TYPES = [\n \"limited_liability_corporation\",\n \"s_corporation\",\n \"c_corporation\",\n \"revocable_trust\",\n \"irrevocable_trust\",\n \"limited_partnership\",\n \"general_partnership\",\n \"foreign_financial_institution\",\n \"banking_institution\",\n \"broker_or_dealer\",\n \"fund_or_hedge_fund\",\n \"unincorporated\",\n // \"other\",\n] as const;\n\nexport const ENTITY_TYPES_OPTIONS = ENTITY_TYPES.map((value) => ({\n value,\n label: startCase(value),\n}));\n\nexport const FUNDING_SOURCES = [\n \"business_revenue\",\n \"asset_appreciation\",\n \"sales_of_assets\",\n \"investors\",\n] as const;\n\nexport const FUNDING_SOURCES_OPTIONS = FUNDING_SOURCES.map((value) => ({\n value,\n label: startCase(value),\n}));\n\nexport const BUSINESS_TYPES = [\n \"administration_or_public_relations\",\n \"agriculture\",\n \"architecture\",\n \"arts_or_film_or_music\",\n \"construction\",\n \"design\",\n \"education\",\n \"finance\",\n \"food_production\",\n \"government_or_public_services\",\n \"healthcare\",\n \"legal_services\",\n \"media_or_marketing\",\n \"oil_or_energy_or_mining\",\n \"pharmaceuticals_or_biochemicals\",\n \"real_estate\",\n \"retail_restaurants\",\n \"technology\",\n \"sports_or_sports_medicine_or_fitness\",\n \"tourism\",\n \"transport\",\n \"other\",\n] as const;\n\nexport const BUSINESS_TYPES_OPTIONS = BUSINESS_TYPES.map((value) => ({\n value,\n label: startCase(value),\n}));\n\nexport const INTENDED_ACCOUNT_USES = [\n \"long_or_short_term_savings\",\n \"income_generation\",\n \"market_speculation\",\n \"preserve_capital\",\n] as const;\n\nexport const INTENDED_ACCOUNT_USES_OPTIONS = INTENDED_ACCOUNT_USES.map(\n (value) => ({ value, label: startCase(value) })\n);\n\nexport const DATE_18_YEARS_AGO = new Date(\n new Date().setFullYear(new Date().getFullYear() - 18)\n);\n\nexport const RANGES = {\n \"1\": { min: 0, max: 250000 },\n \"2\": { min: 250001, max: 750000 },\n \"3\": { min: 750001, max: 10000000 },\n \"4\": { min: 10000001, max: 25000000 },\n \"5\": { min: 25000001, max: 49999999 },\n \"6\": { min: 50000000, max: 100000000 },\n};\n\nexport const RANGE_OPTIONS = Object.entries(RANGES).map(([key, value]) => {\n return {\n value: key,\n label: `$${value.min.toLocaleString()}${\n value.max === RANGES[6].max\n ? \" or above\"\n : ` - ${value.max.toLocaleString()}`\n }`,\n };\n});\n\nexport const REQUIRED_ERR_MSG = \"Required\";\n\nexport const USA = \"United States of America\";\n\nexport const USA_STATES_MAP = {\n AL: \"Alabama\",\n AK: \"Alaska\",\n AS: \"American Samoa\",\n AZ: \"Arizona\",\n AR: \"Arkansas\",\n CA: \"California\",\n CO: \"Colorado\",\n CT: \"Connecticut\",\n DE: \"Delaware\",\n DC: \"District Of Columbia\",\n FM: \"Federated States Of Micronesia\",\n FL: \"Florida\",\n GA: \"Georgia\",\n GU: \"Guam\",\n HI: \"Hawaii\",\n ID: \"Idaho\",\n IL: \"Illinois\",\n IN: \"Indiana\",\n IA: \"Iowa\",\n KS: \"Kansas\",\n KY: \"Kentucky\",\n LA: \"Louisiana\",\n ME: \"Maine\",\n MH: \"Marshall Islands\",\n MD: \"Maryland\",\n MA: \"Massachusetts\",\n MI: \"Michigan\",\n MN: \"Minnesota\",\n MS: \"Mississippi\",\n MO: \"Missouri\",\n MT: \"Montana\",\n NE: \"Nebraska\",\n NV: \"Nevada\",\n NH: \"New Hampshire\",\n NJ: \"New Jersey\",\n NM: \"New Mexico\",\n NY: \"New York\",\n NC: \"North Carolina\",\n ND: \"North Dakota\",\n MP: \"Northern Mariana Islands\",\n OH: \"Ohio\",\n OK: \"Oklahoma\",\n OR: \"Oregon\",\n PW: \"Palau\",\n PA: \"Pennsylvania\",\n PR: \"Puerto Rico\",\n RI: \"Rhode Island\",\n SC: \"South Carolina\",\n SD: \"South Dakota\",\n TN: \"Tennessee\",\n TX: \"Texas\",\n UT: \"Utah\",\n VT: \"Vermont\",\n VI: \"Virgin Islands\",\n VA: \"Virginia\",\n WA: \"Washington\",\n WV: \"West Virginia\",\n WI: \"Wisconsin\",\n WY: \"Wyoming\",\n};\n\nexport const AFFILIATION_BOOLEAN_KEYS = [\n \"is_control_person\",\n \"is_affiliated_exchange_or_finra\",\n \"is_politically_exposed\",\n];\n\nexport const FILE_MAX_SIZE = 20 << (10 * 2); // 20MB\nexport const FILE_SIZE_LABEL = \"Max File size: 20 MB\";\nexport const FILE_SIZE_ERR_MSG = \"Max file size is 20MB.\";\nexport const FILE_ACCEPTED_TYPES = [\n \"application/pdf\",\n \"application/json\",\n \"image/png\",\n \"image/jpeg\",\n \"image/webp\",\n];\nexport const FILE_TYPE_ERR_MSG = `${FILE_ACCEPTED_TYPES.map((type) =>\n type.substring(type.indexOf(\"/\") + 1)\n).join(\", \")} files are accepted.`;\n\nexport const DEFAULT_BUSINESS_INFO_VALUES: Nullable<BusinessInfo> = {\n is_legal_entity: true,\n legal_name: null,\n entity_type: null,\n entity_type_other_description: null,\n is_exempt_from_tax_under_501a: null,\n is_participating_fatca: null,\n type_of_business: null,\n type_of_business_other_free_text: null,\n country_of_incorporation: null,\n state_of_incorporation: null,\n date_of_incorporation: null,\n business_registration_number: null,\n country_of_tax_residence: null,\n tax_id: null,\n tax_id_type: null,\n email: null,\n phone_number: null,\n street_address: null,\n unit: null,\n city: null,\n state: null,\n postal_code: null,\n country: null,\n intended_use_of_account: null,\n liquid_net_worth_min: null,\n liquid_net_worth_max: null,\n total_net_worth_min: null,\n total_net_worth_max: null,\n annual_income_min: null,\n annual_income_max: null,\n funding_source: null,\n};\n\nexport const DEFAULT_ACCOUNT_OPENER_VALUES: Nullable<AccountOpener> = {\n is_legal_account_opener: true,\n title_at_company: null,\n country_of_citizenship: null,\n phone_number: null,\n email: null,\n postal_code: null,\n street_address: null,\n unit: null,\n city: null,\n state: null,\n country_of_tax_residence: null,\n tax_id: null,\n tax_id_type: null,\n date_of_birth: null,\n given_name: null,\n middle_name: null,\n family_name: null,\n is_affiliated_exchange_or_finra: null,\n affiliated_firm: null,\n is_control_person: null,\n controlling_firms: null,\n is_politically_exposed: null,\n immediate_family_exposed: null,\n};\n\nexport const DEFAULT_AUTHORIZED_INDIVIDUAL_VALUES: Nullable<AuthorizedIndividual> =\n {\n is_authorized_individual: true,\n country_of_citizenship: null,\n phone_number: null,\n email: null,\n postal_code: null,\n street_address: null,\n unit: null,\n city: null,\n state: null,\n country_of_tax_residence: null,\n tax_id: null,\n tax_id_type: null,\n date_of_birth: null,\n given_name: null,\n middle_name: null,\n family_name: null,\n is_affiliated_exchange_or_finra: null,\n affiliated_firm: null,\n is_control_person: null,\n controlling_firms: null,\n is_politically_exposed: null,\n immediate_family_exposed: null,\n title_at_company: null,\n };\n\nexport const DEFAULT_UBO_VALUES: Nullable<UltimateBeneficialOwner> = {\n is_ubo: true,\n country_of_citizenship: null,\n phone_number: null,\n email: null,\n postal_code: null,\n street_address: null,\n unit: null,\n city: null,\n state: null,\n country_of_tax_residence: null,\n tax_id: null,\n tax_id_type: null,\n date_of_birth: null,\n given_name: null,\n middle_name: null,\n family_name: null,\n is_affiliated_exchange_or_finra: null,\n affiliated_firm: null,\n is_control_person: null,\n controlling_firms: null,\n is_politically_exposed: null,\n immediate_family_exposed: null,\n percentage_ownership: null,\n title_at_company: null,\n};\n\nexport const DEFAULT_DOCUMENTS_VALUES: Documents = {\n entity_operating_confirmed: false,\n authorized_individual_id_confirmed: false,\n ubo_id_confirmed: false,\n entity_operating_uploaded: false,\n entity_registration_confirmed: false,\n entity_registration_uploaded: false,\n w9_uploaded: false,\n w_8ben_uploaded: false,\n w_8bene_uploaded: false,\n entity_formation_confirmed: false,\n entity_formation_uploaded: false,\n};\n\nexport const DEFAULT_AGREEMENTS_VALUES: Agreements = {\n certifications_and_resolutions_accepted: false,\n ubo_acknowledged: false,\n customer_agreement_acknowledged: false,\n digital_signature_acknowledged: false,\n id_verification_acknowledged: false,\n};\n\nexport const TAX_FORM_URLS = {\n W9: \"https://www.irs.gov/pub/irs-pdf/fw9.pdf\",\n W8_BENE: \"https://www.irs.gov/pub/irs-pdf/fw8bene.pdf\",\n};\n\nexport const CUSTOMER_AGREEMENT_URL =\n \"https://files.alpaca.markets/disclosures/library/AcctAppMarginAndCustAgmt.pdf\";\n\n/** Legal entity cannot use these tax ID types */\nexport const NOT_ALLOWED_LEGAL_ENTITY_TAX_ID_TYPES = [\n \"USA_SSN\",\n \"USA_ITIN\",\n \"USA_TIN\",\n];\n\n/** Account openers, authorized individuals, and UBOs cannot use these tax ID types */\nexport const NOT_ALLOWED_OWNER_TAX_ID_TYPES = [\"USA_EIN\"];\n\nexport const NOT_SPECIFIC_TAX_ID_TYPE: NonNullable<\n CountryInfo[\"tax_id_types\"]\n>[number] = {\n id_type: \"NOT_SPECIFIED\",\n label: \"Other\",\n regexp: \"^.*$\",\n};\n\nexport type EntityOnboardingHistoryState = {\n isInEntityOnboarding?: boolean;\n isEntityOnboardingCompleted?: boolean;\n};\n","import moment from \"moment\";\nimport instance from \"..\";\n\nexport interface Quote {\n symbol: string;\n bid_timestamp: string;\n bid: number;\n bid_size: number;\n bid_exchange: string;\n ask_timestamp: string;\n ask: number;\n ask_size: number;\n ask_exchange: string;\n last_timestamp: string;\n last: number;\n last_size: number;\n last_exchange: string;\n last_day_closing: string;\n}\n\nexport const getQuotes = async (\n symbols: string[],\n source?: string\n): Promise<Quote[]> => {\n const res = await instance.get(\n `/quotes?symbols=${symbols.join(\",\")}&source=${source}`\n );\n\n return res.data;\n};\n\nexport interface Clock {\n timestamp: string;\n is_open: boolean;\n next_open: string;\n next_close: string;\n}\n\nexport const getClock = async (): Promise<Clock> => {\n const res = await instance.get(\"/clock\");\n return res.data;\n};\n\n// get orderbooks\nexport const getOrderbooks = async (symbols: string[]): Promise<any> => {\n const res = await instance.get(\n `/latest/orderbooks?symbols=${symbols.join(\",\")}`,\n {\n baseURL: window.env.CRYPTO_DATA_API_URL,\n }\n );\n return res.data;\n};\n\n/**\nexport const getTrades = async (symbols: string[]): Promise<any> => {\n const meow: any = [];\n const limit = 500;\n\n const next: any = async (token?: string) => {\n const { data } = await instance.get(\n `/trades?symbols=${symbols.join(\",\")}&limit=${limit}${\n !token ? `&start=${moment().subtract(1, \"minutes\").toISOString()}` : \"\"\n }${token ? `&page_token=${token}` : \"\"}`,\n {\n baseURL: window.env.CRYPTO_DATA_B2_API_URL,\n }\n );\n\n if (data.trades[symbols[0]]) {\n meow.push(...data.trades[symbols[0]]);\n }\n\n const next_page_token = data.next_page_token;\n\n return await next(next_page_token);\n };\n\n if (meow.length == 0) {\n await next();\n }\n\n console.log(meow);\n\n return meow;\n};\n **/\n\nexport interface CryptoSnapshot {\n dailyBar: {\n c: number;\n h: number;\n l: number;\n n: number;\n o: number;\n t: string;\n v: number;\n vw: number;\n };\n latestQuote: {\n ap: number;\n as: number;\n bp: number;\n bs: number;\n t: string;\n };\n latestTrade: {\n i: number;\n p: number;\n s: number;\n t: string;\n tks: string;\n };\n minuteBar: {\n c: number;\n h: number;\n l: number;\n n: number;\n o: number;\n t: string;\n v: number;\n vw: number;\n };\n prevDailyBar: {\n c: number;\n h: number;\n l: number;\n n: number;\n o: number;\n t: string;\n v: number;\n vw: number;\n };\n}\n\nexport interface CryptoSnapshots {\n snapshots: {\n [key: string]: CryptoSnapshot;\n };\n}\n\nexport interface GetCryptoSnapshotParams {\n symbols: string[];\n}\n\n// get crypto snapshot\nexport const getCryptoSnapshots = async (\n params: GetCryptoSnapshotParams\n): Promise<CryptoSnapshots> => {\n const res = await instance.get(\n `/snapshots?symbols=${params.symbols.join(\",\")}`,\n {\n baseURL: window.env.CRYPTO_DATA_API_URL,\n }\n );\n return res.data;\n};\n\nexport interface CryptoAsset {\n id: string;\n class: string;\n exchange: string;\n symbol: string;\n name: string;\n status: string;\n tradable: boolean;\n marginable: boolean;\n maintenance_margin_requirement: number;\n shortable: boolean;\n easy_to_borrow: boolean;\n fractionable: boolean;\n min_order_size: string;\n min_trade_increment: string;\n price_increment: string;\n}\n\n// we have to use this for now; not exposed on staging\nexport const getCryptoAssets = (): Promise<CryptoAsset[]> =>\n instance\n .get(\"/assets/public/beta\", {\n baseURL: \"https://api.alpaca.markets/v2\",\n })\n .then(({ data }) => data);\n\nexport interface OptionContract {\n id: string;\n symbol: string;\n name: string;\n status: string;\n tradable: boolean;\n expiration_date: string;\n root_symbol: string;\n underlying_symbol: string;\n underlying_asset_id: string;\n type: string;\n style: string;\n strike_price: string;\n size: string;\n open_interest: string;\n open_interest_date: string;\n close_price: string;\n close_price_date: string;\n multiplier: string;\n}\n\nexport type OptionContractsResponse = {\n option_contracts: OptionContract[];\n page: number;\n limit: number;\n};\n\ntype OptionsContractsParams = {\n underlying_symbol?: string;\n expiration_date_gte?: string;\n expiration_date?: string;\n type?: \"call\" | \"put\";\n product: string;\n};\n\nexport const getOptionsContracts = async ({\n underlying_symbol,\n expiration_date_gte = moment().format(\"YYYY-MM-DD\"),\n expiration_date,\n type,\n product,\n}: OptionsContractsParams): Promise<OptionContractsResponse> => {\n const baseURL =\n product === \"paper\" ? window.env.PAPER_API_ENDPOINT : window.env.API_URL;\n\n const params = new URLSearchParams({\n ...(!expiration_date && { expiration_date_gte }), // Don't need to set expiration_date_gte if expiration_date is present\n ...(expiration_date && { expiration_date }),\n ...(underlying_symbol && { underlying_symbol }),\n ...(type && { type }),\n limit: \"10000\",\n });\n\n const { data } = await instance.get(\n `/options/contracts?${params.toString()}`,\n { baseURL }\n );\n\n return data;\n};\n\nexport const getOptionsContract = async ({\n symbol,\n product,\n}: {\n symbol: string;\n product?: string;\n}): Promise<OptionContract> => {\n const baseURL =\n product === \"paper\" ? window.env.PAPER_API_ENDPOINT : window.env.API_URL;\n\n const { data } = await instance\n .get(`/options/contracts/${symbol}`, { baseURL })\n .catch(() => ({} as any));\n\n return data;\n};\n\nexport interface GetOptionsSnapshotParams {\n symbols: string[];\n limit?: string;\n}\n\nexport interface GetOptionSnapshotsResponse {\n next_page_token: string | null;\n snapshots: {\n [symbol: string]: {\n latestQuote: {\n ap: number;\n as: number;\n ax: string;\n bp: number;\n bs: number;\n bx: string;\n c: string;\n t: string;\n };\n latestTrade: {\n c: string;\n p: number;\n s: number;\n t: string;\n x: string;\n };\n dailyBar?: {\n t: string;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n n: number;\n vw: number;\n };\n minuteBar?: {\n t: string;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n n: number;\n vw: number;\n };\n prevDailyBar?: {\n t: string;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n n: number;\n vw: number;\n };\n greeks?: {\n delta: number;\n gamma: number;\n rho: number;\n theta: number;\n vega: number;\n };\n impliedVolatility?: number;\n };\n };\n}\n\nexport const getOptionContractSnapshot = async ({\n symbols,\n limit = \"100\",\n}: GetOptionsSnapshotParams) => {\n const params = new URLSearchParams({\n symbols: symbols.join(\",\"),\n limit,\n });\n\n const res = await instance.get<GetOptionSnapshotsResponse>(`/snapshots`, {\n baseURL: window.env.OPTION_CHAIN_DATA_API_URL,\n params,\n });\n\n return res.data;\n};\n\nexport interface GetOptionsBarsParams {\n symbols: string[];\n timeframe?: \"1D\";\n}\n\nexport interface GetOptionsBarsResponse {\n bars: {}[];\n currency?: string;\n}\n\nexport const getOptionsBars = async ({\n symbols,\n timeframe = \"1D\",\n}: GetOptionsBarsParams) => {\n const params = new URLSearchParams({\n symbols: symbols.join(\",\"),\n timeframe,\n });\n\n const res = await instance.get<GetOptionsBarsResponse>(\"/bars\", {\n baseURL: \"https://data.staging-v2.tradetalk.us/v1beta1/options\",\n params,\n });\n\n return res.data;\n};\n\nexport interface GetOptionChainSnapshotsParams {\n underlying_symbol: string;\n limit?: string;\n expiration_date?: string;\n expiration_date_gte?: string;\n}\n\nexport const getOptionChainSnapshots = async ({\n underlying_symbol,\n limit = \"1000\",\n expiration_date_gte = moment().format(\"YYYY-MM-DD\"),\n expiration_date,\n}: GetOptionChainSnapshotsParams) => {\n const params = new URLSearchParams({\n ...(!expiration_date && { expiration_date_gte }), // Don't need to set expiration_date_gte if expiration_date is present\n ...(expiration_date && { expiration_date }),\n limit,\n });\n\n const res = await instance.get<GetOptionSnapshotsResponse>(\n `/snapshots/${underlying_symbol}`,\n {\n baseURL: window.env.OPTION_CHAIN_DATA_API_URL,\n params,\n }\n );\n\n return res.data;\n};\n","import useRequest, { QueryOptions } from \"./useRequest\";\nimport { Account, getLiveAccounts } from \"../rest/account\";\n\nexport const useGetLiveAccounts = (options?: QueryOptions<Account[]>) => {\n const { data, isLoading, refetch } = useRequest<Account[]>(\n [\"accounts\", \"live\"],\n () => getLiveAccounts(),\n { refetchInterval: false, ...options }\n );\n\n return { data, refetch, isLoading };\n};\n\nexport default useGetLiveAccounts;\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport {\n getPaperAccounts,\n Account,\n getPaperAccountsWithDetails,\n PaperAccount,\n} from \"../rest/account\";\n\n/**\n * Returns the paper accounts with all the information as Accounts, instead of the\n * minimum information of PaperAccounts\n * @param options\n * @returns\n */\nexport const useGetPaperAccountsWithDetails = (\n options?: QueryOptions<Account[] | PaperAccount[]>\n) => {\n const {\n data: paper_accounts,\n refetch,\n isLoading,\n } = useRequest([\"accounts\", \"paper\"], () => getPaperAccounts(), {\n ...(options as QueryOptions<PaperAccount[]>),\n });\n\n const { data: paperAccountsWithDetails, isLoading: isDetailLoading } =\n useRequest(\n [\n \"accounts\",\n \"paper\",\n \"detail\",\n ...(paper_accounts?.map((p) => p.paper_account_id) ?? []),\n ],\n () =>\n getPaperAccountsWithDetails(\n paper_accounts?.map((p) => p.paper_account_id)\n ),\n {\n ...options,\n }\n );\n\n return {\n data: (paperAccountsWithDetails ?? []) as Account[],\n paper_accounts,\n isLoading: isLoading || isDetailLoading,\n refetch: refetch,\n };\n};\n\nexport default useGetPaperAccountsWithDetails;\n","import React, {\n createContext,\n ReactNode,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport useGetLiveAccounts from \"../api/hooks/useGetLiveAccounts\";\nimport { Account, PaperAccount } from \"../api/rest/account\";\nimport useGetPaperAccountsWithDetails from \"../api/hooks/useGetPaperAccountsWithDetails\";\nimport { syncAccounts } from \"src/reducers/account\";\nimport useLocalStorage from \"src/hooks/useLocalStorage\";\n\nexport interface AccountContextProps {\n liveAccounts: Account[];\n paperAccounts: Account[];\n paperAccountsNoDetail: PaperAccount[];\n refetchLiveAccounts: () => void;\n refetchPaperAccounts: (reset?: boolean) => void;\n currentAccount?: Account;\n setCurrentAccount: (newAccount: Account) => void;\n setProduct: (product: string) => void;\n}\n\nconst ACCOUNT_CONTEXT_DEFAULTS: AccountContextProps = {\n liveAccounts: [],\n paperAccounts: [],\n paperAccountsNoDetail: [],\n refetchLiveAccounts: () => null,\n refetchPaperAccounts: () => null,\n currentAccount: undefined,\n setCurrentAccount: () => null,\n setProduct: () => null,\n};\n\ntype AccountProviderProps = {\n children: ReactNode;\n dispatch?: any;\n cognito?: {\n status: string;\n payload: Account[] | null;\n };\n};\n\nexport const AccountContext = createContext<AccountContextProps>(\n ACCOUNT_CONTEXT_DEFAULTS\n);\n\nconst getCurrentProduct = (product?: string) =>\n product === \"dynamic\"\n ? window.localStorage.getItem(\"product\") ?? \"paper\"\n : product;\n\nconst AccountProvider = ({\n children,\n dispatch,\n cognito,\n}: AccountProviderProps) => {\n const [currentAccount, setCurrentAccount] = useState<Account>();\n const [lastUpdatedAt, setLastUpdatedAt] = useState<Date | undefined>();\n const [product, setProduct] = useState<string>();\n\n const [savedAccountId, setSavedAccountId] = useLocalStorage(\"savedAccount\");\n\n const {\n data: liveAccounts,\n refetch: refetchLiveAccounts,\n isLoading: isLiveAccountsLoading,\n } = useGetLiveAccounts({\n enabled: cognito?.status === \"loaded\" && cognito?.payload !== null,\n });\n const {\n data: paperAccounts,\n paper_accounts: paperAccountsNoDetail,\n refetch: refetchPaperAccounts,\n isLoading: isPaperAccountsLoading,\n } = useGetPaperAccountsWithDetails({\n enabled: cognito?.status === \"loaded\" && cognito?.payload !== null,\n });\n\n const handleSetCurrentAccount = (account?: Account) => {\n setCurrentAccount(account);\n\n setSavedAccountId(account?.id);\n\n dispatch?.(\n syncAccounts(\n getAccountReduxStoreFormat({\n liveAccounts: liveAccounts ?? [],\n paperAccountsNoDetail: paperAccountsNoDetail ?? [],\n currentAccount: account,\n })\n )\n );\n\n setLastUpdatedAt(undefined);\n };\n\n const handleRefetchPaperAccounts = async (\n resetAccount?: boolean | PaperAccount\n ) => {\n await refetchPaperAccounts();\n\n if (resetAccount) {\n // trigger useEffect to select a new current account as currentAccount deleted\n setCurrentAccount(undefined);\n } else {\n handleSyncRedux();\n }\n };\n\n const handleSyncRedux = () => {\n setLastUpdatedAt(new Date());\n };\n\n // Initial Setup and when deletion occurs\n useEffect(() => {\n if (\n !isPaperAccountsLoading &&\n !isLiveAccountsLoading &&\n !currentAccount &&\n product\n ) {\n const currentProduct = getCurrentProduct(product);\n\n if (currentProduct === \"live\") {\n const initialAccount = liveAccounts?.find(\n (liveAccount) => liveAccount.id === savedAccountId\n );\n\n handleSetCurrentAccount(\n initialAccount ?? liveAccounts?.[0] ?? undefined\n );\n } else if (currentProduct === \"paper\") {\n const initialAccount = paperAccounts?.find(\n (paperAccount) => paperAccount.id === savedAccountId\n );\n\n handleSetCurrentAccount(initialAccount ?? paperAccounts?.[0]);\n } else {\n // if product is dynamic or alpaca, try to find savedAccount else default to Paper\n const initialAccount =\n liveAccounts?.find(\n (liveAccount) => liveAccount.id === savedAccountId\n ) ??\n paperAccounts?.find(\n (paperAccount) => paperAccount.id === savedAccountId\n );\n\n handleSetCurrentAccount(initialAccount ?? paperAccounts?.[0]);\n }\n }\n }, [isLiveAccountsLoading, isPaperAccountsLoading, currentAccount, product]);\n\n // Syncs Redux when all data loaded after a handleSyncRedux is called e.g. createAccount\n useEffect(() => {\n if (\n !isLiveAccountsLoading &&\n !isPaperAccountsLoading &&\n lastUpdatedAt &&\n currentAccount\n ) {\n handleSetCurrentAccount(currentAccount);\n }\n }, [\n lastUpdatedAt,\n isPaperAccountsLoading,\n isLiveAccountsLoading,\n currentAccount,\n ]);\n\n return (\n <AccountContext.Provider\n value={{\n liveAccounts: liveAccounts ?? [],\n paperAccounts,\n paperAccountsNoDetail: paperAccountsNoDetail ?? [],\n refetchLiveAccounts,\n refetchPaperAccounts: handleRefetchPaperAccounts,\n currentAccount,\n setCurrentAccount: handleSetCurrentAccount,\n setProduct,\n }}\n >\n {children}\n </AccountContext.Provider>\n );\n};\n\nexport const useAccountContext = () => useContext(AccountContext);\n\n// A Higher Order Component made to give AccountContext to class components\nexport const withAccountContext = (Component: any) => {\n return (props: any) => {\n const accountContext = useAccountContext();\n\n return <Component accountContext={accountContext} {...props} />;\n };\n};\n\n// Migrating away from Redux by removing one store at a time\n// However, many stores are dependent on the account store, so transform\n// the current props into the account store format and sync it\nexport const getAccountReduxStoreFormat = ({\n liveAccounts,\n paperAccountsNoDetail,\n currentAccount,\n}: {\n liveAccounts: Account[];\n paperAccountsNoDetail: PaperAccount[];\n currentAccount?: Account;\n}) => {\n return {\n account: liveAccounts[0],\n paper: {\n current:\n currentAccount?.id ?? paperAccountsNoDetail?.[0]?.paper_account_id,\n accounts: paperAccountsNoDetail,\n },\n };\n};\n\nexport default AccountProvider;\n","import { createAction, createReducer } from \"redux-act\";\nimport { notification } from \"antd\";\nimport Auth from \"@aws-amplify/auth\";\nimport { setUserState } from \"reducers/auth/common\";\nimport { getCurrentAuthenticatedUser } from \"../utils\";\n\nexport const REDUCER = \"profile\";\nconst NS = `@@${REDUCER}/`;\n\nconst _setPhoneNumberToVerify = createAction(`${NS}SET_PHONE_NUMBER_TO_VERIFY`);\nconst _setPhoneNumberVerificationError = createAction(\n `${NS}SET_PHONE_NUMBER_VERIFICATION_ERROR`\n);\n\nexport const submit = (values) => (dispatch) => {\n dispatch(updateInCognito(values));\n};\n\n// Please keep in mind that when extending the capabilities of this function that cognito has a permisive\n// scope for the AccessToken that they are returning and there is no way of configuring that. This in turn\n// helps hackers exploit the AccessToken to change sensitive information such as email and phone number of the cognito account.\n// We want to avoid changing attributes using aws-amplify in the future and just direct the calls to gobroker.\n// This would help maintain the consistency of the data and as well as prevent the exploit.\n// More details of the exploit over here: https://alpaca.atlassian.net/browse/ENG-9903\nconst updateInCognito = (values) => (dispatch, getState) => {\n const state = getState();\n\n // If the user stored a phone number, then they will be sent a verification code.\n // Ensure state updates so that the form page knows to display a form to allow verification.\n if (\n values.phone_number &&\n values.phone_number !== state.auth.userState.attributes.phone_number\n ) {\n dispatch(_setPhoneNumberToVerify(true));\n }\n\n // If the user also sent fields to reset their password, do that too.\n if (values.old_password && values.new_password) {\n // Only the current user can change their password of course\n // Even if someone else stole a user's password, logged in, and changed it...\n // The original user could use \"forgot password\" and reset it from the login screen.\n // IF we also handled the API to change a username/e-mail, the attacker wouldn't be\n // able to change the e-mail either because a verification code is sent for that API method.\n getCurrentAuthenticatedUser()\n .then((user) => {\n return Auth.changePassword(\n user,\n values.old_password,\n values.new_password\n );\n })\n .then(() => {\n // TODO: It would be nice to also send an e-mail notifying the user that someone, hopefully them,\n // changed their password. If it was them, ignore, if it wasn't, forgot password, etc. etc.\n\n notification.open({\n type: \"success\",\n message: \"Your password was changed\",\n });\n dispatch(refreshUserAttributes());\n })\n .catch((err) => {\n switch (err.code) {\n case \"NotAuthorizedException\": {\n notification.open({\n type: \"error\",\n message: \"Entered old password is incorrect\",\n });\n break;\n }\n default: {\n notification.open({\n type: \"error\",\n message: err.message,\n });\n break;\n }\n }\n console.debug(err);\n });\n } else {\n // Just a profile update, no password change\n notification.open({\n type: \"success\",\n message: \"Your profile was updated\",\n });\n dispatch(refreshUserAttributes());\n }\n};\n\n/**\n * Resends a code to verify an attribute.\n */\nexport const resendAttributeVerification =\n (attribute = \"phone_number\") =>\n (dispatch) => {\n return Auth.verifyCurrentUserAttribute(attribute).then(() => {\n if (attribute === \"phone_number\") {\n return dispatch(_setPhoneNumberToVerify(true));\n }\n });\n };\n\n/**\n * Refreshes user attributes (and bypasses any cache).\n */\nexport const refreshUserAttributes = () => (dispatch) => {\n // Update the data fresh\n return getCurrentAuthenticatedUser().then((user) => {\n user.getUserData(\n () => {\n // Now we can get fresh\n return getCurrentAuthenticatedUser().then((freshUser) => {\n return dispatch(\n setUserState({\n userState: freshUser,\n })\n );\n });\n //\n },\n { bypassCache: true }\n );\n });\n};\n\nconst initialState = {\n phoneNumberToVerify: false,\n};\n\nexport default createReducer(\n {\n [_setPhoneNumberToVerify]: (state, phoneNumberToVerify) => ({\n ...state,\n phoneNumberToVerify,\n }),\n [_setPhoneNumberVerificationError]: (\n state,\n phoneNumberVerificationError\n ) => ({ ...state, phoneNumberVerificationError }),\n },\n initialState\n);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Redirect } from \"react-router-dom\";\nimport * as cognitoActions from \"reducers/auth/cognito\";\nimport * as accountListActions from \"reducers/auth/accountList\";\nimport api from \"./api\";\nimport { initAmplify } from \"./reducers/auth/common\";\n\nconst fireLinkedInPixel = () => {\n const partnerId = window._linkedin_partner_id;\n const element = document.createElement(\"img\");\n element.alt = \"\";\n element.height = 1;\n element.width = 1;\n element.src = `https://px.ads.linkedin.com/collect/?pid=${partnerId}&fmt=gif`;\n};\n\nconst mapStateToProps = ({ cognito, accountList }) => ({\n cognitoUser: cognito,\n accountList,\n});\n\n// AuthCheck is a layer to load current login state into redux state\n// before mounting the actual components. All mounted child components can expect\n// cognito/accountList to be the loaded state.\n@connect(mapStateToProps)\nclass AuthCheck extends React.Component {\n load() {\n const { dispatch, cognitoUser, accountList } = this.props;\n // funny way to check that cognito state is loaded\n if (cognitoUser.status !== \"invalid\") {\n return;\n }\n\n initAmplify();\n dispatch(cognitoActions.load()).then((cognitoResponse) => {\n if (accountList.status !== \"invalid\") {\n return;\n }\n\n if (!cognitoResponse) {\n dispatch(accountListActions._receive(null));\n return;\n }\n dispatch(accountListActions.load()).catch((e) => {\n // bail out to create a new account in case this is not done yet.\n // this is not expected as a normal flow\n if (e?.name === \"NotFoundException\") {\n const attrs = cognitoResponse.attributes;\n const utm_params = JSON.parse(\n attrs[\"custom:utm_params\"] ||\n localStorage.getItem(\"signup-utm-params\")\n );\n dispatch(\n api.account.create(\n {},\n {\n email: attrs.email,\n clearing_broker: \"ALPACA_APCA\",\n crypto_broker: attrs[\"custom:crypto_broker\"],\n source: attrs[\"custom:signup_source\"],\n utm_params,\n }\n )\n ).then(() => {\n dispatch(accountListActions._invalidate());\n dispatch(cognitoActions._invalidate());\n });\n } else {\n dispatch(accountListActions._receive(null));\n }\n });\n });\n }\n\n componentDidMount() {\n this.load();\n }\n\n componentDidUpdate() {\n this.load();\n }\n\n render() {\n const { cognitoUser, accountList, routeProps } = this.props;\n // first time log-in where the cognito entry exists but no entry exists in our DB\n if (\n cognitoUser.status === \"loaded\" &&\n accountList.error?.name === \"NotFoundException\"\n ) {\n return <Redirect to=\"/brokerage/new-account\" />;\n }\n if (cognitoUser.status === \"error\") {\n console.error(\"cognitoUser error: \", cognitoUser.error);\n return <Redirect to=\"/login?error=auth\" />;\n }\n if (accountList.status === \"error\") {\n console.error(\"accountList error: \", accountList.error);\n return <Redirect to=\"/login?error=account\" />;\n }\n if (cognitoUser.status !== \"loaded\" || accountList.status !== \"loaded\") {\n return <></>;\n }\n\n // todo: need to expose each no-login-required page\n // no payload means the user is not logged in\n // if (!cognitoUser.payload && !this.props.exposed) {\n // return <Redirect to=\"/login\" />;\n // }\n\n let destination = null;\n if (this.props.redirector) {\n destination = this.props.redirector(\n cognitoUser.payload,\n accountList.payload,\n routeProps\n );\n }\n\n if (destination && destination !== routeProps.location.pathname) {\n return <Redirect to={destination} />;\n }\n\n const pathname = routeProps.location.pathname;\n if (pathname != this.prevPathname) {\n fireLinkedInPixel();\n this.prevPathname = pathname;\n }\n const Component = this.props.component;\n return (\n <Component\n cognitoUser={cognitoUser.payload}\n accountList={accountList.payload}\n routeProps={routeProps}\n />\n );\n }\n}\nexport default AuthCheck;\n","import React from \"react\";\nimport { Redirect } from \"react-router-dom\";\nimport { connect } from \"react-redux\";\nimport LoadingSpinner from \"components/LoadingSpinner\";\nimport { initUser } from \"reducers/auth/common\";\n\nconst mapStateToProps = (state) => ({\n accountState: state.account,\n});\n\n@connect(mapStateToProps)\nclass RootRedirect extends React.Component {\n load() {\n this.props.dispatch(initUser(false));\n }\n\n componentDidMount() {\n this.load();\n }\n\n componentDidUpdate() {\n this.load();\n }\n\n render() {\n const { accountState } = this.props;\n const { account, details } = accountState;\n if (account && details) {\n switch (account.status) {\n case \"PAPER_ONLY\":\n case \"ONBOARDING\":\n return <Redirect to=\"/brokerage/new-account\" />;\n default:\n return <Redirect to=\"/brokerage/dashboard/overview\" />;\n }\n }\n return <></>;\n }\n}\nexport default RootRedirect;\n","const setRequestedPath = ({ pathname, search }) => {\n window.sessionStorage.setItem(\"requested_path\", pathname + search);\n};\n\nexport const requireLogin = (cognitoUser, accountList, routeProps) => {\n if (!cognitoUser || !accountList) {\n setRequestedPath(routeProps.location);\n return \"/login\";\n }\n const emailVerified =\n cognitoUser.attributes && cognitoUser.attributes.email_verified;\n if (!emailVerified) {\n setRequestedPath(routeProps.location);\n return \"/login\";\n }\n};\n\nexport const requireLiveActive = (cognitoUser, accountList, routeProps) => {\n let loginCheck = requireLogin(cognitoUser, accountList, routeProps);\n if (loginCheck) {\n return loginCheck;\n }\n\n const liveAccount = accountList[0];\n switch (liveAccount.status) {\n case \"PAPER_ONLY\":\n case \"REJECTED\":\n return \"/paper/dashboard/overview\";\n case \"ONBOARDING\":\n return \"/brokerage/new-account\";\n }\n};\n\nexport const requireCrytpoActive = (cognitoUser, accountList, routeProps) => {\n let loginCheck = requireLogin(cognitoUser, accountList, routeProps);\n if (loginCheck) {\n return loginCheck;\n }\n\n const liveAccount = accountList[0];\n const enableCryptoTransfers = window.env.ENABLE_COIN_TRANSFERS ?? false;\n if (!enableCryptoTransfers) {\n return \"/brokerage/dashboard/overview\";\n }\n\n switch (liveAccount.crypto_status) {\n case \"REJECTED\":\n return \"/paper/dashboard/overview\";\n case \"ONBOARDING\":\n return \"/brokerage/new-account\";\n }\n};\n\nexport const checkLogin = (cognitoUser, accountList) => {\n if (cognitoUser) {\n const emailVerified =\n cognitoUser.attributes && cognitoUser.attributes.email_verified;\n if (!emailVerified) {\n return \"/login\";\n }\n if (accountList) {\n return \"/\";\n }\n }\n};\n","import React, { useEffect } from \"react\";\nimport { useGetAccount, useGetAccountDetails } from \"./v2/api/hooks\";\nimport { Account, getIntercomUserHash } from \"./v2/api/rest/account\";\nimport { initializeIntercom } from \"./utils/intercom\";\n\ntype IntercomProps = {\n cognito?: {\n status: string;\n payload: Account[] | null;\n };\n};\n\nexport const Intercom = ({ cognito }: IntercomProps) => {\n const { account } = useGetAccount(\"intercom\", {\n enabled: cognito?.status === \"loaded\" && cognito?.payload !== null,\n });\n const { details } = useGetAccountDetails(\"details\", account?.id, {\n enabled: !!account?.id,\n });\n\n useEffect(() => {\n if (details && account) {\n getIntercomUserHash()\n .then((userHash) => initializeIntercom({ account, details }, userHash))\n .catch((err) => console.error(\"Intercom Error\", err));\n }\n }, [account, details]);\n\n return null;\n};\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\n\ntype WireframeProps = {\n enabled: boolean;\n};\n\nexport const Wireframe: React.FC<WireframeProps> = ({ enabled }) => {\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n const toggle = (event: KeyboardEvent) => {\n if (event.ctrlKey && event.key === \"w\") {\n document.documentElement.classList.toggle(\"wireframe\");\n }\n };\n\n window.addEventListener(\"keydown\", toggle);\n\n return () => window.removeEventListener(\"keydown\", toggle);\n }, [enabled]);\n\n return null;\n};\n","import styled from \"styled-components\";\n\nconst Subtitle = styled.p`\n font-size: 0.7em;\n line-height: 1.2em;\n`;\n\nexport default Subtitle;\n","import styled from \"styled-components\";\n\nconst LargeParagraph = styled.p`\n font-size: 1.5em;\n\n @media screen and (max-height: 600px) {\n font-size: 1.2em;\n }\n`;\n\nexport default LargeParagraph;\n","import styled from \"styled-components\";\n\nexport const Link = styled.a`\n margin: ${(props) => (props.margin ? props.margin : \"5px\")};\n font-size: ${(props) => (props.fontSize ? props.fontSize : \"1em\")};\n`;\n\nexport const SubtitleLink = styled.a`\n text-decoration: none;\n font-size: 20px;\n color: #303030;\n white-space: nowrap;\n font-family: \"Gilroy-Light\";\n padding: 0 25px;\n\n :hover {\n color: #fff;\n }\n`;\n","import styled from \"styled-components\";\n\nexport const BlackLightText = styled.p`\n margin: 0;\n color: #303030;\n font-family: \"Gilroy-Light\";\n`;\n\nexport const WhiteLightText = styled.p`\n margin: 0;\n color: #fff;\n font-family: \"Gilroy-Light\";\n`;\n","import styled from \"styled-components\";\n\nexport const TitleBlack = styled.h2`\n margin: 0;\n color: #303030;\n font-family: \"Gilroy-Light\";\n`;\n","import { createAction, createReducer } from \"redux-act\";\nimport { pendingTask, begin, end } from \"react-redux-spinner\";\n\nconst REDUCER = \"app\";\nconst NS = `@@${REDUCER}/`;\n\nconst _setLoading = createAction(`${NS}SET_LOADING`);\n\nexport const setFormInvalid = createAction(`${NS}SET_FORM_INVALID`);\nexport const setUpdatingContent = createAction(`${NS}SET_UPDATING_CONTENT`);\nexport const setActiveDialog = createAction(`${NS}SET_ACTIVE_DIALOG`);\nexport const deleteDialogForm = createAction(`${NS}DELETE_DIALOG_FORM`);\nexport const addSubmitForm = createAction(`${NS}ADD_SUBMIT_FORM`);\nexport const deleteSubmitForm = createAction(`${NS}DELETE_SUBMIT_FORM`);\nexport const setLayoutState = createAction(`${NS}SET_LAYOUT_STATE`);\nexport const setOpenKeys = createAction(`${NS}SET_OPENKEYS_STATE`);\n\nexport const setLoading = (isLoading) => {\n const action = _setLoading(isLoading);\n action[pendingTask] = isLoading ? begin : end;\n return action;\n};\n\nconst initialState = {\n // APP STATE\n from: \"\",\n isUpdatingContent: false,\n isLoading: false,\n activeDialog: \"\",\n dialogForms: {},\n submitForms: {},\n invalidForms: {},\n openKeys: [],\n\n // LAYOUT STATE\n layoutState: {\n isMenuTop: false,\n disableAppMenu: false,\n menuMobileOpened: false,\n menuCollapsed: false,\n menuShadow: true,\n showBrandInHeader: false,\n themeLight: false,\n settingsOpened: false,\n },\n};\n\nexport default createReducer(\n {\n [_setLoading]: (state, isLoading) => ({ ...state, isLoading }),\n [setFormInvalid]: (state, param) => {\n // Sets forms (by id) invalid with a message or just boolean true.\n const invalidForms = {\n ...state.submitForms,\n [param.id || \"all\"]: param.message || true,\n };\n return { ...state, invalidForms };\n },\n [setUpdatingContent]: (state, isUpdatingContent) => ({\n ...state,\n isUpdatingContent,\n }),\n [setLayoutState]: (state, param) => {\n const layoutState = { ...state.layoutState, ...param };\n const newState = { ...state, layoutState };\n window.localStorage.setItem(\n \"app.layoutState\",\n JSON.stringify(newState.layoutState)\n );\n return newState;\n },\n [setOpenKeys]: (state, openKeys) => ({ ...state, openKeys }),\n [setActiveDialog]: (state, activeDialog) => {\n const result = { ...state, activeDialog };\n if (activeDialog !== \"\") {\n const id = activeDialog;\n result.dialogForms = { ...state.dialogForms, [id]: true };\n }\n return result;\n },\n [deleteDialogForm]: (state, id) => {\n const dialogForms = { ...state.dialogForms };\n delete dialogForms[id];\n return { ...state, dialogForms };\n },\n [addSubmitForm]: (state, id) => {\n const submitForms = { ...state.submitForms, [id]: true };\n return { ...state, submitForms };\n },\n [deleteSubmitForm]: (state, id) => {\n const submitForms = { ...state.submitForms };\n delete submitForms[id];\n return { ...state, submitForms };\n },\n },\n initialState\n);\n","import { createAction, createReducer } from \"redux-act\";\n\nconst REDUCER = \"userData\";\nconst NS = `@@${REDUCER}/`;\n\nconst _setUserData = createAction(`${NS}SET_USER_DATA`);\n\n// Export this reducer\nconst initialState = { loaded: false, data: {} };\nexport default createReducer(\n {\n [_setUserData]: (state, payload) => {\n return { ...payload };\n },\n },\n initialState\n);\n","import { createAction, createReducer } from \"redux-act\";\nimport { notification } from \"antd\";\nimport { getAlpacaAccountId } from \"selectors\";\nimport { listTransfers } from \"./account\";\nimport api from \"api\";\nimport AmplitudeProvider from \"src/AmplitudeProvider\";\nimport { eventTracker } from \"src/utils/eventTracker\";\n\nconst REDUCER = \"transfer\";\nconst NS = `@@${REDUCER}/`;\n\nconst _upsertTransfer = createAction(`${NS}UPSERT_TRANSFER`);\nconst _setStatus = createAction(`${NS}SET_STATUS`);\nexport const clearTransferRequest = createAction(`${NS}CLEAR_TRANSFER_REQUEST`);\n\nconst transferCreator = (direction) => ({\n relationshipId,\n bankId,\n amount,\n type,\n}) => (dispatch, getState) => {\n const accountId = getAlpacaAccountId(getState());\n return dispatch(\n api.transfers.create(\n { accountId },\n {\n relationship_id: relationshipId,\n bank_id: bankId,\n transfer_type: type,\n direction,\n amount,\n }\n )\n )\n .then((transfer) => {\n if (transfer) {\n eventTracker(\"Deposited Funds\", {\n category: \"Banking\",\n label: window.location.pathname,\n value: amount,\n });\n\n AmplitudeProvider.dispatch(\n direction == \"INCOMING\"\n ? \"deposit_submitted\"\n : \"withdrawal_submitted\",\n JSON.stringify({ amount })\n );\n\n dispatch(_upsertTransfer(transfer));\n dispatch(listTransfers());\n }\n })\n .catch((err) => {\n eventTracker(\"Failed to Deposit Funds\", {\n category: \"Banking\",\n label: window.location.pathname,\n value: amount,\n });\n console.error(\"Failed transfer request (deposit):\", err);\n notification.open({\n type: \"error\",\n message: \"Failed transfer request (deposit)\",\n description: err.message,\n });\n dispatch(_setStatus(\"FAILED\"));\n });\n};\n\nexport const deposit = transferCreator(\"INCOMING\");\nexport const withdraw = transferCreator(\"OUTGOING\");\n\nexport const cancelTransfer = (transferId) => (dispatch, getState) => {\n const accountId = getAlpacaAccountId(getState());\n return dispatch(api.transfers.delete({ accountId, transferId })).then(() =>\n dispatch(listTransfers())\n );\n};\n\nconst initialState = {};\nexport default createReducer(\n {\n [_upsertTransfer]: (state, transfer) => ({\n ...state,\n ...transfer,\n }),\n [_setStatus]: (state, status) => ({\n ...state,\n status,\n }),\n [clearTransferRequest]: () => ({}),\n },\n initialState\n);\n","import { createAction, createReducer } from \"redux-act\";\nimport \"fast-text-encoding\";\nimport { updateIntercom } from \"src/utils/intercom\";\n\nconst REDUCER = \"profitloss\";\nconst NS = `@@${REDUCER}/`;\n\nconst _setProfitLoss = createAction(`${NS}SET_PROFIT_LOSS`);\n\nconst initialState = {};\nexport default createReducer(\n {\n [_setProfitLoss]: (state, { accountId, product, ownerId, profitloss }) => {\n if (!profitloss) {\n return state;\n }\n\n const newState = { ...state };\n const previousRetrieval = newState[accountId]?.previousRetrieval;\n\n if (!previousRetrieval) {\n // For now, only one live trading account\n if (product === \"live\" && ownerId) {\n updateIntercom(ownerId, {\n profitLossDay: profitloss.day_plpc,\n profitLossTotal: profitloss.total_plpc,\n });\n }\n }\n\n newState[accountId] = profitloss;\n newState[accountId].previousRetrieval = true;\n return newState;\n },\n },\n initialState\n);\n","import { combineReducers } from \"redux\";\nimport { connectRouter } from \"connected-react-router\";\nimport { pendingTasksReducer } from \"react-redux-spinner\";\n\nimport app from \"./app\";\nimport auth from \"./auth/common\";\nimport cognito from \"./auth/cognito\";\nimport accountList from \"./auth/accountList\";\nimport mfa from \"./auth/mfa\";\nimport profile from \"./profile\";\nimport userData from \"./userData\";\n\nimport account from \"./account\";\nimport accountDocuments from \"./accountDocuments\";\nimport accessKeys from \"./accessKeys\";\nimport transfer from \"./transfer\";\nimport position from \"./position/position\";\nimport order from \"./order/order\";\nimport profitloss from \"./profitloss/profitloss\";\nimport trade from \"./trade/trade\";\nimport billing from \"./billing\";\nimport countryInfo from \"./countryInfo\";\n\n// Adds redux forms\nimport { reducer as formReducer } from \"redux-form\";\n\nconst createRootReducer = (history) =>\n combineReducers({\n router: connectRouter(history),\n pendingTasks: pendingTasksReducer,\n app,\n auth,\n cognito,\n accountList,\n mfa,\n profile,\n userData,\n account,\n accountDocuments,\n accessKeys,\n transfer,\n trade,\n position,\n order,\n profitloss,\n form: formReducer,\n billing,\n countryInfo,\n });\n\nexport default createRootReducer;\n","import { routerMiddleware } from \"connected-react-router\";\nimport thunk from \"redux-thunk\";\nimport { applyMiddleware, createStore } from \"redux\";\nimport { composeWithDevTools } from \"redux-devtools-extension\";\nimport { Subject } from \"rxjs\";\n\nimport { history } from \"utils\";\nimport createRootReducer from \"reducers/index\";\n\nexport const actions = new Subject();\n\nconst dynamicMiddleware = (store) => (next) => (action) => {\n const result = next(action);\n actions.next([action, store.getState()]);\n return result;\n};\n\nconst router = routerMiddleware(history);\nconst middlewares = [dynamicMiddleware, router, thunk];\n\nconst isLogger = false;\n\nif (isLogger && process.env.NODE_ENV === \"development\") {\n const { logger } = require(\"redux-logger\");\n middlewares.push(logger);\n}\n\nexport const store = createStore(\n createRootReducer(history),\n composeWithDevTools(applyMiddleware(...middlewares))\n);\n","import { Subject } from \"rxjs\";\nimport { getAccountIdForProduct, getApiToken } from \"selectors/index\";\nimport { actions } from \"store\";\n\nconst liveEndpoint = window.env.STREAM_ENDPOINT;\nconst paperEndpoint = window.env.PAPER_STREAM_ENDPOINT;\n\nconst subjects = {\n [liveEndpoint]: new Subject(),\n [paperEndpoint]: new Subject(),\n};\nconst sockets = { [liveEndpoint]: null, [paperEndpoint]: null };\n\nexport function init() {\n let token = null;\n\n actions.subscribe(([_, state]) => {\n if (getApiToken(state) !== token) {\n token = getApiToken(state);\n const accountId = getAccountIdForProduct(state, \"paper\");\n\n if (token && accountId) {\n connect(liveEndpoint, token);\n connect(paperEndpoint, token);\n }\n }\n });\n}\n\nfunction connect(endpoint, token) {\n const authMsg = JSON.stringify({\n action: \"authenticate\",\n data: {\n cognito_token: token,\n },\n });\n\n // updated auth token\n if (sockets[endpoint]) {\n sockets[endpoint].send(authMsg);\n return;\n }\n\n const socket = new WebSocket(endpoint);\n sockets[endpoint] = socket;\n\n socket.onmessage = (message) => {\n const reader = new FileReader();\n reader.onload = function () {\n const message = JSON.parse(this.result);\n if (message.stream === \"authorization\") {\n if (message.data.status !== \"authorized\") {\n console.error(\"/stream unauthorized\", message.data);\n return;\n }\n socket.send(\n JSON.stringify({\n action: \"listen\",\n data: {\n streams: [\"trade_updates\"],\n },\n })\n );\n } else if (message.stream === \"trade_updates\") {\n subjects[endpoint].next(message);\n }\n };\n reader.readAsText(message.data);\n };\n socket.onerror = (err) => {\n console.error(\"socket error\", err);\n };\n socket.onclose = () => {\n console.error(\"socket closed, trying to reconnect in 15 second\");\n setTimeout(() => connect(endpoint, token), 15000);\n };\n socket.onopen = () => socket.send(authMsg);\n}\n\n// Subscribe to both websockets, but only forward them to Elm if the stream matches the current product.\nexport default {\n bind(subscription, isLive, ports) {\n subscription.add(\n subjects[liveEndpoint].subscribe((message) => {\n if (isLive()) {\n ports.events_.send(message);\n }\n })\n );\n subscription.add(\n subjects[paperEndpoint].subscribe((message) => {\n if (!isLive()) {\n ports.events_.send(message);\n }\n })\n );\n },\n};\n","// @ts-nocheck\n\nimport * as union from \"set.prototype.union\";\nimport * as intersection from \"set.prototype.intersection\";\nimport * as difference from \"set.prototype.difference\";\n\nunion.shim();\nintersection.shim();\ndifference.shim();\n","import * as Sentry from \"@sentry/browser\";\nimport * as SecondaryIntegrations from \"@sentry/integrations\";\nimport { Integrations } from \"@sentry/tracing\";\n\nexport function init() {\n Sentry.init({\n dsn: window.env.SENTRY_DSN,\n release: process.env.REACT_APP_VERSION,\n environment: window.env.ENV,\n integrations: [\n new Integrations.BrowserTracing(),\n new SecondaryIntegrations.Dedupe(),\n new SecondaryIntegrations.ExtraErrorData(),\n ],\n ignoreErrors: [\n // network failure\n \"Failed to fetch\",\n /Loading chunk [\\d]+ failed/,\n /Loading CSS chunk [\\d]+ failed/,\n /NetworkError when attempting to fetch resource/,\n // elm\n \"Cannot read property 'childNodes' of undefined\",\n 'Can\\'t access property \"childNodes\"',\n \".replaceData is not a function\",\n ],\n });\n}\n","import loadable from \"@loadable/component\";\nimport enGB from \"antd/lib/locale-provider/en_GB\";\nimport React, { useCallback } from \"react\";\nimport CookieConsent from \"react-cookie-consent\";\nimport ReactDOM from \"react-dom\";\nimport AmplitudeProvider from \"./AmplitudeProvider\";\nimport AuthCheck from \"./AuthCheck\";\nimport { Layout } from \"./v2/components/Layout\";\nimport RootRedirect from \"./pages/RootRedirect\";\n\nimport {\n checkLogin,\n requireCrytpoActive,\n requireLiveActive,\n requireLogin,\n} from \"./authMethods\";\n\nimport { ConfigProvider } from \"antd\";\nimport { ConnectedRouter } from \"connected-react-router\";\nimport { Toaster } from \"react-hot-toast\";\nimport { QueryClient, QueryClientProvider } from \"react-query\";\nimport { connect, Provider } from \"react-redux\";\nimport { Redirect, Route, Switch } from \"react-router-dom\";\nimport { version } from \"../package.json\";\nimport { Intercom } from \"./Intercom\";\nimport { init as initSentry } from \"./Sentry\";\nimport { Wireframe } from \"./Wireframe\";\nimport { Link } from \"./components/AlpacaComponents/Text\";\nimport { initAmplify } from \"./reducers/auth/common\";\nimport { store } from \"./store\";\nimport { history } from \"./utils\";\nimport { init as initWebsocket } from \"./websocket\";\n\nimport \"antd/dist/antd.css\";\nimport \"resources/AlpacaStyles/alpaca.scss\";\nimport \"resources/AntStyles/AntDesign/antd.override.scss\";\nimport AccountProvider from \"./v2/providers/AccountProvider\";\nimport { Account } from \"./v2/api/rest/account\";\n\nimport \"./shims\";\n\ninitSentry();\n\n// @ts-ignore adds version() command to global scope\nwindow.version = () => {\n return process.env.REACT_APP_VERSION || version;\n};\n\nconst AuthCheckRoute = (props: any) => {\n const component = useCallback(\n (routeProps) => (\n <AuthCheck\n routeProps={routeProps}\n redirector={props.redirector}\n component={props.component}\n />\n ),\n [props.redirector, props.component]\n );\n return <Route path={props.path} component={component} />;\n};\n\n// super gross but really easy way to disable our stupid debug logs in prod\nif (process.env.NODE_ENV !== \"development\") {\n console.log = () => {};\n}\n\ninitWebsocket();\n\nconst queryClient = new QueryClient();\n\nconst render = () => {\n const hasCognitoCookies =\n document.cookie &&\n document.cookie\n .split(\";\")\n .filter((value) => value.match(/CognitoIdentityService.*/)).length > 0;\n if (hasCognitoCookies) {\n initAmplify();\n }\n\n ReactDOM.render(\n <AmplitudeProvider>\n <Provider store={store}>\n <QueryClientProvider client={queryClient}>\n <ConfigProvider locale={enGB}>\n <ConnectedRoutes />\n </ConfigProvider>\n </QueryClientProvider>\n </Provider>\n <Wireframe enabled={process.env.NODE_ENV === \"development\"} />\n </AmplitudeProvider>,\n document.getElementById(\"root\")\n );\n};\n\nconst Routes = ({\n dispatch,\n cognito,\n}: {\n dispatch: any;\n cognito: {\n status: string;\n payload: Account[] | null;\n };\n}) => {\n const NewAccountV2Importer = () => import(\"./v2/pages/dashboard/onboarding\");\n\n const NewAccount = () => (\n <Layout\n product=\"paper\"\n showSearchInHeader={true}\n noHeader={false}\n importer={NewAccountV2Importer}\n />\n );\n\n return (\n <>\n <ConnectedRouter history={history}>\n <AccountProvider dispatch={dispatch} cognito={cognito}>\n <div>\n <Toaster />\n <CookieConsent\n location=\"bottom\"\n buttonText=\"Accept\"\n cookieName=\"gdpr_accepted\"\n style={{ background: \"#2B373B\" }}\n buttonStyle={{\n color: \"#4e503b\",\n fontSize: \"13px\",\n marginRight: \"7em\",\n }}\n >\n Alpaca and selected third parties use cookies on this website as\n specified in the\n <Link\n href=\"https://files.alpaca.markets/disclosures/CookiePolicy.pdf\"\n style={{ color: \"#fcd305\" }}\n >\n cookie policy\n </Link>\n . You accept the use of these cookies or other identifiers by\n pressing ‘Accept’, closing this notice, or logging into your\n account.\n </CookieConsent>\n <Switch>\n <Route\n path=\"/account/login\"\n component={loadable(() => import(\"./v2/pages/auth\"))}\n />\n <AuthCheckRoute\n path=\"/exchange_questions\"\n component={loadable(() => import(\"./pages/ExchangeQuestions\"))}\n />\n <AuthCheckRoute\n path=\"/logout\"\n component={loadable(() => import(\"./pages/LogoutPage\"))}\n redirector={checkLogin}\n />\n <AuthCheckRoute\n path=\"/signup\"\n component={loadable(() => import(\"./v2/pages/signup\"))}\n redirector={checkLogin}\n />\n <AuthCheckRoute\n path=\"/verify\"\n component={loadable(() => import(\"./v2/pages/signup\"))}\n redirector={checkLogin}\n />\n <AuthCheckRoute\n path=\"/signup/pending\"\n component={loadable(() => import(\"./v2/pages/signup\"))}\n redirector={checkLogin}\n />\n <AuthCheckRoute\n path=\"/signup/success\"\n component={loadable(() => import(\"./v2/pages/signup\"))}\n />\n <AuthCheckRoute\n path=\"/onboarding/step/one\"\n component={loadable(\n () => import(\"./v2/pages/dashboard/onboarding\")\n )}\n />\n <AuthCheckRoute\n path=\"/onboarding/step/two\"\n component={loadable(\n () => import(\"./v2/pages/dashboard/onboarding\")\n )}\n />\n <AuthCheckRoute\n path=\"/onboarding/step/three\"\n component={loadable(\n () => import(\"./v2/pages/dashboard/onboarding\")\n )}\n />\n <AuthCheckRoute\n path=\"/onboarding/kyc\"\n component={loadable(\n () => import(\"./v2/pages/dashboard/onboarding\")\n )}\n />\n <AuthCheckRoute\n path=\"/onboarding/bank\"\n component={loadable(\n () => import(\"./v2/pages/dashboard/onboarding\")\n )}\n />\n <Route\n path=\"/dashboard/portfolio\"\n component={() => (\n <Redirect push to=\"/brokerage/dashboard/portfolio\" />\n )}\n />\n <Route\n path=\"/login\"\n component={() => <Redirect push to=\"/account/login\" />}\n />\n <Route\n path=\"/brokerage/dashboard/portfolio\"\n render={() => <Redirect push to=\"/account/positions\" />}\n />\n <Route\n path=\"/paper/dashboard/portfolio\"\n render={() => <Redirect push to=\"/account/positions\" />}\n />\n <AuthCheckRoute\n path=\"/sign/W8-BEN\"\n component={loadable(() => import(\"./v2/pages/sign/W8-BEN\"))}\n redirector={requireLogin}\n />\n <Route path=\"/.well-known/apple-app-site-association\" />\n {/* OAuth */}\n <AuthCheckRoute\n path=\"/oauth/authorize\"\n component={() => (\n <Layout\n noHeader={true}\n disableAppMenu={true}\n showBrandInHeader={true}\n showSearchInHeader={false}\n importer={() => import(\"./pages/OAuth/AuthorizationPage\")}\n />\n )}\n redirector={requireLogin}\n />\n {/* USER & ALPACA ACCOUNT ROUTES */}\n <AuthCheckRoute\n path=\"/user/profile\"\n component={() => (\n <Layout\n product=\"dynamic\"\n showSearchInHeader={true}\n importer={() => import(\"./v2/pages/dashboard/profile\")}\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/user/subscription\"\n component={() => (\n <Layout\n noHeader\n product=\"live\"\n showSearchInHeader={true}\n importer={() => import(\"./pages/User/SubscriptionPage\")}\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/user/trading-plan\"\n component={() => (\n <Layout\n product=\"live\"\n showSearchInHeader={true}\n importer={() => import(\"./v2/pages/dashboard/tradingPlan\")}\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/user/high-yield-cash-enrollment\"\n component={() => (\n <Layout\n product=\"live\"\n showSearchInHeader={true}\n importer={() =>\n import(\"./v2/pages/dashboard/highYieldAgreement\")\n }\n />\n )}\n redirector={requireLogin}\n />\n {/* PAPER ROUTES */}\n\n <AuthCheckRoute\n path=\"/paper/dashboard/order/:orderId\"\n component={() => (\n <Layout\n product=\"paper\"\n importer={() => import(\"./v2/pages/order\")}\n />\n )}\n redirector={requireLogin}\n />\n\n <AuthCheckRoute\n path=\"/paper/dashboard/balances\"\n component={() => (\n <Layout\n product=\"paper\"\n importer={() => import(\"./v2/pages/balances\")}\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/paper/dashboard/account-activities\"\n component={() => (\n <Layout\n product=\"paper\"\n importer={() =>\n import(\"./v2/pages/dashboard/account/activities\")\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/document-requests\"\n component={() => (\n <Layout\n product=\"live\"\n showSearchInHeader={false}\n importer={() =>\n import(\n \"./pages/Dashboard/Product/BrokerageAccount/DocumentRequests\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/paper/dashboard/overview\"\n component={() => (\n <Layout\n product=\"paper\"\n importer={() =>\n import(\n \"./pages/Dashboard/Product/BrokerageAccount/Overview\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/dashboard/overview\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\n \"./pages/Dashboard/Product/BrokerageAccount/Overview\"\n )\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/paper/dashboard/overview\"\n component={() => (\n <Layout\n product=\"paper\"\n importer={() =>\n import(\n \"./pages/Dashboard/Product/BrokerageAccount/Overview\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/dashboard/overview\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\n \"./pages/Dashboard/Product/BrokerageAccount/Overview\"\n )\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path={[\"/paper/trade/:symbol*\", \"/paper/pairs/:symbol*\"]}\n component={() => (\n <Layout\n product=\"paper\"\n importer={() =>\n import(\"./pages/Dashboard/Product/PaperTrading/StockPage\")\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path={[\n \"/brokerage/stocks/:symbol*\",\n \"/brokerage/pairs/:symbol*\",\n ]}\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\n \"./pages/Dashboard/Product/BrokerageAccount/StockPage\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n {/* BROKERAGE ROUTES */}\n <AuthCheckRoute\n path=\"/brokerage/new-account/:step\"\n component={NewAccount}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n exact\n path=\"/brokerage/new-account\"\n component={NewAccount}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/new-entity-account/business-info\"\n component={() => (\n <Layout\n product=\"paper\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\n \"./v2/pages/dashboard/entityOnboarding/pages/businessInfo\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/new-entity-account/account-opener\"\n component={() => (\n <Layout\n product=\"paper\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\n \"./v2/pages/dashboard/entityOnboarding/pages/accountOpener\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/new-entity-account/authorized-individuals-ubos\"\n component={() => (\n <Layout\n product=\"paper\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\n \"./v2/pages/dashboard/entityOnboarding/pages/authIndividualsUBOs\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/new-entity-account/documents\"\n component={() => (\n <Layout\n product=\"paper\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\n \"./v2/pages/dashboard/entityOnboarding/pages/documents\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/new-entity-account/agreements\"\n component={() => (\n <Layout\n product=\"paper\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\n \"./v2/pages/dashboard/entityOnboarding/pages/agreements\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/new-entity-account/completed\"\n component={() => (\n <Layout\n product=\"paper\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\n \"./v2/pages/dashboard/entityOnboarding/pages/completed\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/dashboard/order/:orderId\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() => import(\"./v2/pages/order\")}\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/dashboard/balances\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() => import(\"./v2/pages/balances\")}\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/positions\"\n component={() => <Redirect push to=\"/account/positions\" />}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/account/positions\"\n component={() => (\n <Layout\n product=\"dynamic\"\n importer={() => import(\"./v2/pages/dashboard/positions\")}\n />\n )}\n redirector={requireLogin}\n />\n\n <AuthCheckRoute\n path=\"/account/activities\"\n component={() => (\n <Layout\n product=\"dynamic\"\n importer={({ product }: any = {}) => {\n return import(\"./v2/pages/dashboard/account/activities\");\n }}\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/orders\"\n component={() => <Redirect push to=\"/account/orders\" />}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/account/orders\"\n component={() => (\n <Layout\n product=\"dynamic\"\n importer={() => import(\"./v2/pages/dashboard/orders\")}\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/account/configuration\"\n component={() => (\n <Layout\n product=\"dynamic\"\n importer={() =>\n import(\n \"./v2/pages/dashboard/account/configurations/index\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/account/documents\"\n component={() => (\n <Layout\n product=\"dynamic\"\n importer={() =>\n import(\"./v2/pages/dashboard/account/documents\")\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/account/plans-and-features\"\n component={() => (\n <Layout\n product=\"dynamic\"\n importer={() => import(\"./v2/pages/dashboard/plans\")}\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/dashboard/balances\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() => import(\"./v2/pages/balances\")}\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/deposit/wire\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/funding/deposit/wire/index\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/deposit/ach\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/funding/deposit/ach\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/deposit/currencycloud\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\n \"./v2/pages/dashboard/funding/deposit/currencyCloud\"\n )\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/deposit\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/funding/deposit\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/withdraw/ach\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/funding/withdraw/ach\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/withdraw/wire\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/funding/withdraw/wire\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/withdraw/currencycloud\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\n \"./v2/pages/dashboard/funding/withdraw/currencyCloud\"\n )\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/withdraw\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/funding/withdraw\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/history\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/funding/history\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/link/ach\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/funding/link/ach\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/link/wire\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/funding/link/wire\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding/link/currencycloud\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/funding/link/currencyCloud\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/funding\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/funding/index\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n\n <AuthCheckRoute\n path=\"/brokerage/dashboard/account-activities\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./v2/pages/dashboard/account/activities\")\n }\n />\n )}\n redirector={requireLiveActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/agreement\"\n component={() => (\n <Layout\n noHeader\n product=\"live\"\n showSearchInHeader={false}\n importer={() =>\n import(\n \"./pages/Dashboard/Product/BrokerageAccount/Agreement\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path={[\"/trade/:base/:quote\"]}\n component={() => (\n <Layout\n product=\"dynamic\"\n importer={() =>\n import(\n \"./pages/Dashboard/Product/BrokerageAccount/StockPage\"\n )\n }\n />\n )}\n />\n <AuthCheckRoute\n path={[\"/trade/:symbol\"]}\n component={() => (\n <Layout\n product=\"dynamic\"\n importer={() =>\n import(\n \"./pages/Dashboard/Product/BrokerageAccount/StockPage\"\n )\n }\n />\n )}\n />\n <AuthCheckRoute\n path=\"/connect/submit\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./pages/Dashboard/Product/Connect/SubmitApp\")\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/connect/edit/:clientId\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\"./pages/Dashboard/Product/Connect/SubmitApp\")\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/connect/:clientId\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() => import(\"./v2/pages/connect/AppDetailsPage\")}\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/connect\"\n component={() => (\n <Layout\n product=\"dynamic\"\n importer={() => import(\"./v2/pages/connect/AppPage\")}\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/dashboard/crypto-transfers\"\n component={() => (\n <Layout\n product=\"live\"\n importer={() =>\n import(\n \"./pages/Dashboard/Product/BrokerageAccount/CoinTransfers\"\n )\n }\n />\n )}\n redirector={requireCrytpoActive}\n />\n <AuthCheckRoute\n path=\"/brokerage/options/opt-in/financial-profile\"\n component={() => (\n <Layout\n product=\"live\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\n \"./v2/pages/dashboard/optionsOptIn/pages/financialProfile\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/options/opt-in/investment-experience\"\n component={() => (\n <Layout\n product=\"live\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\n \"./v2/pages/dashboard/optionsOptIn/pages/investmentExperience\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/options/opt-in/spreads\"\n component={() => (\n <Layout\n product=\"live\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\"./v2/pages/dashboard/optionsOptIn/pages/spreads\")\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/options/opt-in/options-agreement\"\n component={() => (\n <Layout\n product=\"live\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\n \"./v2/pages/dashboard/optionsOptIn/pages/agreement\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/options/opt-in/status\"\n component={() => (\n <Layout\n product=\"live\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\"./v2/pages/dashboard/optionsOptIn/pages/status\")\n }\n />\n )}\n redirector={requireLogin}\n />\n <AuthCheckRoute\n path=\"/brokerage/options/opt-in/entity-account\"\n component={() => (\n <Layout\n product=\"live\"\n showSearchInHeader={true}\n noHeader={false}\n importer={() =>\n import(\n \"./v2/pages/dashboard/optionsOptIn/pages/entityAccount\"\n )\n }\n />\n )}\n redirector={requireLogin}\n />\n {/* OPTIONS REDIRECT ROUTE */}\n <Route\n path={\"/options\"}\n component={loadable(() => import(\"./pages/OptionsRedirect\"))}\n />\n {/* TODO: redirect based on account status */}\n <AuthCheckRoute\n path=\"/\"\n component={() => <RootRedirect />}\n redirector={requireLogin}\n />\n {/* REDIRECTS */}\n <Route\n path=\"/account\"\n render={() => (\n <Redirect push to=\"/brokerage/dashboard/profile\" />\n )}\n />\n <Route\n path=\"/docs\"\n render={() => (\n <Redirect push to=\"/brokerage/dashboard/documents\" />\n )}\n />\n <Route\n path=\"/dashboard/overview\"\n render={() => (\n <Redirect push to=\"/brokerage/dashboard/overview\" />\n )}\n />\n <Route\n path=\"/dashboard/onboarding\"\n render={() => (\n <Redirect push to=\"/brokerage/dashboard/onboarding\" />\n )}\n />\n <Route\n path=\"/new-account\"\n render={() => <Redirect push to=\"/brokerage/new-account\" />}\n />\n <Route\n path=\"/brokerage/international/new-account/:step\"\n render={() => <Redirect to=\"/brokerage/new-account\" />}\n />\n </Switch>\n </div>\n </AccountProvider>\n </ConnectedRouter>\n <Intercom cognito={cognito} />\n </>\n );\n};\n\nconst mapStateToProps = (state: any) => ({\n cognitoStatus: state.cognito.status,\n cognito: state.cognito,\n accountList: state.accountList,\n});\n\nconst ConnectedRoutes = connect(mapStateToProps)(Routes);\n\nrender();\n\nexport default history;\n","import instance from \"../\";\n\nimport { CountryInfo } from \"src/v2/types\";\nimport { Country } from \"../hooks/useGetCountries\";\n\nexport interface PreviousStepResponse {\n new_step: string;\n}\n\nexport type CountryInfos = {\n [key: string]: CountryInfo;\n};\n\nexport type DisclosureData = {\n is_control_person: boolean;\n is_politically_exposed: boolean;\n immediate_family_exposed: boolean;\n is_discretionary: boolean;\n non_solicitation_answer: string;\n};\n\nexport interface AddressStepPayload {\n last_name?: string;\n first_name?: string;\n postal_code?: string;\n city?: string;\n state?: string;\n phone_number?: string;\n tax_id?: string;\n date_of_birth?: string;\n tax_id_type?: string;\n unit?: string;\n country?: string;\n street_address?: string[];\n permanent_resident?: boolean;\n signup_step?: string;\n country_of_citizenship?: string;\n country_of_tax_residence?: string;\n margin_agreement_signed?: boolean;\n customer_agreement_signed?: boolean;\n customer_agreement_revision?: string;\n visa_type?: string;\n visa_expiration_date?: string;\n country_of_birth?: string;\n}\n\nexport interface ESignAudit {\n agreement: string;\n signed_at: string;\n}\n\nexport interface AffiliateData {\n type: string;\n street_address?: string[];\n city?: string;\n state?: string;\n postal_code?: string;\n country?: string;\n company_name?: string;\n company_symbol?: string;\n additional_name?: string;\n compliance_email?: string;\n given_name?: string;\n family_name?: string;\n}\n\nexport const acceptW8 = (accountID: string) =>\n instance.post(`/accounts/${accountID}/taxfiles/w_8ben/accept`, {});\n\nexport const createAffiliate = (accountID: string, payload: AffiliateData) =>\n instance.post(`/accounts/${accountID}/affiliates`, payload);\n\nexport const addressPatch = (accountID: string, payload: AddressStepPayload) =>\n instance.patch(`/accounts/${accountID}/steps/next/address_step`, payload);\n\nexport const disclosuresPatch = (\n accountID: string,\n payload: Partial<DisclosureData>\n) =>\n instance.patch(`/accounts/${accountID}/steps/next/disclosures_step`, payload);\n\nexport const confirmDetails = (accountID: string) =>\n instance.patch(`/accounts/${accountID}/steps/next/confirmation_step`, {});\n\nexport const kycPatch = (accountID: string) =>\n instance.patch(`/accounts/${accountID}/steps/next/kyc_step`, {});\n\nexport const getCountries = async (): Promise<Country[]> =>\n (await instance.get(\"/allowed-countries\")).data;\n\nexport const getCountryInfos = async (): Promise<CountryInfos> =>\n (await instance.get(\"/country-infos\")).data;\n\nexport const previousStepPatch = (\n accountID: string\n): Promise<PreviousStepResponse> =>\n instance.patch(`/accounts/${accountID}/steps/previous`, {});\n\nexport const resetPatch = (accountID: string, payload: AddressStepPayload) =>\n instance.patch(`/accounts/${accountID}/steps/reset`, payload);\n","import {\n useQuery,\n QueryFunction,\n UseQueryResult,\n UseQueryOptions,\n QueryKey,\n} from \"react-query\";\n\nimport { useToast } from \"@chakra-ui/toast\";\nimport { defaultToastSettings, getErrorMessage } from \".\";\n\nexport type QueryOptions<T> = UseQueryOptions<T, Error, T, QueryKey>;\n\nexport function useRequest<T>(\n queryKey: QueryKey,\n queryFn: QueryFunction<T>,\n options: QueryOptions<T> = {}\n): UseQueryResult<T, unknown> {\n const toast = useToast();\n\n const defaultQueryOptions: QueryOptions<T> = {\n onError: (err) => {\n // todo: suppress account errors for /trade auth check (for now)\n if (queryKey?.includes(\"account\")) {\n return;\n }\n const key = \"errorToastKey\";\n if (toast.isActive(key)) return;\n const message = getErrorMessage(err);\n\n toast({ id: key, description: message, ...defaultToastSettings });\n },\n };\n\n const data = useQuery(queryKey, queryFn, {\n ...defaultQueryOptions,\n ...options,\n });\n\n return data;\n}\n\nexport default useRequest;\n","import get from \"lodash/get\";\n\n/**\n * Selectors are helper functions that generalize common questions about state.\n *\n * It introduces an extra layer of indirection, but it pays for this\n * by providing a single source of truth for how to interpret the state.\n *\n * This makes it easier to reduce duplication and bad assumptions,\n * and to change the shape of state in the future.\n *\n * A note on functions that return boolean values:\n * If the function is written as `isAccountInSomeState`, it should only be used\n * to determine if that specific condition true. A false value should not be used to infer\n * some other state. For example, if `isMicrodeposit` is false for some relationship,\n * you should not assume that it is a Plaid relationship. There could be some third type\n * of relationship in the future, or the relationship could just be null.\n */\n\n// account stuff\n\nexport const isAlpacaAccountCreated = (state) =>\n !!(state.account && state.account.account);\n\nexport const getAlpacaAccount = (state) => get(state, \"account.account\");\n\nexport const getAlpacaAccountId = (state) => get(state, \"account.account.id\");\n\nexport const getPaperAccountId = (state) => get(state, \"account.paper.current\");\n\nexport const getApiToken = (state) =>\n get(state, \"auth.userState.signInUserSession.idToken.jwtToken\");\n\n// A helper to return access token, account id and paper account id.\nexport const getAccountIdAndJWT = (state) => {\n const account = getAlpacaAccount(state) || {};\n const accountId = account.id || \"\";\n const paperAccountId = getPaperAccountId(state);\n const token = getApiToken(state);\n\n return { accountId, paperAccountId, token };\n};\n\n// banking stuff\n\nexport const isMicrodeposit = (relationship) =>\n relationship &&\n relationship.plaid_verification_status &&\n relationship.plaid_verification_status.includes(\"manual\");\n\nexport const isPendingMicrodeposit = (relationship) =>\n isMicrodeposit(relationship) &&\n relationship.plaid_verification_status.includes(\"pending\");\n\n/**\n * This will return the account ID for the given product.\n * Currently there is only one account per product, but this\n * will change in the future.\n *\n * @param {Object} state\n * @param {String} product\n */\nexport const getAccountIdForProduct = (state, product) => {\n if (product && state) {\n // Figure out the account id to use\n const { account } = state;\n let accountId = \"\";\n if (product === \"paper\") {\n accountId = (account.paper && account.paper.current) || accountId;\n }\n if (product === \"live\") {\n accountId = (account.account && account.account.id) || accountId;\n }\n\n return accountId;\n }\n};\n\n/**\n * Given a live account object, return if the account is in a state\n * of beinga be to be used.\n *\n * @param {Object} account\n */\nexport const isLiveAccountActive = (account) => {\n const accountStatus = (account && account.status) || false;\n\n // A full list of status values here:\n // https://github.com/alpacahq/gobroker/blob/develop/models/enum/enum.go#L17\n //\n // An 'ACTIVE' status will have an account_number so no need to check that.\n // SUBMITTED - action is required on client side, some sort of rejection\n // RESUBMITTED - request has been re-submitted to Apex after account update\n // APPROVAL_PENDING - account awaiting approval\n // REAPPROVAL_PENDING - indeterminate state once apex approves a re-submission\n // ACTION_REQUIRED - account did not pass automatic cip check or failed watchlist check, waiting for admin action\n // SUBMISSION_FAILED - something happened on our server and didn't complete\n // REJECTED - APEX flat out rejected the account (the user must re-apply somehow - new email/login)\n // ::: the following admin actions can change status :::\n // ACCOUNT_UPDATED - if the account was previously in an ACTIVE status\n // EDITED - temporary status when an admin has edited an account\n // ACCOUNT_CLOSED - the account is closed (rare)\n // DISABLED - ETC account is disabled by admin\n return accountStatus === \"ACTIVE\";\n};\n\n/**\n * Given an account object, this will return true if the\n * account is PAPER_ONLY or ONBOARDING\n *\n * @param {Object} account\n */\nexport const isPaperOrOnboarding = (account) => {\n const liveAccount = account?.account ?? account?.liveAccount ?? {};\n const status = liveAccount?.status ?? \"\";\n return (\n status === \"ONBOARDING\" || status === \"PAPER_ONLY\" || status === \"SIGNED_UP\"\n );\n};\n\n// Check on name for disabled\nexport const isLiveAccountClosedOrDisabled = (account) => {\n const liveAccount = account.account || {};\n const { status = \"\" } = liveAccount;\n return status === \"ACCOUNT_CLOSED\" || status === \"DISABLED\";\n};\n","export const Path = {\n // routes\n ROUTE_LOGIN: \"/account/login\",\n ROUTE_DASHBOARD: \"/:product/dashboard/overview\",\n ROUTE_POSITIONS: \"/account/positions\",\n ROUTE_ORDERS: \"/account/orders\",\n ROUTE_TRADE: \"/trade/:symbol\",\n ROUTE_ACCOUNT_ACTIVITIES: \"/account/activities\",\n ROUTE_DOCUMENTS: \"/account/documents\",\n ROUTE_BALANCES: \"/:product/dashboard/balances\",\n ROUTE_CONFIGURATION: \"/account/configuration\",\n ROUTE_IP_ALLOWLIST: \"/account/ip-allowlist\",\n ROUTE_CRYPTO_TRANSFERS: \"/:product/dashboard/crypto-transfers\",\n ROUTE_ALPACA_CONNECT: \"/connect\",\n ROUTE_ALPACA_CONNECT_SUBMIT: \"/connect/submit\",\n ROUTE_ALPACA_CONNECT_APP: \"/connect/:client_id\",\n ROUTE_ALPACA_PROFILE: \"/user/profile#:tab\",\n ROUTE_NEW_ACCOUNT: \"/brokerage/new-account\",\n ROUTE_USER_SUBSCRIPTION: \"/user/subscription\",\n ROUTE_PLANS_AND_FEATURES: \"/account/plans-and-features\",\n ROUTE_USER_SUBSCRIPTION_NEW: \"/brokerage/new-account/data-subscription?upd=1\",\n ROUTE_OPTIONS_OPT_IN_FINANCIAL_PROFILE:\n \"/brokerage/options/opt-in/financial-profile\",\n ROUTE_OPTIONS_OPT_IN_INVESTMENT_EXPERIENCE:\n \"/brokerage/options/opt-in/investment-experience\",\n ROUTE_OPTIONS_OPT_IN_SPREADS: \"/brokerage/options/opt-in/spreads\",\n ROUTE_OPTIONS_OPT_IN_AGREEMENT: \"/brokerage/options/opt-in/options-agreement\",\n ROUTE_OPTIONS_OPT_IN_STATUS: \"/brokerage/options/opt-in/status\",\n ROUTE_OPTIONS_OPT_IN_ENTITY_ACCOUNT:\n \"/brokerage/options/opt-in/entity-account\",\n ROUTE_ENTITY_ONBOARDING_BUSINESS_INFO: \"/brokerage/new-entity-account/business-info\",\n ROUTE_ENTITY_ONBOARDING_ACCOUNT_OPENER:\n \"/brokerage/new-entity-account/account-opener\",\n ROUTE_ENTITY_ONBOARDING_AUTH_INDIVIDUALS_UBOS:\n \"/brokerage/new-entity-account/authorized-individuals-ubos\",\n ROUTE_ENTITY_ONBOARDING_DOCUMENTS: \"/brokerage/new-entity-account/documents\",\n ROUTE_ENTITY_ONBOARDING_AGREEMENTS: \"/brokerage/new-entity-account/agreements\",\n ROUTE_ENTITY_ONBOARDING_COMPLETED: \"/brokerage/new-entity-account/completed\",\n ROUTE_ALPACA_TRADING_PLAN: \"/user/trading-plan\",\n\n ROUTE_FUNDING: \"/brokerage/funding\",\n ROUTE_FUNDING_HISTORY: \"/brokerage/funding/history\",\n ROUTE_FUNDING_LINK: \"/brokerage/funding/link\",\n ROUTE_FUNDING_LINK_ACH: \"/brokerage/funding/link/ach\",\n ROUTE_FUNDING_LINK_WIRE: \"/brokerage/funding/link/wire\",\n ROUTE_FUNDING_LINK_CURRENCYCLOUD: \"/brokerage/funding/link/currencycloud\",\n ROUTE_FUNDING_DEPOSIT: \"/brokerage/funding/deposit\",\n ROUTE_FUNDING_DEPOSIT_ACH: \"/brokerage/funding/deposit/ach\",\n ROUTE_FUNDING_DEPOSIT_WIRE: \"/brokerage/funding/deposit/wire\",\n ROUTE_FUNDING_DEPOSIT_CURRENCYCLOUD:\n \"/brokerage/funding/deposit/currencycloud\",\n ROUTE_FUNDING_WITHDRAW: \"/brokerage/funding/withdraw\",\n ROUTE_FUNDING_WITHDRAW_ACH: \"/brokerage/funding/withdraw/ach\",\n ROUTE_FUNDING_WITHDRAW_WIRE: \"/brokerage/funding/withdraw/wire\",\n ROUTE_FUNDING_WITHDRAW_CURRENCYCLOUD:\n \"/brokerage/funding/withdraw/currencycloud\",\n\n ROUTE_HIGH_YIELD_ONBOARDING: \"/user/high-yield-cash-enrollment\",\n\n // urls\n URL_BUG_REPORT: \"https://forms.gle/32B6T3bbWzL6agbC7\",\n URL_DOCS: \"https://docs.alpaca.markets/docs\",\n URL_DOCS_ACCOUNT_ACTIVITIES:\n \"https://docs.alpaca.markets/docs/account-activities\",\n URL_SLACK: \"https://alpaca.markets/slack\",\n URL_FORUM: \"https://forum.alpaca.markets\",\n URL_SUPPORT: \"https://alpaca.markets/support\",\n URL_DISCLOSURES: \"https://alpaca.markets/disclosures\",\n // helpers\n format: (path: string, params: { [key: string]: string }) =>\n Object.keys(params).reduce(\n (acc, key) =>\n acc.replace(`:${key}`, params[key].replace(\"live\", \"brokerage\")),\n path\n ),\n};\n","import { createAction as baseCreateAction, createReducer } from \"redux-act\";\nimport api from \"api\";\n\nconst REDUCER = \"accountList\";\nconst NS = `@@${REDUCER}`;\nconst createAction = (name) => baseCreateAction(`${NS}/${name}`);\n\nexport const _receive = createAction(\"RECEIVE\");\nexport const _fetch = createAction(\"FETCH\");\nexport const _error = createAction(\"ERROR\");\nexport const _invalidate = createAction(\"INVALIDATE\");\nexport const _reset = createAction(\"RESET_ACCOUNTS\");\n\nconst initialState = {\n status: \"invalid\",\n payload: null,\n error: null,\n};\n\nexport const load = () => (dispatch, getState) => {\n const state = getState().accountList;\n switch (state.status) {\n case \"invalid\":\n dispatch(_fetch());\n return dispatch(api.account.list())\n .then((accounts) => {\n dispatch(_receive(accounts));\n return accounts;\n })\n .catch((error) => {\n dispatch(_error(error));\n throw error;\n });\n\n case \"error\":\n return Promise.reject(state.error);\n\n default:\n return Promise.resolve(state.payload);\n }\n};\n\nexport const reload = () => (dispatch) => {\n return dispatch(api.account.list())\n .then((accounts) => {\n dispatch(_receive(accounts));\n return accounts;\n })\n .catch((error) => {\n dispatch(_error(error));\n throw error;\n });\n};\n\nexport const resetState = () => (dispatch) => {\n dispatch(_reset());\n};\n\nexport default createReducer(\n {\n [_receive]: (state, param) => ({\n ...state,\n status: \"loaded\",\n payload: param,\n }),\n [_fetch]: (state) => ({\n ...state,\n status: \"loading\",\n payload: null,\n error: null,\n }),\n [_error]: (state, param) => ({\n ...state,\n status: \"error\",\n error: param,\n }),\n [_invalidate]: (state) => ({\n ...state,\n status: \"invalid\",\n payload: null,\n error: null,\n }),\n [_reset]: () => initialState,\n },\n initialState\n);\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport { Spinner } from \"@alpacahq/ui\";\nimport loadable, { LoadableClassComponent } from \"@loadable/component\";\nimport { enquireScreen } from \"enquire-js\";\n\nimport { Page } from \"src/v2/components/common/page\";\nimport App from \"src/v2/pages\";\nimport { MFAGuard } from \"src/MFAGuard\";\n\nlet isMobile: boolean;\nenquireScreen((b) => {\n isMobile = b;\n});\n\ninterface LayoutPropsDefaultValues {\n disableAppMenu: boolean;\n headerContent: any;\n noHeader: boolean;\n showBrandInHeader: boolean;\n showSearchInHeader: boolean;\n product: string;\n importer?: (props?: any) => Promise<any>;\n children?: React.ReactNode;\n}\n\nexport type LayoutProps = Partial<LayoutPropsDefaultValues>;\n\nconst DEFAULT_PROPS: LayoutPropsDefaultValues = {\n disableAppMenu: false,\n headerContent: null,\n noHeader: false,\n showBrandInHeader: false,\n showSearchInHeader: true,\n product: \"alpaca\",\n importer: undefined,\n children: undefined,\n};\n\nexport const Layout = (partialProps?: LayoutProps) => {\n const props: LayoutPropsDefaultValues = { ...DEFAULT_PROPS, ...partialProps };\n const {\n disableAppMenu,\n noHeader,\n importer,\n product: initialProduct,\n children,\n } = {\n ...props,\n };\n\n const [product, setProduct] = useState(initialProduct);\n const [LoadableChild, setLoadableChild] =\n useState<LoadableClassComponent<any> | null>(null);\n\n const loadComponent = useCallback(() => {\n if (!importer) {\n return;\n }\n\n const LoadableComponent = loadable(() => importer({ product }), {\n fallback: (\n <div className=\"w-full h-screen flex justify-center items-center\">\n <Spinner />\n </div>\n ),\n });\n\n setLoadableChild(LoadableComponent);\n }, [importer, product]);\n\n useEffect(() => {\n enquireScreen();\n\n loadComponent();\n }, [importer, loadComponent]);\n\n useEffect(() => {\n // only save non-dynamic product state to local storage\n if (initialProduct !== \"dynamic\") {\n window.localStorage.setItem(\"product\", initialProduct);\n } else {\n // set product from local storage to mimic a persistent state\n const savedProduct = window.localStorage.getItem(\"product\") || \"paper\";\n setProduct(savedProduct === \"dynamic\" ? \"paper\" : savedProduct);\n }\n }, [initialProduct]);\n\n return (\n <App>\n <Page\n product={product}\n noHeader={noHeader}\n disableAppMenu={disableAppMenu}\n >\n <MFAGuard>\n {LoadableChild && <LoadableChild {...props} product={product} />}\n {children && children}\n </MFAGuard>\n </Page>\n </App>\n );\n};\n\nexport default Layout;\n","import instance from \"../../../v2/api\";\n\nimport {\n CognitoUser,\n CognitoUserAttribute,\n ISignUpResult,\n} from \"amazon-cognito-identity-js\";\n\nimport { Auth } from \"aws-amplify\";\nimport { clearCookies } from \"src/v2/utils/cookies\";\nimport { parseUtmParams } from \"../../../utils\";\nimport { Path } from \"../../path\";\nimport { getCookie } from \"src/lib/cookies\";\n\nexport type CognitoUserExtended = CognitoUser & {\n username?: string;\n challengeName?: string;\n challengeParam?: {\n CODE_DELIVERY_DESTINATION: string;\n userAttributes: {\n email: string;\n [attrName: string]: string;\n };\n codeParameter: string;\n };\n};\n\nconst getSignUpSourceClientId = (): string | null => {\n const requestedPath = window?.sessionStorage?.getItem(\"requested_path\");\n\n if (!requestedPath) {\n return null;\n }\n\n const searchParams = new URLSearchParams(\n requestedPath.substring(requestedPath.indexOf(\"?\"))\n );\n return searchParams.get(\"client_id\");\n};\n\nexport const getAttributes = async (\n user: CognitoUser\n): Promise<CognitoUserAttribute[]> =>\n new Promise((resolve, reject) => {\n user.getUserAttributes((err, data) => {\n if (err || !data) return reject(err);\n resolve(data);\n });\n });\n\nexport const getCustomAttribute = (\n attributes: CognitoUserAttribute[],\n attr: string,\n defaultValue?: string\n): string => {\n for (const a of attributes) {\n if (a.Name === `custom:${attr}`) return a.Value;\n if (a.Name === attr) return a.Value;\n }\n\n if (defaultValue == undefined) {\n throw new Error(`cannot find custom attribute custom:${attr}`);\n }\n\n return defaultValue;\n};\n\nexport const UserActions = {\n async getCurrentUser(): Promise<CognitoUser> {\n return await Auth.currentAuthenticatedUser();\n },\n async confirmMultiFactorAuth(\n user: CognitoUser,\n code: string,\n mfaType: string\n ): Promise<CognitoUser> {\n return await Auth.confirmSignIn(user, code, mfaType as any);\n },\n async checkLoggedInStatus(): Promise<boolean> {\n try {\n const user = await this.getCurrentUser();\n return Boolean(user);\n } catch (e) {\n console.error(e);\n return false;\n }\n },\n verifyRecoveryCode: async (\n cognitoId: string,\n verifyId: string,\n userPool: string\n ): Promise<void> => {\n const path = `/accounts/${cognitoId}/account-recovery/${verifyId}?userpool=${userPool}`;\n const response = await fetch(`${window.env.API_URL}${path}`);\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.message || \"Invalid recovery code provided\");\n }\n },\n async registerUser(\n firstName: string,\n lastName: string,\n country: string,\n email: string,\n password: string,\n countryOfCitizenship: string,\n validationResponse: string,\n signupIPAddress: string\n ): Promise<ISignUpResult> {\n const params = new URLSearchParams(window.location.search);\n const utmParams = parseUtmParams(params);\n const clientId = getSignUpSourceClientId();\n\n return await Auth.signUp({\n username: email,\n password,\n attributes: {\n \"custom:firstName\": firstName,\n \"custom:lastName\": lastName,\n \"custom:country\": country,\n \"custom:citizenship\": countryOfCitizenship,\n \"custom:onboardingVersion\": \"v2\",\n \"custom:accountCreated\": \"no\",\n \"custom:crypto_broker\": params.has(\"xcrypto\") ? \"BS\" : undefined,\n \"custom:validationResponse\": validationResponse,\n \"custom:signupIPAddress\": signupIPAddress,\n ...(Object.keys(utmParams).length && {\n \"custom:utm_params\": JSON.stringify(utmParams),\n }),\n ...(clientId && {\n \"custom:signup_source\": clientId,\n }),\n },\n });\n },\n userLogin(email: string, password: string): Promise<CognitoUserExtended> {\n return Auth.signIn(email, password);\n },\n async userLogout(): Promise<void> {\n // Sign out from cognito\n await Auth.signOut();\n\n // Clear all local and session storage\n window.localStorage.clear();\n window.sessionStorage.clear();\n\n // Clear cookies\n clearCookies({\n // Don't annoy the user with GDPR consent\n ignore: [\"gdpr_accepted\", \" VIEW_OPTION_PAPER_ANNOUNCEMENT\"],\n // Don't clear Cognito cookies so that \"MFA remember device\" will work \n ignoreStartsWith: [\"CognitoIdentityServiceProvider\"],\n });\n\n // Redirect to login page\n window.location.href = Path.ROUTE_LOGIN;\n },\n async confirmUserSignUp(email: string, code: string): Promise<void> {\n await Auth.confirmSignUp(email, code, {\n forceAliasCreation: true,\n });\n },\n async resendUserSignUp(username: string) {\n await Auth.resendSignUp(username);\n },\n async createUserAccountIfNotExist(user: CognitoUser) {\n const attributes = await getAttributes(user);\n const getAttr = (key: string, defaultValue?: string) =>\n getCustomAttribute(attributes, key, defaultValue);\n\n if (\n (await getAttr(\"onboardingVersion\", \"v1\")) === \"v2\" &&\n (await getAttr(\"accountCreated\")) !== \"yes\"\n ) {\n await instance.post(\"/accounts\", {\n email: getAttr(\"email\"),\n first_name: getAttr(\"firstName\"),\n last_name: getAttr(\"lastName\"),\n country: getAttr(\"country\"),\n country_of_citizenship: getAttr(\"citizenship\"),\n source: getAttr(\"signup_source\", \"\"),\n crypto_broker: getAttr(\"crypto_broker\", \"\"),\n utm_params: getAttr(\"utm_params\", \"\"),\n clearing_broker: \"ALPACA_APCA\",\n version: \"v2\",\n });\n\n // update attribute if account created\n await Auth.updateUserAttributes(user, {\n \"custom:accountCreated\": \"yes\",\n });\n }\n },\n async rememberDevice() {\n try {\n await Auth.rememberDevice();\n } catch (error) {\n console.error(\"Error remembering device\", error);\n }\n },\n async forgetDevice() {\n try {\n await Auth.forgetDevice();\n } catch (error) {\n console.error(\"Error forgetting device\", error);\n }\n },\n async getSavedDevices() {\n try {\n return await Auth.fetchDevices();\n } catch (error) {\n console.error(\"Error getting saved devices\", error);\n return [];\n }\n },\n async isDeviceRemembered() {\n try {\n const devices = await Auth.fetchDevices();\n const currentUser = await Auth.currentAuthenticatedUser() as CognitoUser;\n // @ts-ignore: keyPrefix exists but is not typed...\n const keyPrefix = currentUser.keyPrefix;\n const username = currentUser.getUsername();\n const key = `${keyPrefix}.${username}.deviceKey`;\n const value = getCookie(key);\n\n const isDeviceRemembered = devices.some((device) => device.id === value);\n\n return isDeviceRemembered;\n } catch (error) {\n console.error(\"Error checking if device is remembered\", error);\n return false;\n }\n },\n async forgetAllDevices() {\n try {\n const currentUser = await Auth.currentAuthenticatedUser() as CognitoUser;\n const devices = await Auth.fetchDevices();\n\n await Promise.all(devices.map((device) =>\n new Promise((resolve, reject) => {\n currentUser.forgetSpecificDevice(device.id, {\n onSuccess: () => resolve(null),\n onFailure: (error) => reject(error),\n })\n }\n )));\n } catch (error) {\n console.error(\"Error forgetting specific device\", error);\n }\n },\n};\n\n// @deprecated use UserActions instead\nexport const getCurrentUser = UserActions.getCurrentUser;\n// @deprecated use UserActions instead\nexport const confirmMFA = UserActions.confirmMultiFactorAuth;\n\n// @deprecated use UserActions instead\nexport const isLoggedIn = UserActions.checkLoggedInStatus;\n\n// @deprecated use UserActions instead\nexport const register = UserActions.registerUser;\n\n// @deprecated use UserActions instead\nexport const login = UserActions.userLogin;\n\n// @deprecated use UserActions instead\nexport const signOut = UserActions.userLogout;\n\n// @deprecated use UserActions instead\nexport const confirmSignUp = UserActions.confirmUserSignUp;\n\n// @deprecated use UserActions instead\nexport const resendSignUp = UserActions.resendUserSignUp;\n\n// @deprecated use UserActions instead\nexport const createAccountIfNotExist = UserActions.createUserAccountIfNotExist;\n\n// @deprecated use UserActions instead\nexport const getCustomAttr = getCustomAttribute;\n\nconst rememberDevice = UserActions.rememberDevice;\n\nconst forgetDevice = UserActions.forgetDevice;\n\nconst getSavedDevices = UserActions.getSavedDevices;\n\nconst isDeviceRemembered = UserActions.isDeviceRemembered;\n\nconst forgetAllDevices = UserActions.forgetAllDevices;\n\n// @deprecated use UserActions instead\nexport const AuthService = {\n getCurrentUser,\n confirmMFA,\n isLoggedIn,\n register,\n login,\n signOut,\n confirmSignUp,\n resendSignUp,\n createAccountIfNotExist,\n getAttributes,\n getCustomAttr,\n rememberDevice,\n forgetDevice,\n getSavedDevices,\n isDeviceRemembered,\n forgetAllDevices\n};\n","type ClearCookiesOptions = {\n ignore?: string[];\n ignoreStartsWith?: string[];\n};\n\nexport const clearCookies = ({ ignore = [], ignoreStartsWith = [] }: ClearCookiesOptions = {}) =>\n document.cookie\n .split(\";\")\n .filter((cookie) => !ignore.includes(cookie.split(\"=\")[0]))\n .filter((cookie) => ignoreStartsWith.some((prefix) => cookie.split(\"=\")[0].startsWith(prefix)))\n .forEach((cookie) => {\n document.cookie = cookie\n .replace(/^ +/, \"\")\n .replace(/=.*/, `=;expires=${new Date().toUTCString()};path=/`);\n });\n","import instance from \"..\";\nimport { EliteStatus } from \"./account\";\n\nexport const getEliteNetDeposits = async (\n accountID: string\n): Promise<string> => {\n const res = await instance.get<string>(\n `/accounts/${accountID}/elite/net_deposit`\n );\n\n return res.data;\n};\n\nexport type AlgoRouting = {\n model: AlgoRoutingModel;\n};\n\nexport const getEliteAlgoRouting = async (\n accountID: string\n): Promise<AlgoRouting> => {\n const res = await instance.get<AlgoRouting>(\n `/accounts/${accountID}/elite/algo_routing`\n );\n return res.data;\n};\n\nexport type AlgoRoutingModel = \"retail\" | \"cost_plus\" | \"all_in\";\n\nexport const applyEliteAlgoRouting = async (\n accountID: string,\n model: AlgoRoutingModel\n): Promise<void> =>\n await instance.post(`/accounts/${accountID}/elite/algo_routing/apply`, {\n model,\n });\n\nexport type ElitePerks = {\n elite_status: EliteStatus;\n router: AlgoRouting;\n market_data: boolean;\n};\n\nexport const getElitePerks = async (accountID: string): Promise<ElitePerks> => {\n const res = await instance.get(`/accounts/${accountID}/elite/perks`);\n return res.data;\n};\n\nexport const applyEliteMarketData = async (accountID: string): Promise<any> => {\n const res = await instance.post(\n `/accounts/${accountID}/elite/market_data/apply`\n );\n return res.data;\n};\n","import instance from \"..\";\n\nexport type GetCurrencyCloudAccountResponse = {\n account_number: string;\n account_holder_name: string;\n bank_name: string;\n bank_address: string;\n routing_code: string;\n routing_code_type: string;\n};\n\nexport const getCurrencyCloudAccount = async (\n accountId: string\n): Promise<GetCurrencyCloudAccountResponse> => {\n const res = await instance.get<GetCurrencyCloudAccountResponse>(\n `/currency_cloud/${accountId}/funding_account`\n );\n return res.data;\n};\n\nexport const createCurrencyCloudAccount = async (accountId: string) => {\n await instance.post(`/currency_cloud/${accountId}/funding_account`);\n};\n\nexport type GetCurrencyCloudStatusResponse = {\n sub_account_exists: string;\n beneficiary_exists: string;\n};\n\nexport const getCurrencyCloudStatus = async (\n accountId: string\n): Promise<GetCurrencyCloudStatusResponse> => {\n const res = await instance.get<GetCurrencyCloudStatusResponse>(\n `/currency_cloud/${accountId}/status`\n );\n return res.data;\n};\n\nexport type CurrencyCloudTransfer = {\n id: string;\n account_id: string;\n amount: string;\n direction: string;\n status: string;\n created_at: string;\n updated_at: string;\n};\n\nexport type GetCurrencyCloudTransfersResponse = CurrencyCloudTransfer[];\n\nexport const getCurrencyCloudTransfers = async (\n accountId: string\n): Promise<GetCurrencyCloudTransfersResponse> => {\n const res = await instance.get<GetCurrencyCloudTransfersResponse>(\n `/currency_cloud/${accountId}/transfers`\n );\n return res.data;\n};\n\nexport type CreateCurrencyCloudTransferRequest = {\n amount: string;\n};\n\nexport const createCurrencyCloudTransfer = async (\n accountId: string,\n data: CreateCurrencyCloudTransferRequest\n) => {\n const res = await instance.post(\n `/currency_cloud/${accountId}/transfers`,\n data\n );\n return res.data;\n};\n\nexport type CurrencyCloudBeneficiary = {\n account_number: string;\n iban: string;\n bic_swift: string;\n sort_code: string;\n aba: string;\n bsb_code: string;\n bank_code: string;\n branch_code: string;\n clabe: string;\n cnaps: string;\n ifsc: string;\n};\n\nexport type GetCurrencyCloudBeneficiaryResponse = {\n required_details: CurrencyCloudBeneficiary[];\n};\n\nexport const getCurrencyCloudBeneficiaryRequiredDetails = async (\n accountId: string\n) => {\n const res = await instance.get<GetCurrencyCloudBeneficiaryResponse>(\n `/currency_cloud/${accountId}/beneficiary_required_details`\n );\n return res.data;\n};\n\nexport type CreateCurrencyCloudBeneficiaryRequest = CurrencyCloudBeneficiary;\n\nexport const createCurrencyCloudBeneficiary = async (\n accountId: string,\n data: CreateCurrencyCloudBeneficiaryRequest\n) => {\n const res = await instance.post(\n `/currency_cloud/${accountId}/beneficiary`,\n data\n );\n return res.data;\n};\n","import React, { useState, useEffect } from \"react\";\nimport styled from \"styled-components\";\nimport { Button, Checkbox, Row, Input, notification, Table } from \"antd\";\nimport AntPhoneInput from \"src/components/Utilities/AntPhoneInput\";\nimport Markdown from \"components/Utilities/Markdown\";\nimport QRCode from \"@alpacahq/qrcode.react\";\nimport { recovery } from \"src/api\";\nimport { Card, CardBody } from \"src/components/common\";\nimport { Icon } from \"@alpacahq/ui\";\nimport copy from \"copy-to-clipboard\";\nimport { useToast } from \"@chakra-ui/react\";\n\nexport const BigCard = styled.div`\n background-color: #ffffff;\n\n &::after {\n content: \"\";\n clear: both;\n display: table;\n }\n`;\n\nexport const SmallCard = styled.div`\n box-sizing: border-box;\n padding: 16px;\n border-radius: 4px;\n border: 1px rgba(0, 0, 0, 0.15) solid;\n margin-bottom: 1em;\n`;\n\nexport const SecurityLink = styled.div`\n float: right;\n cursor: pointer;\n text-decoration: underline;\n height: 16px;\n font-family: Gilroy-Light;\n font-size: 14px;\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: #303030;\n`;\n\nexport const Caption = styled.div`\n font-family: Carnas;\n font-size: 14px;\n font-weight: 500;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: #000000;\n`;\nexport const Text = styled.div`\n font-family: Gilroy-Light;\n height: 16px;\n font-size: 14px;\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: #303030;\n`;\n\nexport const EditBtn = styled.button`\n float: right;\n background-color: rgba(48, 48, 48, 0.5);\n border-color: rgba(48, 48, 48, 0.5);\n border: none;\n color: white;\n width: 60px;\n height: 29px;\n border-radius: 4px;\n`;\n\nexport const ConfigContainer = styled.span`\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nexport const FormContainer = styled.div`\n input::placeholder {\n color: #303030 !important;\n font-family: Gilroy-Light;\n }\n`;\n\nexport const StatusIndicator = styled.div`\n float: right;\n display: flex;\n justify-content: space-between;\n`;\n\nexport const RadioWrapper = styled.div`\n font-family: Gilroy-Light;\n height: 16px;\n font-size: 14px;\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n -webkit-letter-spacing: normal;\n -moz-letter-spacing: normal;\n -ms-letter-spacing: normal;\n letter-spacing: normal;\n color: #303030;\n width: 100%;\n .ant-radio-group {\n display: flex;\n }\n\n .ant-radio-inner {\n border-color: #f0f0f0 !important;\n }\n\n .ant-radio-inner::after {\n transition-duration: 0.1s !important;\n }\n\n .ant-radio-checked .ant-radio-inner {\n border-color: #979797 !important;\n }\n\n .ant-radio:hover .ant-radio-inner {\n box-shadow: 0 0 0 3px rgba(144, 144, 144, 0.08) !important;\n }\n\n .ant-radio:focus-within .ant-radio-inner {\n border-color: #979797 !important;\n box-shadow: 0 0 0 3px rgba(144, 144, 144, 0.08) !important;\n }\n\n .ant-radio-inner:after {\n background-color: #ffd700;\n border-color: #f0f0f0;\n }\n`;\n\nexport const SwitchContainer = styled.label`\n position: relative;\n display: inline-block;\n width: 46px;\n height: 24px;\n\n input {\n opacity: 0;\n width: 0;\n height: 0;\n }\n\n span {\n position: absolute;\n cursor: pointer;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: white;\n -webkit-transition: 0.2s;\n transition: 0.2s;\n border-radius: 16px;\n border: solid 1px rgba(0, 0, 0, 0.15);\n }\n\n span:before {\n background-color: #979797;\n position: absolute;\n content: \"\";\n height: 14px;\n width: 14px;\n left: 4px;\n bottom: 3px;\n -webkit-transition: 0.2s;\n transition: 0.2s;\n border-radius: 50%;\n }\n\n input:checked + span:before {\n background-color: #ffd700;\n }\n\n input:checked + span:before {\n -webkit-transform: translateX(20px);\n -ms-transform: translateX(20px);\n transform: translateX(20px);\n }\n`;\n\nexport const EditIcon = (props) => {\n return (\n <i\n style={{ marginLeft: \"12px\", fontSize: \"13px\", cursor: \"pointer\" }}\n onClick={props.onClick}\n className=\"fas fa-pencil-alt\"\n />\n );\n};\n\nexport const LoadIcon = () => {\n return (\n <img\n style={{ height: \"35px\" }}\n src=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTBweCIgIGhlaWdodD0iNTBweCIgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIiBjbGFzcz0ibGRzLXJvbGxpbmciIHN0eWxlPSJiYWNrZ3JvdW5kOiBub25lOyI+PGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgbmctYXR0ci1zdHJva2U9Int7Y29uZmlnLmNvbG9yfX0iIG5nLWF0dHItc3Ryb2tlLXdpZHRoPSJ7e2NvbmZpZy53aWR0aH19IiBuZy1hdHRyLXI9Int7Y29uZmlnLnJhZGl1c319IiBuZy1hdHRyLXN0cm9rZS1kYXNoYXJyYXk9Int7Y29uZmlnLmRhc2hhcnJheX19IiBzdHJva2U9IiNmY2Q1MDMiIHN0cm9rZS13aWR0aD0iMTAiIHI9IjM1IiBzdHJva2UtZGFzaGFycmF5PSIxNjQuOTMzNjE0MzEzNDY0MTUgNTYuOTc3ODcxNDM3ODIxMzgiIHRyYW5zZm9ybT0icm90YXRlKDI4Ny45NiA1MCA1MCkiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0icm90YXRlIiBjYWxjTW9kZT0ibGluZWFyIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIiBkdXI9IjJzIiBiZWdpbj0iMHMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIj48L2FuaW1hdGVUcmFuc2Zvcm0+PC9jaXJjbGU+PC9zdmc+\"\n alt=\"\"\n />\n );\n};\n\nexport const Loading = styled.div`\n height: 200px;\n background-position: center center;\n background-repeat: no-repeat;\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTBweCIgIGhlaWdodD0iNTBweCIgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIiBjbGFzcz0ibGRzLXJvbGxpbmciIHN0eWxlPSJiYWNrZ3JvdW5kOiBub25lOyI+PGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgbmctYXR0ci1zdHJva2U9Int7Y29uZmlnLmNvbG9yfX0iIG5nLWF0dHItc3Ryb2tlLXdpZHRoPSJ7e2NvbmZpZy53aWR0aH19IiBuZy1hdHRyLXI9Int7Y29uZmlnLnJhZGl1c319IiBuZy1hdHRyLXN0cm9rZS1kYXNoYXJyYXk9Int7Y29uZmlnLmRhc2hhcnJheX19IiBzdHJva2U9IiNmY2Q1MDMiIHN0cm9rZS13aWR0aD0iMTAiIHI9IjM1IiBzdHJva2UtZGFzaGFycmF5PSIxNjQuOTMzNjE0MzEzNDY0MTUgNTYuOTc3ODcxNDM3ODIxMzgiIHRyYW5zZm9ybT0icm90YXRlKDI4Ny45NiA1MCA1MCkiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0icm90YXRlIiBjYWxjTW9kZT0ibGluZWFyIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIiBkdXI9IjJzIiBiZWdpbj0iMHMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIj48L2FuaW1hdGVUcmFuc2Zvcm0+PC9jaXJjbGU+PC9zdmc+\");\n`;\n\nexport const DropdownWrapper = styled.div`\n margin-right: 5px;\n .ant-select-selection {\n width: 182px;\n border-radius: 4px;\n border: solid 2px #f0f0f0 !important;\n font-family: Gilroy-Medium;\n font-size: 14px;\n line-height: 40px;\n color: #303030;\n box-shadow: none !important;\n }\n svg {\n fill: #ffd700;\n }\n`;\n\nexport const Agreement = styled(Markdown)`\n font-size: 16px;\n letter-spacing: 0.4px;\n color: #152430;\n height: 280px;\n overflow-y: scroll;\n padding: 10px;\n margin-bottom: 20px;\n ${(props) =>\n props.onboarding ? \"background: #f4f4f4; margin-top: 5rem;\" : \"\"}\n`;\n\nexport const CryptoCard = styled(SmallCard)`\n padding: 4px;\n ${(props) => (props.highlightCrypto ? \"border-color: #F2C53D;\" : \"\")}\n`;\n\nexport const CardTitle = styled.div`\n font-family: \"Gilroy-Medium\", sans-serif;\n margin: 10px 0px -10px 15px;\n font-size: 15px;\n font-weight: 600;\n color: #000000;\n`;\n\nexport const CollapseText = styled.span`\n font-family: Gilroy-Light;\n font-size: 14px;\n`;\n\nexport const AgreeBtn = styled(Button)`\n float: right;\n margin: 2rem;\n`;\n\nexport const AgreeCheckbox = styled(Checkbox)`\n float: right;\n margin: 2rem;\n margin-top: 3rem;\n`;\n\nexport const FloatText = styled.span`\n float: ${(props) => (props.right ? \"right\" : \"left\")};\n`;\n\nexport const BoldText = styled.span`\n font-family: sans-serif;\n`;\n\nexport const AddressConfirmRow = styled(Row)`\n margin-top: 75px;\n opacity: 80%;\n justify-content: center;\n`;\n\nexport const AgreeBox = styled(Checkbox)`\n margin-top: 10px;\n`;\n\nexport const FeeTable = styled(Table)`\n th,\n td {\n text-align: center !important;\n }\n`;\n\nconst MFACard = styled.div`\n padding: 12px;\n width: 100%;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n border: 1px solid #979797;\n border-radius: 4px;\n align-items: center;\n`;\n\nconst MFASubCard = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst MFAText = styled.span`\n font-size: 14px;\n color: #000;\n`;\n\nconst ErrorText = styled(MFAText)`\n color: red;\n margin-top: 0.5rem;\n`;\n\nconst MFATitleCard = styled(MFASubCard)`\n flex-direction: column;\n margin-left: 1rem;\n align-items: baseline;\n`;\n\nconst SecurityLevelText = styled.span`\n color: ${(props) => props.color};\n font-size: 13px;\n`;\n\nconst ModalScreenCard = styled(MFASubCard)`\n flex-direction: column;\n text-align: center;\n max-width: 450px;\n padding: 15px;\n`;\n\nconst MFACodeInput = styled(Input)`\n max-width: 110px;\n border-color: black;\n width: 84px;\n margin-top: 2rem;\n`;\n\nconst MFAModalTitle = styled.span`\n font-size: 24px;\n font-weight: 400;\n color: black;\n margin-bottom: 1rem;\n`;\n\nconst MFAModalSubtitle = styled.span`\n font-size: 18px;\n font-weight: 400;\n color: black;\n`;\n\nconst ModalButtonRow = styled.span`\n width: 60%;\n margin-top: 3rem;\n`;\n\nconst ModalButton = styled(Button)`\n width: 50%;\n`;\n\nconst ModalButtonPrev = styled(ModalButton)`\n border: none;\n`;\n\nconst CompletionCheck = styled.img`\n filter: ${(props) => (props.disabled ? \"grayscale(100%)\" : \"none\")};\n max-width: 128px;\n margin-top: 2rem;\n margin-bottom: 2rem;\n`;\n\nconst RecoveryCode = styled.div`\n background: #f7f7f7;\n border-radius: 4px;\n font-weight: 700;\n padding: 12px 24px;\n margin-top: 1.5rem;\n`;\n\nconst RecoveryContainer = styled.div`\n display: flex;\n flex-direction: column;\n margin-top: 1.5rem;\n`;\n\nconst getIconName = (type) => {\n switch (type) {\n case \"sms\":\n return \"ChatBubbleBottomCenterText\";\n case \"totp\":\n return \"DevicePhoneMobile\";\n default:\n return \"DevicePhoneMobile\";\n }\n};\n\nexport const ProfileMFA = ({\n type,\n title,\n securityLevel,\n onClick,\n disabled,\n current,\n}) => {\n return (\n <Card style={{ boxShadow: \"none\", border: \"0px\" }}>\n <CardBody\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"0px\",\n }}\n >\n <MFASubCard>\n <Icon name={getIconName(type)} className=\"max-h-8\" />\n <MFATitleCard>\n <MFAText>{title}</MFAText>\n <SecurityLevelText\n color={type === \"sms\" ? \"rgb(240, 192, 2)\" : \"rgb(6, 157, 72)\"}\n >\n {securityLevel}\n </SecurityLevelText>\n </MFATitleCard>\n </MFASubCard>\n <Button disabled={current !== \"NOMFA\" && disabled} onClick={onClick}>\n {disabled ? \"Activate\" : \"Disable\"}\n </Button>{\" \"}\n </CardBody>\n </Card>\n );\n};\n\nconst getTOTPPlainTextCode = (totpQRCode) => {\n try {\n const secret = totpQRCode.split(\"secret=\")[1].split(\"&issuer=\")[0];\n return secret;\n } catch (e) {\n return \"No code available, please try again.\";\n }\n};\n\n// 2fa modal contents\nexport const TOTPScreen = ({ totpQRCode, onCancel, onNext }) => {\n const toast = useToast();\n const [isText, setIsText] = useState(false);\n\n const textCode = getTOTPPlainTextCode(totpQRCode);\n\n const onToggleText = () => setIsText((isText) => !isText);\n\n const onCopyTextClicked = () => {\n copy(textCode);\n toast({\n title: \"Code copied to clipboard!\",\n status: \"success\",\n });\n };\n\n return (\n <ModalScreenCard>\n <MFAModalTitle>Activate 2FA via authenticator app</MFAModalTitle>\n <MFAText>\n {isText\n ? \"Enter code into authenticator app\"\n : \"Scan this QR code with the authenticator app\"}\n </MFAText>\n <div className=\"my-10 max-w-sm\">\n {isText ? (\n <span\n className=\"text-wrap cursor-pointer\"\n onClick={onCopyTextClicked}\n >\n {textCode}\n </span>\n ) : (\n <QRCode value={totpQRCode || \"\"} />\n )}\n </div>\n <Text>\n {isText ? \"Want to scan QR code?\" : \"Can't scan QR code?\"}{\" \"}\n <button className=\"underline\" onClick={onToggleText}>\n Click here to see {isText ? \"QR code\" : \"text code\"}\n </button>\n .\n </Text>\n <ModalButtonRow style={{ display: \"flex\" }}>\n <ModalButtonPrev\n size=\"large\"\n style={{ marginRight: \"1rem\" }}\n onClick={onCancel}\n >\n Cancel\n </ModalButtonPrev>\n <ModalButton onClick={onNext} type=\"primary\" size=\"large\">\n Next\n </ModalButton>\n </ModalButtonRow>\n </ModalScreenCard>\n );\n};\n\nexport const SMSScreen = ({ onNext, onCancel, onSubmit }) => {\n const [phoneNumer, setPhoneNumber] = useState(\"\");\n return (\n <ModalScreenCard>\n <MFAModalTitle>Enable 2FA via SMS Code</MFAModalTitle>\n <MFAText>\n To enable SMS 2FA, you need to have a phone number capable of receiving\n text messages.\n </MFAText>\n <AntPhoneInput\n placeholder=\"+1 XXX-XXX-XXXX\"\n onChange={setPhoneNumber}\n style={{ marginTop: \"2.5rem\" }}\n />\n <ModalButtonRow style={{ display: \"flex\" }}>\n <ModalButtonPrev\n size=\"large\"\n onClick={onCancel}\n style={{ marginRight: \"1rem\" }}\n >\n Cancel\n </ModalButtonPrev>\n <ModalButton\n onClick={() => {\n onNext();\n onSubmit(phoneNumer);\n }}\n type=\"primary\"\n size=\"large\"\n >\n Next\n </ModalButton>\n </ModalButtonRow>\n </ModalScreenCard>\n );\n};\n\nexport const MFAChallenge = ({\n activating,\n type,\n onVerify,\n onBack,\n title,\n error,\n}) => {\n const subheaderMap = {\n SOFTWARE_TOKEN_MFA: \"your authenticator app generated\",\n SMS_MFA: \"you received via SMS\",\n };\n\n let buttonCopy = activating ? \"Activate\" : \"Disable\";\n if (activating === null) {\n buttonCopy = \"Submit\";\n }\n\n const [code, setCode] = useState(\"\");\n return (\n <ModalScreenCard>\n <MFAModalTitle>{title}</MFAModalTitle>\n <MFAText>{`Enter the code ${subheaderMap[type]}`}</MFAText>\n <MFACodeInput\n placeholder=\"XXXXXX\"\n onChange={(e) => {\n setCode(e.target.value);\n }}\n />\n <ErrorText>{error}</ErrorText>\n <ModalButtonRow>\n <ModalButtonPrev\n size=\"large\"\n onClick={onBack}\n disabled={onBack === null}\n >\n Back\n </ModalButtonPrev>\n <ModalButton\n onClick={() => {\n onVerify(code, activating);\n }}\n size=\"large\"\n type=\"primary\"\n disabled={code.length !== 6}\n >\n {buttonCopy}\n </ModalButton>\n </ModalButtonRow>\n </ModalScreenCard>\n );\n};\n\nconst CompletedView = ({ activating, title, onLoad, cognitoId }) => {\n const [recoveryCode, setRecoveryCode] = useState(\"\");\n\n useEffect(() => {\n onLoad();\n async function handleRecovery(creating) {\n if (creating) {\n await createRecoveryCode(cognitoId, setRecoveryCode);\n } else {\n await deleteRecoveryCode(cognitoId);\n }\n }\n handleRecovery(activating);\n }, []);\n return (\n <ModalScreenCard>\n <MFAModalTitle>{title}</MFAModalTitle>\n <CompletionCheck\n src=\"/resources/images/completion-check.png\"\n disabled={!activating}\n />\n <MFAModalSubtitle>{`Successful ${\n activating ? \"activation\" : \"deactivation\"\n }`}</MFAModalSubtitle>\n <MFAText>\n {activating\n ? \"You have taken an important step to keep your account secure.\"\n : \"You can turn on two-factor authentication anytime.\"}\n </MFAText>\n {activating && (\n <RecoveryContainer>\n <MFAText>\n {\n \"Save this emergency code and store it somewhere safe. If you lose your mobile device, you can use this code to bypass 2FA and sign in.\"\n }\n </MFAText>\n <RecoveryCode>\n <MFAText>{recoveryCode}</MFAText>\n </RecoveryCode>\n </RecoveryContainer>\n )}\n </ModalScreenCard>\n );\n};\n\nexport const MFAModalContents = ({\n activating,\n totpQRCode = \"\",\n type,\n onVerify,\n onCancel,\n current,\n onSubmit,\n error = \"\",\n cognitoId = \"\",\n}) => {\n const [step, setStep] = useState(activating ? 0 : 1);\n const headerMap = {\n SOFTWARE_TOKEN_MFA: \"authenticator app\",\n SMS_MFA: \"SMS code\",\n };\n const title = activating\n ? `Activate 2FA via ${headerMap[type]}`\n : \"Disable 2FA\";\n\n // triggers the confirmation page if the state has properly changed\n const completed =\n (!activating && current === \"NOMFA\") || (activating && current !== \"NOMFA\");\n if (completed) {\n return (\n <CompletedView\n activating={activating}\n title={title}\n onLoad={() => setStep(activating ? 1 : 0)}\n cognitoId={cognitoId}\n />\n );\n }\n\n switch (step) {\n case 0:\n if (type === \"SMS_MFA\") {\n return (\n <SMSScreen\n onNext={() => setStep(1)}\n onCancel={onCancel}\n onSubmit={onSubmit}\n />\n );\n }\n return (\n <TOTPScreen\n totpQRCode={totpQRCode}\n onCancel={onCancel}\n onNext={() => setStep(1)}\n />\n );\n case 1:\n return (\n <MFAChallenge\n activating={activating}\n type={type}\n onVerify={onVerify}\n onBack={() => setStep(0)}\n title={title}\n error={error.message}\n />\n );\n }\n};\n\nconst createRecoveryCode = async (cognitoId, setCode) => {\n const endpoint = recovery.create({\n cognitoId,\n });\n endpoint()\n .then((res) => {\n setCode(res.code);\n })\n .catch(() =>\n notification.open({\n type: \"error\",\n message: \"An error occurred while creating recovery codes.\",\n })\n );\n};\n\nconst deleteRecoveryCode = async (cognitoId) => {\n const endpoint = recovery.delete({\n cognitoId,\n });\n endpoint().catch((e) => {\n console.error(e);\n });\n};\n\nexport const formatCryptoVolume = (v) => {\n if (v > 0) {\n let comma = Number(v).toLocaleString(\"en-US\");\n return `>${comma}`;\n }\n return v;\n};\n\nexport const formatCryptoFee = (fee) => {\n return `${Number(fee).toFixed(\n Math.max(((fee + \"\").split(\".\")[1] || \"\").length, 2)\n )}%`;\n};\n\nexport const feeCryptoLevel = (volume) => {\n const numVolume = Number(volume);\n switch (true) {\n case numVolume > 100000000:\n return \"8\";\n case numVolume > 50000000:\n return \"7\";\n case numVolume > 25000000:\n return \"6\";\n case numVolume > 10000000:\n return \"5\";\n case numVolume > 5000000:\n return \"4\";\n case numVolume > 1000000:\n return \"3\";\n case numVolume > 500000:\n return \"2\";\n case numVolume >= 0:\n return \"1\";\n }\n};\n","export const initializeIntercom = (account, userHash) => {\n window.Intercom(\"boot\", {\n app_id: \"p7a9jdob\",\n user_id: account.details.owner_id,\n status: account.details.status,\n firstName: account.details.given_name,\n lastName: account.details.family_name,\n portfolioValue: account.account.equity,\n tradingBlocked: account.account.trading_blocked,\n country: account.details.country_of_tax_residence,\n state: account.details.state,\n clearing_broker: account.account.clearing_broker,\n created_at: account.account.created_at,\n id: account.details.owner_id,\n name: account.account.name,\n user_hash: userHash,\n });\n};\n\nexport const updateIntercom = (ownerId, data) => {\n window.Intercom(\"update\", {\n user_id: ownerId,\n ...data,\n });\n};\n","import instance from \"..\";\n\nexport interface Billing {\n lifetimeSubCount: number;\n plan: string;\n}\n\nexport const getBillingOverview = async (): Promise<Billing> => {\n const res = await instance.get(\"/billing/overview\");\n\n return res.data;\n};\n\nexport interface CryptoFeeStructure {\n fee_structure: {\n [key: string]: {\n volume: string;\n maker: string;\n taker: string;\n };\n };\n}\n\nexport const getCryptoFeeStructure = async (): Promise<CryptoFeeStructure> => {\n const res = await instance.get(\"/crypto/fee-structure\");\n return res.data;\n};\n\nexport interface CryptoMonthlyVolume {\n volume: string;\n}\n\nexport const getCryptoMonthlyVolume = async (\n accountID: string\n): Promise<CryptoMonthlyVolume> => {\n const res = await instance.get(\n `/accounts/${accountID}/crypto/monthly-volume`\n );\n return res.data;\n};\n","import moment from \"moment\";\nimport instance from \"..\";\n\nimport { renameFile } from \"../../utils\";\nimport { AuthService, getAttributes, getCustomAttr } from \"../auth\";\nimport { uniqBy } from \"lodash\";\n\nexport interface TradeAccount {\n id: string;\n account_number: string;\n status: string;\n crypto_status: string;\n currency: string;\n buying_power: string;\n regt_buying_power: string;\n daytrading_buying_power: string;\n effective_buying_power: string;\n non_marginable_buying_power: string;\n bod_dtbp: string;\n cash: string;\n cash_withdrawable: string;\n cash_transferable: string;\n accrued_fees: string;\n pending_transfer_out: string;\n pending_transfer_in: string;\n portfolio_value: string;\n pattern_day_trader: boolean;\n trading_blocked: boolean;\n transfers_blocked: boolean;\n account_blocked: boolean;\n created_at: Date;\n trade_suspended_by_user: boolean;\n multiplier: string;\n shorting_enabled: boolean;\n equity: string;\n last_equity: string;\n long_market_value: string;\n short_market_value: string;\n position_market_value: string;\n initial_margin: string;\n maintenance_margin: string;\n last_maintenance_margin: string;\n sma: string;\n daytrade_count: number;\n balance_asof: string;\n clearing_broker: string;\n}\n\nexport interface UserConfigurations {\n max_margin_multiplier: string;\n dtbp_check: string;\n no_shorting: boolean;\n suspend_trade: boolean;\n fractional_trading: boolean;\n pdt_check: string;\n trade_confirm_email: string;\n trade_suspended_by_user: boolean;\n ptp_no_exception_entry: boolean;\n max_options_trading_level?: number;\n}\n\nexport type EliteStatus = null | \"30k\" | \"100k\";\n\nexport interface AccountCashInterest {\n currency?: string;\n status?: string;\n apr_tier_name?: string | null | undefined;\n}\n\nexport interface Account {\n account_number: string;\n account_name?: string;\n admin_configurations: {\n allow_instant_ach: boolean;\n max_options_trading_level?: number;\n };\n balance_asof: string;\n can_limited_fund: boolean;\n capabilities?: {\n bank_linkable_status?: \"disallowed\" | \"allowed\";\n depositable_status?: \"disallowed\" | \"limited\" | \"allowed\";\n withdrawable_status?: \"disallowed\" | \"limited\" | \"allowed\";\n };\n clearing_broker: string;\n correspondent: string;\n created_at: string;\n crypto_broker: string;\n crypto_status: string;\n crypto_tier: number;\n day_trade_count: number;\n email: string;\n elite_status: EliteStatus;\n equity: string;\n id: string;\n is_legal_entity: boolean;\n kyc_provider: string;\n last_onboarding_step: string;\n maintenance_margin: string;\n marked_pattern_day_trader_at: string;\n marked_risky_transfers_at: string;\n multiplier: string;\n name: string;\n onfido_applicant_id?: string;\n onfido_details?: Record<string, any>;\n options_approved_level: number;\n options_trading_level: number;\n shorting_enabled: string;\n status: string;\n user_configurations: UserConfigurations;\n pattern_day_trader: boolean;\n cash_interest?: AccountCashInterest[];\n currency: string;\n}\n\nexport type Portfolio = {\n [key: string]: {\n // date, profit_loss, profit_loss_pct, portfolio_value\n arrays: [[], [], [], []];\n };\n};\nexport interface Position {\n asset_id: string;\n symbol: string;\n exchange: string;\n asset_class: string;\n asset_marginable: boolean;\n qty: string;\n avg_entry_price: string;\n side: string;\n market_value: string;\n cost_basis: string;\n unrealized_pl: string;\n unrealized_plpc: string;\n unrealized_intraday_pl: string;\n unrealized_intraday_plpc: string;\n current_price: string;\n lastday_price: string;\n change_today: string;\n qty_available: string;\n}\n\nexport interface OwnerDetails {\n permanent_resident: boolean;\n annual_income_max: number;\n annual_income_min: number;\n liquid_net_worth: number;\n total_net_worth: number;\n city: string;\n unit: string;\n country_of_citizenship: string;\n country_of_tax_residence: string;\n created_at: string;\n crypto_agreement_signed_at?: Date | null;\n crypto_agreement_revision?: string;\n customer_agreement_signed_at?: Date;\n opra_agreement_signed_at?: Date;\n date_of_birth: string;\n employer_address: string;\n employer: string;\n employment_status: string;\n country_of_birth: string;\n visa_type: string;\n visa_expiration_date?: Date;\n family_name: string;\n function: string;\n funding_source: string[];\n given_name: string;\n immediate_family_exposed: boolean;\n is_affiliated_exchange_or_finra: null;\n is_control_person: boolean;\n is_discretionary: boolean;\n is_politically_exposed: boolean;\n is_professional: boolean;\n legal_name: string;\n liquid_net_worth_max: number;\n liquid_net_worth_min: number;\n owner_id: string;\n phone_number: string;\n position: string;\n postal_code: string;\n state: string;\n street_address: string[];\n tax_id_type: string;\n total_net_worth_max: number;\n total_net_worth_min: number;\n investment_experience_with_options?: string;\n investment_experience_with_stocks?: string;\n investment_objective?: string;\n investment_time_horizon?: string;\n risk_tolerance?: string;\n liquidity_needs?: string;\n esign_audit?: {\n agreement: string;\n signed_at: string;\n ip_address: string;\n revision: string;\n }[];\n cash_interest: AccountCashInterest[];\n has_spreads_knowledge?: boolean;\n marital_status?: string;\n number_of_dependents?: number;\n}\n\nexport type Owner = {\n owner_id: string;\n is_ubo: boolean;\n is_authorized_individual: boolean;\n is_legal_entity: boolean;\n is_legal_account_opener: boolean;\n email: string | null;\n given_name: string | null;\n middle_name: string | null;\n family_name: string | null;\n date_of_birth: string | null;\n phone_number: string | null;\n country_of_tax_residence: string | null;\n country_of_citizenship: string | null;\n street_address: string | null;\n unit: string | null;\n city: string | null;\n state: string | null;\n postal_code: string | null;\n country: string | null;\n tax_id_type: string | null;\n title_at_company: string | null;\n is_politically_exposed: boolean | null;\n immediate_family_exposed: boolean;\n is_control_person: boolean | null;\n controlling_firms: string | null;\n is_affiliated_exchange_or_finra: boolean | null;\n affiliated_firm: string | null;\n legal_name: string | null;\n country_of_incorporation: string | null;\n state_of_incorporation: string | null;\n date_of_incorporation: string | null;\n entity_type: string | null;\n entity_type_other_description: string | null;\n is_participating_fatca: boolean | null;\n is_exempt_from_tax_under_501a: boolean | null;\n business_registration_number: string | null;\n mailing_street_address: string | null;\n mailing_unit: string | null;\n mailing_city: string | null;\n mailing_state: string | null;\n mailing_postal_code: string | null;\n mailing_country: string | null;\n annual_income_min: number | null;\n annual_income_max: number | null;\n total_net_worth_min: number | null;\n total_net_worth_max: number | null;\n liquid_net_worth_min: number | null;\n liquid_net_worth_max: number | null;\n intended_use_of_account: string | null;\n funding_source: string | null;\n type_of_business: string | null;\n type_of_business_other_free_text: string | null;\n percentage_ownership: number | null;\n};\n\nexport interface TrustedContact {\n account_id: string;\n email_address: string;\n phone_number: string;\n street_address: string;\n city: string;\n state: string;\n postal_code: string;\n country: string;\n given_name: string;\n family_name: string;\n}\n\nexport const DOCUMENT_TYPES = [\n \"date_of_birth_verification\",\n \"social_security_number_verification\",\n \"address_verification\",\n \"address_vertification\", // due to a typo\n \"account_approval_letter\",\n \"identity_verification\",\n \"w_8ben\",\n \"tax_id_verification\",\n \"selfie\",\n] as const;\n\nexport const DOCUMENT_SUB_TYPES = [\n \"407_letter\",\n \"acat_form\",\n \"account_application\",\n \"bank_statement\",\n \"cip_docv\",\n \"cip\",\n \"drivers_license\",\n \"Form W-8BEN\",\n \"government_id\",\n \"lease_agreement\",\n \"letter_of_authorization\",\n \"passport\",\n \"permanent_resident_card\",\n \"poa\",\n \"ssa_certified_letter\",\n \"ssn_card\",\n \"statement\",\n \"utility_bill\",\n \"return_mail\",\n \"return_email\",\n \"will\",\n \"death_certificate\",\n \"trust_certification\",\n \"beneficiary_form\",\n \"court_order\",\n \"divorce_decree\",\n \"letter_of_testamentary\",\n \"b-notice_letter_1\",\n \"b-notice_letter_2\",\n \"w-8ben-e\",\n \"w-8imy\",\n \"\",\n] as const;\n\nexport type DocUploadData = {\n doc_type: string;\n doc_sub_type: string;\n content: any;\n};\n\nexport type DocumentRequestResponse = {\n id: string;\n owner_id: string;\n object_key: string;\n object_metadata: Record<string, unknown>;\n object_url: string;\n doc_type: (typeof DOCUMENT_TYPES)[number];\n doc_sub_type: (typeof DOCUMENT_SUB_TYPES)[number];\n uploaded_by_admin_id: string;\n requested_by_admin_id: string;\n requested_at: Date;\n uploaded_at: Date;\n created_at: Date;\n updated_at: Date;\n deleted_at: Date;\n};\n\nexport interface GetAccountParams {\n product: string;\n}\n\nexport const getAccount = async ({\n product = \"live\",\n}: GetAccountParams): Promise<Account> => {\n // fetch the live account no matter what\n const accounts = await instance.get<Account[]>(\"/accounts\");\n const live = accounts.data[0];\n\n // if not paper we can stop here and return the live account\n if (product !== \"paper\") {\n return live;\n }\n\n // if paper we need to fetch the paper account\n const paperAccounts = await getPaperAccounts();\n const paper = await instance.get<Account>(\n \"/paper_accounts/\"\n .concat(paperAccounts[0].paper_account_id)\n .concat(\"/trade_account/margin\")\n );\n\n return paper.data;\n};\n\nexport const getLiveAccounts = async () => {\n const accounts = await instance.get<Account[]>(\"/accounts\");\n return accounts.data;\n};\n\nexport const getDetails = async (\n accountID: string,\n product = \"live\"\n): Promise<OwnerDetails> => {\n const res = await instance.get<OwnerDetails>(\n product === \"paper\" ? \"/paper_accounts/\" : `/accounts/${accountID}/details`\n );\n\n return res.data;\n};\n\nexport const patchDetails = async (\n accountID: string,\n payload: Partial<OwnerDetails>\n) => {\n const res = await instance.patch<OwnerDetails>(\n `/accounts/${accountID}/details`,\n payload\n );\n return res.data;\n};\n\nexport type PatchAccountRequest = {\n is_legal_entity: boolean;\n account_name: string;\n cash_interest: AccountCashInterest[];\n};\n\nexport const patchAccount = async (\n accountID: string,\n payload: Partial<PatchAccountRequest>\n) => {\n const res = await instance.patch<OwnerDetails>(\n `/accounts/${accountID}`,\n payload\n );\n return res.data;\n};\n\nexport const patchEsign = async (\n accountID: string,\n payload: { agreement: string; revision: string; signed_at: Date }\n) => {\n const res = await instance.patch<OwnerDetails>(\n `/accounts/${accountID}/details/esign`,\n { esign_audit: [payload] }\n );\n return res.data;\n};\n\nexport const getAccountOpenerDetails = async (\n accountID: string\n): Promise<OwnerDetails> => {\n const res = await instance.get<{ owners: OwnerDetails[] }>(\n `/accounts/${accountID}/owners`\n );\n return res.data.owners.find(\n // @ts-ignore\n (owner) => owner.is_legal_account_opener\n ) as OwnerDetails;\n};\n\nexport const getOwners = async (accountID: string): Promise<Owner[]> => {\n const res = await instance.get<{ owners: Owner[] }>(\n `/accounts/${accountID}/owners`\n );\n return res.data.owners;\n};\n\nexport const setUserConfigurations = async (\n accountID: string,\n product = \"live\",\n payload: Partial<UserConfigurations>\n) => {\n const res = await instance.patch(\n `/${getPathForProduct(product)}/${accountID}/configurations`,\n payload\n );\n\n return res.data;\n};\n\nexport interface UserConfigurationsParams {\n accountID: string;\n product?: string;\n}\n\nexport const getUserConfigurations = async ({\n accountID = \"\",\n product = \"live\",\n}: UserConfigurationsParams): Promise<UserConfigurations> => {\n const res = await instance.get<UserConfigurations>(\n `/${getPathForProduct(product)}/${accountID}/configurations`\n );\n\n return res.data;\n};\n\nexport const patchFinancialProfile = async (\n accountID: string,\n payload: Partial<OwnerDetails>\n) => {\n const res = await instance.patch<OwnerDetails>(\n `/accounts/${accountID}/steps/next/financial_profile_step`,\n payload\n );\n return res.data;\n};\n\nexport const patchEmploymentStatus = async (\n accountID: string,\n payload: Partial<OwnerDetails>\n) => {\n const res = await instance.patch<OwnerDetails>(\n `/accounts/${accountID}/steps/next/employment_step`,\n payload\n );\n return res.data;\n};\n\nexport const getTrustedContact = async (\n accountID: string\n): Promise<TrustedContact> => {\n const res = await instance.get(`/accounts/${accountID}/trusted_contact`);\n return res.data;\n};\n\nexport type Product = \"live\" | \"paper\";\n\nexport interface LiquidatePositionParams {\n accountID: string;\n product: Product;\n symbol: string;\n cancelOrders?: boolean;\n}\n\nexport const liquidatePosition = async ({\n product,\n accountID,\n symbol,\n cancelOrders,\n}: LiquidatePositionParams) => {\n if (symbol) {\n const res = await instance.delete(\n `/${\n product === \"live\" ? \"accounts\" : \"paper_accounts\"\n }/${accountID}/positions/${symbol}?cancel_orders=${cancelOrders}`,\n {\n data: {\n allow_out_of_markets: false,\n symbols: [symbol],\n },\n }\n );\n\n return res.data;\n }\n};\n\nexport type ExcerciseOptionParams = {\n accountID: string;\n symbol: string;\n product: string;\n};\n\nexport const exerciseOption = async ({\n accountID,\n symbol,\n product,\n}: ExcerciseOptionParams) => {\n const res = await instance.post(\n `/${\n product === \"live\" ? \"accounts\" : \"paper_accounts\"\n }/${accountID}/positions/${symbol}/exercise`\n );\n\n return res.data;\n};\n\nexport type OrderLeg = Omit<Order, \"legs\">;\n\nexport interface Order {\n id: string;\n client_order_id: string;\n created_at: Date;\n updated_at: Date;\n submitted_at: Date;\n filled_at: Date;\n expired_at?: any;\n canceled_at?: any;\n failed_at?: any;\n replaced_at?: any;\n replaced_by?: any;\n replaces?: any;\n expires_at?: any;\n asset_id: string;\n symbol: string;\n asset_class: string;\n notional?: any;\n qty: string;\n filled_qty: string;\n ratio_qty?: string;\n filled_avg_price: string;\n order_class: string;\n order_type: string;\n type: string;\n side: string;\n position_intent: string;\n time_in_force: string;\n limit_price?: any;\n stop_price?: any;\n status: string;\n extended_hours: boolean;\n legs?: OrderLeg[];\n trail_percent?: any;\n trail_price?: any;\n hwm?: any;\n subtag?: any;\n source: string;\n}\n\nexport interface CancelOrderParams {\n accountID: string;\n product: string;\n orderID: string;\n}\n\nexport const cancelOrder = async ({\n product,\n accountID,\n orderID,\n}: CancelOrderParams) => {\n const res = await instance.delete(\n `/${\n product === \"live\" ? \"accounts\" : \"paper_accounts\"\n }/${accountID}/orders/${orderID}`\n );\n\n return res.data;\n};\n\nexport const patchTrustedAccount = async (\n accountID: string,\n payload: Partial<TrustedContact>\n) => {\n const res = await instance.patch<TrustedContact>(\n `/accounts/${accountID}/trusted_contact`,\n {\n ...payload,\n // todo: fix this, i'll get to it later\n street_address: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country: \"\",\n }\n );\n return res.data;\n};\n\nexport const getTrustedAccount = async (\n accountID: string\n): Promise<TrustedContact> => {\n const res = await instance\n .get<TrustedContact>(`/accounts/${accountID}/trusted_contact`)\n .catch(() => null);\n\n // todo: handle this better later, I don't have time to do it now\n return res?.data || ({} as TrustedContact);\n};\n\nexport const postTrustedAccount = async (\n accountID: string,\n payload: Partial<TrustedContact>\n) => {\n const res = await instance.post<TrustedContact>(\n `/accounts/${accountID}/trusted_contact`,\n {\n ...payload,\n // todo: fix this, i'll get to it later\n street_address: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country: \"\",\n }\n );\n return res.data;\n};\n\nexport interface NonIdentityAccountDocumentURL {\n id: string;\n url: string;\n}\n\nexport const getNonIdentityAccountDocumentURL = async (\n accountID: string,\n documentID: string\n): Promise<NonIdentityAccountDocumentURL> => {\n const res = await instance.get(\n `accounts/${accountID}/documents/${documentID}/url`,\n {\n headers: {\n Accept: \"*/*\",\n },\n }\n );\n\n return res.data;\n};\n\nexport interface NonIdentityAccountDocument {\n id: string;\n name: string;\n type: string;\n sub_type: string;\n date: string;\n}\n\nconst DEFAULT_DOCUMENTS_RANGE_IN_YEARS = 3;\n\nexport const getNonIdentityAccountDocuments = async (\n accountID: string\n): Promise<Array<NonIdentityAccountDocument>> => {\n const res = await instance.get(\n `accounts/${accountID}/documents`.concat(\n `?start=${moment()\n .subtract(DEFAULT_DOCUMENTS_RANGE_IN_YEARS, \"year\")\n .format(\"YYYY-MM-DD\")}&end=${moment().format(\"YYYY-MM-DD\")}`\n )\n );\n return res.data;\n};\n\nexport const getAccountDocuments = async (\n accountID: string\n): Promise<Array<DocumentRequestResponse>> => {\n const res = await instance.get(`documents/accounts/${accountID}`);\n return res.data;\n};\n\nexport const getAccountDocumentRequests = async (\n accountID: string\n): Promise<Array<DocumentRequestResponse>> => {\n const res = await instance.get(`documents/accounts/${accountID}/requests`);\n return res.data;\n};\n\nexport const uploadAccountDocumentByDocType = async (\n accountID: string,\n payload: DocUploadData\n): Promise<DocUploadData> => {\n var formData = new FormData();\n formData.append(\"uploadfile\", payload.content);\n const res = await instance.post(\n `documents/accounts/${accountID}/upload/${payload.doc_type}/${payload.doc_sub_type}`,\n formData,\n { headers: { \"Content-Type\": \"multipart/form-data\" } }\n );\n return res.data;\n};\n\nexport const uploadAccountDocument = async (\n docID: string,\n payload: DocUploadData\n): Promise<DocUploadData> => {\n let formData = new FormData();\n formData.append(\"uploadfile\", payload.content);\n const res = await instance.post(\n `/documents/${docID}/upload?sub_type=${payload.doc_sub_type}`,\n formData,\n { headers: { \"Content-Type\": \"multipart/form-data\" } }\n );\n return res.data;\n};\n\nexport const fetchAccountAgreement = async (\n accountID: string,\n agreement: string\n): Promise<Blob> => {\n const res = await instance.get(\n `/accounts/${accountID}/taxfiles/${agreement}/preview`,\n { responseType: \"blob\" }\n );\n return res.data;\n};\n\nexport const requestEmail = async (\n email: string,\n a: string\n): Promise<unknown> => {\n const res = await instance.post(\"/owner/email\", { email, a });\n return res.data;\n};\n\nexport const confirmEmail = async (code: string): Promise<unknown> => {\n const res = await instance.post(\"/owner/email-confirm\", { code });\n return res.data;\n};\n\nexport const getCountryOfCitizenship = async () => {\n const user = await AuthService.getCurrentUser();\n const attr = await getAttributes(user);\n return getCustomAttr(attr, \"citizenship\", \"\");\n};\n\n// adding a symbol to the watchlist\n// POST https://staging-app.tradetalk.us/internal/accounts/b501fb34-56cd-4a2a-80cd-a9a37bf16e10/watchlists:by_name?name=Primary Watchlist\n// {\"symbol\":\"GME\"}\n\n// removing a symbol from a watchlist\n// PUT https://staging-app.tradetalk.us/internal/accounts/b501fb34-56cd-4a2a-80cd-a9a37bf16e10/watchlists:by_name?name=Primary Watchlist\n// {\"name\":\"Primary Watchlist\",\"symbols\":[\"SPY\",\"FB\"]}\n\nexport interface Asset {\n id: string;\n class: string;\n exchange: string;\n symbol: string;\n name: string;\n status: string;\n tradable: boolean;\n marginable: boolean;\n maintenance_margin_requirement: number;\n shortable: boolean;\n easy_to_borrow: boolean;\n fractionable: boolean;\n}\n\nexport interface Watchlist {\n id: string;\n account_id: string;\n created_at: Date;\n updated_at: Date;\n name: string;\n assets: Asset[];\n}\n\nexport interface GetWatchlistParams {\n accountID: string;\n name: string;\n}\n\nexport const getWatchlist = async ({\n accountID,\n name,\n}: GetWatchlistParams): Promise<Watchlist> => {\n const res = await instance.get(\n `/accounts/${accountID}/watchlists:by_name?name=${name}`\n );\n return res.data;\n};\n\nexport interface AddSymbolToWatchlistParams {\n accountID: string;\n name: string;\n symbol: string;\n}\n\nexport const addSymbolToWatchlist = async ({\n accountID,\n name,\n symbol,\n}: AddSymbolToWatchlistParams): Promise<Watchlist> => {\n const res = await instance.post(\n `/accounts/${accountID}/watchlists:by_name?name=${name}`,\n { symbol }\n );\n return res.data;\n};\n\nexport interface RemoveSymbolFromWatchlistParams {\n accountID: string;\n name: string;\n symbols: string[];\n}\n\nexport const removeSymbolFromWatchlist = async ({\n accountID,\n name,\n symbols,\n}: RemoveSymbolFromWatchlistParams): Promise<Watchlist> => {\n const res = await instance.put(\n `/accounts/${accountID}/watchlists:by_name?name=${name}`,\n { name, symbols }\n );\n return res.data;\n};\n\nexport interface CreateWatchlistParams {\n accountID: string;\n name: string;\n symbols: string[];\n}\n\nexport const createWatchlist = async ({\n accountID,\n name,\n symbols,\n}: CreateWatchlistParams): Promise<Watchlist> => {\n const res = await instance.post(`/accounts/${accountID}/watchlists`, {\n name,\n symbols,\n });\n return res.data;\n};\n\nexport interface GetWatchlistsParams {\n accountID: string;\n}\n\nexport const getWatchlists = async ({\n accountID,\n}: GetWatchlistsParams): Promise<Watchlist[]> => {\n const res = await instance.get(`/accounts/${accountID}/watchlists`);\n return res.data;\n};\n\nexport interface ResetPaperAccountParams {\n accountID: string;\n paperAccountID: string;\n cash: number;\n}\n\nexport const resetPaperAccount = async ({\n accountID,\n paperAccountID,\n cash,\n}: ResetPaperAccountParams): Promise<void> => {\n const res = await instance.post(\n `/accounts/${accountID}/paper_accounts/${paperAccountID}`,\n { cash }\n );\n\n return res.data;\n};\n\nexport interface PaperAccount {\n owner_id: string;\n paper_account_id: string;\n name: string;\n created_at: string;\n updated_at: string;\n}\n\nexport const getPaperAccounts = async (): Promise<PaperAccount[]> => {\n const res = await instance.get(`/paper_accounts`);\n return res.data;\n};\n\nexport const getPaperAccountsWithDetails = async (\n paperAccountIds?: string[]\n): Promise<Account[]> => {\n if (!paperAccountIds?.length) {\n return [];\n }\n\n const promises = await Promise.allSettled(\n paperAccountIds.map((id) =>\n instance.get(`/paper_accounts/${id}/trade_account/margin`)\n )\n );\n\n let accounts: Account[] = [];\n for (const p of promises) {\n if (p.status === \"fulfilled\") {\n accounts.push(p.value.data);\n } else {\n console.error(\"failed to query paper account details\", p.reason);\n }\n }\n\n return accounts;\n};\n\nexport type createPaperAccountParams = {\n name: string;\n cash: number;\n};\n\nexport const createPaperAccount = async (params: createPaperAccountParams) => {\n const res = await instance.post(`/paper_accounts`, params);\n return res.data;\n};\n\ntype patchPaperAccountParams = {\n name: string;\n};\n\nexport const editPaperAccount = async (\n paperAccountId: string,\n params: patchPaperAccountParams\n) => {\n const res = await instance.patch(`/paper_accounts/${paperAccountId}`, params);\n return res.data;\n};\n\nexport const deletePaperAccount = async (paperAccountId: string) => {\n const res = await instance.delete(`/paper_accounts/${paperAccountId}`);\n return res.data;\n};\n\nexport interface Margin {\n id: string;\n crypto_tier: number;\n account_number: string;\n status: string;\n crypto_status: string;\n currency: string;\n held_ach_deposits: number;\n buying_power: string;\n regt_buying_power: string;\n daytrading_buying_power: string;\n effective_buying_power: string;\n non_marginable_buying_power: string;\n bod_dtbp: string;\n cash: string;\n cash_withdrawable: string;\n cash_transferable: string;\n accrued_fees: string;\n pending_transfer_out: string;\n pending_transfer_in: string;\n portfolio_value: string;\n pattern_day_trader: boolean;\n trading_blocked: false;\n transfers_blocked: false;\n account_blocked: false;\n created_at: string;\n trade_suspended_by_user: false;\n multiplier: string;\n shorting_enabled: boolean;\n equity: string;\n last_equity: string;\n long_market_value: string;\n short_market_value: string;\n position_market_value: string;\n initial_margin: string;\n maintenance_margin: string;\n last_maintenance_margin: string;\n sma: string;\n daytrade_count: number;\n balance_asof: string;\n clearing_broker: string;\n}\n\nexport const getMargin = async (\n accountID: string,\n paper?: boolean,\n last?: boolean\n): Promise<Margin | null> => {\n const startPath = paper ? \"/paper_accounts\" : \"/accounts\";\n const endPath = last ? \"/last\" : \"\";\n\n try {\n const res = await instance.get(\n `${startPath}/${accountID}/trade_account/margin${endPath}`\n );\n\n if (last) {\n // @todo remove mutations when endpoints are refactored\n res.data.last_effective_buying_power =\n res.data.last_buying_power - res.data.last_maintenance_margin;\n res.data.last_excess_margin =\n res.data.last_equity - res.data.last_maintenance_margin;\n }\n\n return res.data;\n } catch (e) {\n console.error(e);\n return null;\n }\n};\n\nexport interface GetOrdersParams {\n accountID: string;\n paper?: boolean;\n symbols?: string[];\n status?: \"open\" | \"closed\" | \"all\";\n side?: \"buy\" | \"sell\" | \"sell_short\" | \"\";\n limit?: number;\n}\n\nexport const getOrders = async ({\n accountID,\n paper,\n symbols,\n status = \"all\",\n side = \"\",\n limit = 3000,\n}: GetOrdersParams): Promise<Order[]> => {\n const ORDER_LIMIT = Math.min(3000, limit);\n const LIMIT = Math.min(500, ORDER_LIMIT);\n const REQUEST_LIMIT = 10;\n\n let allOrders: Order[] = [];\n let fetchDate = moment().add(1, \"day\").toISOString();\n let fetching = true;\n let requestCount = 0;\n\n while (fetching) {\n const res = await instance.get(\n `/${\n paper ? \"paper_accounts\" : \"accounts\"\n }/${accountID}/orders?status=${status}&side=${side}&symbols=${symbols?.join(\n \",\"\n )}&limit=${LIMIT}&until=${fetchDate}`\n );\n\n const orders = res.data ?? [];\n allOrders = [...allOrders, ...orders];\n requestCount++;\n\n // Prevent user from stuck on request loop\n if (\n orders.length === LIMIT &&\n allOrders.length < ORDER_LIMIT &&\n requestCount < REQUEST_LIMIT\n ) {\n const earliestSubmittedOrderDate = orders.sort((a: Order, b: Order) => {\n return (\n moment(a.submitted_at).valueOf() - moment(b.submitted_at).valueOf()\n );\n })?.[0]?.submitted_at;\n\n // Fail safe incase for some reason fetchDate is not updating we don't want\n // the app to stuck on looping\n if (!moment(earliestSubmittedOrderDate).isSame(fetchDate)) {\n fetchDate = moment(earliestSubmittedOrderDate).toISOString();\n } else {\n fetching = false;\n }\n } else {\n fetching = false;\n }\n }\n\n return uniqBy(allOrders, \"id\");\n};\n\nexport interface GetPositionParams {\n accountID: string;\n symbol: string;\n paper?: boolean;\n}\n\nexport const getPosition = async ({\n accountID,\n symbol,\n paper,\n}: GetPositionParams): Promise<Position> => {\n const res = await instance.get(\n `/${paper ? \"paper_accounts\" : \"accounts\"}/${accountID}/positions/${symbol}`\n );\n return res.data;\n};\n\nexport type OptionContract = {\n id: string;\n symbol: string;\n name: string;\n status: \"active\" | \"inactive\";\n tradable: boolean;\n expiration_date: string;\n root_symbol: string;\n underlying_symbol: string;\n underlying_asset_id: string;\n type: \"call\" | \"put\";\n style: \"american\";\n strike_price: string;\n size: string;\n open_interest: string;\n open_interest_date: string;\n close_price: string;\n close_price_date: string;\n};\n\nexport interface GetPositionsParams {\n accountID: string;\n product?: string;\n}\n\nexport const getPositions = async ({\n accountID,\n product = \"paper\",\n}: GetPositionsParams): Promise<Position[]> => {\n const res = await instance.get(\n `/${\n product === \"paper\" ? \"paper_accounts\" : \"accounts\"\n }/${accountID}/positions`\n );\n\n return res.data;\n};\n\nexport interface Activity {\n id: string;\n activity_type: string;\n date: string;\n transaction_time: string;\n net_amount: string;\n description: string;\n symbol: string;\n side: string;\n price: string;\n qty: string;\n per_share_amount: string;\n status: string;\n}\n\nexport interface GetActivitiesParams {\n accountID: string;\n paper?: boolean;\n activityTypes?: string[];\n after?: string;\n date?: string;\n until?: string;\n page_size?: number;\n page_token?: string;\n}\n\nexport const getActivities = async ({\n accountID,\n paper,\n activityTypes,\n after,\n date,\n until,\n page_size,\n page_token,\n}: GetActivitiesParams): Promise<Activity[]> => {\n const base = paper ? \"/paper_accounts\" : \"/accounts\";\n const queryParams = {\n activity_types: activityTypes?.join(\",\"),\n after,\n date,\n until,\n page_size,\n page_token,\n };\n\n const res = await instance.get(`${base}/${accountID}/activities`, {\n params: queryParams,\n });\n\n return res.data;\n};\n\nexport interface Bank {\n id: string;\n account_id: string;\n name: string;\n status: string;\n country: string;\n state_province: string;\n postal_code: string;\n city: string;\n street_address: string;\n account_number: string;\n bank_code: string;\n bank_code_type: string;\n created_at: Date;\n updated_at: Date;\n}\n\nexport interface GetBanksParams {\n accountID: string;\n}\n\nexport const getBanks = async ({\n accountID,\n}: GetBanksParams): Promise<Bank[]> => {\n const res = await instance.get(`/accounts/${accountID}/banks`);\n return res.data;\n};\n\nexport interface CreateBankParams {\n accountID: string;\n bank: Bank;\n}\n\nexport const createBank = async ({\n accountID,\n bank,\n}: CreateBankParams): Promise<Bank> => {\n const res = await instance.post(`/accounts/${accountID}/banks`, bank);\n return res.data;\n};\n\nexport const uploadBankStatement = async ({\n accountID,\n file,\n}: {\n accountID: string;\n file: File;\n}): Promise<any> => {\n const now = moment().format(\"YYYY-MM-DD HH:mm:ss\");\n const bankStatement = renameFile(file, `bank_statement_${now}`);\n const formData = new FormData();\n formData.append(\"uploadfile\", bankStatement);\n\n const res = await instance.post(\n `/documents/accounts/${accountID}/upload/identity_verification/bank_statement`,\n formData,\n { headers: { \"Content-Type\": \"multipart/form-data\" } }\n );\n return res.data;\n};\n\nexport interface DeleteBankParams {\n accountID: string;\n bankID: string;\n}\n\nexport const deleteBank = async ({\n accountID,\n bankID,\n}: DeleteBankParams): Promise<void> => {\n const res = await instance.delete(`/accounts/${accountID}/banks/${bankID}`);\n return res.data;\n};\n\nexport interface AccessKey {\n id: string;\n account_id: string;\n secret: string;\n status: string;\n created_at: string;\n updated_at: string;\n deleted_at: string;\n}\n\nexport interface GetAccessKeysParams {\n accountID?: string;\n}\n\nexport const getAccessKeys = async ({\n accountID,\n}: GetAccessKeysParams = {}): Promise<AccessKey[]> => {\n const res = await instance.get(\n !!accountID ? `/paper_accounts/${accountID}/access_keys` : `/access_keys`\n );\n\n return res.data;\n};\n\nexport interface DeleteAccessKeyParams {\n accessKeyID: string;\n accountID?: string;\n}\n\nexport const deleteAccessKey = async ({\n accountID,\n accessKeyID,\n}: DeleteAccessKeyParams): Promise<AccessKey> => {\n const res = await instance.delete(\n !!accountID\n ? `/paper_accounts/${accountID}/access_keys/${accessKeyID}`\n : `/access_keys/${accessKeyID}`\n );\n\n return res.data;\n};\n\nexport interface CreateNewAccessKeyParams {\n accountID?: string;\n}\n\nexport const createNewAccessKey = async ({\n accountID,\n}: CreateNewAccessKeyParams = {}): Promise<AccessKey> => {\n const res = await instance.post(\n !!accountID ? `/paper_accounts/${accountID}/access_keys` : `/access_keys`\n );\n\n return res.data;\n};\n\nconst getPathForProduct = (product: string) => {\n return product === \"paper\" ? \"paper_accounts\" : \"accounts\";\n};\n\nexport const getIntercomUserHash = async (): Promise<string> => {\n const res = await instance.get<{ intercom_id: string }>(`/owner/intercom-id`);\n\n return res.data.intercom_id;\n};\n\ntype OptionsRequestStatus =\n | \"PENDING\"\n | \"APPROVED\"\n | \"LOWER_LEVEL_APPROVED\"\n | \"REJECTED\";\n\nexport const OPTIONS_LEVELS = [1, 2, 3] as const;\n\nexport type OptionsLevel = (typeof OPTIONS_LEVELS)[number];\n\nexport type OptionsApprovalStatus = {\n OptionsRequestStatus: OptionsRequestStatus | null;\n ReapplyAvailableDate: string | null;\n RequestedLevel: OptionsLevel | null;\n ApprovedLevel: OptionsLevel | null;\n};\n\nexport const getOptionsApprovalStatus = async (\n accountId: string\n): Promise<OptionsApprovalStatus> => {\n const res = await instance.get<OptionsApprovalStatus>(\n `/accounts/${accountId}/options/approval`\n );\n return res.data;\n};\n\nexport type OptionsApprovalResponse = {\n id: string;\n account_id: string;\n created_at: string;\n updated_at: string;\n requested_level: number;\n status: OptionsRequestStatus;\n};\n\nexport const postOptionsApproval = async (\n accountId: string,\n level: OptionsLevel\n): Promise<OptionsApprovalResponse> => {\n const res = await instance.post<OptionsApprovalResponse>(\n `/accounts/${accountId}/options/approval`,\n {\n level,\n }\n );\n return res.data;\n};\n\nexport interface CIDR {\n cidr: string;\n}\n\nexport interface IPAllowlist {\n enabled: boolean;\n cidrs: string[];\n}\n\nexport const getIPAllowlist = async (\n accountID: string\n): Promise<IPAllowlist> => {\n const res = await instance.get(`/accounts/${accountID}/allowed-cidrs`);\n\n return res.data;\n};\n","import iso3166 from \"iso-3166-2\";\nimport moment from \"moment-timezone\";\nimport React from \"react\";\n\nimport { ControllerRenderProps } from \"react-hook-form\";\nimport { Timeframe } from \"../pages/dashboard/home/sections/chart\";\n\nconst FRACTION_DIGITS_CONFIG = [\n { threshold: 1, digits: 2 },\n { threshold: 0.01, digits: 4 },\n { threshold: 0.0001, digits: 6 },\n];\nconst DEFAULT_DIGITS = 9;\n\nconst timeframeFormats: Record<Timeframe, string> = {\n \"1D\": \"hh:mm A z\",\n \"1W\": \"MMM DD, yyyy hh:mm A z\",\n \"1M\": \"MMM DD, yyyy\",\n \"1A\": \"MMM DD, yyyy\",\n all: \"MMM DD, yyyy\",\n};\n\nexport const getPrettyDate = (value?: string | Date | number | null) => {\n if (value == null) {\n return \"-\";\n }\n const date = moment(value);\n if (date.isValid()) {\n return date.format(\"MMM DD, YYYY, hh:mm:ss A z\");\n } else {\n return \"-\";\n }\n};\n\nexport const getPrettyDateFromTimeframe = (\n timeframe: Timeframe,\n epoch?: number\n) => {\n const format = timeframeFormats[timeframe] || timeframeFormats.all;\n return `${moment(epoch).tz(moment.tz.guess()).format(format)}`;\n};\n\nexport const getPrettyDateFormatted = (\n value = 0,\n format = \"MMM DD, yyyy, hh:mm A\"\n) => `${moment(value).format(format)}`;\n\nexport const getPrettyTime = (value: number = 0) =>\n `${moment(value).format(\"hh:mm A\")}`;\n\nconst getMaxFractionDigits = (value: number) => {\n const num = Math.abs(value);\n for (const config of FRACTION_DIGITS_CONFIG) {\n if (num === 0 || num > config.threshold) {\n return config.digits;\n }\n }\n return DEFAULT_DIGITS;\n};\n\nexport const getQuoteCurrency = (symbol: string, assetClass: string) => {\n if (assetClass !== \"crypto\") {\n return \"USD\";\n }\n\n const [base, quote] = symbol.split(\"/\");\n\n if (!base || !quote) {\n return \"\";\n }\n\n return quote;\n};\n\nexport const getPrettyPrice = (\n value: number | string | undefined,\n symbol: string,\n assetClass: string,\n minimumFractionDigits = 2,\n maximumFractionDigits = 6\n) => {\n const parsed = parseFloat(value?.toString() ?? \"\");\n\n if (parsed === 0) {\n return \"0.00\";\n }\n\n if (isNaN(parsed) || !isFinite(parsed)) {\n return \"-\";\n }\n\n const prefix = parsed < 0 ? \"-\" : \"\";\n\n const amount = Math.abs(parsed).toLocaleString(\"en-US\", {\n minimumFractionDigits,\n maximumFractionDigits,\n });\n\n if (assetClass !== \"crypto\") {\n return `${prefix}$${amount}`;\n }\n\n const currency = getQuoteCurrency(symbol, assetClass);\n\n if (!currency) {\n return `${prefix}${amount}`;\n }\n\n return `${currency} ${prefix}${amount}`;\n};\n\nexport const getPrettyCash = (\n value: number | string | undefined,\n options?: {\n withPrefix?: boolean;\n forcePrecision?: number;\n minimumFractionDigits?: number;\n acceptZero?: boolean;\n }\n): string => {\n const parsed =\n typeof value === \"string\"\n ? parseFloat((value as string).replace(/,/g, \"\"))\n : value;\n\n if (\n parsed === undefined ||\n parsed === null ||\n isNaN(parsed) ||\n !isFinite(parsed) ||\n (parsed === 0 && !options?.acceptZero)\n ) {\n return \"–\";\n }\n\n const sign = options?.withPrefix ? (parsed > 0 ? \"+\" : \"-\") : \"\";\n const prefix = parsed < 0 ? \"-\" : sign;\n const absValue = Math.abs(parsed).toLocaleString(\"en-US\", {\n minimumFractionDigits: options?.minimumFractionDigits || 0,\n maximumFractionDigits:\n options?.forcePrecision || getMaxFractionDigits(parsed),\n });\n\n return `${prefix}$${absValue}`;\n};\n\nexport const getPrettyAmount = (\n value: number | string | null = 0,\n minimumFractionDigits = 2,\n maximumFractionDigits = 2\n): string => {\n const parsed = parseFloat(value?.toString() ?? \"\");\n\n if (parsed === 0) {\n return \"0.00\";\n }\n\n if (isNaN(parsed) || !isFinite(parsed)) {\n return \"-\";\n }\n\n return `${(parsed > 0 ? \"\" : \"-\").concat(\n Math.abs(parsed).toLocaleString(\"en-US\", {\n minimumFractionDigits,\n maximumFractionDigits,\n })\n )}`;\n};\n\nexport const getPrettyPercent = (\n value: number | string | undefined = 0,\n noPrefix: boolean = false,\n multiply: boolean = false\n): string => {\n const parsed = parseFloat(value?.toString());\n\n if (isNaN(parsed) || !isFinite(parsed) || parsed === 0) {\n return \"-\";\n }\n\n return `${parsed > 0 && !noPrefix ? \"+\" : \"\"}${(multiply\n ? parsed * 100\n : parsed\n ).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}%`;\n};\n\nexport const getProfitLossColor = (value: string | number) => {\n const parsed = parseFloat(value?.toString());\n\n if (isNaN(parsed) || !isFinite(parsed) || parsed === 0) {\n return \"text-gray-500\";\n }\n\n // if the value is positive, return green\n if (parsed >= 0) {\n return \"text-emerald-500\";\n }\n\n // if the value is negative, return red\n return \"text-rose-500\";\n};\n\n/**\n * @name getNumberOnly\n * @description removes all non-numeric characters from a string\n *\n * @param {string} value\n * @return {number}\n */\n\nexport const getNumberOnly = (value = \"\") =>\n Number(value.replace(/[^0-9.]/g, \"\"));\n\n/**\n * @name getCashTransformer\n * @description a function that modifies the input of a number value to a currency format (e.g. $1,000.00)\n *\n * @param {object} field - the field object from react-hook-form\n * @param {string} field.value - the value of the field\n * @param {function} field.onChange - the onChange function for the field\n */\n\nexport const getCashTransformer = ({\n field,\n}: {\n field: ControllerRenderProps | any;\n}) => {\n const transform = {\n // this will probably always be a pass-through\n input: (value: string) => value,\n // this will get called every time the input changes\n output: (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target?.value?.replace(/[^0-9.]/g, \"\") || \"\";\n const separator = value.includes(\".\") ? \".\" : \"\";\n const split = value.split(\".\");\n const base = split[0] !== \"\" ? parseInt(split[0]) : 0;\n const cents = split[1] || \"\";\n\n const formattedBase = base.toLocaleString(\"en-US\");\n\n return `${\n base === 0 && value.startsWith(\"0\") ? \"0\" : `$${formattedBase}`\n }${separator}${cents.slice(0, 2)}`;\n },\n };\n\n return {\n ...field,\n placeholder: \"$0.00\",\n value: transform.input(field.value),\n onChange: (event: React.ChangeEvent<HTMLInputElement>) =>\n field.onChange(transform.output(event)),\n };\n};\n\n/**\n * @name getISO3166Alpha3FormatMapping\n * @description a function that returns ISO3166-ALPHA-2 to ISO3166-ALPHA-3 format\n *\n */\n\nexport const getISO3166Alpha3FormatMapping = () => {\n let iso3166Alpha3FormatMapping: any = {};\n\n Object.keys(iso3166.codes).map((key) => {\n const value = iso3166.codes[key];\n iso3166Alpha3FormatMapping[value] = key;\n });\n\n return iso3166Alpha3FormatMapping;\n};\n","const TOTAL_TIME_KEY = \"entity_onboarding_timer\";\n\nexport const timer = {\n start: (key = TOTAL_TIME_KEY) => {\n window?.localStorage?.setItem(key, Date.now().toString());\n },\n end: (key = TOTAL_TIME_KEY) => {\n const start = window?.localStorage?.getItem(key);\n\n if (!start) {\n return;\n }\n\n const now = Date.now();\n const duration = now - parseInt(start, 10);\n\n return duration;\n },\n remove: (key = TOTAL_TIME_KEY) => {\n window?.localStorage?.removeItem(key);\n },\n isSet: (key = TOTAL_TIME_KEY) => {\n return window?.localStorage?.getItem(key) !== null;\n },\n};\n","import Auth from \"@aws-amplify/auth\";\nimport { createBrowserHistory } from \"history\";\nimport { getCookie } from \"src/lib/cookies\";\nimport CryptoJS from \"crypto-js\";\n\nexport const history = createBrowserHistory();\n\nexport const push = history.push;\nexport const replace = history.replace;\nexport const goBack = history.goBack;\n\nexport const isUrl = (url) => {\n const protocol = \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9\\\\-]+)://)\";\n const ipv4 =\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\";\n const hostname = \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\";\n const domain =\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\";\n const tld = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\";\n const port = \"(?::\\\\d{2,5})?\";\n const resourcePath = \"(?:[/?#]\\\\S*)?\";\n const regex = `${protocol}(?:(?:localhost|${ipv4}|${hostname}(?:${domain}(?:${tld}\\\\.?))?)?${port}${resourcePath})?`;\n const isUrl = new RegExp(`^${regex}$`, \"i\");\n\n return isUrl.test(url);\n};\n\nexport const weakEncrypt = (str) => {\n const encrypted = CryptoJS.AES.encrypt(str, window.env.SHARED_SECRET);\n return encrypted.toString();\n};\n\nexport class UserNotAuthenticated extends Error {\n name = \"UserNotAuthenticated\";\n constructor() {\n super(\"The user is not authenticated\");\n }\n}\n\n// will load from local storage so\n// not guaranteed to return valid token\nexport const getCurrentAuthenticatedUser = async () => {\n try {\n return await Auth.currentAuthenticatedUser();\n } catch (e) {\n if (e === \"The user is not authenticated\") {\n throw new UserNotAuthenticated();\n }\n throw e;\n }\n};\n\n// will refresh token automatically\nexport const getSessionJWT = async () => {\n try {\n const session = await Auth.currentSession();\n const token = session.getIdToken();\n return token.getJwtToken();\n } catch (e) {\n throw new UserNotAuthenticated();\n }\n};\n\nexport const parseUtmParams = (params) => {\n const utm_params = {};\n for (const utm_key of [\"utm_source\", \"utm_medium\", \"utm_campaign\", \"utm_content\", \"utm_term\"]) {\n if (params.has(utm_key)) {\n utm_params[utm_key] = params.get(utm_key);\n }\n\n // override utm_params with long lived referrer cookies\n if (getCookie(\"alpaca_referrer_campaign_source\")) {\n utm_params[\"utm_source\"] = getCookie(\"alpaca_referrer_campaign_source\")\n }\n if (getCookie(\"alpaca_referrer_campaign_medium\")) {\n utm_params[\"utm_medium\"] = getCookie(\"alpaca_referrer_campaign_medium\")\n }\n if (getCookie(\"alpaca_referrer_campaign_name\")) {\n utm_params[\"utm_campaign\"] = getCookie(\"alpaca_referrer_campaign_name\")\n }\n if (getCookie(\"alpaca_referrer_campaign_content\")) {\n utm_params[\"utm_content\"] = getCookie(\"alpaca_referrer_campaign_content\")\n }\n if (getCookie(\"alpaca_referrer_campaign_term\")) {\n utm_params[\"utm_term\"] = getCookie(\"alpaca_referrer_campaign_term\")\n }\n\n }\n return utm_params;\n};\n","import { createAction as baseCreateAction, createReducer } from \"redux-act\";\nimport * as Sentry from \"@sentry/browser\";\nimport { getCurrentAuthenticatedUser, UserNotAuthenticated } from \"../../utils\";\n\nconst REDUCER = \"cognito\";\nconst NS = `@@${REDUCER}`;\nconst createAction = (name) => baseCreateAction(`${NS}/${name}`);\n\nexport const _receive = createAction(\"RECEIVE\");\nexport const _fetch = createAction(\"FETCH\");\nexport const _error = createAction(\"ERROR\");\nexport const _invalidate = createAction(\"INVALIDATE\");\n\nconst initialState = {\n status: \"invalid\",\n payload: null,\n error: null,\n};\n\nexport const load = () => (dispatch, getState) => {\n const state = getState().cognito;\n if (state.status === \"invalid\") {\n dispatch(_fetch());\n return getCurrentAuthenticatedUser()\n .then((data) => {\n Sentry.setUser({ email: data.attributes?.email });\n dispatch(_receive(data));\n return data;\n })\n .catch((error) => {\n if (error instanceof UserNotAuthenticated) {\n dispatch(_receive(null));\n return null;\n }\n dispatch(_error(error));\n throw error;\n });\n } else if (state.status === \"error\") {\n return Promise.reject(state.error);\n } else if (state.status === \"loaded\") {\n return Promise.resolve(state.payload);\n }\n // } else if (state.status === 'loading') {\n // // TODO:\n // return Promise.resolve(state.payload)\n // }\n};\n\nexport default createReducer(\n {\n [_receive]: (state, param) => ({\n ...state,\n status: \"loaded\",\n payload: param,\n }),\n [_fetch]: (state) => ({\n ...state,\n status: \"loading\",\n payload: null,\n error: null,\n }),\n [_error]: (state, param) => ({\n ...state,\n status: \"error\",\n error: param,\n }),\n [_invalidate]: (state) => ({\n ...state,\n status: \"invalid\",\n payload: null,\n error: null,\n }),\n },\n initialState\n);\n","import { useToast } from \"@chakra-ui/toast\";\nimport { defaultToastSettings, getErrorMessage } from \".\";\nimport { useMutation, MutationFunction, UseMutationOptions } from \"react-query\";\n\nexport function useMutationRequest<T, U>(\n request: MutationFunction<T, U>,\n options?: UseMutationOptions<T, Error, U, unknown>\n) {\n const toast = useToast();\n const mutation = useMutation<T, Error, U>(request, {\n onError: (e) => {\n const key = \"errorToastKey\";\n const message = getErrorMessage(e);\n toast({\n id: key,\n description: message,\n ...defaultToastSettings,\n });\n },\n ...options,\n });\n\n return mutation;\n}\n\nexport default useMutationRequest;\n","import instance from \"..\";\n\nexport interface Asset {\n id: string;\n class: string;\n exchange: string;\n symbol: string;\n name: string;\n status: string;\n tradable: boolean;\n marginable: boolean;\n maintenance_margin_requirement: number;\n shortable: boolean;\n easy_to_borrow: boolean;\n fractionable: boolean;\n min_order_size: string;\n min_trade_increment: string;\n price_increment: string;\n}\n\n// fetch the asset list\nexport const getAssets = (): Promise<Asset[]> =>\n instance.get<Asset[]>(\"/assets\").then(({ data }) => data);\n\n// fetch the asset list\nexport const getAsset = async (symbol: string): Promise<Asset> => {\n const res = await instance.get<Asset>(`/assets/${symbol}`);\n return res.data;\n};\n","import { isEmpty } from \"lodash\";\n\n// @todo mocked until flag-service is deprecated\nexport const setFlag = (flag: string, value: boolean) => {\n localStorage.setItem(flag, value ? \"true\" : \"false\");\n};\n\nexport const getFlag = (flag: string) => localStorage.getItem(flag);\n\n// @todo mocked until flag-service is deprecated\nexport const useFlag = (flag: string) => {\n const value = localStorage.getItem(flag);\n return value === \"true\";\n};\n\nexport const featureFlagManager = (flag: string, percentage: number) => {\n const flagString = getFlag(flag) ?? \"{}\";\n let flagObject = null;\n\n try {\n // Parse the flag string, or initialize an empty object if the string is invalid or null\n flagObject = JSON.parse(flagString ?? \"{}\");\n } catch (e) {\n console.error(\"Error parsing JSON for flag:\", flag, e);\n }\n\n // If feature flag was never set or percentage increases then we will determine\n // if the user is eligible to be the testing group\n if (\n isEmpty(flagObject) ||\n (flagObject?.percentage < percentage && flagObject?.status === false)\n ) {\n if (Math.random() * 100 <= percentage) {\n localStorage.setItem(\n flag,\n JSON.stringify({ status: true, percentage: percentage })\n );\n } else {\n localStorage.setItem(\n flag,\n JSON.stringify({ status: false, percentage: percentage })\n );\n }\n }\n};\n\nexport const isFeatureAccessible = (flag: string) => {\n const flagObject = JSON.parse(getFlag(flag) ?? \"{}\");\n const isDebugMode = getFlag(\"debug\") === \"true\";\n\n if (isDebugMode) {\n return true;\n } else {\n return flagObject?.status ?? false;\n }\n};\n","// The API will return a response if the JWT is invalid, but Amplify should also handle that.\n// There is also a rate limit that apparently throws this error too.\nexport const handleSessionExpire = (promise) =>\n promise.catch((e) => {\n if (e.name === \"InvalidCredentialException\") {\n // Not necessarily a lotout event here.\n // TODO: logout\n }\n throw e;\n });\n","import instance from \"../\";\n\ntype ACHApprovalMethod =\n | \"MICRO_DEPOSIT\"\n | \"PLAID\"\n | \"PLAID_MICRO\"\n | \"CORRESPONDENT\"\n | \"PLAID_PARTNER\";\n\ntype RelationshipStatus =\n | \"QUEUED\"\n | \"CANCEL_REQUESTED\"\n | \"CANCEL_SENT\"\n | \"CANCEL_FAILED\"\n | \"PENDING\"\n | \"SENT_TO_CLEARING\"\n | \"APPROVED\"\n | \"CANCELED\"\n | \"REJECTED\";\n\nexport type PlaidVerificationStatus =\n | \"automatically_verified\"\n | \"pending_automatic_verification\"\n | \"pending_manual_verification\"\n | \"manually_verified\"\n | \"verification_expired\"\n | \"verification_failed\";\n\nexport type ACHRelationship = {\n id: string;\n clearing_id?: string;\n created_at: string;\n updated_at: string;\n deleted_at: string;\n account_id: string;\n status: RelationshipStatus;\n approval_method: ACHApprovalMethod;\n plaid_institution?: string;\n plaid_verification_status?: PlaidVerificationStatus;\n mask?: string;\n account_name?: string;\n expires_at?: string;\n failed_attempts: number;\n reason: string;\n micro_deposit_id: string;\n micro_deposit_status: string;\n processor_token?: string;\n correspondent_code?: string;\n};\n\ntype BankRelationship = {\n id: string;\n account_id: string;\n status: RelationshipStatus;\n approval_method: ACHApprovalMethod;\n account_name: string;\n account_mask: string;\n plaid_institution: string;\n plaid_verification_status: string;\n created_at: string;\n expires_at: string;\n};\n\nexport type BankRelationships = BankRelationship[];\n\nexport type MutateBankRelationshipParams = {\n plaid: {\n public_token: string;\n account_id: string;\n name: string;\n mask: string;\n verification_status?: string;\n };\n};\n\nexport const getBankRelationships = async (accountID: string) => {\n const { data } = await instance.get<BankRelationships>(\n `/accounts/${accountID}/relationships`\n );\n return data;\n};\nexport const createBankRelationship = async (\n accountID: string,\n body: MutateBankRelationshipParams\n) => {\n const { data } = await instance.post<ACHRelationship>(\n `/accounts/${accountID}/relationships`,\n body\n );\n\n return data;\n};\n\nexport type VerifyBankRelationshipArgs = {\n accountID: string;\n relationshipID: string;\n body: MutateBankRelationshipParams;\n};\nexport const verifyBankRelationship = async ({\n accountID,\n relationshipID,\n body,\n}: VerifyBankRelationshipArgs) => {\n const { data } = await instance.post<ACHRelationship>(\n `/accounts/${accountID}/relationships/${relationshipID}/verify`,\n body\n );\n\n return data;\n};\n","import { createAction, createReducer } from \"redux-act\";\nimport api from \"api\";\nimport { handleSessionExpire } from \"./alpacaAuth/session\";\nimport { getAccountIdAndJWT, getAccountIdForProduct } from \"selectors\";\nimport { eventTracker } from \"src/utils/eventTracker\";\n\n// access keys\nconst _setAccessKeys = createAction(`SET_ACCESS_KEYS`);\n// call when creating new paper account because an access key for the old paper account\n// would still be in state\nexport const unsetAccessKeys = createAction(`UNSET_ACCESS_KEYS`);\n\n/**\n * listAccessKeys will retrieve all API access keys for a user\n */\nexport const listAccessKeys = () => (dispatch, getState) => {\n const { token } = getAccountIdAndJWT(getState());\n\n const accountId = getAccountIdForProduct(getState(), \"live\");\n const paperAccountId = getAccountIdForProduct(getState(), \"paper\");\n\n // If you don't get this reference, figure it out immediately.\n const nakedEyes = [];\n if (accountId) {\n nakedEyes.push(\n handleSessionExpire(\n api.accessKeys\n .list(accountId, token)\n .then((payload) =>\n dispatch(_setAccessKeys({ accessKeys: payload, product: \"live\" }))\n )\n .catch(console.error),\n dispatch\n )\n );\n }\n\n if (paperAccountId) {\n nakedEyes.push(\n handleSessionExpire(\n api.paperAccessKeys\n .list(paperAccountId, token)\n .then((payload) =>\n dispatch(_setAccessKeys({ accessKeys: payload, product: \"paper\" }))\n )\n .catch(console.error),\n dispatch\n )\n );\n }\n\n return Promise.all(nakedEyes);\n};\n\n/**\n * createAccessKey will re/create an API access key for an account\n *\n * @param {String} product The product (paper or live)\n */\nexport const createAccessKey = (product) => (dispatch, getState) => {\n const { token } = getAccountIdAndJWT(getState());\n\n const accountId = getAccountIdForProduct(getState(), \"live\");\n const paperAccountId = getAccountIdForProduct(getState(), \"paper\");\n\n if (product) {\n eventTracker(\"Created Access Key\", {\n category: \"API\",\n label: product,\n });\n\n if (product === \"paper\") {\n // Intercom can not use event labels like GA and other things can.\n // So it needs its own special event in order to build e-mail campaign rules.\n eventTracker(\"Created Paper Access Key\", {\n category: \"API\",\n });\n return handleSessionExpire(\n api.paperAccessKeys.create(paperAccountId, token),\n dispatch\n );\n }\n if (product === \"live\") {\n // Intercom can not use event labels like GA and other things can.\n // So it needs its own special event in order to build e-mail campaign rules.\n eventTracker(\"Created Live Access Key\", {\n category: \"API\",\n });\n return handleSessionExpire(\n api.accessKeys.create(accountId, token),\n dispatch\n );\n }\n }\n return;\n};\n\n/**\n * deleteAccessKey will delete an API key\n */\nexport const deleteAccessKey = (key) => (dispatch, getState) => {\n const { token } = getAccountIdAndJWT(getState());\n\n // Removing based on product. Paper/live, more in the future.\n if (key && key.product && key.id) {\n eventTracker(\"Deleted Access Key\", {\n category: \"API\",\n label: key.product,\n });\n\n if (key.product === \"live\") {\n return handleSessionExpire(\n // NOTE: key.account_id could be either the paper account id or the live trade account id\n // Each product can theoretically have multiple accounts\n api.accessKeys.delete(key.account_id, key.id, token),\n dispatch\n );\n }\n if (key.product === \"paper\") {\n return handleSessionExpire(\n api.paperAccessKeys.delete(key.account_id, key.id, token),\n dispatch\n );\n }\n }\n return;\n};\n\n// Export this reducer\nconst initialState = {};\nexport default createReducer(\n {\n // Account access keys, these can be added to or updated\n [_setAccessKeys]: (state, payload) => {\n // Likely only one key at a time. When we regenerate we delete the old.\n // However, if not, this can certainly expose an issue.\n const currentKeys = state.accessKeys || {};\n if (payload.product && payload.accessKeys) {\n payload.accessKeys.forEach((key) => {\n currentKeys[key.account_id] = { ...key, product: payload.product };\n });\n }\n return { ...state, ...currentKeys };\n },\n [unsetAccessKeys]: () => {\n return {};\n },\n },\n initialState\n);\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { getMargin, Margin } from \"../rest/account\";\n\nexport const useGetMargin = (\n key: any | any[] = \"\",\n accountID: string = \"\",\n paper: boolean,\n options?: QueryOptions<Margin | null>\n) => {\n const { data: margin } = useRequest(\n [key, accountID],\n () => getMargin(accountID, paper),\n {\n ...options,\n }\n );\n\n return { margin };\n};\n\nexport const useGetMargins = (\n key: any | any[] = \"\",\n accountID: string[] = [],\n paper: boolean,\n options?: QueryOptions<Margin[]>\n) => {\n const { data: margin } = useRequest(\n [key, ...accountID],\n async () => {\n const margins = await Promise.all(\n accountID.map((id) => getMargin(id, paper))\n );\n return margins.filter((m): m is Margin => !!m);\n },\n {\n ...options,\n }\n );\n\n return { margin };\n};\n\nexport default useGetMargin;\n","import { Dispatch, SetStateAction, useEffect, useState } from \"react\";\n\nconst getValue = <T,>(key: string, defaultValue: T) => {\n try {\n return JSON.parse(localStorage.getItem(key) || String(defaultValue));\n } catch (error) {\n return defaultValue;\n }\n};\n\nconst useLocalStorage = <T,>(\n key: string,\n defaultValue?: T,\n isLoading?: boolean\n): [T, Dispatch<SetStateAction<T>>] => {\n const [isValueRetrieved, setIsValueRetrieved] = useState(false);\n const [value, setValue] = useState<T>(() => {\n // if something is preventing initial setting e.g. key is retrieved async\n // set default value for now\n if (isLoading) {\n return defaultValue;\n }\n\n setIsValueRetrieved(true);\n return getValue(key, defaultValue);\n });\n\n useEffect(() => {\n if (isLoading === undefined) {\n return;\n }\n\n if (!isLoading) {\n setIsValueRetrieved(true);\n setValue(getValue(key, defaultValue));\n }\n }, [isLoading, defaultValue, key]);\n\n useEffect(() => {\n // We have at least made an initial attempt to retrieve the local storage value and thus\n // safe to overwrite\n if (isValueRetrieved) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n }, [value, key, isValueRetrieved]);\n\n return [value, setValue];\n};\n\nexport default useLocalStorage;\n","import { z } from \"zod\";\nimport { RANGES, REQUIRED_ERR_MSG } from \"./constants\";\nimport axios, { AxiosError } from \"axios\";\nimport AmplitudeProvider from \"src/AmplitudeProvider\";\nimport { UseCountryReturn } from \"./useCountry\";\n\nexport const getMinMaxFromRangeOptions = (\n rangeOption: keyof typeof RANGES | string\n) => {\n if (!RANGES.hasOwnProperty(rangeOption)) {\n return { min: 0, max: 0 };\n }\n return RANGES[rangeOption as keyof typeof RANGES];\n};\n\n// Range Key is used to render correct values for min and max in select component\nexport const getRangeKeyFromValues = ({\n min,\n max,\n}: {\n min: number;\n max: number;\n}): keyof typeof RANGES | \"\" =>\n (Object.keys(RANGES).find((key) => {\n const range = RANGES[key as keyof typeof RANGES];\n\n return range.min === min && range.max === max;\n }) as keyof typeof RANGES | undefined) ?? \"\";\n\nexport type Nullable<T> = { [K in keyof T]: T[K] | null };\n\nexport type Transform<T> = {\n keys: Partial<keyof T>[] | \"ALL_FIELDS\";\n condition: (value: any) => boolean;\n transform: (value: any) => any;\n};\n\nexport function getDefaultFormValues<\n T extends { [K in keyof T]: T[K] },\n A extends { [K in keyof A]: A[K] }\n>(\n obj: Partial<T> | undefined,\n transforms: Transform<T>[] | Transform<any>[],\n defaultObj: A\n) {\n return Object.fromEntries(\n Object.entries(defaultObj).map(([k, defaultValue]) => {\n const key = k as keyof T;\n const value = obj?.hasOwnProperty(key) ? obj[key] : defaultValue;\n\n for (const { keys, condition, transform } of transforms) {\n if (Array.isArray(keys) && keys.includes(key) && condition(value)) {\n return [key, transform(value)];\n }\n }\n\n const transformAll = transforms.find((t) => t.keys === \"ALL_FIELDS\");\n\n if (transformAll && transformAll.condition(value)) {\n return [key, transformAll.transform(value)];\n }\n\n return [key, value];\n })\n );\n}\n\nexport function transformObject<T extends { [K in keyof T]: T[K] }, ReturnType>(\n obj: T,\n transforms: Transform<T>[]\n) {\n return Object.fromEntries(\n Object.entries(obj).map(([k, value]) => {\n const key = k as keyof T;\n\n for (const { keys, condition, transform } of transforms) {\n if (Array.isArray(keys) && keys?.includes(key) && condition(value)) {\n return [key, transform(value)];\n }\n }\n\n const transformAll = transforms.find((t) => t.keys === \"ALL_FIELDS\");\n\n if (transformAll && transformAll.condition(value)) {\n return [key, transformAll.transform(value)];\n }\n\n return [key, value];\n })\n ) as ReturnType;\n}\n\nexport const zAffiliationsRefinement =\n (country: UseCountryReturn, percentageOwnershipAvailable?: number) =>\n (data: { [key: string]: any }, refinementContext: z.RefinementCtx) => {\n const {\n is_affiliated_exchange_or_finra,\n affiliated_firm,\n is_control_person,\n controlling_firms,\n country_of_tax_residence,\n tax_id_type,\n tax_id,\n country_of_citizenship,\n } = data;\n\n const countryOfCitizenshipAlpha3 = country.nameToAlpha3(\n country_of_citizenship\n );\n\n if (!countryOfCitizenshipAlpha3) {\n refinementContext.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Select country from dropdown\",\n path: [\"country_of_citizenship\"],\n });\n }\n\n const countryOfTaxResidenceAlpha3 =\n country.nameToAlpha3(country_of_tax_residence) ?? \"\";\n\n if (!countryOfTaxResidenceAlpha3) {\n refinementContext.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Select country from dropdown\",\n path: [\"country_of_tax_residence\"],\n });\n }\n\n const countryTaxIdTypes =\n country?.infos[countryOfTaxResidenceAlpha3]?.tax_id_types;\n\n const taxIdTypeMatch = countryTaxIdTypes?.find(\n ({ id_type }) => id_type === tax_id_type\n );\n const regexp = taxIdTypeMatch?.regexp;\n\n // Tax ID Type must be valid for the country\n if (countryTaxIdTypes && !taxIdTypeMatch) {\n refinementContext.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Invalid Tax ID Type\",\n path: [\"tax_id_type\"],\n });\n }\n\n // Tax ID must match the regexp for the tax ID type, if it exists\n if (regexp && !new RegExp(regexp).test(tax_id)) {\n refinementContext.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Invalid Tax ID\",\n path: [\"tax_id\"],\n });\n }\n\n if (is_affiliated_exchange_or_finra && !affiliated_firm) {\n refinementContext.addIssue({\n code: z.ZodIssueCode.custom,\n message: REQUIRED_ERR_MSG,\n path: [\"affiliated_firm\"],\n });\n }\n\n if (is_control_person && !controlling_firms) {\n refinementContext.addIssue({\n code: z.ZodIssueCode.custom,\n message: REQUIRED_ERR_MSG,\n path: [\"controlling_firms\"],\n });\n }\n \n if (\n typeof percentageOwnershipAvailable === \"number\" &&\n data?.percentage_ownership &&\n data.percentage_ownership > percentageOwnershipAvailable\n ) {\n refinementContext.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Sum of ownership cannot exceed 100%. ${percentageOwnershipAvailable}% available.`,\n path: [\"percentage_ownership\"],\n });\n }\n };\n\nexport const zNonEmptyString = z\n .string()\n .refine((s) => !!s?.trim(), { message: REQUIRED_ERR_MSG });\n\nexport const zPhoneNumber = z\n .string({ errorMap: () => ({ message: REQUIRED_ERR_MSG }) })\n .min(10, \"Invalid phone number\")\n .regex(/^\\+?[ 0-9\\-\\(\\)]+$/, \"Invalid phone number\");\n\nexport const zIsoDate = z\n .string({ errorMap: () => ({ message: REQUIRED_ERR_MSG }) })\n .regex(/^\\d\\d\\d\\d-\\d\\d-\\d\\d$/, \"Invalid date\")\n .refine((d) => {\n const [year, month, day] = d.split(\"-\").map((n) => parseInt(n, 10));\n const isLeapYear =\n year % 4 === 0 && (!(year % 100 === 0) || year % 400 === 0);\n switch (month) {\n case 1:\n case 3:\n case 5:\n case 7:\n case 8:\n case 10:\n case 12:\n return day > 0 && day <= 31;\n case 4:\n case 6:\n case 9:\n case 11:\n return day > 0 && day <= 30;\n case 2:\n return day > 0 && day <= (isLeapYear ? 29 : 28);\n default:\n return false;\n }\n }, \"Invalid date\");\n\nexport const getErrorMessage = (err: Error | AxiosError): string => {\n if (axios.isAxiosError(err)) {\n const resp = err.response?.data;\n return resp?.debug || resp?.message;\n }\n return err.message;\n};\n\nexport const logAmplitudeEvent = {\n onboardingStarted: () => {\n AmplitudeProvider.dispatch(\"algodash_entity_onboarding_started\");\n },\n onboardingCompleted: (duration?: number) => {\n AmplitudeProvider.dispatch(\"algodash_entity_onboarding_completed\", {\n duration,\n });\n },\n nextClicked: () => {\n AmplitudeProvider.dispatch(\"algodash_entity_onboarding_next_clicked\", {\n url: window.location.pathname,\n });\n },\n backClicked: () => {\n AmplitudeProvider.dispatch(\"algodash_entity_onboarding_back_clicked\", {\n url: window.location.pathname,\n });\n },\n invalidInput: (message: string) => {\n AmplitudeProvider.dispatch(\"algodash_entity_onboarding_invalid_input\", {\n message,\n url: window.location.pathname,\n });\n },\n addOwnerClicked: (type: \"ubo\" | \"authorized-individual\") => {\n AmplitudeProvider.dispatch(\"algodash_entity_onboarding_add_owner_clicked\", {\n type,\n url: window.location.pathname,\n });\n },\n editOwnerClicked: (type: \"ubo\" | \"authorized-individual\") => {\n AmplitudeProvider.dispatch(\n \"algodash_entity_onboarding_edit_owner_clicked\",\n {\n type,\n url: window.location.pathname,\n }\n );\n },\n pageCompleted: (duration?: number) => {\n AmplitudeProvider.dispatch(\"algodash_entity_onboarding_page_completed\", {\n duration,\n url: window.location.pathname,\n });\n },\n};\n\n// Handle Tax ID masking - required for any Tax ID inputs that could use USA-SSN\nexport const onTaxIdKeyDown =\n (taxIDType: string): React.KeyboardEventHandler<HTMLInputElement> =>\n (evt) => {\n // we are only masking domestic SSN\n if (taxIDType !== \"USA_SSN\") {\n return;\n }\n const value = evt.currentTarget.value;\n // handle user input of hyphen\n if (value.length === 3 || value.length === 6) {\n evt.key !== \"-\" &&\n /[0-9]/.test(evt.key) &&\n (evt.currentTarget.value += \"-\");\n }\n };\n","import instance from \"../\";\nimport { ACHRelationship } from \"./relationships\";\n\nexport const getPlaidLinkToken = async (accountID: string) => {\n const { data } = await instance.get(\n `/accounts/${accountID}/plaid/link/token`\n );\n return data;\n};\n\nexport const getPlaidAuthStatus = async (plaidAcconutID: string) => {\n const { data } = await instance.get<{ verification_status: string }>(\n `/accounts/${plaidAcconutID}/plaid/auth_status`\n );\n return data;\n};\n","// For more information see:\n// https://alpaca.atlassian.net/wiki/spaces/ENG/pages/1612480730/Amplitude+Integration\n\nimport React from \"react\";\n\nimport { useFlag } from \"src/v2/helpers/flags\";\n\nclass AmplitudeProvider extends React.Component {\n eventTypes = [\"click\", \"input\", \"submit\", \"load\", \"unload\", \"custom\"];\n eventHistory = new Map();\n eventHistoryTimeout = 60000;\n account;\n\n constructor(props) {\n super(props);\n }\n\n static dispatch(name, data) {\n window.dispatchEvent(\n new CustomEvent(\"custom\", {\n detail: {\n \"amplitude-event-name\": name,\n \"amplitude-event-data\": data,\n },\n })\n );\n }\n\n static dispatchPageVisit(eventData = {}) {\n if (!eventData.hasOwnProperty(\"url\")) {\n eventData.url = window.location.pathname;\n }\n\n window.dispatchEvent(\n new CustomEvent(\"custom\", {\n detail: {\n \"amplitude-event-name\": \"algodash_page_visited\",\n \"amplitude-event-data\": eventData,\n },\n })\n );\n }\n\n static setAccount = (acc) => {\n this.account = acc;\n getAmplitude().setUserId(acc?.details?.owner_id);\n getAmplitude().setUserProperties({\n country_of_tax_residence: acc?.details?.country_of_tax_residence,\n account_status: acc?.account?.status,\n account_number: acc?.account?.account_number,\n account_id: acc?.account?.id,\n algodash_v2: true,\n });\n };\n\n // WARNING: Do not remove! This class is a wrapper for the rest of the app.\n render = () => this.props.children;\n\n componentDidMount = () =>\n this.eventTypes.forEach((type) =>\n window.addEventListener(type, this.handleEvent.bind(this), false)\n );\n\n handleEvent = (event) => {\n const eventName = this.getEventName(event);\n const eventData = this.getEventData(event) || {};\n const isPaper = window.location.href.indexOf(\"paper\") > -1;\n\n if (isPaper && !eventData.hasOwnProperty(\"is_paper\")) {\n eventData.is_paper = true;\n }\n\n const key = `${eventName}-${JSON.stringify(eventData)}`;\n const rateExceeded =\n Date.now() - (this.eventHistory.get(key) ?? 0) < this.eventHistoryTimeout;\n\n // If we have an event name and data (optional)\n // If we have not exceeded the rate limit\n if (eventName && !rateExceeded) {\n getAmplitude().logEvent(eventName, eventData);\n this.eventHistory.set(key, Date.now());\n }\n\n // Clear expired events\n this.eventHistory.forEach((timestamp, key) => {\n if (Date.now() - timestamp > this.eventHistoryTimeout) {\n this.eventHistory.delete(key);\n }\n });\n };\n\n getEventName = (event) => {\n const { target, detail } = event;\n const attribute = \"amplitude-event-name\";\n\n if (target && \"getAttribute\" in target) {\n return target.getAttribute(attribute);\n }\n\n if (detail) {\n return detail[attribute];\n }\n\n return null;\n };\n\n getEventData = (event) => {\n const { target, detail } = event;\n\n if (target && \"getAttribute\" in target) {\n try {\n return JSON.parse(target.getAttribute(\"amplitude-event-data\"));\n } catch {\n // ignore\n }\n }\n\n if (detail && \"amplitude-event-data\" in detail) {\n const data = detail[\"amplitude-event-data\"];\n\n try {\n return JSON.parse(data);\n } catch {\n return data;\n }\n }\n\n return null;\n };\n}\n\nexport const getAmplitude = () => window.amplitude?.getInstance();\n\nexport default AmplitudeProvider;\n","import { isLiveAccountClosedOrDisabled, isPaperOrOnboarding } from \"selectors\";\n\nexport const isNotFullActiveAccount = (account) =>\n !account ||\n isPaperOrOnboarding(account) ||\n isLiveAccountClosedOrDisabled(account);\n","import { useEffect, useState } from \"react\";\nimport { getCountryOfCitizenship } from \"../rest/account\";\n\nexport const useGetCitizenship = () => {\n const [country, setCountry] = useState<string>(\"\");\n\n useEffect(() => {\n async function fetchCitizenship() {\n const country = await getCountryOfCitizenship();\n setCountry(country);\n }\n fetchCitizenship();\n }, []);\n\n return { country };\n};\n\nexport default useGetCitizenship;\n","import { CountryInfo, Nullable } from \"src/v2/types\";\n\ntype CountryInfoMap = {\n [key: string]: CountryInfo;\n};\n\n// we use a hook in-case we want to fetch backend data in the future\nexport const useGetCryptoEnabled = (\n country: Nullable<string>,\n state: Nullable<string>,\n infoMap: Nullable<CountryInfoMap>\n) => {\n if (country && country !== \"USA\") {\n return Boolean(infoMap?.[country]?.crypto_enabled);\n }\n\n // need both country and state to be defined for U.S.\n if (!country || !state) {\n return false;\n }\n\n const supported = window.env.SUPPORTED_CRYPTO_STATES || \"\";\n return supported.split(\",\").includes(state?.toUpperCase());\n};\n\nexport default useGetCryptoEnabled;\n","import useRequest, { QueryOptions } from \"./useRequest\";\nimport { getDetails, OwnerDetails } from \"../rest/account\";\n\nexport const useGetAccountDetails = (\n key: any | any[] = \"\",\n accountID: string = \"\",\n options?: QueryOptions<OwnerDetails>\n) => {\n const { data: details, refetch } = useRequest(\n key,\n () => getDetails(accountID),\n { refetchInterval: false, enabled: !!accountID, ...options }\n );\n\n return { details, refetch };\n};\n\nexport default useGetAccountDetails;\n","import { CountryInfo } from \"src/v2/types\";\nimport { useEffect, useState } from \"react\";\nimport { getCountryInfos } from \"../rest/onboarding\";\n\nexport const useGetCountryInfos = () => {\n const [infos, setInfos] = useState<{ [key: string]: CountryInfo }>({});\n\n useEffect(() => {\n async function fetch() {\n setInfos(await getCountryInfos());\n }\n fetch();\n }, []);\n\n return {\n infos,\n canLimitedFund: (alpha3: string) => alpha3 === \"USA\",\n };\n};\n\nexport type UseGetCountyInfosReturn = ReturnType<typeof useGetCountryInfos>;\n\nexport default useGetCountryInfos;\n","import { useCallback, useState } from \"react\";\n\nexport const useLock = ({\n initialLocked = true,\n}: {\n initialLocked?: boolean;\n} = {}) => {\n // initially unlocked\n const [locked, setLocked] = useState(false);\n\n // a function that locks\n const lock = useCallback(() => setLocked(initialLocked), []);\n\n // a function that unlocks\n const unlock = useCallback(() => setLocked(false), []);\n\n // a function that toggles\n const toggle = useCallback(() => setLocked(!locked), [locked]);\n\n // a function that locks for a given duration\n const lockFor = useCallback(\n (duration: number) => {\n setLocked(true);\n setTimeout(unlock, duration);\n },\n [unlock]\n );\n\n // a function that locks until a given date\n const lockUntil = useCallback(\n (until: number) => {\n setLocked(true);\n setTimeout(unlock, until - Date.now());\n },\n [unlock]\n );\n\n return {\n locked,\n lock,\n unlock,\n toggle,\n lockFor,\n lockUntil,\n };\n};\n\nexport default useLock;\n","import instance from \"..\";\nimport { Portfolio } from \"./account\";\n\nexport interface PortfolioHistoryResponse {\n arrays: [number[], number[], number[], number[]];\n attributes: { name: string; type: string }[];\n base_value: number;\n base_value_asof: string; // YYYY-MM-DD\n timeframe: string;\n}\n\nexport interface GetPortfolioArgs {\n accountID: string;\n product: string;\n intraday_reporting?: \"market_hours\" | \"extended_hours\" | \"continuous\";\n start?: string;\n end?: string;\n pnl_reset?: \"per_day\" | \"no_reset\";\n period?: \"1D\" | \"1W\" | \"1M\" | \"1A\" | \"all\";\n}\n\nexport const getPortfolioHistory = async ({\n accountID,\n product,\n start,\n end,\n pnl_reset,\n period = \"1D\",\n intraday_reporting = \"extended_hours\",\n}: GetPortfolioArgs) => {\n const isLiveAccount = product === \"live\";\n\n const endpoint = `/${\n isLiveAccount ? \"accounts\" : \"paper_accounts\"\n }/${accountID}/portfolio/history`;\n\n const res = await instance.get<PortfolioHistoryResponse>(endpoint, {\n params: {\n ...(start && { start }),\n ...(end && { end }),\n ...(pnl_reset && { pnl_reset }),\n ...(period && { period }),\n ...(intraday_reporting && { intraday_reporting }),\n },\n });\n\n return res.data;\n};\n","import { useRequest } from \".\";\nimport {\n GetPortfolioArgs,\n getPortfolioHistory,\n PortfolioHistoryResponse,\n} from \"../rest/portfolio\";\nimport { QueryOptions } from \"./useRequest\";\n\nexport interface UseGetPortfolioHistoryArgs extends GetPortfolioArgs {\n options?: QueryOptions<PortfolioHistoryResponse>;\n}\n\nexport const useGetPortfolioHistory = ({\n options,\n ...rest\n}: UseGetPortfolioHistoryArgs) => {\n const { data, ...restResponse } = useRequest(\n [\"portfolio\", ...Object.values(rest)],\n () => getPortfolioHistory({ ...rest }),\n {\n ...options,\n // todo: revisit this override of default behavior (duplicate error handling)\n onError: () => null,\n }\n );\n\n return { portfolio: data, ...restResponse };\n};\n\nexport default useGetPortfolioHistory;\n","import { useRequest } from \".\";\nimport { getPositions } from \"../rest/account\";\n\n// todo: parameter-ize this hook\nexport const useGetPositions = (\n accountID?: string,\n product?: string,\n options = {}\n) => {\n const { data, ...rest } = useRequest(\n [\"position\", accountID],\n () => getPositions({ accountID: accountID || \"\", product }),\n {\n ...options,\n // todo: revisit this override of default behavior (duplicate error handling)\n onError: () => null,\n }\n );\n\n return { positions: data || [], ...rest };\n};\n\nexport default useGetPositions;\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { getStatus, Status } from \"../rest/status\";\n\nexport const useGetStatus = (\n key: any | any[] = \"\",\n options?: QueryOptions<Status>\n) => {\n const { data: status } = useRequest(key, () => getStatus(), {\n ...options,\n });\n\n return { status };\n};\n\nexport default useGetStatus;\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { Asset, getAsset } from \"../rest\";\n\nexport const useGetAsset = (\n key: any | any[] = \"\",\n symbol: string,\n options?: QueryOptions<Asset>\n) => {\n const { data, refetch, isFetched } = useRequest(key, () => getAsset(symbol), {\n ...options,\n cacheTime: 9999999,\n refetchInterval: false,\n });\n\n return { asset: data, refetch, isFetched };\n};\n\nexport default useGetAsset;\n","import { useRequest } from \".\";\nimport { getOrderbooks } from \"../rest/data\";\n\nexport const useGetOrderbooks = (symbols: string[]) => {\n const { data } = useRequest(\n [symbols, \"orderbook\"],\n () => getOrderbooks(symbols),\n {\n staleTime: 1000,\n refetchInterval: 1000,\n }\n );\n return { orderbooks: data?.orderbooks };\n};\n\nexport default useGetOrderbooks;\n","import { useRequest } from \".\";\nimport { getPosition } from \"../rest/account\";\n\nexport const useGetPosition = (\n accountID?: string,\n symbol?: string,\n product?: string,\n options = {}\n) => {\n const { data } = useRequest(\n [\"position\", symbol, accountID],\n () =>\n getPosition({\n accountID: accountID || \"\",\n symbol: (symbol || \"\").replace(\"/\", \"\"),\n paper: product === \"paper\",\n }),\n {\n ...options,\n onError: (error) => {\n // do nothing\n },\n }\n );\n return { position: data };\n};\n\nexport default useGetPosition;\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { getClock, Clock } from \"../rest/data\";\n\nexport const useGetClock = (\n key: any | any[] = \"\",\n options?: QueryOptions<Clock>\n) => {\n const { data: clock } = useRequest(key, () => getClock(), { ...options });\n\n return { clock };\n};\n\nexport default useGetClock;\n","import { useMemo } from \"react\";\nimport { useRequest } from \".\";\nimport { getOrders, Order } from \"../rest/account\";\nimport { QueryOptions } from \"./useRequest\";\n\nexport const useGetOrders = (\n accountID: string,\n product: string,\n options?: QueryOptions<Order[]>,\n status?: \"open\" | \"closed\" | \"all\",\n side?: \"buy\" | \"sell\" | \"sell_short\",\n limit?: number\n) => {\n const { data, refetch, isLoading } = useRequest(\n [\"orders\", accountID, status, side, limit],\n () =>\n getOrders({\n accountID: accountID || \"\",\n paper: product === \"paper\",\n symbols: [],\n status: status ? status : \"all\",\n side: side,\n limit,\n }),\n options\n );\n\n // Required to avoid infinite rerender loop\n const emptyOrders = useMemo(() => [], []);\n\n return { orders: data || emptyOrders, refetch, isLoading };\n};\n\nexport default useGetOrders;\n","import { useRequest } from \".\";\nimport { getCryptoSnapshots } from \"../rest/data\";\n\nexport const useGetCryptoSnapshots = (symbols: (string | any)[]) => {\n const { data } = useRequest(\n [symbols, \"snapshots\"],\n () => getCryptoSnapshots({ symbols }),\n {\n enabled: !!symbols.length,\n refetchInterval: 10000,\n staleTime: 10000,\n }\n );\n\n return { ...data?.snapshots };\n};\n\nexport default useGetCryptoSnapshots;\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { getAccessKeys, AccessKey } from \"../rest/account\";\n\nexport const useGetAccessKeys = (\n options?: QueryOptions<AccessKey[]> & { accountID?: string }\n) => {\n const { data, ...rest } = useRequest(\n [\"access-keys\", options?.accountID],\n () => getAccessKeys({ accountID: options?.accountID }),\n {\n ...options,\n cacheTime: 1000 * 60 * 5,\n }\n );\n\n return { access_keys: data || [], ...rest };\n};\n\nexport default useGetAccessKeys;\n","import { useToast } from \"@chakra-ui/react\";\nimport { useCallback } from \"react\";\nimport {\n PlaidAccount,\n PlaidLinkOnEvent,\n PlaidLinkOnExit,\n PlaidLinkOnSuccess,\n PlaidLinkOnSuccessMetadata,\n PlaidLinkStableEvent,\n usePlaidLink,\n} from \"react-plaid-link\";\nimport { useQueryClient } from \"react-query\";\nimport { Account } from \"src/v2/api/rest/account\";\nimport {\n createBankRelationship,\n verifyBankRelationship,\n MutateBankRelationshipParams,\n VerifyBankRelationshipArgs,\n BankRelationships,\n getBankRelationships,\n} from \"../rest/relationships\";\nimport * as Sentry from \"@sentry/browser\";\nimport { CaptureContext } from \"@sentry/types\";\n\nimport { getPlaidAuthStatus, getPlaidLinkToken } from \"../rest/plaid\";\nimport { ACHRelationship } from \"../rest/relationships\";\nimport { getOnfidoSdkToken } from \"../rest/onfido\";\nimport useRequest, { QueryOptions } from \"./useRequest\";\nimport useMutationRequest from \"./useMutationRequest\";\nimport AmplitudeProvider from \"src/AmplitudeProvider\";\n\ntype PlaidLinkToken = { expiration: string; link_token: string };\nconst usePlaidLinkToken = (\n accountID: string,\n options: QueryOptions<PlaidLinkToken>\n) =>\n useRequest<PlaidLinkToken>(\n [\"plaid-token\", accountID],\n () => getPlaidLinkToken(accountID),\n options\n );\n\n// hook to integrate plaid\n// it is a light wrapper on top of react-plaid-link\ntype UsePlaidCallbacks = {\n onSuccess?: PlaidLinkOnSuccess;\n onExit?: PlaidLinkOnExit;\n};\n\nexport const usePlaid = (\n account: Account | undefined,\n cb: UsePlaidCallbacks = {},\n createRelationshipCb?: () => void\n) => {\n const accountID = account?.id ?? \"\";\n const queryClient = useQueryClient();\n const toast = useToast();\n\n const { data: relationshipResp } = useAccountRelationships(accountID, {\n enabled: Boolean(account),\n });\n\n const { mutate: createRelationship } = useMutationRequest(\n (body: MutateBankRelationshipParams) =>\n createBankRelationship(accountID, body),\n { onSuccess: createRelationshipCb }\n );\n\n const { mutate: verifyRelationship } = useMutationRequest(\n (body: VerifyBankRelationshipArgs) => verifyBankRelationship(body)\n );\n\n const { data: linkResp } = usePlaidLinkToken(accountID, {\n enabled: Boolean(account),\n });\n\n const relationships = relationshipResp ?? [];\n const hasRelationship = relationships.length > 0;\n const relationship = hasRelationship ? relationships[0] : null;\n const token = linkResp?.link_token ?? null;\n\n const onSuccess: PlaidLinkOnSuccess = async (public_token, md) => {\n // overwrite metadata type\n const metadata = md as PlaidLinkOnSuccessMetadata & {\n account: PlaidAccount;\n account_id: string;\n };\n\n // accountID for our id\n // account_id for plaid account id\n const account = metadata?.accounts?.[0] ?? metadata?.account;\n\n const account_id = account?.id;\n const name = account?.name;\n const mask = account?.mask;\n\n if (!account || !accountID || !name || !mask) {\n const errMsg = \"plaid metadata is not available\";\n const info = {\n account: metadata.account,\n account_id,\n name,\n mask,\n accounts: metadata.accounts,\n };\n\n toast({\n status: \"error\",\n description: errMsg,\n });\n\n console.error(errMsg, info);\n Sentry.captureException(new Error(errMsg), info as CaptureContext);\n return;\n }\n\n let verification_status = account?.verification_status;\n // Status is omitted when null. Seems that this is the result of either\n // a successful instant or manual auth. If it's a manual auth we can\n // check the auth status manually\n\n // I dont think this check is even needed.\n // verification_status is always null.\n // getPlaidAuthStatus simply sets it to \"\" instead of null which can be done client side... ??\n if (!verification_status && hasRelationship) {\n // Status is omitted when null. Seems that this is the result of either\n // a successful instant or manual auth. If it's a manual auth we can\n // check the auth status manually.\n\n // TODO FIX type here\n const authInfo = await queryClient.fetchQuery(\n [\"plaid-auth\", account_id],\n () => getPlaidAuthStatus(account_id)\n );\n verification_status = authInfo?.verification_status ?? \"\";\n\n if (!verification_status) {\n toast({\n status: \"error\",\n description: \"plaid link result contained empty verification_status\",\n });\n return;\n }\n }\n\n const body: MutateBankRelationshipParams = {\n plaid: {\n public_token,\n account_id,\n name: name,\n mask: mask,\n verification_status: verification_status,\n },\n };\n // create relationship or verify relationship based on verification status\n switch (verification_status) {\n case \"manually_verified\":\n verifyRelationship({\n accountID: accountID,\n relationshipID: relationship?.id ?? \"\",\n body,\n });\n break;\n case \"pending_automatic_verification\":\n case \"pending_manual_verification\":\n default:\n createRelationship(body);\n break;\n }\n\n AmplitudeProvider.dispatch(\"plaid_finished\", {\n verification_status: verification_status,\n account_id: account_id,\n });\n\n // call success callback if provided\n cb.onSuccess && cb.onSuccess(public_token, metadata);\n };\n\n const onEvent: PlaidLinkOnEvent = (eventName, metadata) => {\n let eventData;\n switch (eventName) {\n case PlaidLinkStableEvent.OPEN: {\n eventData = {\n event: PlaidLinkStableEvent.OPEN,\n view_name: metadata.view_name,\n };\n break;\n }\n case PlaidLinkStableEvent.HANDOFF: {\n eventData = {\n event: PlaidLinkStableEvent.HANDOFF,\n view_name: metadata.institution_name,\n };\n break;\n }\n case PlaidLinkStableEvent.EXIT: {\n eventData = {\n event: PlaidLinkStableEvent.EXIT,\n exit_status: metadata.exit_status,\n error_code: metadata.error_code,\n error_type: metadata.error_type,\n institution_name: metadata.institution_name,\n };\n break;\n }\n case PlaidLinkStableEvent.ERROR: {\n eventData = {\n event: PlaidLinkStableEvent.ERROR,\n error_code: metadata.error_code,\n error_message: metadata.error_message,\n error_type: metadata.error_type,\n institution_name: metadata.institution_name,\n };\n break;\n }\n default:\n break;\n }\n\n if (eventData) {\n AmplitudeProvider.dispatch(\"plaid_event\", JSON.stringify(eventData));\n }\n };\n\n const onExit = useCallback<PlaidLinkOnExit>((err, metadata) => {\n // custom behavior for exit called here\n cb.onExit && cb.onExit(null, metadata);\n\n // no errors nothing to do\n if (!err) return;\n\n const info = {\n err,\n request_id: metadata.request_id,\n session_id: metadata.link_session_id,\n };\n const errMsg = `plaid link error encountered: ${err.error_code}`;\n\n toast({\n title: \"Something went wrong\",\n status: \"error\",\n description: errMsg,\n });\n\n console.error(errMsg, info);\n Sentry.captureException(new Error(errMsg), info as CaptureContext);\n }, []);\n\n const plaidLink = usePlaidLink({\n token,\n onSuccess,\n onExit,\n onEvent,\n userLegalName: account?.name,\n userEmailAddress: account?.email,\n });\n\n return plaidLink;\n};\n\nconst useAccountRelationships = (\n accountID: string,\n options: QueryOptions<BankRelationships>\n) =>\n useRequest(\n [\"relationships\", accountID],\n () => getBankRelationships(accountID),\n options\n );\n\nexport default usePlaid;\n","import { useQuery } from \"react-query\";\nimport { getCountries } from \"../rest/onboarding\";\n\nexport type Country = {\n name: string;\n \"alpha-3\": string;\n \"country-code\": string;\n};\n\nexport const useGetCountries = () => {\n const { data: countries = [] } = useQuery(\"countries\", getCountries, {\n // It's so unlikely that this will change, we can cache it forever\n staleTime: Infinity,\n });\n\n return {\n countries,\n countriesRaw: countries,\n alpha3ToName: (alpha3: string) =>\n countries.find(({ [\"alpha-3\"]: short }) => short === alpha3)?.name,\n nameToAlpha3: (name: string) =>\n countries.find(({ name: n }) => n === name)?.[\"alpha-3\"],\n };\n};\n\nexport type UseGetCountriesReturn = ReturnType<typeof useGetCountries>;\n\nexport default useGetCountries;\n","import useRequest, { QueryOptions } from \"./useRequest\";\nimport {\n getDetails,\n getTrustedAccount,\n OwnerDetails,\n TrustedContact,\n} from \"../rest/account\";\n\nexport const useGetTrustedContact = (\n key: any | any[] = \"\",\n accountID: string = \"\",\n options?: QueryOptions<TrustedContact>\n) => {\n const { data: details, refetch, isFetched } = useRequest(\n key,\n () => getTrustedAccount(accountID),\n { ...options, refetchInterval: false }\n );\n\n return { trusted_contact: details, refetch, isFetched };\n};\n\nexport default useGetTrustedContact;\n","import { useRequest } from \".\";\nimport { getActivities, GetActivitiesParams } from \"../rest/account\";\n\nexport const useGetActivities = (\n { accountID, paper, activityTypes, after, date, until }: GetActivitiesParams,\n options = {}\n) => {\n const { data, ...rest } = useRequest(\n [\n \"activity\",\n accountID,\n paper,\n activityTypes?.join(\",\"),\n after,\n date,\n until,\n ],\n () =>\n getActivities({\n accountID: accountID || \"\",\n paper,\n activityTypes,\n after,\n date,\n until,\n }),\n {\n ...options,\n // todo: revisit this override of default behavior (duplicate error handling)\n onError: () => null,\n }\n );\n\n return { activities: data || [], ...rest };\n};\n\nexport default useGetActivities;\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { QueryObserverResult } from \"react-query\";\nimport { AchRelationship, getAchRelationships } from \"../rest/banking\";\n\ntype UseGetAchRelationships = {\n achRelationships?: AchRelationship[];\n refetch: () => Promise<QueryObserverResult<AchRelationship[], unknown>>;\n};\n\nexport const useGetAchRelationships = (\n accountId?: string,\n key: any | any[] = \"\",\n options?: QueryOptions<AchRelationship[]>\n): UseGetAchRelationships => {\n const { data: achRelationships, refetch } = useRequest(\n \"ach-relationships\" + key,\n () => getAchRelationships(accountId || \"\"),\n {\n ...options,\n }\n );\n\n return { achRelationships, refetch };\n};\n","import { getCashWithdrawable } from \"../rest/banking\";\nimport useRequest, { QueryOptions } from \"./useRequest\";\n\ntype UseGetCashWithdrawableProps = {\n accountID: string;\n key?: any | any[];\n options?: QueryOptions<number>;\n};\n\nexport const useGetCashWithdrawable = ({\n accountID,\n key = \"cash-withdrawable\",\n options,\n}: UseGetCashWithdrawableProps) => {\n const cashWithdrawable = useRequest(\n [key, accountID],\n () => getCashWithdrawable(accountID),\n {\n ...options,\n }\n );\n\n return cashWithdrawable;\n};\n","import { useMemo } from \"react\";\nimport { useRequest } from \"src/v2/api/hooks\";\nimport {\n getAchTransfers,\n getRapydTransfers,\n Transfer,\n} from \"src/v2/api/rest/banking\";\nimport { getCurrencyCloudTransfers } from \"src/v2/api/rest/currencyCloud\";\n\ntype UseGetAllTransfersProps = {\n accountID: string;\n isCurrencyCloudEnabled?: boolean;\n refetchOnMount?: boolean | \"always\";\n};\n\nexport type UseGetAllTransfersReturn = {\n achAndWire: {\n transfers: Transfer[];\n isLoading: boolean;\n refetch: () => void;\n };\n rapyd: {\n transfers: Transfer[];\n isLoading: boolean;\n refetch: () => void;\n };\n currencyCloud: {\n transfers: Transfer[];\n isLoading: boolean;\n refetch: () => void;\n };\n};\n\nexport const useGetAllTransfers = ({\n accountID,\n isCurrencyCloudEnabled,\n refetchOnMount,\n}: UseGetAllTransfersProps): UseGetAllTransfersReturn => {\n // This actually includes wire transfers too\n const achAndWire = useRequest(\n [\"ach-transfers\", accountID],\n () => getAchTransfers(accountID),\n {\n enabled: !!accountID,\n refetchOnMount,\n }\n );\n\n const rapyd = useRequest(\n [\"rapyd-transfers\", accountID],\n () => getRapydTransfers(accountID),\n {\n enabled: !!accountID,\n refetchOnMount,\n }\n );\n\n const currencyCloud = useRequest(\n \"cc-transfers\",\n () => getCurrencyCloudTransfers(accountID),\n {\n enabled: !!accountID && isCurrencyCloudEnabled,\n refetchOnMount,\n }\n );\n\n const ccTransfers: Transfer[] = useMemo(\n () =>\n currencyCloud.data?.map((cc) => ({\n id: cc.id,\n status: cc.status,\n amount: parseFloat(cc.amount),\n created_at: cc.created_at,\n type: \"CurrencyCloud\",\n direction: cc.direction,\n })) ?? [],\n [currencyCloud.data]\n );\n\n return {\n achAndWire: {\n transfers: achAndWire.data || [],\n isLoading: achAndWire.isLoading,\n refetch: achAndWire.refetch,\n },\n rapyd: {\n transfers: rapyd.data || [],\n isLoading: rapyd.isLoading,\n refetch: rapyd.refetch,\n },\n currencyCloud: {\n transfers: ccTransfers || [],\n isLoading: currencyCloud.isLoading,\n refetch: currencyCloud.refetch,\n },\n };\n};\n","import { useGetCurrencyCloudStatus, useRequest } from \"src/v2/api/hooks\";\nimport { Account, Bank, getBanks } from \"src/v2/api/rest/account\";\nimport {\n getAchRelationships,\n getBankInstitution,\n} from \"src/v2/api/rest/banking\";\nimport { AchRelationshipWithBankInfo } from \"../../pages/dashboard/funding/common/types\";\nimport { getCountryInfos } from \"src/v2/api/rest/onboarding\";\nimport { useGetCurrencyCloudAccount } from \"src/v2/api/hooks\";\nimport { useMemo } from \"react\";\nimport {\n GetCurrencyCloudAccountResponse,\n GetCurrencyCloudStatusResponse,\n} from \"src/v2/api/rest/currencyCloud\";\nimport { QueryObserverResult } from \"react-query\";\n\ntype UseGetAllRelationshipsProps = {\n account: Account | undefined;\n countryOfTaxResidence: string;\n key?: string[];\n};\n\nexport type UseGetAllRelationshipsReturn = {\n ach: {\n relationships: AchRelationshipWithBankInfo[];\n isLoading: boolean;\n refetch: () => Promise<\n QueryObserverResult<AchRelationshipWithBankInfo[], unknown>\n >;\n };\n wire: {\n relationships: Bank[];\n isLoading: boolean;\n refetch: () => Promise<QueryObserverResult<Bank[], unknown>>;\n };\n currencyCloud: {\n account: GetCurrencyCloudAccountResponse | undefined;\n status: GetCurrencyCloudStatusResponse | undefined;\n isLoading: boolean;\n isEnabled: boolean;\n refetchAccount: () => Promise<\n QueryObserverResult<GetCurrencyCloudAccountResponse, unknown>\n >;\n refetchStatus: () => Promise<\n QueryObserverResult<GetCurrencyCloudStatusResponse, unknown>\n >;\n };\n};\n\nexport const useGetAllRelationships = ({\n account,\n countryOfTaxResidence,\n key = [\"get-all-relationships\"],\n}: UseGetAllRelationshipsProps): UseGetAllRelationshipsReturn => {\n const accountID = account?.id ?? \"\";\n const isLegalEntity = account?.is_legal_entity ?? false;\n\n const ach = useRequest(\n [...key, \"ach-relationships\", accountID],\n async () => {\n const relationships = await getAchRelationships(accountID);\n\n // All this just for bank logos >:(\n return Promise.all(\n (relationships ?? []).map(async (relationship) => {\n // if no plaid_institution use generic bank logo\n if (!relationship.plaid_institution) {\n return {\n ...relationship,\n logo: \"/resources/images/bank.svg\",\n brand_name: relationship.account_name ?? \"\",\n };\n }\n\n try {\n const bankInstitution = await getBankInstitution(\n relationship.plaid_institution\n );\n\n const bankRelationship: AchRelationshipWithBankInfo = {\n ...bankInstitution,\n ...relationship,\n logo: `data:image/png;base64,${bankInstitution.logo}`,\n };\n\n return bankRelationship;\n } catch (error) {\n console.error(\"Failed to get bank institution\", error);\n return {\n ...relationship,\n logo: \"/resources/images/bank.svg\",\n brand_name: relationship.account_name ?? \"\",\n };\n }\n })\n );\n },\n {\n enabled: !!accountID,\n refetchOnMount: \"always\",\n }\n );\n\n const banks = useRequest(\n [...key, \"banks\", accountID],\n () => getBanks({ accountID }),\n {\n enabled: !!accountID,\n refetchOnMount: \"always\",\n }\n );\n\n const { data: countryInfo } = useRequest(\"countryInfos\", () =>\n getCountryInfos()\n );\n\n const isCurrencyCloudEnabled = useMemo(\n () =>\n !isLegalEntity &&\n (countryInfo?.[countryOfTaxResidence]?.currencycloud_enabled ?? false),\n [isLegalEntity, countryInfo, countryOfTaxResidence]\n );\n\n const ccStatus = useGetCurrencyCloudStatus({\n accountID,\n key: [...key, \"cc-status\", accountID],\n options: {\n enabled: !!accountID && isCurrencyCloudEnabled,\n refetchOnMount: \"always\",\n },\n });\n\n const ccAccount = useGetCurrencyCloudAccount({\n accountID,\n key: [...key, \"cc-account\", accountID],\n options: {\n enabled:\n !!accountID &&\n isCurrencyCloudEnabled &&\n // returns 500 server error when beneficiary does not exist\n ccStatus.data?.beneficiary_exists === \"true\",\n refetchOnMount: \"always\",\n },\n });\n\n return {\n ach: {\n relationships: ach.data || [],\n isLoading: ach.isLoading,\n refetch: ach.refetch,\n },\n wire: {\n relationships: banks.data || [],\n isLoading: banks.isLoading,\n refetch: banks.refetch,\n },\n currencyCloud: {\n account: ccAccount.data,\n status: ccStatus.data,\n isLoading: ccAccount.isLoading && ccStatus.isLoading,\n isEnabled: isCurrencyCloudEnabled,\n refetchAccount: ccAccount.refetch,\n refetchStatus: ccStatus.refetch,\n },\n };\n};\n","import useRequest, { QueryOptions } from \"./useRequest\";\nimport { getWatchlists, Watchlist } from \"../rest/account\";\n\nexport const useGetWatchlists = (\n key: any | any[] = \"\",\n accountID: string = \"\",\n options?: QueryOptions<Watchlist[]>\n) => {\n const { data: watchlists, refetch, isFetched } = useRequest(\n key,\n () => getWatchlists({ accountID }),\n { ...options, refetchInterval: false }\n );\n\n return { watchlists, refetch, isFetched };\n};\n\nexport default useGetWatchlists;\n","import useRequest, { QueryOptions } from \"./useRequest\";\nimport { getWatchlist, Watchlist } from \"../rest/account\";\n\nexport const useGetWatchlist = (\n key: any | any[] = \"\",\n accountID: string = \"\",\n name: string = \"Primary Watchlist\",\n options?: QueryOptions<Watchlist>\n) => {\n const { data: watchlist, refetch, isFetched } = useRequest(\n key,\n () => getWatchlist({ accountID, name }),\n { ...options, refetchInterval: false }\n );\n\n return { watchlist, refetch, isFetched };\n};\n\nexport default useGetWatchlist;\n","import { getQuotes, Quote } from \"../rest/data\";\nimport useRequest, { QueryOptions } from \"./useRequest\";\n\nexport const useGetQuotes = (\n key: any | any[] = \"\",\n symbols: string[] = [],\n options?: QueryOptions<Quote[]>,\n source?: string\n) => {\n const {\n data: quotes,\n refetch,\n isFetched,\n } = useRequest(key, () => getQuotes(symbols, source), {\n ...options,\n refetchInterval: false,\n });\n\n return { quotes, refetch, isFetched };\n};\n\nexport default useGetQuotes;\n","export type IpAddressResponse = {\n ip_address: string;\n};\n\nexport const getIpAddress = async () => {\n const response = await fetch(\"https://alpaca.markets/_ip_address\");\n const data = await response.json();\n\n return data;\n};\n","import { getIpAddress, IpAddressResponse } from \"../rest/ip\";\n\nimport { useState } from \"react\";\nimport { useQuery } from \"react-query\";\n\nexport const useGetIpAddress = () => {\n const [ipAddress, setIpAddress] = useState<string>(\"\");\n\n useQuery(\"ip-address\", getIpAddress, {\n cacheTime: 0,\n onSuccess: (data) => setIpAddress(data.ip_address),\n });\n\n return {\n ipAddress,\n };\n};\n\nexport default useGetIpAddress;\n","import useRequest, { QueryOptions } from \"./useRequest\";\nimport {\n OptionsApprovalStatus,\n getOptionsApprovalStatus,\n} from \"../rest/account\";\n\nexport const useGetOptionsApprovalStatus = (\n key: any | any[] = \"\",\n accountID: string = \"\",\n options?: QueryOptions<OptionsApprovalStatus>\n) => {\n const { data, isLoading } = useRequest(key, () => getOptionsApprovalStatus(accountID), {\n ...options,\n });\n\n return { data, isLoading };\n};\n","import useRequest, { QueryOptions } from \"./useRequest\";\nimport { OwnerDocument, getOwnerDocuments } from \"../rest/entityOnboarding\";\n\nexport const useGetOwnerDocuments = (\n key: any | any[] = \"\",\n accountId: string,\n ownerId: string,\n options?: QueryOptions<OwnerDocument[]>\n) => {\n const { data, refetch } = useRequest(\n key,\n () => getOwnerDocuments(accountId, ownerId),\n {\n refetchInterval: false,\n enabled: !!ownerId && !!accountId,\n ...options,\n }\n );\n\n return { documents: data ?? [], refetch };\n};\n\nexport default useGetOwnerDocuments;\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { getEliteNetDeposits } from \"../rest/elite\";\n\nexport const useGetEliteNetDeposits = (\n key: any | any[] = \"elite-net-deposit\",\n accountID: string,\n options?: QueryOptions<string>\n) => {\n const { data } = useRequest(key, () => getEliteNetDeposits(accountID), {\n ...options,\n });\n\n return { netDeposit: data };\n};\n\nexport default useGetEliteNetDeposits;\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { AlgoRouting, getEliteAlgoRouting } from \"../rest/elite\";\n\nexport const useGetEliteAlgoRouting = (\n key: any | any[] = \"elite-net-deposit\",\n accountID: string,\n options?: QueryOptions<AlgoRouting>\n) => {\n const { data } = useRequest(key, () => getEliteAlgoRouting(accountID), {\n ...options,\n });\n\n return { ...data };\n};\n\nexport default useGetEliteAlgoRouting;\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { ElitePerks, getElitePerks } from \"../rest/elite\";\n\nexport const useGetElitePerks = (\n key: any | any[] = \"elite-perks\",\n accountID: string,\n options?: QueryOptions<ElitePerks>\n) => {\n const { data, refetch } = useRequest(key, () => getElitePerks(accountID), {\n ...options,\n });\n\n return { perks: data, refetch };\n};\n\nexport default useGetElitePerks;\n","import { UseMutationResult, useMutation } from \"react-query\";\nimport { DocUploadData, uploadAccountDocument } from \"../rest/account\";\n\ninterface PostAccountDocumentRequest {\n docId: string;\n payload: DocUploadData;\n}\n\ninterface PostAccountDocumentMutationProps {\n onSuccess: (response: DocUploadData) => void;\n onError: (e: unknown) => void;\n onSettled?: () => void;\n onMutate?: () => void;\n}\n\nexport const usePostAccountDocument = ({\n onSuccess,\n onError,\n onMutate,\n onSettled,\n}: PostAccountDocumentMutationProps): UseMutationResult<\n DocUploadData,\n object,\n PostAccountDocumentRequest,\n unknown\n> => {\n return useMutation({\n mutationFn: (request) =>\n uploadAccountDocument(request.docId, request.payload),\n onMutate: (): void => {\n onMutate?.();\n },\n onSuccess: (response): void => {\n onSuccess(response);\n },\n onError: (e): void => {\n onError(e);\n },\n onSettled: (): void => {\n onSettled?.();\n },\n });\n};\n","import { UseMutationResult, useMutation } from \"react-query\";\nimport { DocUploadData } from \"../rest/account\";\nimport { acceptW8 } from \"../rest/onboarding\";\n\ninterface PostW8BenRequest {\n accountId: string;\n}\n\ninterface PostW8BenMutationProps {\n onSuccess: () => void;\n onError: (e: unknown) => void;\n onSettled?: () => void;\n onMutate?: () => void;\n}\n\nexport const usePostW8Ben = ({\n onSuccess,\n onError,\n onMutate,\n onSettled,\n}: PostW8BenMutationProps): UseMutationResult<\n object,\n object,\n PostW8BenRequest,\n unknown\n> => {\n return useMutation({\n mutationFn: (request) => acceptW8(request.accountId),\n onMutate: (): void => {\n onMutate?.();\n },\n onSuccess: (): void => {\n onSuccess();\n },\n onError: (e): void => {\n onError(e);\n },\n onSettled: (): void => {\n onSettled?.();\n },\n });\n};\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { UseQueryResult } from \"react-query\";\nimport {\n DocumentRequestResponse,\n getAccountDocumentRequests,\n} from \"../rest/account\";\n\nexport const useGetAccountDocumentRequests = (\n accountId?: string,\n options?: QueryOptions<DocumentRequestResponse[]>\n): UseQueryResult<DocumentRequestResponse[]> => {\n return useRequest(\n [\"account_document_requests\", accountId],\n () => getAccountDocumentRequests(accountId || \"\"),\n {\n ...options,\n }\n );\n};\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { UseQueryResult } from \"react-query\";\nimport { DocumentRequestResponse, getAccountDocuments } from \"../rest/account\";\n\nexport const useGetAccountDocumentUploads = (\n accountId?: string,\n options?: QueryOptions<DocumentRequestResponse[]>\n): UseQueryResult<DocumentRequestResponse[]> => {\n return useRequest(\n [\"account_document_uploads\", accountId],\n () => getAccountDocuments(accountId || \"\"),\n {\n ...options,\n }\n );\n};\n","import {\n getCurrencyCloudAccount,\n GetCurrencyCloudAccountResponse,\n getCurrencyCloudBeneficiaryRequiredDetails,\n GetCurrencyCloudBeneficiaryResponse,\n getCurrencyCloudStatus,\n GetCurrencyCloudStatusResponse,\n} from \"../rest/currencyCloud\";\nimport useRequest, { QueryOptions } from \"./useRequest\";\n\ntype UseGetCurrencyCloudAccountProps = {\n accountID: string;\n key?: any | any[];\n options?: QueryOptions<GetCurrencyCloudAccountResponse>;\n};\n\nexport const useGetCurrencyCloudAccount = ({\n accountID,\n key = \"cc-account\",\n options,\n}: UseGetCurrencyCloudAccountProps) => {\n const cc = useRequest(\n [key, accountID],\n () => getCurrencyCloudAccount(accountID),\n {\n ...options,\n }\n );\n\n return cc;\n};\n\ntype UseGetCurrencyCloudBeneficiaryProps = {\n accountID: string;\n key?: any | any[];\n options?: QueryOptions<GetCurrencyCloudBeneficiaryResponse>;\n};\n\nexport const useGetCurrencyCloudBeneficiaryRequiredDetails = ({\n accountID,\n key = \"cc-account-required-details\",\n options,\n}: UseGetCurrencyCloudBeneficiaryProps) => {\n const ccBeneficiaryRequiredDetails = useRequest(\n [key, accountID],\n () => getCurrencyCloudBeneficiaryRequiredDetails(accountID),\n {\n ...options,\n }\n );\n\n return ccBeneficiaryRequiredDetails;\n};\n\ntype UseGetCurrencyCloudStatusProps = {\n accountID: string;\n key?: any | any[];\n options?: QueryOptions<GetCurrencyCloudStatusResponse>;\n};\n\nexport const useGetCurrencyCloudStatus = ({\n accountID,\n key = \"cc-status\",\n options,\n}: UseGetCurrencyCloudStatusProps) => {\n const ccStatus = useRequest(\n [key, accountID],\n () => getCurrencyCloudStatus(accountID),\n {\n ...options,\n }\n );\n\n return ccStatus;\n};\n","import axios, { AxiosError } from \"axios\";\n\nimport { UseToastOptions } from \"@chakra-ui/react\";\n\nexport { useGetCitizenship } from \"./useGetCitizenship\";\nexport { useMutationRequest } from \"./useMutationRequest\";\nexport { useGetCryptoEnabled } from \"./useGetCryptoEnabled\";\nexport { useGetAccountDetails } from \"./useGetAccountDetails\";\nexport { useGetCountryInfos } from \"./useGetCountryInfos\";\nexport { useKeyPress } from \"./useKeyPress\";\nexport { useLock } from \"./useLock\";\n\nexport { useGetPortfolioHistory } from \"./useGetPortfolioHistory\";\nexport { useGetPositions } from \"./useGetPositions\";\nexport { useGetPaperAccounts } from \"./useGetPaperAccounts\";\nexport { useGetStatus } from \"./useGetStatus\";\nexport { useGetMargin } from \"./useGetMargin\";\nexport { useGetAsset } from \"./useGetAsset\";\nexport { useGetOrderbooks } from \"./useGetOrderbooks\";\nexport { useGetPosition } from \"./useGetPosition\";\nexport { useGetClock } from \"./useGetClock\";\nexport { useGetOrders } from \"./useGetOrders\";\nexport { useGetCryptoSnapshots } from \"./useGetCryptoSnapshots\";\nexport { useGetAccessKeys } from \"./useGetAccessKeys\";\n\nexport { usePlaid } from \"./usePlaid\";\nexport { useGetBillingOverview } from \"./useGetBillingOverview\";\nexport { useOnfido } from \"./useOnfido\";\nexport { useRequest } from \"./useRequest\";\nexport { useGetCountries } from \"./useGetCountries\";\nexport { useGetAccount } from \"./useGetAccount\";\nexport { useGetTrustedContact } from \"./useGetTrustedAccount\";\nexport { useGetActivities } from \"./useGetActivities\";\n\nexport { useGetAchRelationships } from \"./useGetAchRelationships\";\nexport { useGetAchTransfers } from \"./useGetAchTransfers\";\nexport { useGetBankInstitution } from \"./useGetBankInstitution\";\nexport { useGetRapydTransfers } from \"./useGetRapydTransfers\";\nexport { useGetCashWithdrawable } from \"./useGetCashWithdrawable\";\n\nexport { useGetAllTransfers } from \"./useGetAllTransfers\";\nexport { useGetAllRelationships } from \"./useGetAllRelationships\";\n\nexport { useGetWatchlists } from \"./useGetWatchlists\";\nexport { useGetWatchlist } from \"./useGetWatchlist\";\nexport { useGetQuotes } from \"./useGetQuotes\";\n\nexport { useGetCryptoFeeStructure } from \"./useGetCryptoFeeStructure\";\nexport { useGetCryptoMonthlyVolume } from \"./useGetCryptoMonthlyVolume\";\n\nexport { useGetIpAddress } from \"./useGetIpAddress\";\n\nexport { useGetOptionsApprovalStatus } from \"./useGetOptionsApprovalStatus\";\nexport { useGetOwners } from \"./useGetOwners\";\nexport { useGetOwnerDocuments } from \"./useGetOwnerDocuments\";\n\nexport { useGetEliteNetDeposits } from \"./useGetEliteNetDeposits\";\nexport { useGetEliteAlgoRouting } from \"./useGetEliteAlgoRouting\";\nexport { useGetElitePerks } from \"./useGetElitePerks\";\n\nexport { usePostAccountDocument } from \"./usePostAccountDocument\";\nexport { usePostW8Ben } from \"./usePostW8Ben\";\nexport { useGetAccountDocumentRequests } from \"./useGetAccountDocumentRequests\";\nexport { useGetAccountDocumentUploads } from \"./useGetAccountDocumentUploads\";\n\nexport {\n useGetCurrencyCloudAccount,\n useGetCurrencyCloudBeneficiaryRequiredDetails,\n useGetCurrencyCloudStatus,\n} from \"./useGetCurrencyCloud\";\n\nexport const defaultToastSettings: UseToastOptions = {\n title: \"An error occurred\",\n status: \"error\",\n duration: 3000,\n isClosable: true,\n};\n\nexport const getErrorMessage = (err: Error | AxiosError): string => {\n if (axios.isAxiosError(err)) {\n const resp = err.response?.data;\n return resp?.debug || resp?.message;\n }\n return err.message;\n};\n","import styled from \"@emotion/styled\";\n\nexport const Card = styled.div`\n background: #fff;\n border-radius: 8px;\n padding: 0px;\n border: 0.111rem solid rgba(231, 234, 243, 0.8);\n box-shadow: 0 0.375rem 0.75rem rgba(140, 152, 164, 0.04);\n`;\n\nexport const CardHeader = styled.div`\n font-family: Carnas;\n font-weight: 500;\n font-size: 14px;\n border-bottom: 0.1rem solid rgba(231, 234, 243, 0.7);\n padding: 0.5rem 1rem 0.5rem 1rem;\n`;\n\nexport const CardBody = styled.div`\n padding: 1.25rem;\n padding-top: 1.1rem;\n font-size: 14px;\n`;\n\nexport const CardFooter = styled.div`\n font-size: 16px;\n font-weight: 600;\n border-top: 0.1rem solid rgba(231, 234, 243, 0.7);\n display: flex;\n padding: 0.5rem 1rem 0.5rem 1rem;\n`;\n","import React from \"react\";\nimport cn from \"classnames\";\n\nimport { Text } from \"@alpacahq/ui\";\n\nexport interface CardProps\n extends React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n > {\n title?: string;\n tools?: React.ReactNode;\n}\n\nexport const Card = ({\n title,\n tools,\n children,\n className,\n ...more\n}: CardProps) => {\n return (\n <div\n className={cn(\n \"space-y-6 p-6 rounded-lg border border-gray-200 bg-white\",\n className\n )}\n {...more}\n >\n {(title !== undefined || tools !== undefined) && (\n <div className=\"flex space-x-2 justify-between items-start\">\n {title && <Text className=\"text-lg font-medium\">{title}</Text>}\n {tools}\n </div>\n )}\n\n {children}\n </div>\n );\n};\n\nexport default Card;\n","import { timer } from \"../entityOnboarding/timer\";\nimport AmplitudeProvider from \"src/AmplitudeProvider\";\nimport { Path } from \"src/v2/path\";\nimport { OptionsApprovalStatus, Account } from \"src/v2/api/rest/account\";\nimport moment from \"moment\";\nimport { isPaperOrOnboarding } from \"src/v2/utils\";\n\nexport const isLocalStorageAvailable = () => {\n try {\n window.localStorage.setItem(\"_test_\", \"1\");\n window.localStorage.removeItem(\"_test_\");\n return true;\n } catch (_error) {\n return false;\n }\n};\n\nconst TIER_LOCAL_STORAGE_KEY = \"options_opt_in_tier\";\nconst TIMER_LOCAL_STORAGE_KEY = \"opt_in_timer\";\nconst UTM_LOCAL_STORAGE_KEY = \"options_opt_in_utms\";\n\n/** Local Storage Helper */\nexport const storage = {\n setUTMs: (utms: { [key: string]: string }) => {\n window.localStorage.setItem(UTM_LOCAL_STORAGE_KEY, JSON.stringify(utms));\n },\n getUTMs: (): { [key: string]: string } | undefined => {\n const utms = window.localStorage.getItem(UTM_LOCAL_STORAGE_KEY);\n\n if (!utms) {\n return;\n }\n\n return JSON.parse(utms) as { [key: string]: string };\n },\n removeUTMs: () => {\n window.localStorage.removeItem(UTM_LOCAL_STORAGE_KEY);\n },\n setTier: (tier: string) => {\n window.localStorage.setItem(TIER_LOCAL_STORAGE_KEY, tier);\n },\n getTier: (): string | null => {\n return window.localStorage.getItem(TIER_LOCAL_STORAGE_KEY);\n },\n removeTier: () => {\n window.localStorage.removeItem(TIER_LOCAL_STORAGE_KEY);\n },\n startTimer: () => {\n if (!timer.isSet(TIMER_LOCAL_STORAGE_KEY)) {\n timer.start(TIMER_LOCAL_STORAGE_KEY);\n }\n },\n endTimer: () => {\n const duration = timer.end(TIMER_LOCAL_STORAGE_KEY);\n timer.remove(TIMER_LOCAL_STORAGE_KEY);\n return duration;\n },\n};\n\nexport const logAmplitudeEvent = {\n started: () => {\n AmplitudeProvider.dispatch(\"algodash_options_opt_in_started\");\n },\n completed: (duration?: number, utms?: { [key: string]: string }) => {\n AmplitudeProvider.dispatch(\"algodash_options_opt_in_completed\", {\n duration,\n ...utms,\n });\n },\n nextClicked: () => {\n AmplitudeProvider.dispatch(\"algodash_options_opt_in_next_clicked\", {\n url: window.location.pathname,\n });\n },\n backClicked: () => {\n AmplitudeProvider.dispatch(\"algodash_options_opt_in_back_clicked\", {\n url: window.location.pathname,\n });\n },\n pageCompleted: (duration?: number) => {\n AmplitudeProvider.dispatch(\"algodash_options_opt_in_page_completed\", {\n duration,\n url: window.location.pathname,\n });\n },\n};\n\nexport const BANKING_AND_ONBOARDING_PATHS = [\n Path.ROUTE_NEW_ACCOUNT,\n Path.ROUTE_ENTITY_ONBOARDING_BUSINESS_INFO,\n Path.ROUTE_ENTITY_ONBOARDING_ACCOUNT_OPENER,\n Path.ROUTE_ENTITY_ONBOARDING_AUTH_INDIVIDUALS_UBOS,\n Path.ROUTE_ENTITY_ONBOARDING_DOCUMENTS,\n];\n\nexport const isOptionsOnboardingAvailable = (\n account?: Account,\n optionsApprovalStatus?: OptionsApprovalStatus,\n options?: { allowLegalEntities?: boolean }\n) => {\n if (!account || !optionsApprovalStatus) {\n return false;\n }\n\n // Do not allow user to onboard for options:\n // if user is paper only or onboarding\n // Or options_approved_level is 3 (highest level)\n // Or is legal entity and allowLegalEntities is false\n if (\n isPaperOrOnboarding(account) ||\n account.options_approved_level === 3 ||\n (account?.is_legal_entity && !options?.allowLegalEntities)\n ) {\n return false;\n }\n\n // If user's application is in pending status don't allow them to apply\n if ([\"PENDING\"].includes(optionsApprovalStatus?.OptionsRequestStatus ?? \"\")) {\n return false;\n }\n\n // Don't allow the user to reapply if their reapply available date is after today\n if (\n optionsApprovalStatus?.ReapplyAvailableDate &&\n moment(optionsApprovalStatus?.ReapplyAvailableDate).isAfter(new Date())\n ) {\n return false;\n }\n\n return true;\n};\n\nexport const getUTMsFromSearch = (\n search: string\n): { [key: string]: string } | undefined => {\n if (!search) {\n return;\n }\n\n const params = new URLSearchParams(search);\n\n const source = params.get(\"utm_source\");\n const medium = params.get(\"utm_medium\");\n const campaign = params.get(\"utm_campaign\");\n const term = params.get(\"utm_term\");\n const content = params.get(\"utm_content\");\n\n const utms = {\n ...(source && { utm_source: source }),\n ...(medium && { utm_medium: medium }),\n ...(campaign && { utm_campaign: campaign }),\n ...(term && { utm_term: term }),\n ...(content && { utm_content: content }),\n };\n\n if (!Object.keys(utms).length) {\n return;\n }\n\n return utms;\n};\n","import instance from \"..\";\nimport moment from \"moment\";\nimport { BusinessInfo } from \"../../pages/dashboard/entityOnboarding/pages/businessInfo/schema\";\nimport { AccountOpener } from \"../../pages/dashboard/entityOnboarding/pages/accountOpener/schema\";\nimport {\n Transform,\n transformObject,\n} from \"../../pages/dashboard/entityOnboarding/util\";\nimport {\n AuthorizedIndividual,\n UltimateBeneficialOwner,\n} from \"../../pages/dashboard/entityOnboarding/pages/authIndividualsUBOs/schema\";\nimport { Owner } from \"./account\";\n\nexport const toEntityAccount = async (accountId: string): Promise<void> => {\n const res = await instance.patch(`/accounts/${accountId}/to-entity-account`);\n return res.data;\n};\n\nexport const toIndividualAccount = async (accountId: string): Promise<void> => {\n const res = await instance.patch(\n `/accounts/${accountId}/to-individual-account`\n );\n return res.data;\n};\n\nexport type PostOwnerArgs =\n | { type: \"legal-entity\"; accountId: string; data: BusinessInfo }\n | { type: \"account-opener\"; accountId: string; data: AccountOpener }\n | {\n type: \"authorized-individual\";\n accountId: string;\n data: AuthorizedIndividual;\n }\n | { type: \"ubo\"; accountId: string; data: UltimateBeneficialOwner };\n\nexport type OwnerType = PostOwnerArgs[\"type\"];\n\nexport type PatchOwnerArgs =\n | {\n type: \"legal-entity\";\n accountId: string;\n ownerId: string;\n data: Partial<BusinessInfo>;\n }\n | {\n type: \"account-opener\";\n accountId: string;\n ownerId: string;\n data: Partial<AccountOpener>;\n }\n | {\n type: \"authorized-individual\";\n accountId: string;\n ownerId: string;\n data: Partial<AuthorizedIndividual>;\n }\n | {\n type: \"ubo\";\n accountId: string;\n ownerId: string;\n data: Partial<UltimateBeneficialOwner>;\n };\n\nconst getOwnerTransforms = (\n type: PostOwnerArgs[\"type\"]\n): Transform<{ [key: string]: any }>[] => {\n if (type === \"legal-entity\") {\n return [\n {\n keys: [\"funding_source\"],\n condition: (value) => typeof value === \"string\",\n transform: (value) => value.split(\",\"),\n },\n {\n keys: \"ALL_FIELDS\",\n condition: (value) => value === \"\",\n transform: () => undefined,\n },\n ];\n }\n\n return [\n {\n keys: [\"controlling_firms\"],\n condition: (value) => typeof value === \"string\",\n transform: (value) => value.split(\",\"),\n },\n {\n keys: \"ALL_FIELDS\",\n condition: (value) => value === \"\",\n transform: () => undefined,\n },\n ];\n};\n\nexport const postOwner = async ({ type, accountId, data }: PostOwnerArgs) => {\n const transforms = getOwnerTransforms(type);\n const res = await instance.post<Owner>(`/accounts/${accountId}/owners`, {\n ...transformObject(data, transforms),\n });\n return res.data;\n};\n\nexport const patchOwner = async ({\n type,\n accountId,\n ownerId,\n data,\n}: PatchOwnerArgs) => {\n const transforms = getOwnerTransforms(type);\n const res = await instance.patch<Owner>(\n `/accounts/${accountId}/owners/${ownerId}`,\n {\n ...transformObject(data, transforms),\n }\n );\n return res.data;\n};\n\nexport const deleteOwner = async ({\n accountId,\n ownerId,\n}: {\n accountId: string;\n ownerId: string;\n}) => {\n const res = await instance.delete(`/accounts/${accountId}/owners/${ownerId}`);\n return res.data;\n};\n\nexport type OwnerDocument = {\n id: string;\n owner_id: string;\n doc_type: string;\n doc_sub_type: string;\n};\n\nexport const getOwnerDocuments = async (accountId: string, ownerId: string) => {\n const res = await instance.get<{ documents: OwnerDocument[] }>(\n `/accounts/${accountId}/owners/${ownerId}/documents`\n );\n return res.data.documents;\n};\n\nexport const getOwnerDocumentURL = async (\n accountId: string,\n ownerId: string,\n documentId: string\n) => {\n const res = await instance.get(\n `/accounts/${accountId}/owners/${ownerId}/documents/${documentId}/url`\n );\n return res.data;\n};\n\nexport const postFileUpload = async ({\n accountId,\n ownerId,\n docType,\n docSubType,\n file,\n}: {\n accountId: string;\n ownerId: string;\n docType: string;\n docSubType?: string;\n file: File;\n}) => {\n const form = new FormData();\n form.append(\"uploadfile\", file);\n const res = await instance.post<{ id: string; object_key: string }>(\n `/accounts/${accountId}/owners/${ownerId}/documents/${docType}${\n docSubType ? `/${docSubType}` : \"\"\n }`,\n form,\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n }\n );\n return res.data;\n};\n\nexport const deleteFileUpload = async ({\n accountId,\n ownerId,\n documentId,\n}: {\n accountId: string;\n ownerId: string;\n documentId: string;\n}) => {\n const res = await instance.delete(\n `/accounts/${accountId}/owners/${ownerId}/documents/${documentId}`\n );\n return res.data;\n};\n\nexport const uploadOwnerDocument = async ({\n accountId,\n docType,\n docSubType,\n file,\n}: {\n accountId: string;\n docType: string;\n docSubType?: string;\n file: File;\n}) => {\n const form = new FormData();\n form.append(\"uploadfile\", file);\n const res = await instance.post(\n `/documents/accounts/${accountId}/upload/${docType}${\n docSubType ? `/${docSubType}` : \"\"\n }`,\n form,\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n }\n );\n return res.data;\n};\n\nexport const getTaxFileForm = async ({\n accountId,\n ownerId,\n form,\n}: {\n accountId: string;\n ownerId: string;\n form: \"certifications_and_resolutions_statement\" | \"w_8ben\";\n}): Promise<Blob> => {\n const res = await instance.get(\n `/accounts/${accountId}/owners/${ownerId}/taxfiles/${form}/preview`,\n { responseType: \"blob\" }\n );\n return res.data;\n};\n\nexport const acceptTaxFileForm = async ({\n accountId,\n ownerId,\n form,\n}: {\n accountId: string;\n ownerId: string;\n form: \"certifications_and_resolutions_statement\" | \"w_8ben\";\n}) => {\n const res = await instance.post(\n `/accounts/${accountId}/owners/${ownerId}/taxfiles/${form}/accept`\n );\n return res.data;\n};\n\nexport const submitEntityAccount = async (accountId: string) => {\n const res = await instance.post(`/accounts/${accountId}/submit`);\n return res.data;\n};\n\nexport const postAgreement = async ({\n accountId,\n ownerId,\n agreement,\n revision,\n}: {\n accountId: string;\n ownerId: string;\n agreement: string;\n revision: string;\n}) => {\n const res = await instance.post(\n `/accounts/${accountId}/owners/${ownerId}/agreements/${agreement}/${revision}`\n );\n return res.data;\n};\n\nexport const patchOwnerType = async ({\n accountId,\n ownerId,\n isUBO,\n isAuthorizedIndividual,\n}: {\n accountId: string;\n ownerId: string;\n isUBO: boolean;\n isAuthorizedIndividual: boolean;\n}) => {\n const res = await instance.patch(\n `/accounts/${accountId}/owners/${ownerId}/owner_type`,\n {\n is_ubo: isUBO,\n is_authorized_individual: isAuthorizedIndividual,\n owner_id: ownerId,\n }\n );\n return res.data;\n};\n","import React, { ReactNode } from \"react\";\n\nimport { Alert, Text, classes } from \"@alpacahq/ui\";\n\n// this is a legacy react feature; hasn't been brought to hook form yet\nclass ErrorBoundary extends React.Component {\n state = {\n hasError: false,\n errorMessage: \"\",\n };\n\n static getDerivedStateFromError(error: any) {\n return {\n hasError: true,\n errorMessage: error.message,\n };\n }\n\n componentDidCatch(error: any, info: any) {\n console.error(\"ErrorBoundary caught an error\", error, info);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <>\n <Alert\n variant=\"danger\"\n title=\"Something went wrong.\"\n message={`Please refresh the page and try again or contact support. (error: ${this.state.errorMessage})`}\n />\n </>\n );\n }\n\n return this.props.children;\n }\n}\n\nexport interface PageProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: ReactNode;\n subtitle?: ReactNode;\n breadcrumbs?: ReactNode;\n}\n\nexport const Page: React.FC<PageProps> = ({\n className,\n title,\n subtitle,\n breadcrumbs,\n children,\n ...rest\n}) => (\n <div\n className={classes(\n \"xs:pl-0 mx-auto w-full flex-1 space-y-8 py-8 pr-8 pl-8\",\n className\n )}\n {...rest}\n >\n <ErrorBoundary>\n {(title || subtitle || breadcrumbs) && (\n <div className=\"space-y-2\">\n {title && (\n <Text className=\"text-3xl font-semibold text-gray-900\">\n {title}\n </Text>\n )}\n {subtitle && (\n <Text className=\"text-xl text-gray-500\">{subtitle}</Text>\n )}\n {breadcrumbs}\n </div>\n )}\n {children}\n </ErrorBoundary>\n </div>\n);\n\nexport default Page;\n","import UI from \"@alpacahq/ui\";\nimport React, { useEffect } from \"react\";\n\nimport { ReactNode } from \"react\";\n\nimport { Box, ChakraProvider } from \"@chakra-ui/react\";\nimport { QueryClient, QueryClientProvider } from \"react-query\";\nimport { useHistory } from \"react-router-dom\";\nimport { customTheme } from \"../../v2/theme\";\nimport { useDarkMode } from \"../api/hooks/useDarkMode\";\n\nimport \"react-datepicker/dist/react-datepicker.css\";\nimport \"react-phone-input-2/lib/style.css\";\n// @deprecated\nimport \"@alpacahq/sassy/dist/theme.css\";\nimport \"@alpacahq/ui/theme\";\nimport \"../theme.scss\";\nimport AmplitudeProvider from \"src/AmplitudeProvider\";\n\nexport const client = new QueryClient({\n defaultOptions: { queries: { staleTime: 10000 } },\n});\n\nconst App = (props: { children: ReactNode }) => {\n const { useDarkModeValue } = useDarkMode();\n const history = useHistory();\n\n useEffect(() => {\n AmplitudeProvider.dispatchPageVisit();\n }, [history.location.pathname]);\n\n return (\n <UI.Provider history={useHistory()}>\n <ChakraProvider theme={{ ...customTheme(useDarkModeValue) }}>\n <QueryClientProvider client={client}>\n <Box id=\"anchor\" />\n {props.children}\n </QueryClientProvider>\n </ChakraProvider>\n </UI.Provider>\n );\n};\n\nexport default App;\n","// basically fuck chakra's color mode provider\nimport React, { useCallback, useEffect } from \"react\";\n\n// switch color mode state ref based on local storage\nexport const useDarkMode = () => {\n const [darkMode, setDarkMode] = React.useState<boolean>(\n // JSON.parse(localStorage.getItem(\"dark-mode\") || \"false\")\n false\n );\n\n /** \n \n useEffect(() => {\n const tick = setInterval(\n () =>\n setDarkModeValue(\n JSON.parse(localStorage.getItem(\"dark-mode\") || \"false\")\n ),\n 250\n );\n\n return () => clearInterval(tick);\n }, []);\n**/\n\n const useDarkModeValue = useCallback((a: any, b: any) => (darkMode ? a : b), [\n darkMode,\n ]);\n\n const setDarkModeValue = (newValue: boolean) => {\n // before we set the dark mode state, we need to set the local storage\n // localStorage.setItem(\"dark-mode\", `${newValue}`);\n // update state\n // setDarkMode(newValue);\n };\n\n return {\n darkMode,\n useDarkModeValue,\n setDarkMode: setDarkModeValue,\n };\n};\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { getAssets } from \"../rest\";\nimport { Asset } from \"../rest/account\";\n\nexport const useGetAssets = (\n key: any | any[] = \"\",\n options?: QueryOptions<any[]>\n) => {\n const { data, refetch, isFetched } = useRequest(key, () => getAssets(), {\n cacheTime: 9999999,\n staleTime: Infinity,\n ...options,\n });\n\n return { assets: data || [], refetch, isFetched };\n};\n\nexport default useGetAssets;\n","import React from \"react\";\nimport { Button, Icon } from \"@alpacahq/ui\";\n\nexport type OptionsButtonProps = {\n isUpgrade: boolean;\n onClick: () => void;\n};\n\n// Desktop Options Opt In button - shortens text on small screens, on top bar\nexport const OptionsTopBarButton = ({\n isUpgrade,\n onClick,\n}: OptionsButtonProps) => (\n <Button\n onClick={onClick}\n variant=\"ghost\"\n className=\"hidden min-[479px]:flex border-2 border-yellow-300\"\n >\n <div className=\"min-[700px]:hidden flex flex-row gap-1\">\n <Icon name=\"Plus\" className=\" h-4 w-4\" />\n Options\n </div>\n <div className=\"hidden min-[700px]:contents\">\n {isUpgrade ? \"Upgrade Your Options Level\" : \"Get Started with Options\"}\n </div>\n </Button>\n);\n\n// Mobile Options Opt In button - full width centered text, below top bar\nexport const OptionsMobileButton = ({\n isUpgrade,\n onClick,\n}: OptionsButtonProps) => (\n <Button\n onClick={onClick}\n variant=\"ghost\"\n className=\"min-[479px]:hidden mx-8 mb-6 border-2 border-yellow-300 justify-center\"\n >\n {isUpgrade ? \"Upgrade Your Options Level\" : \"Get Started with Options\"}\n </Button>\n);\n","import _ from \"lodash\";\nimport AmplitudeProvider from \"src/AmplitudeProvider\";\nimport useGetAssets from \"../../../api/hooks/useGetAssets\";\n\nimport { useGetAccount, useGetOptionsApprovalStatus } from \"src/v2/api/hooks\";\n\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport {\n Button,\n Icon,\n SidebarState,\n UIContext,\n Combobox,\n classes,\n} from \"@alpacahq/ui\";\nimport { Box, BoxProps } from \"@chakra-ui/react\";\nimport { useQuery } from \"react-query\";\nimport { useHistory } from \"react-router\";\nimport { isPaperOrOnboarding } from \"src/v2/utils\";\nimport { Asset } from \"../../../api/rest\";\nimport { getCryptoAssets } from \"../../../api/rest/data\";\nimport { AssetLike } from \"../../../pages/dashboard/trade/Trade\";\nimport { Path } from \"../../../path\";\nimport { isOptionsOnboardingAvailable } from \"src/v2/pages/dashboard/optionsOptIn/util\";\nimport {\n OptionsTopBarButton,\n OptionsMobileButton,\n} from \"./OptionsTopBarButton\";\n\nconst BANKING_AND_ONBOARDING_PATHS = [\n Path.ROUTE_NEW_ACCOUNT,\n Path.ROUTE_ENTITY_ONBOARDING_BUSINESS_INFO,\n Path.ROUTE_ENTITY_ONBOARDING_ACCOUNT_OPENER,\n Path.ROUTE_ENTITY_ONBOARDING_AUTH_INDIVIDUALS_UBOS,\n Path.ROUTE_ENTITY_ONBOARDING_DOCUMENTS,\n];\n\nconst SEARCH_RESULTS_LIMIT = 10;\n\n// a map of assets sorted by first letter and then word groups for fast searching\ntype AssetMap = {\n // letter group\n [key: string]: {\n // word group\n [key: string]: Partial<Asset>;\n };\n};\n\nexport const TopBar = (props: BoxProps & { product: string }) => {\n const history = useHistory();\n\n const [assets, setAssets] = useState<AssetLike[]>([]);\n\n const { sidebarState, setSidebarState } = useContext(UIContext);\n const { account, isAuthenticated } = useGetAccount();\n\n const { data: crypto } = useQuery(\"crypto\", getCryptoAssets);\n\n const { assets: equities } = useGetAssets(\"equities\", {\n enabled: !!isAuthenticated,\n });\n\n const { data: optionsApprovalStatus } = useGetOptionsApprovalStatus(\n [\"options-opt-in\", account?.id],\n account?.id,\n {\n enabled: !!account?.id,\n }\n );\n\n // normalize asset symbol and name for searching\n const normalize = useCallback(\n (value: string) =>\n String(value)\n .toUpperCase()\n .trim()\n .replace(/[^a-z\\s-]/gi, \"\"),\n []\n );\n\n useEffect(() => {\n // filter out assets that are already in the list\n const filtered = (crypto || [])\n .concat(equities)\n .filter((asset) => !assets.some((a) => a.symbol === asset.symbol));\n\n // add new assets to the list\n if (filtered.length) {\n setAssets([...assets, ...filtered]);\n }\n }, [equities, crypto]);\n\n // memoize assets into index map for fast searching\n const assetMap = useMemo<AssetMap>(\n () =>\n assets\n .filter((asset) => asset.symbol)\n .map(({ symbol, name }) => ({ symbol, name }))\n .reduce((prev, next) => {\n const symbol = normalize(next.symbol);\n const name = normalize(next.name);\n const keyForSymbol = symbol[0];\n const keyForName = name[0];\n\n // create symbol character group\n if (!prev[keyForSymbol]) {\n prev[keyForSymbol] = {};\n }\n\n // create name character group\n if (!prev[keyForName]) {\n prev[keyForName] = {};\n }\n\n // add asset to symbol and name groups\n prev[keyForSymbol][symbol] = next;\n prev[keyForName][name] = next;\n\n return prev;\n }, {} as AssetMap),\n [assets]\n );\n\n const onSearch = useCallback(\n (query: string) => {\n // normalize query string for searching\n const normalized = normalize(query);\n\n // find and set match based on first letter\n const match = assetMap[normalized.charAt(0)];\n\n // if no match, set empty array\n if (!match) {\n return [];\n }\n\n // sort by symbol in descending alphabetic order\n const matched = Object.keys(match)\n .filter((key) => key.startsWith(normalized))\n .map((key) => match[key])\n .sort((a, b) => {\n const matchA = a.symbol?.startsWith(normalized);\n const matchB = b.symbol?.startsWith(normalized);\n\n // if both match, sort\n if (matchA && matchB) {\n return (a.symbol?.length || 0) - (b.symbol?.length || 0);\n }\n\n if (matchA) {\n // negative number means a comes first\n return -1;\n } else if (matchB) {\n // positive number means b comes first\n return 1;\n } else {\n // if neither match, return 0\n return 0;\n }\n });\n\n return (\n _.uniqBy(matched, (asset) => asset.symbol)\n // we only care about the first X results\n .slice(0, SEARCH_RESULTS_LIMIT)\n // filter out assets without symbol\n .filter(({ symbol }) => !!symbol)\n // map to suggestion object\n .map(\n // cast as string because we already filtered out assets without symbol or name\n ({ symbol, name }) => ({\n label: symbol as string,\n description: name || \"no asset description found\",\n href: Path.ROUTE_TRADE.replace(\":symbol\", symbol as string),\n }),\n []\n )\n );\n },\n [assetMap]\n );\n\n // handle the deposit or open account button click\n const onDepositOrOpenAccountClick = useCallback(() => {\n // track the event\n AmplitudeProvider.dispatch(\n props.product === \"paper\"\n ? \"navbar_open_live_account_button_clicked\"\n : \"navbar_deposit_funds_button_clicked\"\n );\n\n // if the account is paper or onboarding, go to the new account page\n if (props.product === \"paper\") {\n history.push(Path.ROUTE_NEW_ACCOUNT);\n } else {\n // if the account is not paper or onboarding, go to the deposit page\n history.push(Path.ROUTE_FUNDING);\n }\n }, [history, props.product]);\n\n // handle state transition logic\n const handleSidebarState = (currentSidebarState: SidebarState) => {\n switch (currentSidebarState) {\n case SidebarState.HIDDEN:\n return SidebarState.MOBILE;\n case SidebarState.MOBILE:\n return SidebarState.HIDDEN;\n case SidebarState.EXPANDED:\n return SidebarState.COLLAPSED;\n case SidebarState.COLLAPSED:\n return SidebarState.EXPANDED;\n default:\n localStorage.removeItem(\"sidebarState\");\n return null;\n }\n };\n\n const isInBankingOrOnboardingPath = BANKING_AND_ONBOARDING_PATHS.some(\n (path) => window.location.pathname.includes(path)\n );\n\n const isDepositOrOpenAccountBtnDisplayed =\n // hide button while onboarding\n !isInBankingOrOnboardingPath &&\n (isPaperOrOnboarding(account) || props.product === \"live\") &&\n // hide button if live account cannot add funds\n !(\n props.product === \"live\" &&\n account?.status !== \"ACTIVE\" &&\n account?.status !== \"ACCOUNT_UPDATED\"\n );\n\n const isOptionsUpgradable = account?.options_approved_level !== 3;\n\n // Only display the options opt-in button for people can apply or upgrade\n const isOptionsButtonDisplayed = useMemo(\n () =>\n isOptionsOnboardingAvailable(account, optionsApprovalStatus, {\n allowLegalEntities: true,\n }) && isOptionsUpgradable,\n [account, optionsApprovalStatus]\n );\n\n const isOptionsUpgrading = (account?.options_approved_level ?? 0) > 0;\n\n const onOptionsClick = () =>\n history.push(\n account?.is_legal_entity\n ? Path.ROUTE_OPTIONS_OPT_IN_ENTITY_ACCOUNT\n : Path.ROUTE_OPTIONS_OPT_IN_FINANCIAL_PROFILE\n );\n\n return (\n <Box\n id=\"topbar\"\n w=\"100%\"\n zIndex={2}\n display=\"flex\"\n flexDir=\"column\"\n {...props}\n >\n <div\n className={classes(\n \"flex flex-row gap-3 items-center p-6 xs:pl-0 md:pr-6 z-5 mt-[1px]\"\n )}\n >\n {sidebarState === SidebarState.HIDDEN && (\n <Button\n className=\"px-3\"\n variant=\"secondary\"\n onClick={() => {\n const newState = handleSidebarState(sidebarState);\n if (newState !== null) {\n setSidebarState(newState);\n localStorage.setItem(\"sidebarState\", newState);\n }\n }}\n >\n <Icon className=\"h-4 w-4\" name=\"Bars3\" />\n </Button>\n )}\n <div className=\"w-full max-w-[300px]\">\n <Combobox\n placeholder=\"Search\"\n options={onSearch}\n getOptionKey={(o) => o.label}\n getOptionLabel={(o) => o.label}\n getOptionSecondary={(o) => o.description}\n value={null}\n onChange={(o) => {\n if (o) history.push(o.href);\n }}\n optionSpacing=\"justify-between\"\n icon=\"MagnifyingGlass\"\n />\n </div>\n {sidebarState !== SidebarState.HIDDEN && (\n <>\n <div className=\"flex-1\" />\n {isOptionsButtonDisplayed && (\n <OptionsTopBarButton\n isUpgrade={isOptionsUpgrading}\n onClick={onOptionsClick}\n />\n )}\n\n {isDepositOrOpenAccountBtnDisplayed && (\n <Button variant=\"secondary\" onClick={onDepositOrOpenAccountClick}>\n {props.product === \"paper\" ? (\n \"Open Live Account\"\n ) : (\n <div className=\"flex flex-row gap-2\">\n <Icon name=\"Plus\" className=\"h-4 w-4\" />\n <span className=\"whitespace-nowrap\">Add Funds</span>\n </div>\n )}\n </Button>\n )}\n </>\n )}\n </div>\n {isOptionsButtonDisplayed && (\n <OptionsMobileButton\n isUpgrade={isOptionsUpgrading}\n onClick={onOptionsClick}\n />\n )}\n </Box>\n );\n};\n\nexport default TopBar;\n","import React from \"react\";\n\nimport { Icon } from \"@alpacahq/ui\";\nimport { Account } from \"../../../api/rest/account\";\nimport { Path } from \"../../../path\";\nimport { isPaperOrOnboarding } from \"../../../utils\";\n\nexport type PaperBannerProps = {\n account?: Account;\n};\n\nexport const PaperBanner = ({ account }: PaperBannerProps) => (\n <div className=\"rounded-lg bg-blue-100 px-4 h-10 flex items-center mt-6 mx-6 xs:ml-0\">\n <Icon name=\"InformationCircle\" className=\"h-5 w-5 text-blue-600 mr-2\" />\n <p className=\"text-base font-medium text-blue-600\">\n <span>You are on Paper Trading, no real money is being used. </span>\n {account && !isPaperOrOnboarding(account) ? (\n <a\n className=\"font-semibold underline hover:underline\"\n href={Path.format(Path.ROUTE_DASHBOARD, { product: \"live\" })}\n >\n Switch to Live Trading?\n </a>\n ) : null}\n </p>\n </div>\n);\n","import { clsx } from \"@alpacahq/ui\";\nimport React from \"react\";\nimport { getPrettyCash } from \"src/v2/utils/formatting\";\n\nexport type SidebarAccountItemProperties = {\n name: string;\n id: string;\n number: string;\n percentage: number;\n equity?: string;\n last_equity?: string;\n};\n\ntype SidebarAccountItemProps = SidebarAccountItemProperties & {\n onClick?: () => void;\n active?: boolean;\n};\n\ntype SidebarAccountItemDividerProps = {\n label: string;\n};\n\ntype SidebarAccountMenuItemProps = {\n children: React.ReactNode;\n onClick?: () => void;\n};\n\nconst SidebarAccountItem = ({\n name,\n number,\n equity,\n percentage,\n onClick,\n active,\n}: SidebarAccountItemProps) => {\n return (\n <div\n className={clsx(\n `items-center w-full p-2.5 rounded-lg space-y-0.5`,\n !!onClick && \"cursor-pointer hover:bg-gray-100\",\n active && \"bg-gray-100\"\n )}\n onClick={onClick}\n >\n <div className=\"flex justify-between font-medium text-sm text-gray-900 gap-2\">\n <div className=\"whitespace-nowrap truncate\">{name}</div>\n <div className=\"font-normal\">{getPrettyCash(equity)}</div>\n </div>\n <div className=\"flex justify-between gap-4 font-medium text-xs text-true-gray-600\">\n <div>{number}</div>\n <div\n className={`${\n percentage >= 0 ? \"text-emerald-500\" : \"text-rose-500\"\n }`}\n >\n {percentage?.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}\n %\n </div>\n </div>\n </div>\n );\n};\n\nexport const SidebarAccountItemDivider = ({\n label,\n}: SidebarAccountItemDividerProps) => {\n return (\n <div className=\"uppercase text-gray-500 font-medium text-xs mb-2.5\">\n {label}\n </div>\n );\n};\n\nexport const SidebarAccountMenuItem = ({\n children,\n onClick,\n}: SidebarAccountMenuItemProps) => (\n <div\n className={clsx(\n \"p-2.5 cursor-pointer rounded-md\",\n !!onClick && \"hover:bg-gray-100\"\n )}\n onClick={onClick}\n >\n {children}\n </div>\n);\n\nexport default SidebarAccountItem;\n","import React, { useEffect } from \"react\";\n\nimport {\n Button,\n Checkbox,\n CheckboxState,\n Form,\n useModal,\n useUIForm,\n} from \"@alpacahq/ui\";\nimport { z } from \"zod\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useGetMargin, useMutationRequest } from \"src/v2/api/hooks\";\nimport {\n createPaperAccount,\n createPaperAccountParams,\n PaperAccount,\n} from \"src/v2/api/rest/account\";\nimport { useToast } from \"@chakra-ui/react\";\nimport { useAccountContext } from \"src/v2/providers/AccountProvider\";\nimport { getPrettyCash } from \"src/v2/utils/formatting\";\n\nexport interface CreatePaperAccountModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nconst MIN_FUNDS = 1;\nconst MAX_FUNDS = 1000000;\n\nconst schema = z.object({\n cash: z.coerce.number().gte(MIN_FUNDS).lte(MAX_FUNDS).optional(),\n name: z.string(),\n match: z.boolean(),\n});\n\ntype CreatePaperAccountModalForm = z.infer<typeof schema>;\n\nexport const CreatePaperAccountModal: React.FC<\n CreatePaperAccountModalProps\n> = ({ isOpen, onClose }) => {\n const toast = useToast();\n\n const { liveAccounts, refetchPaperAccounts } = useAccountContext();\n\n const accountId = liveAccounts?.[0]?.id;\n const { margin } = useGetMargin([\"margin\", accountId], accountId, false, {\n enabled: !!accountId,\n });\n\n const createPaperAccountMutation = useMutationRequest<\n PaperAccount,\n createPaperAccountParams\n >((formValues) => createPaperAccount(formValues), {\n onSuccess: () => {\n toast({\n title: \"Success\",\n description: \"You have successfully created a new account\",\n status: \"success\",\n });\n\n refetchPaperAccounts();\n onClose();\n },\n });\n\n const form = useUIForm<CreatePaperAccountModalForm>({\n resolver: zodResolver(schema),\n defaultValues: {\n match: false,\n },\n });\n\n const matchLiveEquity = form.watch(\"match\");\n\n const handleSubmit = ({ match, cash, name }: CreatePaperAccountModalForm) => {\n const values = {\n cash: match ? parseFloat(margin?.equity ?? \"0\") : cash ? cash : 100000,\n name,\n };\n createPaperAccountMutation.mutate(values);\n };\n\n const {\n component: Modal,\n isOpen: isModalOpen,\n toggle,\n } = useModal({\n title: \"Open New Paper Account\",\n content: (\n <div className=\"space-y-2\">\n <div>\n Create a new paper account to simulate trades and test strategies. You\n can have up to 3 paper accounts.\n </div>\n <Form formMethods={form} onSubmit={handleSubmit}>\n <Form.TextInput label=\"Nickname\" name=\"name\" />\n\n <Form.TextInput\n type=\"number\"\n label=\"Set Funds\"\n name=\"cash\"\n isDisabled={matchLiveEquity}\n placeholder={`${getPrettyCash(MIN_FUNDS)} - ${getPrettyCash(\n MAX_FUNDS\n )}`}\n />\n\n <div\n className=\"flex gap-1 cursor-pointer\"\n onClick={() => {\n form.setValue(\"match\", !matchLiveEquity);\n }}\n >\n <Checkbox\n state={\n matchLiveEquity\n ? CheckboxState.Checked\n : CheckboxState.Unchecked\n }\n />\n Match current live account equity balance?\n </div>\n </Form>\n </div>\n ),\n controls: (\n <div className=\"flex space-x-2\">\n <Button variant=\"alternate\" onClick={() => toggle()}>\n Close\n </Button>\n <Button onClick={form.handleSubmit(handleSubmit)}>Submit</Button>\n </div>\n ),\n onClose: () => {\n if (isModalOpen) {\n onClose();\n }\n },\n });\n\n useEffect(() => {\n if (isOpen && !isModalOpen) {\n toggle();\n }\n }, [isOpen, isModalOpen, toggle]);\n\n return <>{Modal}</>;\n};\nexport default CreatePaperAccountModal;\n","import TetherComponent from \"react-tether\";\n\nimport {\n Icon,\n clsx,\n UIContext,\n SidebarState,\n Logo,\n Button,\n classNames,\n} from \"@alpacahq/ui\";\n\nimport React, {\n useState,\n useContext,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\n\nimport SidebarAccountItem, {\n SidebarAccountItemDivider,\n SidebarAccountItemProperties,\n SidebarAccountMenuItem,\n} from \"./SidebarAccountItem\";\nimport CreatePaperAccountModal from \"./CreatePaperAccountModal\";\nimport { getPercentageChange } from \"src/v2/utils\";\nimport { useAccountContext } from \"src/v2/providers/AccountProvider\";\nimport { useGetMargin } from \"src/v2/api/hooks\";\nimport { useGetMargins } from \"src/v2/api/hooks/useGetMargin\";\nimport { Account, Margin, PaperAccount } from \"src/v2/api/rest/account\";\nimport { Path } from \"../../path\";\nimport useLocalStorage from \"src/hooks/useLocalStorage\";\nimport { useHistory } from \"react-router-dom\";\nimport { connect } from \"react-redux\";\n\nexport interface SidebarAccountSwitcherProps {\n darkLogo?: boolean;\n ownerId?: string;\n product: string;\n dashboardTradeAccountMap?: Record<string, Margin>;\n}\n\nexport const MAX_PAPER_ACCOUNTS = 3;\n\nconst getSidebarAccountItemProperties = (\n margins?: Margin[],\n type = \"Paper\",\n accounts?: PaperAccount[] | Account[],\n dashboardTradeAccountMap?: Record<string, Margin>\n): SidebarAccountItemProperties[] => {\n const getName = (type: string, account?: PaperAccount | Account) => {\n if (type === \"Paper\") {\n return !!account?.name ? account.name : type;\n } else if (type === \"Live\") {\n const name = (account as Account)?.account_name;\n\n return !!name ? name : type;\n }\n\n return type;\n };\n\n return (\n margins?.map(({ equity, account_number, last_equity, id }, index) => {\n const dashboardMargin = dashboardTradeAccountMap?.[id];\n\n const displayedEquity = dashboardMargin?.equity ?? equity;\n const displayedLastEquity = dashboardMargin?.last_equity ?? last_equity;\n\n return {\n name: getName(type, accounts?.[index]),\n id,\n number: account_number,\n percentage: getPercentageChange(displayedLastEquity, displayedEquity),\n equity: displayedEquity,\n last_equity: displayedLastEquity,\n };\n }) ?? []\n );\n};\n\n// The dashboard uses redux state to display its equity value. While they use\n// the same endpoints, equity changes by the second. To ensure the equity shown\n// in dashboard and sidebar are the same, connect to redux until dashboard updated\nconst mapStateToProps = (state: { trade: Record<string, Margin> }) => ({\n dashboardTradeAccountMap: state.trade || {},\n});\n\nconst SidebarAccountSwitcher: React.FC<SidebarAccountSwitcherProps> = ({\n darkLogo,\n product,\n dashboardTradeAccountMap,\n}) => {\n const { sidebarState, setIsSidebarBlurred } = useContext(UIContext);\n const history = useHistory();\n\n const [isOpen, setIsOpen] = useState(false);\n const [dropdownOpacity, setDropdownOpacity] = useState(0);\n const [forceUpdate, setForceUpdate] = useState(false);\n\n const [isCreationModalOpen, setIsCreationModalOpen] = useState(false);\n\n const {\n currentAccount,\n setCurrentAccount,\n liveAccounts,\n paperAccounts,\n paperAccountsNoDetail,\n } = useAccountContext();\n\n const [_savedAccountId, setSavedAccountId] = useLocalStorage(\"savedAccount\");\n\n const liveAccount = liveAccounts[0];\n const isPaper = product === \"paper\";\n\n const { margin: liveMargin } = useGetMargin(\n \"margin\",\n liveAccount?.id,\n false,\n {\n enabled: !!liveAccount?.id,\n }\n );\n\n const { margin: paperMargins } = useGetMargins(\n \"margin-paper\",\n paperAccountsNoDetail.map(({ paper_account_id }) => paper_account_id),\n true,\n {\n enabled: !!paperAccountsNoDetail.length,\n }\n );\n\n const handleSwitchAccount = (newAccount: SidebarAccountItemProperties) => {\n const isAccountTypeDifferentFromProduct =\n (product === \"live\" &&\n paperAccounts.find((a) => a.id === newAccount.id)) ||\n (product === \"paper\" && liveAccounts.find((a) => a.id === newAccount.id));\n\n // Need to redirect if switching products, as invalid credentials error occur\n // if switching from paper to live and vice versa\n if (isAccountTypeDifferentFromProduct) {\n setSavedAccountId(newAccount.id);\n\n window.location.href = Path.format(Path.ROUTE_DASHBOARD, {\n product: isPaper ? \"live\" : \"paper\",\n });\n return;\n }\n\n const account =\n liveAccounts.find((a) => a.id === newAccount.id) ??\n paperAccounts.find((a) => a.id === newAccount.id);\n\n if (account) {\n setCurrentAccount(account);\n }\n };\n\n const liveAccountItems = getSidebarAccountItemProperties(\n liveMargin ? [liveMargin] : [],\n \"Live\",\n liveAccounts,\n dashboardTradeAccountMap\n );\n const paperAccountItems = getSidebarAccountItemProperties(\n paperMargins,\n \"Paper\",\n paperAccountsNoDetail,\n dashboardTradeAccountMap\n );\n\n const currentSidebarAccount = useMemo(() => {\n const account =\n liveAccountItems.find((a) => a.id === currentAccount?.id) ||\n paperAccountItems.find((pa) => pa.id === currentAccount?.id);\n return (\n account ??\n ({ name: \"Guest\", number: \"no-account\" } as SidebarAccountItemProperties)\n );\n }, [liveAccountItems, paperAccountItems, currentAccount]);\n\n // short-form for checking if the sidebar is collapsed\n const isCollapsed = sidebarState === SidebarState.COLLAPSED;\n\n useEffect(() => {\n // blur the sidebar when the dropdown is open to focus on the dropdown\n setIsSidebarBlurred(isOpen);\n }, [isOpen]);\n\n useEffect(() => {\n // close the dropdown when clicking outside of it\n // granted it may be a click on the dropdown itself, but\n // we want to close it anyway when you click an item\n const handleClickOutside = () => setIsOpen(false);\n document.addEventListener(\"click\", handleClickOutside);\n return () => {\n document.removeEventListener(\"click\", handleClickOutside);\n };\n }, []);\n\n // due to positioning issues with the dropdown, we need to force a re-render after a delay\n // the dropdown will not get cut-off from parent scroll containers this way\n const toggleOpen = (event: any) => {\n event.stopPropagation();\n\n setIsOpen(!isOpen);\n setDropdownOpacity(0);\n\n if (!isOpen) {\n setTimeout(() => {\n setForceUpdate(true);\n setDropdownOpacity(1);\n }, 100);\n }\n };\n\n const handleUpdate = useCallback(() => {\n // force a re-render after the first update\n if (forceUpdate) {\n setForceUpdate(false);\n }\n }, [forceUpdate]);\n\n return (\n <div className=\"h-10\">\n <TetherComponent\n // @ts-ignore for some reason the types are not correct\n attachment=\"top left\"\n // @ts-ignore for some reason the types are not correct\n targetAttachment=\"bottom left\"\n // @ts-ignore for some reason the types are not correct\n offset=\"-12px 0\"\n onUpdate={handleUpdate}\n renderTarget={(ref) => (\n <Button\n variant=\"ghost\"\n ref={ref}\n onClick={toggleOpen}\n className={clsx(\n // base styles\n \"flex w-full overflow-hidden cursor-pointer rounded-lg items-center space-x-1 h-10 px-0 py-0\",\n // collapsed styles\n !isCollapsed ? \"justify-between\" : \"justify-center bg-transparent\"\n )}\n >\n <div className=\"flex w-full overflow-hidden items-center space-x-2\">\n <Logo\n className={classNames(\"h-9 w-9\", darkLogo && \"text-gray-900\")}\n />\n {!isCollapsed && (\n <div className=\"w-full overflow-hidden text-left text-base\">\n <div className=\"font-semibold text-gray-900 whitespace-nowrap truncate\">\n {currentSidebarAccount?.name}\n </div>\n <div className=\"font-medium text-gray-500\">\n {currentSidebarAccount?.number}\n </div>\n </div>\n )}\n </div>\n {!isCollapsed && <Icon name=\"ChevronUpDown\" />}\n </Button>\n )}\n renderElement={(ref) =>\n isOpen && (\n <div\n ref={ref}\n style={{ opacity: dropdownOpacity }}\n className=\"z-50 w-[275px] rounded-md border border-gray-200 bg-white p-4 space-y-2\"\n >\n <SidebarAccountItemDivider label=\"Individual Trading\" />\n {liveAccountItems.map((account) => (\n <SidebarAccountItem\n {...account}\n active={account.id === currentAccount?.id}\n onClick={() => handleSwitchAccount(account)}\n />\n ))}\n\n <SidebarAccountItemDivider label=\"Paper\" />\n {paperAccountItems.length > 0 ? (\n <div>\n {paperAccountItems.map((account) => (\n <SidebarAccountItem\n {...account}\n active={account.id === currentAccount?.id}\n onClick={() => handleSwitchAccount(account)}\n />\n ))}\n </div>\n ) : (\n <SidebarAccountMenuItem>\n No Paper Accounts\n </SidebarAccountMenuItem>\n )}\n\n <SidebarAccountItemDivider label=\"Account Management\" />\n {paperAccounts.length < MAX_PAPER_ACCOUNTS && (\n <SidebarAccountMenuItem\n onClick={() => setIsCreationModalOpen(true)}\n >\n Open New Paper Account\n </SidebarAccountMenuItem>\n )}\n <SidebarAccountMenuItem\n onClick={() =>\n history.push(\n Path.format(Path.ROUTE_ALPACA_PROFILE, {\n tab: \"manage-accounts\",\n })\n )\n }\n >\n Account Settings\n </SidebarAccountMenuItem>\n </div>\n )\n }\n />\n {isCreationModalOpen && (\n <CreatePaperAccountModal\n isOpen\n onClose={() => setIsCreationModalOpen(false)}\n />\n )}\n </div>\n );\n};\n\nexport default connect(mapStateToProps)(SidebarAccountSwitcher);\n","import React, {\n useState,\n useContext,\n useMemo,\n useEffect,\n ReactNode,\n} from \"react\";\n\nimport {\n UIContext,\n SidebarState,\n clsx,\n Icon,\n IconName,\n Tooltip,\n Button,\n getHashCode,\n} from \"@alpacahq/ui\";\n\nexport interface SidebarItemProps {\n label: ReactNode;\n leftIcon?: IconName;\n subItems?: ConditionalSidebarItemProps[];\n href?: string;\n active?: boolean;\n newTab?: boolean;\n divider?: boolean;\n unresponsive?: boolean;\n onClick?: () => void;\n}\n\nexport type ConditionalSidebarItemProps =\n | false // item can be false to conditionally render it\n | (SidebarItemProps &\n (\n | { subItems: never[]; href: string } // if the item has subItems, it can't have an href\n | { subItems?: ConditionalSidebarItemProps[]; href?: string }\n )); // same as default props for SidebarItemProps\n\nexport const SidebarItem: React.FC<ConditionalSidebarItemProps> = (props) => {\n // if the item is false, don't render anything (used for conditional rendering)\n if (typeof props === \"boolean\") {\n return null;\n }\n\n const {\n label,\n leftIcon,\n subItems,\n href,\n divider = false,\n newTab = false,\n active = false,\n onClick,\n unresponsive = false,\n } = props;\n\n const { history, sidebarState } = useContext(UIContext);\n\n const checkIsActive = (item: ConditionalSidebarItemProps) => {\n if (typeof item === \"boolean\") {\n return false;\n }\n\n const { href, active } = item;\n const path = href?.substring(0, href?.indexOf(\"?\")) || href;\n\n return active || (path && window.location.pathname === path);\n };\n\n const isActive = useMemo(() => checkIsActive(props), [active, href]);\n\n const [isOpen, setIsOpen] = useState(false);\n const [manualCollapseTriggered, setManualCollapseTriggered] = useState(false);\n const [filteredSubItems, setFilteredSubItems] = useState<SidebarItemProps[]>(\n []\n );\n\n useEffect(() => {\n if (subItems) {\n // @ts-ignore get around typescript complaining about the conditional props\n setFilteredSubItems(subItems.filter(Boolean));\n }\n }, [subItems]);\n\n useEffect(() => {\n if (!manualCollapseTriggered && filteredSubItems.some(checkIsActive)) {\n setIsOpen(true);\n } else {\n setIsOpen(false);\n }\n }, [manualCollapseTriggered, filteredSubItems]);\n\n // short-form for checking if the sidebar is collapsed\n const isCollapsed = unresponsive\n ? false\n : sidebarState === SidebarState.COLLAPSED;\n\n const handleItemClick = () => {\n // if the item has sub-items, toggle the dropdown and track the manual collapse status\n if (subItems) {\n if (isOpen && !manualCollapseTriggered) {\n setManualCollapseTriggered(true);\n } else {\n setIsOpen(!isOpen);\n setManualCollapseTriggered(false);\n }\n }\n\n // if the item has a href, navigate to it\n if (href) {\n if (newTab) {\n window.open(href, \"_blank\");\n } else {\n history?.push(href);\n }\n }\n };\n\n return (\n <>\n <div className=\"relative flex flex-col\">\n <Tooltip\n content={label}\n hidden={!isCollapsed}\n placement={isCollapsed ? \"right\" : \"top\"}\n >\n <Button\n className={\n \"flex w-full justify-start h-10 rounded-lg\" +\n (isActive ? \" bg-zinc-100\" : \"\")\n }\n variant={isActive ? \"secondary\" : \"ghost\"}\n leftIcon={leftIcon ? <Icon name={leftIcon} /> : undefined}\n onClick={() => {\n handleItemClick();\n if (onClick) {\n onClick();\n }\n }}\n >\n {!isCollapsed && (\n <span className=\"flex w-full flex-grow justify-start truncate\">\n {label}\n </span>\n )}\n {!!subItems && (\n <Icon\n name={isOpen ? \"ChevronDown\" : \"ChevronRight\"}\n className={clsx(\n \"h-4 w-4 stroke-[3px]\",\n isCollapsed && \"hidden\"\n )}\n />\n )}\n </Button>\n </Tooltip>\n {isOpen && (\n <div className={clsx(\"mt-0.5 space-y-0.5\", !isCollapsed && \"pl-2\")}>\n {filteredSubItems.map((subItem) => (\n <SidebarItem key={getHashCode(subItem)} {...subItem} />\n ))}\n </div>\n )}\n </div>\n </>\n );\n};\n\nexport default SidebarItem;\n","import TetherComponent from \"react-tether\";\n\nimport React, { useState, useEffect, useContext, useCallback } from \"react\";\n\nimport { Icon } from \"@alpacahq/ui\";\nimport { Button } from \"@alpacahq/ui\";\nimport { UIContext, getHashCode } from \"@alpacahq/ui\";\nimport { SidebarItemProps, SidebarItem } from \"./SidebarItem\";\n\nexport interface SidebarSettingsProps {\n settings: SidebarItemProps[];\n}\n\nexport const SidebarSettings: React.FC<SidebarSettingsProps> = ({\n settings,\n}) => {\n const { setIsSidebarBlurred } = useContext(UIContext);\n\n const [isOpen, setIsOpen] = useState(false);\n const [dropdownOpacity, setDropdownOpacity] = useState(0);\n const [forceUpdate, setForceUpdate] = useState(false);\n\n useEffect(() => {\n // blur the sidebar when the dropdown is open to focus on the dropdown\n setIsSidebarBlurred(isOpen);\n }, [isOpen]);\n\n useEffect(() => {\n // close the dropdown when clicking outside of it\n // granted it may be a click on the dropdown itself, but\n // we want to close it anyway when you click an item\n const handleClickOutside = () => setIsOpen(false);\n document.addEventListener(\"click\", handleClickOutside);\n return () => {\n document.removeEventListener(\"click\", handleClickOutside);\n };\n }, []);\n\n // due to positioning issues with the dropdown, we need to force a re-render after a delay\n // the dropdown will not get cut-off from parent scroll containers this way\n const toggleOpen = (event: any) => {\n event.stopPropagation();\n\n setIsOpen(!isOpen);\n setDropdownOpacity(0);\n\n if (!isOpen) {\n setTimeout(() => {\n setForceUpdate(true);\n setDropdownOpacity(1);\n }, 100);\n }\n };\n\n const handleUpdate = useCallback(() => {\n // force a re-render after the first update\n if (forceUpdate) {\n setForceUpdate(false);\n }\n }, [forceUpdate]);\n\n return (\n <TetherComponent\n // @ts-ignore for some reason the types are not correct\n attachment=\"bottom left\"\n // @ts-ignore for some reason the types are not correct\n targetAttachment=\"top left\"\n // @ts-ignore for some reason the types are not correct\n offset=\"12px 0\"\n onUpdate={handleUpdate}\n renderTarget={(ref) => (\n <Button ref={ref} variant=\"secondary\" onClick={toggleOpen}>\n <Icon name=\"Cog6Tooth\" />\n </Button>\n )}\n renderElement={(ref) =>\n isOpen && (\n <div\n ref={ref}\n style={{ opacity: dropdownOpacity }}\n className=\"z-50 min-w-[186.4px] space-y-0.5 rounded-md border border-gray-200 bg-white p-1\"\n >\n {settings.map((item) => (\n <SidebarItem key={getHashCode(item)} {...item} unresponsive />\n ))}\n </div>\n )\n }\n />\n );\n};\n","import React, { useContext } from \"react\";\n\nimport { Icon, UIContext, SidebarState, Button } from \"@alpacahq/ui\";\n\nexport const SidebarToggle: React.FC = () => {\n const { sidebarState, setSidebarState } = useContext(UIContext);\n\n const handleClick = () => {\n switch (sidebarState) {\n case SidebarState.EXPANDED:\n // if the sidebar is currently expanded, then collapse it\n // and update the local storage to remember this state\n setSidebarState(SidebarState.COLLAPSED);\n localStorage.setItem(\"sidebarState\", SidebarState.COLLAPSED);\n break;\n\n case SidebarState.MOBILE:\n // if the sidebar is currently in the mobile state, then hide it\n // and remove the corresponding local storage entry\n setSidebarState(SidebarState.HIDDEN);\n localStorage.removeItem(\"sidebarState\");\n break;\n\n case SidebarState.COLLAPSED:\n // if the sidebar is currently collapsed, then expand it\n // and update the local storage to remember this state\n setSidebarState(SidebarState.EXPANDED);\n localStorage.setItem(\"sidebarState\", SidebarState.EXPANDED);\n break;\n\n default:\n // if the sidebar state is neither expanded, mobile nor collapsed\n console.error(\"invalid sidebarState\");\n }\n };\n\n // determine the name of the icon based on the current sidebar state\n const iconName = [SidebarState.EXPANDED, SidebarState.MOBILE].includes(\n sidebarState\n )\n ? \"ArrowSmallLeft\"\n : \"ArrowSmallRight\";\n\n return (\n <Button onClick={handleClick} variant=\"secondary\">\n <Icon name={iconName} />\n </Button>\n );\n};\n\nexport default SidebarToggle;\n","import React, { useContext, useMemo } from \"react\";\n\nimport SidebarAccountSwitcher, {\n SidebarAccountSwitcherProps,\n} from \"./SidebarAccountSwitcher\";\n\nimport { SidebarState, Text, UIContext, clsx, getHashCode } from \"@alpacahq/ui\";\nimport { ConditionalSidebarItemProps, SidebarItem } from \"./SidebarItem\";\nimport { SidebarSettings, SidebarSettingsProps } from \"./SidebarSettings\";\nimport { SidebarToggle } from \"./SidebarToggle\";\n\nexport interface SidebarProps\n extends SidebarAccountSwitcherProps,\n SidebarSettingsProps {\n items: ConditionalSidebarItemProps[];\n darkLogo?: boolean;\n version?: string;\n children?: React.ReactNode;\n ownerId?: string;\n product: string;\n}\n\nexport const Sidebar: React.FC<SidebarProps> = ({\n items,\n darkLogo,\n version,\n settings,\n children,\n ownerId,\n product,\n}) => {\n const { sidebarState, isSidebarBlurred } = useContext(UIContext);\n\n const sidebarItems = useMemo(() => {\n return (\n items\n .filter(Boolean)\n // @ts-ignore\n .map((item) => <SidebarItem key={getHashCode(item)} {...item} />)\n );\n }, [items]);\n\n return (\n // this is the sidebar container\n <div className=\"overflow-y-auto h-screen flex-shrink-0\">\n <nav\n className={clsx(\n // base styles for the sidebar itself\n \"flex flex-col space-y-6 rounded-lg h-full p-6 pr-5\",\n // when you click on a sidebar drop menu, the sidebar is \"blurred\"\n isSidebarBlurred && \"pointer-events-none\",\n // the sidebar is hidden when the user is on mobile\n sidebarState === SidebarState.HIDDEN && \"hidden\",\n // the sidebar is expanded when the user is on desktop otherwise it's collapsed (w-fit)\n sidebarState === SidebarState.EXPANDED ? \"w-64\" : \"w-fit\",\n // on mobile we want full height and width\n sidebarState === SidebarState.MOBILE &&\n \"fixed top-0 left-0 z-50 h-full w-full bg-white overflow-y-scroll rounded-none border-transparent\"\n )}\n >\n <SidebarAccountSwitcher\n darkLogo={darkLogo}\n ownerId={ownerId}\n product={product}\n />\n <div\n className={clsx(\n // base styles for the sidebar items\n \"flex flex-col space-y-0\",\n // if collapsed, we want the sidebar items to be centered\n sidebarState === SidebarState.COLLAPSED && \"items-center\"\n )}\n >\n {sidebarItems}\n </div>\n {children}\n <div className=\"flex w-full flex-1 items-end\">\n <div\n className={clsx(\n // base styles for the sidebar tools\n \"flex w-full justify-between\",\n // if expanded or mobile, we want the tools to be spaced out\n [SidebarState.EXPANDED, SidebarState.MOBILE].includes(\n sidebarState\n )\n ? \"space-x-4\"\n : \"flex-col items-center space-y-2.5\"\n )}\n >\n <SidebarSettings settings={settings} />\n <SidebarToggle />\n </div>\n </div>\n {\n // show the app version when the sidebar is not collapsed\n version && sidebarState === SidebarState.EXPANDED && (\n <Text className=\"mx-auto text-center text-base font-medium text-gray-500\">\n {version}\n </Text>\n )\n }\n </nav>\n </div>\n );\n};\nexport default Sidebar;\n","import styled from \"@emotion/styled\";\nimport AmplitudeProvider from \"src/AmplitudeProvider\";\nimport TopBar from \"./topbar\";\n\nimport {\n useGetAccountDetails,\n useGetBillingOverview,\n useGetElitePerks,\n} from \"src/v2/api/hooks\";\n\nimport React, { useContext, useEffect, useMemo, useState } from \"react\";\n\nimport { classNames, Link, SidebarState, UIContext } from \"@alpacahq/ui\";\nimport { Box, Progress } from \"@chakra-ui/react\";\nimport { isNotFullActiveAccount } from \"../../../utils/isNotFullActiveAccount\";\nimport { inSupportedLocation } from \"../../../utils/crypto\";\nimport { featureFlagManager, setFlag } from \"../../../v2/helpers/flags\";\nimport { AuthService } from \"../../api/auth\";\nimport { PaperBanner } from \"../../pages/dashboard/home/paperBanner\";\nimport { Path } from \"../../path\";\nimport { isPaperOrOnboarding } from \"../../utils\";\nimport { Sidebar, SidebarProps } from \"../Sidebar/Sidebar\";\nimport { useAccountContext } from \"src/v2/providers/AccountProvider\";\n\n// experimenting with larger screen size for some pages - ie `/trade/NVDA`\nconst WIDE_PAGE_MAX_WIDTH = \"max-w-[1648px]\";\nconst WIDE_PAGES = [\n \"/trade/\",\n \"/account/orders\",\n \"/brokerage/dashboard/overview\",\n \"/paper/dashboard/overview\",\n \"/brokerage/dashboard/crypto-transfers\",\n];\n\nexport interface PageProps {\n children: React.ReactNode;\n noHeader?: boolean;\n disableAppMenu?: boolean;\n product: string;\n}\n\nexport const FDIC_SWEEP_FEATURE_FLAG = \"fdic_sweep_feature_flag\";\n\nexport const FDIC_SWEEP_FEATURE_FLAG_PERCENTAGE = 100;\n\nexport const heights: Record<string, string | any> = {\n sidebar: \"70px\",\n topbar: \"91.6667px\",\n apply: (value: string) =>\n value.replace(/{(.*?)}/g, (match, key) => heights[key]),\n};\n\nconst Container = styled(Box)`\n .page--content {\n margin-left: auto;\n margin-right: auto;\n }\n\n .sticky {\n position: sticky;\n top: 0;\n }\n`;\n\nexport const Page = (props: PageProps) => {\n const { sidebarState } = useContext(UIContext);\n\n const [product, setProduct] = useState(props.product);\n\n const isDebugMode =\n new URLSearchParams(window?.location?.search ?? \"\")?.get(\"debug\") ?? null;\n\n if (isDebugMode !== null) {\n setFlag(\"debug\", isDebugMode === \"true\");\n }\n\n featureFlagManager(\n FDIC_SWEEP_FEATURE_FLAG,\n FDIC_SWEEP_FEATURE_FLAG_PERCENTAGE\n );\n\n const {\n currentAccount,\n liveAccounts,\n setProduct: setAccountContextProduct,\n } = useAccountContext();\n\n useEffect(() => {\n if (product === \"dynamic\") {\n const updatedProduct = window.localStorage.getItem(\"product\") || \"paper\";\n setProduct(updatedProduct);\n setAccountContextProduct(updatedProduct);\n }\n setAccountContextProduct(product);\n }, [product]);\n\n const isPaper = product === \"paper\";\n const isWidePage = WIDE_PAGES.some((path) =>\n window?.location?.pathname?.startsWith(path)\n );\n\n const { noHeader, children, disableAppMenu } = props;\n\n const liveAccount = liveAccounts?.[0];\n // These endpoints are using the live account to determine information\n const { billing } = useGetBillingOverview(\"billing\", {\n enabled: !!liveAccount,\n });\n const { details } = useGetAccountDetails(\"details\", liveAccount?.id, {\n enabled: !!currentAccount?.id,\n });\n const { perks } = useGetElitePerks(\"elite-perks\", liveAccount?.id ?? \"\", {\n enabled: !!liveAccount?.id && !isPaperOrOnboarding(liveAccount),\n });\n\n const isSubscribed =\n (billing?.lifetimeSubCount || 0) > 0 || perks?.market_data;\n const cryptoTier = liveAccount?.crypto_tier ?? 0;\n\n // percentage of tier completion, given 8 tiers\n const cryptoTierProgress = (cryptoTier / 8) * 100;\n\n const canTransferCrypto =\n inSupportedLocation(details) && !isNotFullActiveAccount({ liveAccount });\n\n const sidebarProps: Pick<SidebarProps, \"settings\" | \"items\"> = useMemo(\n () => ({\n settings: [\n {\n label: \"Profile\",\n leftIcon: \"Identification\",\n href: Path.ROUTE_ALPACA_PROFILE,\n },\n {\n label: \"Log Out\",\n leftIcon: \"LockClosed\",\n onClick: AuthService.signOut,\n },\n ],\n items: [\n {\n label: \"Home\",\n leftIcon: \"Home\",\n href: Path.format(Path.ROUTE_DASHBOARD, { product }),\n },\n {\n label: \"Account\",\n leftIcon: \"RectangleStack\",\n subItems: [\n {\n label: \"Positions\",\n leftIcon: \"ChartPie\",\n href: Path.ROUTE_POSITIONS,\n },\n {\n label: \"Orders\",\n leftIcon: \"ClipboardDocumentList\",\n href: Path.format(Path.ROUTE_ORDERS, { product }),\n },\n {\n label: \"Activities\",\n leftIcon: \"QueueList\",\n href: Path.format(Path.ROUTE_ACCOUNT_ACTIVITIES, { product }),\n },\n {\n label: \"Balances\",\n leftIcon: \"TableCells\",\n href: Path.format(Path.ROUTE_BALANCES, { product }),\n },\n {\n label: \"Configure\",\n leftIcon: \"AdjustmentsVertical\",\n href: Path.ROUTE_CONFIGURATION,\n },\n !isPaper && {\n label: \"Documents\",\n leftIcon: \"DocumentDuplicate\",\n href: Path.ROUTE_DOCUMENTS,\n },\n ],\n },\n {\n label: \"Alpaca Connect\",\n leftIcon: \"Cloud\",\n href: Path.ROUTE_ALPACA_CONNECT,\n },\n {\n label: \"Plans & Features\",\n leftIcon: \"Heart\",\n href: Path.ROUTE_PLANS_AND_FEATURES,\n subItems: [\n !isPaper && {\n label: \"Trading Plan\",\n leftIcon: \"ClipboardDocumentList\",\n href: Path.ROUTE_ALPACA_TRADING_PLAN,\n },\n !details?.is_professional && {\n label: \"Market Data\",\n leftIcon: \"PresentationChartLine\",\n href: isSubscribed\n ? Path.ROUTE_USER_SUBSCRIPTION\n : Path.ROUTE_USER_SUBSCRIPTION_NEW,\n },\n !isPaper &&\n canTransferCrypto && {\n label: \"Crypto Fee\",\n leftIcon: \"ChartBarSquare\",\n href: Path.format(Path.ROUTE_ALPACA_PROFILE, {\n tab: \"crypto-fees\",\n }),\n },\n ],\n },\n !isPaper && {\n label: `Funds${canTransferCrypto ? \" & Wallet\" : \"\"}`,\n leftIcon: \"Banknotes\",\n subItems: [\n {\n label: \"Transfer\",\n leftIcon: \"BuildingLibrary\",\n href: Path.format(Path.ROUTE_FUNDING, { product }),\n },\n {\n label: \"History\",\n leftIcon: \"ArchiveBox\",\n href: Path.format(Path.ROUTE_FUNDING_HISTORY, { product }),\n },\n canTransferCrypto && {\n label: \"Crypto Transfers\",\n leftIcon: \"CurrencyDollar\",\n href: Path.format(Path.ROUTE_CRYPTO_TRANSFERS, { product }),\n },\n ],\n },\n {\n label: \"API\",\n leftIcon: \"CommandLine\",\n href: Path.URL_DOCS,\n newTab: true,\n },\n {\n label: \"Community\",\n leftIcon: \"ChatBubbleLeftRight\",\n subItems: [\n {\n label: \"Slack\",\n leftIcon: \"Hashtag\",\n href: Path.URL_SLACK,\n newTab: true,\n },\n {\n label: \"Forum\",\n leftIcon: \"Users\",\n href: Path.URL_FORUM,\n newTab: true,\n },\n ],\n },\n {\n label: \"Support\",\n leftIcon: \"Lifebuoy\",\n href: Path.URL_SUPPORT,\n newTab: true,\n },\n {\n label: \"Legal\",\n leftIcon: \"Scale\",\n href: Path.URL_DISCLOSURES,\n newTab: true,\n },\n ],\n }),\n [\n ,\n canTransferCrypto,\n details,\n isNotFullActiveAccount,\n isPaper,\n isSubscribed,\n product,\n sidebarState,\n ]\n );\n\n useEffect(() => {\n // if defined pass account and details to AmplitudeProvider\n if (details && liveAccount) {\n AmplitudeProvider.setAccount({ liveAccount, details });\n }\n }, [liveAccount, details]);\n\n return (\n <>\n <Container>\n <Box h=\"100%\" w=\"100%\" display=\"flex\" id=\"page-wrapper\">\n {!disableAppMenu && sidebarState !== SidebarState.HIDDEN && (\n <Sidebar\n {...sidebarProps}\n ownerId={liveAccount?.id}\n product={product}\n >\n {sidebarState === SidebarState.EXPANDED &&\n !isPaper &&\n canTransferCrypto && (\n <>\n <div className=\"bg-white border border-b-3 border-warm-gray-200 rounded-md p-2.5\">\n <Link\n className=\"w-full font-medium text-gray-800 dark:text-gray-200 rounded-md focus:border-yellow-50 focus:outline-none focus:ring-yellow-50\"\n to={Path.format(Path.ROUTE_ALPACA_PROFILE, {\n tab: \"crypto-fees\",\n })}\n >\n <div className=\"flex justify-between items-center mb-2\">\n Crypto Fee Rate\n <label className=\"text-xs bg-gray-200 rounded p-1 dark:bg-blue-400 dark:text-gray-800\">\n Level {cryptoTier}\n </label>\n </div>\n <Progress\n bg=\"gray.50\"\n id=\"progress\"\n size=\"sm\"\n hasStripe\n isAnimated\n rounded=\"md\"\n value={cryptoTierProgress}\n />\n </Link>\n </div>\n </>\n )}\n </Sidebar>\n )}\n <Box\n h=\"100vh\"\n marginLeft=\"auto\"\n overflowY=\"scroll\"\n flexGrow={1}\n className={classNames(\n \"page--content\",\n sidebarState !== SidebarState.HIDDEN && \"pl-1\",\n isWidePage ? WIDE_PAGE_MAX_WIDTH : \"max-w-6xl\"\n )}\n >\n {!noHeader && (\n <>\n {product === \"paper\" && <PaperBanner account={liveAccount} />}\n <TopBar product={product} />\n </>\n )}\n <Box>\n <Box id=\"__anchor\" />\n {children}\n </Box>\n </Box>\n </Box>\n </Container>\n </>\n );\n};\n\nexport default Page;\n","export const isCryptoEnabled = (countryCode, state, infoMap) => {\n if (countryCode === \"USA\") {\n const supportedStates = window.env.SUPPORTED_CRYPTO_STATES || \"\";\n return supportedStates.split(\",\").includes(state?.toUpperCase());\n }\n\n return Boolean(infoMap?.[countryCode]?.crypto_enabled);\n};\n\nexport const inSupportedLocation = (accountDetails) => {\n const supportedCountries =\n window.env.SUPPORTED_CRYPTO_TRANSFER_COUNTRIES?.split(\",\") ?? [];\n\n const supportedStates = window.env.SUPPORTED_CRYPTO_STATES?.split(\",\") ?? [];\n\n return _inSupportedLocation(\n accountDetails,\n supportedCountries,\n supportedStates\n );\n};\n\nexport const _inSupportedLocation = (\n accountDetails,\n supportedCountries,\n supportedStates\n) => {\n if (!accountDetails) return false;\n const { state, country_of_tax_residence } = accountDetails;\n\n if (supportedCountries.includes(country_of_tax_residence)) {\n if (country_of_tax_residence === \"USA\") {\n return supportedStates.includes(state);\n }\n return true;\n }\n\n return false;\n};\n","import { colors } from \"@alpacahq/sassy\";\nimport { extendTheme } from \"@chakra-ui/react\";\n\nexport const TOAST_THEME = {\n style: {\n background: \"#ffffff\",\n border: \"1px solid #E4E4E7\",\n borderRadius: \"6px\",\n padding: \"16px\",\n paddingTop: \"12px\",\n paddingBottom: \"12px\",\n gap: \"5px\",\n boxShadow: \"none\",\n maxWidth: \"500px\",\n },\n};\n\nexport const customTheme = (mode: any) =>\n extendTheme({\n styles: {\n global: () => ({\n html: {\n fontFamily: \"Inter var, sans-serif\",\n background: \"#ffffff\",\n color: \"black\",\n fontSize: \"14px\",\n lineHeight: \"16px\",\n textRendering: \"unset\",\n WebkitFontSmoothing: \"unset\",\n },\n body: {\n fontFamily: \"Inter var, sans-serif\",\n background: \"#ffffff\",\n color: \"black\",\n fontSize: \"14px\",\n lineHeight: \"16px\",\n },\n div: {\n borderColor: mode(\n \"var(--chakra-colors-gray-90) !important\",\n \"var(--chakra-colors-gray-20)\"\n ),\n },\n hr: {\n opacity: \"1 !important\",\n borderColor: mode(\n \"var(--chakra-colors-gray-90) !important\",\n \"var(--chakra-colors-gray-15) !important\"\n ),\n },\n p: {\n color: mode(\"gray.10\", \"gray.100\"),\n },\n\n h2: {\n color: mode(\"gray.10\", \"gray.100\"),\n borderColor: mode(\n \"var(--chakra-colors-gray-90) !important\",\n \"var(--chakra-colors-gray-20)\"\n ),\n },\n \".chakra-menu__menuitem\": {\n color: mode(\"gray.10\", \"black !important\"),\n fontWeight: 400,\n _focus: {\n background: \"var(--chakra-colors-gray-15) !important\",\n },\n },\n }),\n },\n fonts: {\n heading: \"Inter var, sans-serif\",\n body: \"Inter var, sans-serif\",\n mono: \"Roboto Mono, monospace\",\n },\n space: {\n xxs: \"0.215rem\",\n xs: \"0.43rem\",\n sm: \"0.96rem\",\n md: \"1.6rem\",\n lg: \"3.2rem\",\n xl: \"6.4rem\",\n },\n fontSizes: {\n xs: \".86rem\",\n sm: \".96rem\",\n md: \"0.98rem\",\n lg: \"1.125rem\",\n xl: \"1.250rem\",\n \"2xl\": \"1.5rem\",\n \"3xl\": \"1.875rem\",\n \"4xl\": \"2.25rem\",\n \"5xl\": \"2.86rem\",\n \"6xl\": \"3.75rem\",\n \"7xl\": \"4.5rem\",\n \"8xl\": \"6rem\",\n \"9xl\": \"8rem\",\n },\n colors: {\n ...colors,\n pastel: {\n green: \"#5DAF90\",\n red: \"#e65555\",\n },\n black: \"#010101\",\n gray: {\n ...colors.gray,\n 90: \"#181818\",\n 20: \"#e4e4e4\",\n 15: \"#f0f0f0\",\n 10: \"#f7f7f7\",\n },\n },\n components: {\n Radio: {\n baseStyle: {\n control: {\n borderColor: \"gray.20\",\n _checked: {\n bg: \"yellow.60\",\n color: \"gray.10\",\n borderColor: \"yellow.60\",\n _hover: {\n bg: \"yellow.60\",\n color: \"gray.10\",\n borderColor: \"yellow.60\",\n },\n },\n _focus: {\n boxShadow: \"none !important\",\n },\n },\n label: {\n fontSize: \"1rem !important\",\n fontFamily: \"Inter var, sans-serif\",\n },\n },\n },\n Icon: {\n baseStyle: (props: any) => ({\n color: mode(\"gray.10 !important\", \"gray.100\"),\n }),\n },\n Text: {\n baseStyle: (props: any) => ({\n color: mode(\"gray.10 !important\", \"gray.100\"),\n fontFamily: \"Inter var, sans-serif !important\",\n }),\n },\n Checkbox: {\n baseStyle: {\n label: {\n fontFamily: \"Inter var, sans-serif !important\",\n },\n control: {\n _checked: {\n color: \"yellow.80\",\n background: \"yellow.50\",\n borderColor: \"yellow.50\",\n _hover: {\n background: \"yellow.50\",\n borderColor: \"yellow.50\",\n },\n },\n },\n },\n },\n Link: {\n baseStyle: {\n fontSize: \"1rem\",\n color: \"#191919\",\n textDecoration: \"none\",\n fontFamily: \"Inter var, sans-serif !important\",\n },\n },\n Switch: {\n baseStyle: {\n track: {\n bg: \"gray.40\",\n _checked: {\n bg: \"yellow.50\",\n },\n },\n },\n },\n Input: {\n baseStyle: {\n fontFamily: \"Inter var, sans-serif !important\",\n },\n defaultProps: {\n variant: \"filled\",\n },\n variants: {\n flushed: {\n field: {\n color: \"gray.100\",\n borderBottom: \"1px solid var(--chakra-colors-gray-20) !important\",\n boxShadow: \"none !important\",\n _focused: {\n borderBottom:\n \"1px solid var(--chakra-colors-gray-20) !important\",\n boxShadow: \"none !important\",\n },\n _placeholder: {\n color: \"var(--chakra-colors-gray-60) !important\",\n opacity: \"1 !important\",\n },\n },\n },\n skeleton: {\n field: {\n color: \"gray.100\",\n border: \"2px solid var(--chakra-colors-gray-15) !important\",\n boxShadow: \"none !important\",\n _focused: {\n border: \"2px solid var(--chakra-colors-gray-20) !important\",\n boxShadow: \"none !important\",\n },\n _placeholder: {\n color: \"var(--chakra-colors-gray-60) !important\",\n opacity: \"1 !important\",\n },\n },\n },\n filled2: {\n field: {\n color: \"gray.100\",\n border: \"1px solid transparent\",\n background: \"gray.15\",\n _placeholder: {\n color: \"var(--chakra-colors-gray-60) !important\",\n opacity: \"1 !important\",\n },\n _focus: {\n border: \"1px solid gray.10\",\n color: mode(\"gray.10\", \"gray.100\"),\n },\n },\n },\n\n filled: {\n field: {\n background: mode(\"#29292c\", \"gray.20\"),\n color: \"gray.100\",\n border: \"1px solid transparent\",\n _placeholder: {\n color: \"var(--chakra-colors-gray-60) !important\",\n opacity: \"1 !important\",\n },\n _hover: {\n background: \"gray.20\",\n color: \"gray.100\",\n },\n _focus: {\n shadow: \"sm\",\n background: mode(\"#000\", \"gray.20\"),\n borderColor: \"transparent\",\n color: mode(\"gray.10\", \"gray.100\"),\n },\n },\n },\n },\n },\n Select: {\n defaultProps: {\n variant: \"skeleton\",\n },\n variants: {\n lightGray: {\n field: {\n fontWeight: 400,\n color: \"black\",\n borderRadius: \"md\",\n background: \"gray.20\",\n fontSize: \".9rem\",\n border: \"none\",\n _hover: {\n boxShadow: \"0 3px 6px -2px rgba(140,152,164,.25)\",\n },\n _focus: {\n boxShadow: \"0 3px 6px -2px rgba(140,152,164,.25)\",\n },\n },\n },\n yellow: {\n field: {\n fontWeight: 500,\n color: \"black\",\n borderRadius: \"md\",\n background: \"yellow.20\",\n fontSize: \".9rem\",\n border: \"1px solid var(--chakra-colors-yellow-40)\",\n _hover: {\n boxShadow: \"0 3px 6px -2px rgba(140,152,164,.25)\",\n },\n _focus: {\n boxShadow: \"0 3px 6px -2px rgba(140,152,164,.25)\",\n },\n },\n },\n skeleton: {\n field: {\n fontWeight: 500,\n color: \"black\",\n borderRadius: \"md\",\n fontSize: \".9rem\",\n border: \"1px solid var(--chakra-colors-gray-20)\",\n _hover: {},\n _focus: {},\n },\n },\n skeleton__light_gray: {\n field: {\n background: \"gray.20\",\n color: \"black\",\n borderRadius: \"md\",\n fontSize: \"xs\",\n fontWeight: 500,\n border: \"1px solid transparent !important\",\n _hover: {},\n _focus: {},\n },\n },\n solid: {\n field: {\n border: \"none\",\n background: \"gray.15\",\n fontWeight: 400,\n color: \"gray.100\",\n _placeholder: { color: \"gray.50\", opacity: 1 },\n _hover: { backgroundColor: \"gray.15\", color: \"auto\" },\n _focus: { backgroundColor: \"gray.15\", color: \"auto\" },\n },\n },\n },\n },\n Button: {\n defaultProps: {\n variant: \"primary\",\n },\n variants: {\n skeleton: {\n fontWeight: 500,\n color: \"black\",\n borderRadius: \"md\",\n fontSize: \".9rem\",\n minWidth: \"fit-content\",\n border: \"2px solid var(--chakra-colors-gray-20)\",\n _hover: {\n border: \"2px solid var(--chakra-colors-gray-30)\",\n },\n },\n primary: {\n bg: \"yellow.40\",\n fontWeight: 500,\n color: \"yellow.100\",\n fontSize: \".9rem\",\n borderRadius: \"md\",\n _disabled: {\n _hover: {\n background: \"var(--chakra-colors-yellow-40) !important\",\n },\n },\n _hover: {\n bg: \"yellow.40\",\n },\n },\n red: {\n bg: \"red.60\",\n fontWeight: \"500\",\n color: \"black\",\n borderRadius: \"md\",\n fontSize: \".9rem\",\n _disabled: {\n _hover: {\n background: \"red.60 !important\",\n },\n },\n _hover: {\n bg: \"red.60\",\n },\n },\n },\n sizes: { lg: { height: \"46px !important\" } },\n },\n },\n });\n","import useRequest, { QueryOptions } from \"./useRequest\";\nimport { Billing, getBillingOverview } from \"../rest/billing\";\nimport { QueryObserverResult } from \"react-query\";\n\ntype UseGetBillingOverview = {\n billing?: Billing;\n refetch: () => Promise<QueryObserverResult<Billing, unknown>>;\n};\n\nexport const useGetBillingOverview = (\n key: any | any[] = \"\",\n options?: QueryOptions<Billing>\n): UseGetBillingOverview => {\n const { data: billing, isError, isSuccess, refetch } = useRequest(\n \"billing\" + key,\n getBillingOverview,\n { refetchInterval: false, ...options }\n );\n\n return { billing, refetch };\n};\n","import useRequest, { QueryOptions } from \"./useRequest\";\nimport { getOwners, Owner } from \"../rest/account\";\n\nexport const useGetOwners = (\n key: any | any[] = \"\",\n accountId: string,\n options?: QueryOptions<Owner[]>\n) => {\n const {\n data: owners,\n refetch,\n isLoading,\n } = useRequest(key, () => getOwners(accountId), {\n refetchInterval: false,\n enabled: !!accountId,\n ...options,\n });\n\n return { owners, refetch, isLoading };\n};\n\nexport default useGetOwners;\n","export const isETC = (clearingBroker) =>\n clearingBroker === \"ETC\" ||\n clearingBroker === \"VELOX\" ||\n clearingBroker === \"ALPACA_APCA\";\n","import { createAction, createReducer } from \"redux-act\";\nimport { handleSessionExpire } from \"./alpacaAuth/session\";\nimport { billing } from \"api\";\n\nconst REDUCER = \"billing\";\nconst NS = `@@${REDUCER}/`;\n\nconst _setPlans = createAction(`${NS}SET_PLANS`);\nconst _billingCreated = createAction(`${NS}BILLING_CREATED`);\nconst _billingCanceled = createAction(`${NS}BILLING_CANCELED`);\nconst _billingUpdated = createAction(`${NS}BILLING_UPDATED`);\nconst _getOverview = createAction(`${NS}BILLING_OVERVIEW`);\n\nconst _processStripeResponse = async (stripe, overview) => {\n const { paymentIntentSecret, setupIntentSecret } = overview;\n\n if (paymentIntentSecret) {\n const { error, paymentIntent } = await stripe.confirmCardPayment(\n paymentIntentSecret\n );\n\n if (error) {\n return Promise.reject(error);\n }\n\n if (paymentIntent.status === \"succeeded\") {\n return Promise.resolve(overview);\n } else if (paymentIntent.status === \"requires_payment_method\") {\n return Promise.reject(paymentIntent.last_payment_error);\n }\n }\n\n if (setupIntentSecret) {\n const { error, setupIntent } = await stripe.confirmCardSetup(\n setupIntentSecret\n );\n\n if (error) {\n return Promise.reject(error);\n }\n\n if (setupIntent.status === \"succeeded\") {\n return Promise.resolve(overview);\n } else if (setupIntent.status === \"requires_payment_method\") {\n return Promise.reject(setupIntent.last_setup_error);\n }\n }\n\n return Promise.resolve(overview);\n};\n\n/**\n * getPlans will retrieve a list of all plans\n */\nexport const getPlans = () => (dispatch) =>\n dispatch(billing.plans()).then((plans) => dispatch(_setPlans({ plans })));\n\n/**\n * createStripeSubscription will create a stripe subscription for the user\n */\nexport const createStripeSubscription = (\n stripe,\n token,\n plan,\n address,\n coupon\n) => (dispatch, getState) => {\n return handleSessionExpire(\n billing.stripe\n .create({}, { token, plan, address, coupon })(dispatch, getState)\n .then((overview) => _processStripeResponse(stripe, overview))\n .then((overview) => dispatch(_billingCreated({ overview }))),\n dispatch\n );\n};\n\n/**\n * createAlpacaSubscription will create a subscription via brokerage for the user\n */\nexport const createAlpacaSubscription = (plan, coupon) => (\n dispatch,\n getState\n) => {\n return handleSessionExpire(\n billing.alpaca\n .create({}, { plan, coupon })(dispatch, getState)\n .then(() => dispatch(getBillingOverview())),\n dispatch\n );\n};\n\n/**\n * cancelstripeSubscription will cancel the subscription via brokerage for the user\n */\nexport const cancelStripeSubscription = (reason) => (dispatch, getState) => {\n return handleSessionExpire(\n billing.stripe\n .cancel({}, { reason })(dispatch, getState)\n .then(async (overview) => dispatch(_billingCanceled({ overview }))),\n dispatch\n );\n};\n\n/**\n * cancelAlpacaSubscription will cancel the subscription via brokerage for the user\n */\nexport const cancelAlpacaSubscription = (reason) => (dispatch, getState) => {\n return handleSessionExpire(\n billing.alpaca\n .cancel({}, { reason })(dispatch, getState)\n .then(async (overview) => dispatch(_billingCanceled({ overview }))),\n dispatch\n );\n};\n\n/**\n * updateStripeSubscription will update the subscription via stripe for the user\n */\nexport const updateStripeSubscription = (stripe, token) => (\n dispatch,\n getState\n) => {\n return handleSessionExpire(\n billing.stripe\n .update({}, { token })(dispatch, getState)\n .then((overview) => _processStripeResponse(stripe, overview))\n .then((overview) => dispatch(_billingUpdated({ overview }))),\n dispatch\n );\n};\n\n/**\n * getBillingOverview will retrieve the billing overview for the user\n */\nexport const getBillingOverview = () => (dispatch, getState) => {\n return handleSessionExpire(\n billing\n .overview({})(dispatch, getState)\n .then(async (overview) => dispatch(_getOverview({ overview })))\n .catch(console.error),\n dispatch\n );\n};\n\n// Export this reducer\nconst initialState = {};\nexport default createReducer(\n {\n [_setPlans]: (state, { plans }) => {\n return { ...state, plans };\n },\n [_billingCreated]: (state, { overview }) => {\n return { ...state, overview };\n },\n [_getOverview]: (state, { overview }) => {\n return { ...state, overview };\n },\n [_billingCanceled]: (state, { overview }) => {\n return { ...state, overview };\n },\n [_billingUpdated]: (state, { overview }) => {\n return { ...state, overview };\n },\n },\n initialState\n);\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { getCryptoFeeStructure, CryptoFeeStructure } from \"../rest/billing\";\n\nexport const useGetCryptoFeeStructure = (\n key: any | any[] = \"crypto-fee-structure\",\n options?: QueryOptions<CryptoFeeStructure>\n) => {\n const { data } = useRequest(key, () => getCryptoFeeStructure(), {\n ...options,\n });\n\n return { ...data };\n};\n\nexport default useGetCryptoFeeStructure;\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { CryptoMonthlyVolume, getCryptoMonthlyVolume } from \"../rest/billing\";\n\nexport const useGetCryptoMonthlyVolume = (\n key: any | any[] = \"crypto-monthly-volume\",\n accountID: string = \"\",\n options?: QueryOptions<CryptoMonthlyVolume>\n) => {\n const { data } = useRequest(key, () => getCryptoMonthlyVolume(accountID), {\n enabled: !!accountID,\n ...options,\n });\n\n return { ...data };\n};\n\nexport default useGetCryptoMonthlyVolume;\n","import moment from \"moment\";\n\nimport React, { useEffect, useState } from \"react\";\n\nimport { Text } from \"@alpacahq/ui\";\nimport { Auth } from \"aws-amplify\";\nimport { EditProfileForm } from \"./pages/User/ProfilePage/ProfileContainer/AccountSecurity\";\nimport { useGetAccount } from \"./v2/api/hooks\";\nimport { Card } from \"./v2/components\";\n\nexport const MFA_ENFORCED_DATE = \"2024-06-13\";\nexport const MFA_DUE_DATE = \"2025-03-31\";\nexport const WARNING_KEY = \"mfa_warning\";\n\nconst canRenderMFAGuard = (account, cognitoUser) => {\n if (\n cognitoUser?.preferredMFA === \"NOMFA\" &&\n moment(account?.created_at).isSameOrAfter(MFA_ENFORCED_DATE, \"day\")\n ) {\n return true;\n }\n\n return false;\n};\n\nexport const canRenderWarning = (cognitoUser) => {\n return cognitoUser?.preferredMFA === \"NOMFA\";\n};\n\nexport const MFAGuard = ({ children }) => {\n const { account } = useGetAccount();\n\n const [cognitoUser, setCognitoUser] = useState(null);\n\n useEffect(() => {\n Auth.currentAuthenticatedUser()\n .then((user) => setCognitoUser(user))\n .catch((err) => console.error(\"MFAGuard err\", err));\n }, []);\n\n // Render a loader or a placeholder while loading\n if (!account?.created_at) {\n return <div className=\"text-zinc-500\">Checking MFA status...</div>;\n }\n\n // Render MFA guard if conditions are met\n if (canRenderMFAGuard(account, cognitoUser)) {\n return (\n <Card title=\"MFA is required\" className=\"mr-8\">\n <Text className=\"text-md opacity-75\">\n Please enable MFA on your account before continuing.\n {/* You can do so by choosing an authentication type below. */}\n </Text>\n <EditProfileForm showSMSOption={!!account?.account_number} />\n </Card>\n );\n }\n\n // Render children if no MFA guard is needed\n return children;\n};\n","import React, { forwardRef } from \"react\";\nimport styled from \"styled-components\";\nimport PhoneInput from \"react-phone-input-2\";\nimport \"react-phone-input-2/lib/style.css\";\n\nconst Container = styled.div`\n .react-tel-input {\n font-family: Carnas;\n\n .form-control {\n width: 100%;\n border: 1px solid #e4e9f0;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n }\n\n .flag-dropdown,\n .flag-dropdown.open {\n background-color: transparent;\n border: 1px solid transparent;\n }\n }\n`;\n\nconst AntPhoneInput = forwardRef(({ onChange, country, ...props }, _ref) => (\n <Container>\n <PhoneInput\n inputClass=\"ant-input\"\n onChange={(phone) => onChange(`+${phone}`)}\n country={country || \"us\"}\n {...props}\n />\n </Container>\n));\n\nexport default AntPhoneInput;\n","import React from \"react\";\n\nconst Markdown = ({ source, className, style, onScroll }) => {\n return (\n <div\n id=\"foo\"\n onScroll={onScroll}\n style={style}\n className={className}\n dangerouslySetInnerHTML={{ __html: source }}\n />\n );\n};\n\nexport default Markdown;\n","import * as auth from \"./common\";\nimport Auth from \"@aws-amplify/auth\";\nimport { eraseCookie } from \"lib/cookies\";\nimport { getCurrentAuthenticatedUser } from \"../../utils\";\n\n/**\n * Logs the user out from Cognito (clears cookies, and wipes local storage if needed because\n * it's apparently too much to ask of Amplify rofl).\n */\nexport const logout = () => (dispatch) => {\n getCurrentAuthenticatedUser()\n .then((currentUser) => {\n // make sure to delete cookie for subdomain\n eraseCookie(\"dashboard.authtoken\");\n // Try to get fresh data (setting bypassCache true)\n // https://github.com/aws-amplify/amplify-js/issues/2627\n currentUser.getUserData(() => dispatch(signOutGlobal()), {\n bypassCache: true,\n });\n })\n .catch((e) => {\n console.debug(\n \"Error getting current user before trying to log out. Log out anyway.\",\n e\n );\n dispatch(signOutGlobal());\n });\n};\n\n// By using `global: true`, all the auth tokens are revoked (id token, access token and refresh token)\n// which means the user is signed out from all the devices\n// Note: although the tokens are revoked, the AWS credentials will remain valid until they expire (which by default is 1 hour)\nconst signOutGlobal = () => (dispatch) => {\n Auth.signOut({ global: true })\n .then(() => dispatch(cleanUpAndRedirect()))\n .catch(() => dispatch(signOutLocal()));\n};\n\n// If signOut with `global: true` throws, then we're probably already logged out globally so just log out this session\nconst signOutLocal = () => (dispatch) => {\n Auth.signOut()\n .catch(() => dispatch(clearCookieStorage()))\n .finally(() => dispatch(cleanUpAndRedirect()));\n};\n\n/**\n * Friendlier cleanup tasks.\n */\nexport const cleanUpAndRedirect = () => (dispatch) => {\n dispatch(\n auth.setUserState({\n userState: {},\n })\n );\n const { pathname, search } = window.location;\n window.sessionStorage.setItem(\"requested_path\", pathname + search);\n window.localStorage.setItem(\"user\", \"\");\n window.location = \"/login\";\n};\n\n/**\n * Kill it all with fire. Sometimes its safer to wipe all cookies.\n * See: https://github.com/aws-amplify/amplify-js/issues/614\n * and: https://github.com/aws-amplify/amplify-js/issues/2605\n */\nexport const clearCookieStorage = () => {\n console.debug(\"Removing Cognito cookies.\");\n try {\n const cookies = document.cookie.split(\";\");\n cookies\n .filter((value) => value.match(/CognitoIdentityService.*/))\n .forEach((value) => {\n eraseCookie(value.split(\"=\")[0]);\n });\n // make sure to delete cookie for subdomain\n eraseCookie(\"dashboard.authtoken\");\n } catch (e) {\n console.error(`An error occured clearing cookies: ${e}`);\n }\n};\n","import useRequest, { QueryOptions } from \"./useRequest\";\n\nimport { useState } from \"react\";\nimport { QueryObserverResult } from \"react-query\";\nimport { Account, getAccount } from \"../rest/account\";\nimport { useAccountContext } from \"src/v2/providers/AccountProvider\";\n\ntype UseGetAccount = {\n account?: Account;\n isAuthenticated: boolean | undefined;\n refetch: () => Promise<QueryObserverResult<Account>>;\n};\n\n/**\n * AccountProvider is the source of truth for which account is currently displayed. We use\n * the product argument to determine which account to return, with live returning the one\n * liveAccount, and paper returning the currentAccount as chosen in AccountProvider\n */\nexport const useGetAccount = (\n key: any | any[] = \"\",\n // todo: revisit this type, we need to include product for all account-dynamic hooks\n options?: QueryOptions<Account> & { product?: string }\n): UseGetAccount => {\n const [isAuthenticated, setAuthed] = useState<boolean | undefined>();\n\n const {\n currentAccount,\n liveAccounts,\n refetchLiveAccounts,\n refetchPaperAccounts,\n } = useAccountContext();\n\n const {\n data: account,\n isError,\n isSuccess,\n refetch,\n } = useRequest(\n [\"account\", key, options?.product],\n () => getAccount({ product: options?.product || \"live\" }),\n {\n ...options,\n refetchInterval: 10000,\n enabled:\n options?.enabled !== undefined\n ? options?.enabled === true\n : options?.product !== \"paper\" && !currentAccount,\n select: (data) => {\n // does not rely on onSuccess and onError being called\n if (!!data && !isAuthenticated) {\n setAuthed(true);\n }\n\n return data;\n },\n onSuccess: (data) => {\n setAuthed(true);\n options?.onSuccess?.(data);\n },\n onError: () => {\n setAuthed(false);\n options?.onError?.({} as any);\n },\n }\n );\n\n const handleRefetch = () => {\n refetchLiveAccounts();\n refetchPaperAccounts();\n return refetch();\n };\n\n if (isError || (isSuccess && !account?.id)) {\n // redirect should occur at router level\n // AuthService.signOut();\n // history.push(\"/login\");\n }\n\n return {\n account:\n options?.product === \"paper\" && !!currentAccount\n ? currentAccount\n : liveAccounts?.[0] ?? account,\n refetch: handleRefetch,\n isAuthenticated,\n };\n};\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { connect } from \"react-redux\";\nimport {\n REDUCER,\n submit,\n refreshUserAttributes,\n resendAttributeVerification,\n} from \"reducers/profile\";\nimport {\n MFAMethods,\n enableMFA,\n disableMFA,\n currentMFAMethod,\n setupTOTP,\n verifyTOTPToken,\n} from \"reducers/auth/mfa\";\nimport Auth from \"@aws-amplify/auth\";\nimport { getCurrentAuthenticatedUser } from \"src/utils\";\nimport { Form, Row, Modal } from \"antd\";\n\nimport { ProfileMFA, MFAModalContents, MFAChallenge } from \"./common\";\nimport api from \"src/api\";\n\nconst Wrapper = styled.div`\n a,\n p,\n div {\n font-family: Carnas !important;\n }\n a {\n text-decoration: underline;\n color: #377dff;\n font-weight: 600;\n }\n .ant-form-item-label label {\n font-size: 14px;\n padding-bottom: 0px;\n }\n`;\n\nconst mapStateToProps = (state) => {\n return {\n isSubmitForm: state.app.submitForms[REDUCER],\n userState: state.auth.userState,\n mfaMethod: state.mfa.method,\n TOTPQRCode: state.mfa.TOTPQRCode,\n TOTPSetupVerificationError: state.mfa.TOTPSetupVerificationError,\n phoneNumberVerificationError: state.profile.phoneNumberVerificationError,\n phoneNumberToVerify: state.profile.phoneNumberToVerify,\n };\n};\n\n// todo: this is temporary until we rewrite in v2, i dont have time :)\n@connect(mapStateToProps)\n@Form.create()\nexport class EditProfileForm extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n mfaExpand: true,\n passwordExpand: false,\n mfaModalVisible: false,\n smsModalVisible: false,\n disablingMfa: false,\n challengeModalVisible: false,\n };\n }\n\n static defaultProps = {};\n\n componentDidMount = () => {\n const { dispatch } = this.props;\n dispatch(currentMFAMethod());\n };\n\n toggleExpand(field) {\n this.setState({ [field]: !this.state[field] });\n }\n\n onSubmit = (isSubmitForm) => (event) => {\n event.preventDefault();\n const { form, dispatch } = this.props;\n if (!isSubmitForm) {\n form.validateFields((error, values) => {\n if (!error) {\n // Ensure mask values are not included\n if (values.phone_number) {\n values.phone_number = values.phone_number\n .replace(\" \", \"\")\n .replace(/-/g, \"\");\n }\n dispatch(submit(values));\n dispatch(refreshUserAttributes());\n this.toggleExpand(\"passwordExpand\");\n form.resetFields();\n }\n });\n }\n };\n\n /**\n * Handles the verification for the user's phone number.\n * Phone numbers saved to user attributes in Cognito must be verified.\n */\n onSubmitPhoneNumberVerification = (code, activating) => {\n const { dispatch } = this.props;\n Auth.verifyCurrentUserAttributeSubmit(\"phone_number\", code).then(() => {\n if (activating === null) {\n this.toggleExpand(\"passwordExpand\");\n this.setState({ challengeModalVisible: false });\n return;\n }\n\n if (activating) {\n dispatch(enableMFA());\n } else {\n dispatch(disableMFA());\n }\n });\n };\n\n handlePasswordToggle = () => {\n const { mfaMethod, dispatch } = this.props;\n\n // if MFA is disabled, just open - otherwise present a verification challenge\n if (mfaMethod === \"NOMFA\") {\n this.setState({ passwordExpand: !this.state.passwordExpand });\n return;\n }\n if (mfaMethod === \"SMS_MFA\") {\n dispatch(resendAttributeVerification());\n }\n\n this.setState({ challengeModalVisible: true });\n };\n onSubmitPhoneNumber = (phoneNumber) => {\n const { dispatch } = this.props;\n getCurrentAuthenticatedUser().then((user) => {\n api.ownerDetails\n .patch(user.attributes[\"custom:account_id\"], {\n phone_number: phoneNumber.replace(/-/g, \"\"),\n })\n .then(() => {\n dispatch(resendAttributeVerification(\"phone_number\"));\n });\n });\n };\n\n /**\n * Handles the verification for the user's TOTP setup.\n * Cognito will not enable TOTP MFA until the user has confirmed that\n * they have a TOTP app generating a synchronized token.\n */\n onSubmitTOTPTokenVerification = (token) => {\n let { dispatch } = this.props;\n dispatch(verifyTOTPToken(token));\n dispatch(refreshUserAttributes());\n };\n\n completeTOTPChallenge = (code, activating) => {\n let { dispatch } = this.props;\n getCurrentAuthenticatedUser().then((user) => {\n Auth.verifyTotpToken(user, code)\n .then(() => {\n if (activating === null) {\n this.toggleExpand(\"passwordExpand\");\n this.setState({ challengeModalVisible: false });\n return;\n }\n\n dispatch(disableMFA());\n })\n .catch((err) => {\n console.error(err);\n });\n });\n };\n\n render() {\n const {\n isSubmitForm,\n userState,\n mfaMethod,\n TOTPQRCode,\n TOTPSetupVerificationError,\n dispatch,\n phoneNumberVerificationError,\n } = this.props;\n const cognitoId = userState.attributes && userState.attributes[\"sub\"];\n // Easily adjust which MFA methods are available to the user, since both were built.\n // ie. ['SMS', 'TOTP']\n const validMFAMethods = [\"SMS\", \"TOTP\"];\n\n const onCancelMFA = () => {\n this.setState({\n mfaModalVisible: false,\n smsModalVisible: false,\n disablingMfa: false,\n });\n // refresh if we haven't just disabled MFA\n if (mfaMethod !== \"NOMFA\") {\n // not ideal but we are replacing this entire app soon, so...\n window.location.reload();\n }\n };\n\n return (\n <Wrapper>\n <Form\n layout=\"vertical\"\n hideRequiredMark\n onSubmit={this.onSubmit(isSubmitForm)}\n >\n {this.state.mfaExpand && (\n <div>\n {validMFAMethods.includes(\"TOTP\") && (\n <Row style={{ marginBottom: \"1rem\" }}>\n <ProfileMFA\n type=\"totp\"\n title=\"Authenticator\"\n securityLevel=\"Secure (Recommended)\"\n onClick={() => {\n if (\n mfaMethod !== MFAMethods[\"SOFTWARE_TOKEN_MFA\"].method\n ) {\n dispatch(setupTOTP());\n } else {\n this.setState({ disablingMfa: true });\n }\n this.setState({ mfaModalVisible: true });\n }}\n disabled={\n mfaMethod !== MFAMethods[\"SOFTWARE_TOKEN_MFA\"].method\n }\n current={mfaMethod}\n />\n </Row>\n )}\n\n {validMFAMethods.includes(\"SMS\") && this.props.showSMSOption && (\n <Row>\n <ProfileMFA\n type=\"sms\"\n title=\"SMS code\"\n securityLevel=\"Moderately Secure\"\n onClick={() => {\n if (mfaMethod === MFAMethods[\"SMS_MFA\"].method) {\n this.setState({ disablingMfa: true });\n dispatch(resendAttributeVerification());\n }\n this.setState({ smsModalVisible: true });\n }}\n disabled={mfaMethod !== MFAMethods[\"SMS_MFA\"].method}\n current={mfaMethod}\n />\n </Row>\n )}\n </div>\n )}\n </Form>\n <Modal\n visible={this.state.mfaModalVisible}\n footer={null}\n width=\"450px\"\n onCancel={onCancelMFA}\n >\n <div style={{ padding: \"20px\" }}>\n <MFAModalContents\n totpQRCode={TOTPQRCode}\n activating={!this.state.disablingMfa}\n type={\"SOFTWARE_TOKEN_MFA\"}\n onVerify={\n this.state.disablingMfa\n ? this.completeTOTPChallenge\n : this.onSubmitTOTPTokenVerification\n }\n onCancel={onCancelMFA}\n current={mfaMethod}\n error={TOTPSetupVerificationError}\n cognitoId={cognitoId}\n />\n </div>\n </Modal>\n <Modal\n visible={this.state.smsModalVisible}\n footer={null}\n onCancel={onCancelMFA}\n >\n <div style={{ padding: \"20px\" }}>\n <MFAModalContents\n activating={!this.state.disablingMfa}\n type={\"SMS_MFA\"}\n onCancel={onCancelMFA}\n onVerify={this.onSubmitPhoneNumberVerification}\n onSubmit={this.onSubmitPhoneNumber}\n current={mfaMethod}\n error={phoneNumberVerificationError}\n cognitoId={cognitoId}\n />\n </div>\n </Modal>\n <Modal\n visible={this.state.challengeModalVisible}\n footer={null}\n onCancel={() => this.setState({ challengeModalVisible: false })}\n >\n <div style={{ padding: \"20px\" }}>\n <MFAChallenge\n activating={null}\n onBack={null}\n onVerify={\n mfaMethod === \"SMS_MFA\"\n ? this.onSubmitPhoneNumberVerification\n : this.completeTOTPChallenge\n }\n type={mfaMethod}\n error={\n mfaMethod === \"SMS_MFA\"\n ? phoneNumberVerificationError\n : TOTPSetupVerificationError\n }\n title={\"Change your password\"}\n />\n </div>\n </Modal>\n </Wrapper>\n );\n }\n}\n","import { createAction, createReducer } from \"redux-act\";\nimport api from \"api\";\nimport { handleSessionExpire } from \"./alpacaAuth/session\";\nimport { getAccountIdAndJWT, getAccountIdForProduct } from \"selectors\";\n\n// documents for an account, uploads and requests\nconst _setDocumentRequests = createAction(`SET_ACCOUNT_DOCUMENTS_REQUESTS`);\nconst _setDocumentUploads = createAction(`SET_ACCOUNT_DOCUMENTS_UPLOADS`);\n\n/**\n * listAccountDocumentRequests retrieves all document requests for the current user's account\n */\nexport const listAccountDocumentRequests = () => (dispatch, getState) => {\n const { token } = getAccountIdAndJWT(getState());\n\n const accountId = getAccountIdForProduct(getState(), \"live\");\n\n return handleSessionExpire(\n api.accountDocuments\n .listRequests(accountId, token)\n .then((documentRequests) =>\n dispatch(_setDocumentRequests({ accountId, documentRequests }))\n ),\n dispatch\n );\n};\n\n/**\n * listAccountDocumentUploads retrieves all documents uploaded for the current user's account\n */\nexport const listAccountDocumentUploads = () => (dispatch, getState) => {\n const { token } = getAccountIdAndJWT(getState());\n\n const accountId = getAccountIdForProduct(getState(), \"live\");\n\n return handleSessionExpire(\n api.accountDocuments\n .listUploads(accountId, token)\n .then((documentUploads) =>\n dispatch(_setDocumentUploads({ accountId, documentUploads }))\n ),\n dispatch\n );\n};\n\n/**\n * uploadDocumentForRequest handles a file upload with sub type field for a given request\n */\nexport const uploadDocumentForRequest = (docId, subType, file) => (\n dispatch,\n getState\n) => {\n const { token } = getAccountIdAndJWT(getState());\n\n const accountId = getAccountIdForProduct(getState(), \"live\");\n\n // post form data with the key `uploadfile`\n var formData = new FormData();\n formData.append(\"uploadfile\", file);\n return handleSessionExpire(\n api.accountDocuments.upload(accountId, token, { docId, subType, formData }),\n dispatch\n );\n};\n\nexport const uploadByDocType = (docType, docSubType, file) => (\n dispatch,\n getState\n) => {\n const { token } = getAccountIdAndJWT(getState());\n\n const accountId = getAccountIdForProduct(getState(), \"live\");\n\n // post form data with the key `uploadfile`\n var formData = new FormData();\n formData.append(\"uploadfile\", file);\n return handleSessionExpire(\n api.accountDocuments.uploadByDocType(accountId, token, {\n docType,\n docSubType,\n formData,\n }),\n dispatch\n );\n};\n\n// Export this reducer\nconst initialState = {\n uploads: {},\n requests: {},\n};\nexport default createReducer(\n {\n [_setDocumentRequests]: (state, { accountId, documentRequests }) => {\n // the document records will all belong to the same account_id\n const currentDocuments = state.accountDocuments || {};\n const requests = currentDocuments[\"requests\"] || {};\n\n if (accountId) {\n if (!requests[accountId]) {\n requests[accountId] = {};\n }\n requests[accountId] = documentRequests;\n }\n currentDocuments[\"requests\"] = requests;\n return { ...state, ...currentDocuments };\n },\n [_setDocumentUploads]: (state, { accountId, documentUploads }) => {\n // the document records will all belong to the same account_id\n const currentDocuments = state.accountDocuments || {};\n const uploads = currentDocuments[\"uploads\"] || {};\n\n if (accountId) {\n if (!uploads[accountId]) {\n uploads[accountId] = {};\n }\n uploads[accountId] = documentUploads;\n }\n currentDocuments[\"uploads\"] = uploads;\n return { ...state, ...currentDocuments };\n },\n },\n initialState\n);\n","import { createAction, createReducer } from \"redux-act\";\nimport api from \"api\";\nimport { handleSessionExpire } from \"../alpacaAuth/session\";\nimport \"fast-text-encoding\";\nimport { getAccountIdForProduct } from \"selectors\";\nimport { getSessionJWT } from \"../../utils\";\n\nconst REDUCER = \"position\";\nconst NS = `@@${REDUCER}/`;\n\nconst _setPositions = createAction(`${NS}SET_POSITIONS`);\nconst _setPlacedLiquidationOrders = createAction(\n `${NS}SET_PLACED_LIQUIDATION_ORDERS`\n);\n\n/**\n * listPositions\n */\nexport const listPositions = (product) => async (dispatch, getState) => {\n const token = await getSessionJWT();\n\n // Figure out the account id to use\n const accountId = getAccountIdForProduct(getState(), product);\n // TODO: Move some logic for getting the account info out from all of the components\n // and into these actions. If there is no accountId, attempt to get it.\n // That way, it covers the case where a user loads a dashboard page directly\n // and does not yet have account info (opposed to when they navigate from another\n // page and already had account info in state).\n // Though there may be more needed than just the accountId. Many places require\n // owner details, and all accounts. So initUser() seems to be the minimum needed.\n\n const positionsEndPoint =\n product === \"paper\" ? \"paperPositions\" : \"positions\";\n if (accountId) {\n return handleSessionExpire(\n api[positionsEndPoint].list(accountId, token).then((positions) => {\n return dispatch(_setPositions({ accountId, positions }));\n }),\n dispatch\n );\n }\n return;\n};\n\n/**\n * liquidate\n */\nexport const liquidate = ({ product, symbols, qty }) => (\n dispatch,\n getState\n) => {\n const accountId = getAccountIdForProduct(getState(), product);\n const ordersEndPoint = product === \"paper\" ? \"paperPositions\" : \"positions\";\n let endpoint = api[ordersEndPoint].liquidate(\n { accountId },\n { symbols: symbols || [] }\n );\n\n // If a single position is specified with quantity\n if (qty && symbols && symbols.length === 1) {\n endpoint = api[ordersEndPoint].liquidatePosition({\n accountId,\n symbol: symbols[0],\n qty,\n });\n }\n\n return handleSessionExpire(\n dispatch(endpoint)\n .then((res) => {\n // Set the response (a list of placed orders) on the state to be displayed to the user for confirmation\n dispatch(\n _setPlacedLiquidationOrders({\n accountId,\n // liquide returns list of orders while liquidatePosition returns the order\n placedLiquidationOrders: res.orders || [res],\n })\n );\n // Refresh current list of positions\n dispatch(listPositions());\n\n // Handling errors in 200 response.\n // Note that responses are not consistent. Due to this being a batch operation,\n // an array of errors could be returned. Alternatively, if there was some sort of\n // other error preventing the batch operation from even ocurring, the error response\n // could take on a different format commonly seen from other API methods.\n // Note: catch() below because of the status code.\n\n // In the event of a partial liquidate:\n // Not sure what to display. The feedback is already presented to the user as they\n // will see the table data update.\n // if (res.errors && res.errors.length > 0) {\n // throw new Error('There was an error with one or more liquidation order.')\n // }\n // Example error: {\"errors\":[{\"code\":40310000,\"message\":\"insufficient qty (0 \\u003c 10)\"}],\"orders\":[]}\n // When there's existing orders. That's %3C or < ... So: \"qty (0 < 10)\"\n // It's not descript enough to say which symbol so can't be used in a summary screen or anything. Just yet.\n if (res.errors && res.errors.length > 0) {\n res.errors.forEach((err) => {\n if (\n err.message ===\n \"trade denied due to pattern day trading protection\"\n ) {\n throw new Error(\n \"One or more positions could not be liquidated due to pattern day trading protection.\"\n );\n }\n });\n throw new Error(\"One or more positions could not be liquidated.\");\n } else {\n return res;\n }\n })\n .catch((e) => {\n // Regardless of error, refresh current list of positions and ensure placed liquidation orders state is empty\n dispatch(\n _setPlacedLiquidationOrders({\n accountId,\n placedLiquidationOrders: [],\n })\n );\n dispatch(listPositions());\n\n // In the event the market is closed:\n // 'market is closed' is a common erorr message returned by the gobroker API in other places too.\n // Example error: {\"code\":40310000,\"message\":\"market is closed\"}\n // A friendlier message has been created here.\n if (e.message && e.message === \"market is closed\") {\n e.message = \"The market is closed right now.\";\n }\n throw e;\n }),\n dispatch\n );\n};\n\n// Resets the list of orders created by a previous liquidate\nexport const resetLiquidatedOrders = (product) => (dispatch, getState) => {\n const accountId = getAccountIdForProduct(getState(), product);\n if (accountId) {\n return dispatch(\n _setPlacedLiquidationOrders({ accountId, placedLiquidationOrders: [] })\n );\n }\n};\n\n// Export this reducer\nconst initialState = {};\nexport default createReducer(\n {\n [_setPositions]: (state, { accountId, positions }) => {\n // ie. position.bfe87e76-5ad3-41d6-a12d-918142bb38df.positions\n const newState = { ...state };\n if (newState[accountId] === undefined) {\n newState[accountId] = { positions };\n } else {\n newState[accountId].positions = positions;\n }\n return newState;\n },\n [_setPlacedLiquidationOrders]: (\n state,\n { accountId, placedLiquidationOrders }\n ) => {\n const newState = { ...state };\n if (newState[accountId] === undefined) {\n newState[accountId] = { placedLiquidationOrders };\n } else {\n newState[accountId].placedLiquidationOrders = placedLiquidationOrders;\n }\n return newState;\n },\n },\n initialState\n);\n","import { createAction, createReducer } from \"redux-act\";\nimport api from \"api\";\nimport { handleSessionExpire } from \"../alpacaAuth/session\";\nimport unionBy from \"lodash/unionBy\";\nimport { getAccountIdForProduct } from \"selectors\";\n\nconst REDUCER = \"order\";\nconst NS = `@@${REDUCER}/`;\n\nconst _setOrderHistory = createAction(`${NS}SET_ORDER_HISTORY`);\nconst _setOrderNotFound = createAction(`${NS}SET_ORDER_NOT_FOUND`);\nconst _setOrderStream = createAction(`${NS}SET_ORDER_STREAM`);\nconst _setCanceledOrders = createAction(`${NS}SET_CANCELED_ORDERS`);\nconst _requestOrderHistory = createAction(`${NS}REQUEST_ORDER_HISTORY`);\nconst _requestOrderStream = createAction(`${NS}REQUEST_ORDER_STREAM`);\nconst _clearOrderHistory = createAction(`${NS}CLEAR_ORDER_HISTORY`);\n\n/**\n * listOrders\n *\n * @param {Object}\n * - product The product, paper or live\n * - status Is either \"open\", \"closed\", or \"all\" (defaults to all)\n * - limit Is by default 50, max 500\n * - until Is current date by default (can be specified as '2019-01-01')\n * - after Is a long time ago by default\n * - keyByStatus Will take the response and put the orders into state keyed by status\n * (useful when viewing multiple tables of orders by status, ie. open vs closed)\n */\nexport const listOrders =\n ({\n product,\n status,\n limit,\n until,\n after,\n keyByStatus = false,\n initializeOpen = false,\n }) =>\n (dispatch, getState) => {\n const accountId = getAccountIdForProduct(getState(), product);\n\n if (accountId) {\n const currentAccountOrders =\n (getState() && getState().order && getState().order[accountId]) ||\n false;\n if (currentAccountOrders && currentAccountOrders.awaitingStream)\n return Promise.resolve();\n\n dispatch(_requestOrderHistory({ accountId, limit, until, after }));\n\n const ordersEndPoint = product === \"paper\" ? \"paperOrders\" : \"orders\";\n const endpoint = api[ordersEndPoint].list;\n\n const requests = [\n dispatch(endpoint({ accountId }, { status, limit, until, after })),\n ];\n if (initializeOpen) {\n // add request for open orders\n requests.push(\n dispatch(\n endpoint(\n { accountId },\n {\n status: \"open\",\n limit,\n }\n )\n )\n );\n }\n\n return handleSessionExpire(\n Promise.all(requests).then((resp) => {\n for (const orders of resp) {\n const hasMoreHistory = !!orders && orders.length === limit;\n dispatch(\n _setOrderHistory({\n accountId,\n orders,\n hasMoreHistory,\n keyByStatus,\n })\n );\n }\n }),\n dispatch\n );\n }\n return;\n };\n\n/**\n * cancelOrders will cancel provided open orders.\n */\nexport const cancelSelectedOrders =\n (product, orderIds) => (dispatch, getState) => {\n // Figure out the account id to use\n const accountId = getAccountIdForProduct(getState(), product);\n\n if (accountId) {\n const currentAccount =\n (getState() && getState().order && getState().order[accountId]) ||\n false;\n if (currentAccount && currentAccount.awaitingStream)\n return Promise.resolve();\n\n const ordersEndPoint = product === \"paper\" ? \"paperOrders\" : \"orders\";\n const requests = orderIds.map((orderId) =>\n dispatch(\n api[ordersEndPoint].cancelOrder({\n accountId,\n orderId,\n })\n )\n );\n\n return handleSessionExpire(\n Promise.all(requests).then(() => {\n dispatch(\n _setCanceledOrders({\n accountId,\n // UI checks status code on orders\n canceledOrders: orderIds.map((id) => ({ id, status: 204 })),\n })\n );\n }),\n dispatch\n );\n }\n return;\n };\n\n/**\n * replaceOrder will replace an order with new order details\n */\nexport const replaceOrder =\n (product, orderId, orderDetails) => (dispatch, getState) => {\n const accountId = getAccountIdForProduct(getState(), product);\n\n if (accountId) {\n const ordersEndPoint = product === \"paper\" ? \"paperOrders\" : \"orders\";\n const request = api[ordersEndPoint].replaceOrder(\n {\n accountId,\n orderId,\n },\n orderDetails\n );\n\n return handleSessionExpire(dispatch(request), dispatch);\n }\n\n return new Promise();\n };\n\n/**\n * clearCanceledOrders clears the state of all previously canceled order UUIDs\n * for either paper or live account.\n */\nexport const clearCanceledOrders = (product) => (dispatch, getState) => {\n // Figure out the account id to use\n const accountId = getAccountIdForProduct(getState(), product);\n\n dispatch(_setCanceledOrders({ accountId, canceledOrders: [] }));\n};\n\n/**\n * gerOrder fetch details for a single order\n */\nexport const getOrder = (product, orderId) => (dispatch, getState) => {\n const accountId = getAccountIdForProduct(getState(), product);\n\n if (accountId) {\n const ordersEndPoint = api[\n product === \"paper\" ? \"paperOrders\" : \"orders\"\n ].getOrder({\n accountId,\n orderId,\n });\n\n return handleSessionExpire(\n ordersEndPoint()\n .then((order) => {\n dispatch(_setOrderHistory({ accountId, orders: [order] }));\n })\n .catch((e) => {\n if (e.status === 404)\n dispatch(_setOrderNotFound({ accountId, orderId }));\n }),\n dispatch\n );\n }\n return;\n};\n\n/**\n * clearOrderHistory\n */\nexport const clearOrderHistory = () => (dispatch) => {\n dispatch(_clearOrderHistory());\n};\n\n// Export this reducer\nconst initialState = {};\n\nexport default createReducer(\n {\n [_setOrderNotFound]: (state, payload) => {\n const { accountId, orderId } = payload;\n const newState = { ...state };\n newState[accountId] = newState[accountId] || {};\n newState[accountId].notFound = newState[accountId].notFound || [];\n newState[accountId].notFound.push(orderId);\n return newState;\n },\n\n [_setOrderHistory]: (state, payload) => {\n // since this will periodically be called, merge new orders to existing state (don't duplicate data)\n const existingOrders =\n (state[payload.accountId] && state[payload.accountId].orders) || [];\n const newOrders = (payload && payload.orders) || [];\n const concatOrders = unionBy(newOrders, existingOrders, \"id\");\n\n const newState = { ...state };\n newState[payload.accountId] = {\n ...newState[payload.accountId],\n awaitingStream: false,\n isInitialized: true,\n lastStreamTime: payload.lastStreamTime,\n hasMoreHistory: payload.hasMoreHistory,\n };\n\n const openStatusList = [\n \"accepted\",\n \"new\",\n \"partially_filled\",\n \"calculated\",\n \"pending_new\",\n \"pending_cancel\",\n \"pending_replace\",\n \"accepted_for_bidding\",\n \"held\",\n \"pending_review\",\n ];\n // optional, keeps state size down if not true\n if (payload.keyByStatus) {\n newState[payload.accountId].openOrders = concatOrders.filter((o) => {\n return openStatusList.includes(o.status);\n });\n newState[payload.accountId].closedOrders = concatOrders.filter((o) => {\n return !openStatusList.includes(o.status);\n });\n }\n\n // always needs to be set\n newState[payload.accountId].orders = concatOrders;\n return newState;\n },\n\n [_setOrderStream]: (state, payload) => {\n // since this will periodically be called, merge new orders to existing state (don't duplicate data)\n const existingOrders =\n (state[payload.accountId] && state[payload.accountId].orders) || [];\n const newOrders = (payload && payload.orders) || [];\n const concatOrders = unionBy(newOrders, existingOrders, \"id\");\n\n const newState = { ...state };\n newState[payload.accountId] = {\n ...newState[payload.accountId],\n awaitingStream: false,\n isInitialized: true,\n lastStreamTime: payload.lastStreamTime,\n orders: concatOrders,\n };\n return newState;\n },\n\n [_setCanceledOrders]: (state, { accountId, canceledOrders }) => {\n const newState = { ...state };\n newState[accountId].canceledOrders = canceledOrders;\n return newState;\n },\n\n [_requestOrderHistory]: (state, { accountId }) => {\n // ie. order.bfe87e76-5ad3-41d6-a12d-918142bb38df.positions\n const newState = { ...state };\n newState[accountId] = { ...newState[accountId], awaitingStream: true };\n return newState;\n },\n\n [_requestOrderStream]: (state, { accountId }) => {\n // ie. order.bfe87e76-5ad3-41d6-a12d-918142bb38df.positions\n const newState = { ...state };\n newState[accountId] = { ...newState[accountId], awaitingStream: true };\n return newState;\n },\n\n [_clearOrderHistory]: () => {\n return initialState;\n },\n },\n initialState\n);\n","import { createAction, createReducer } from \"redux-act\";\nimport api from \"api\";\n\n/**\n * ACTIONS\n */\nconst _setCountryInfo = createAction(\"COUNTRY_CONFIG\");\n\n/**\n * API CALLS\n */\nexport const getCountryInfos = () => (dispatch) => {\n dispatch(api.countries.getCountryInfos())\n .then((infoMap) => dispatch(_setCountryInfo({ infoMap })))\n .catch(() => console.error(\"error fetching country info map\"));\n};\n\n/**\n * REDUCER\n */\nconst initialState = {};\nexport default createReducer(\n {\n [_setCountryInfo]: (state, { infoMap }) => ({ ...state, infoMap }),\n },\n initialState\n);\n","import { useDisclosure } from \"@chakra-ui/react\";\nimport { init, SdkOptions, StepTypes } from \"onfido-sdk-ui\";\nimport { useEffect, useRef } from \"react\";\nimport AmplitudeProvider from \"src/AmplitudeProvider\";\nimport { useMutationRequest } from \"src/v2/api/hooks\";\n\nimport { getOnfidoSdkToken } from \"../rest/onfido\";\n\nimport { Account } from \"../rest/account\";\nimport {\n createOnfidoApplicant,\n patchOnfidoSdkToken,\n updateOnfidoApplicant,\n PatchOnfidoParams,\n} from \"../rest/onfido\";\nimport useRequest, { QueryOptions } from \"./useRequest\";\nimport { eventTracker } from \"src/utils/eventTracker\";\n\n// custom hook handles the logic for starting and closing the Onfido modal\ntype UseOnfidoOptions = {\n account?: Account;\n steps: StepTypes[];\n onComplete: () => void;\n onError: (err: string) => void;\n};\nexport const useOnfido = ({\n account,\n steps,\n onComplete: completeCb,\n onError: errorCb,\n}: UseOnfidoOptions) => {\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n const {\n mutate: createApplicant,\n isSuccess: createdOnfido,\n } = useMutationRequest<Account, string>((accountID) =>\n createOnfidoApplicant(accountID)\n );\n\n const {\n mutate: updateApplicant,\n isSuccess: updatedOnfido,\n } = useMutationRequest<Account, string>((accountID) =>\n updateOnfidoApplicant(accountID)\n );\n\n const { data: sdkResponse, refetch: refetchToken } = useOnfidoToken(\n account?.id ?? \"\",\n {\n // dont fetch onfido token until one of the above mutations occur\n enabled: Boolean(account && (createdOnfido || updatedOnfido)),\n }\n );\n\n const {\n mutate: patchSDKToken,\n } = useMutationRequest((body: PatchOnfidoParams) =>\n patchOnfidoSdkToken(body)\n );\n\n const firstTime = useRef(true);\n const openModal = () => {\n // always use new onfido token whenever onfido sdk is open\n if (!firstTime.current) {\n refetchToken();\n }\n firstTime.current = false;\n onOpen();\n };\n\n useEffect(() => {\n if (!account) return;\n\n // Create Applicant if not exists\n const applicantExists = hasOnfidoApplicant(account);\n if (applicantExists) {\n // update onfido applicant\n updateApplicant(account.id);\n } else {\n // create onfido applicant\n createApplicant(account.id);\n }\n }, [Boolean(account)]);\n\n useEffect(() => {\n if (!sdkResponse || !account) return;\n const token = sdkResponse.onfido_sdk_token;\n // Start Onfido flow\n const opts: SdkOptions = {\n ...defaultOnfidoOptions,\n token,\n isModalOpen: isOpen,\n steps: steps,\n onComplete: () => {\n eventTracker(\"Finished Onfido SDK flow\", {\n category: \"Onboarding\",\n });\n\n AmplitudeProvider.dispatch(\n \"onfido_finished\",\n JSON.stringify({ onfido_id: account?.onfido_applicant_id })\n );\n patchSDKToken({\n accountID: account.id,\n outcome: \"USER_COMPLETED\",\n token: token,\n });\n onClose();\n completeCb();\n },\n onError: (err) => {\n console.error(\"Onfido exception:\", err);\n patchSDKToken({\n accountID: account.id,\n outcome: \"SDK_ERROR\",\n token: token,\n });\n errorCb(err.message);\n },\n onModalRequestClose: () => {\n eventTracker(\"Closed Onfido SDK flow\", {\n category: \"Onboarding\",\n });\n\n onClose();\n },\n };\n\n eventTracker(\"Started Onfido SDK flow\", {\n category: \"Onboarding\",\n });\n\n AmplitudeProvider.dispatch(\n \"onfido_started\",\n JSON.stringify({ onfido_id: account?.onfido_applicant_id })\n );\n\n const onfido = init(opts);\n\n return () => {\n onfido.tearDown();\n };\n }, [isOpen]);\n\n return { isReadyToStart: Boolean(sdkResponse), openModal };\n};\n\nconst hasOnfidoApplicant = (account: Account): boolean =>\n Boolean(\n JSON.parse(window.localStorage.getItem(\"kyc\") ?? \"{}\")?.[account.id] ||\n account?.onfido_applicant_id ||\n account?.onfido_details?.applicant_id\n );\n\nconst defaultOnfidoOptions = {\n useModal: true,\n containerId: \"onfido-mount\",\n customUI: {\n fontFamilyTitle: \"Carnas, medium\",\n fontFamilySubtitle: \"Carnas, regular\",\n fontFamilyBody: \"Carnas, regular\",\n fontSizeTitle: \"26px\",\n fontSizeSubtitle: \"20px\",\n fontSizeBody: \"14px\",\n fontWeightSubtitle: 600,\n colorContentButtonPrimaryText: \"#000000\",\n colorBackgroundButtonPrimary: \"#FFD700\",\n },\n};\n\ntype OnfidoToken = { onfido_sdk_token: string };\n\nconst useOnfidoToken = (\n accountID: string,\n options: QueryOptions<OnfidoToken>\n) =>\n useRequest<OnfidoToken>(\n [\"onfidoSDK\", accountID],\n () => getOnfidoSdkToken(accountID),\n options\n );\n\nexport default useOnfido;\n","import instance from \"../\";\nimport { Account } from \"./account\";\n\nexport const createOnfidoApplicant = async (accountID: string) => {\n const { data } = await instance.post<Account>(\n `/accounts/${accountID}/onfido/applicant`\n );\n return data;\n};\n\nexport const updateOnfidoApplicant = async (accountID: string) => {\n const { data } = await instance.patch(\n `/accounts/${accountID}/onfido/applicant`\n );\n return data;\n};\n\nexport const getOnfidoSdkToken = async (accountID: string) => {\n const { data } = await instance.get(\n `/accounts/${accountID}/onfido/sdk_token`\n );\n return data;\n};\n\ntype OnfidoSDKOutcomes = \"SDK_ERROR\" | \"USER_COMPLETED\";\nexport type PatchOnfidoParams = {\n accountID: string;\n outcome: OnfidoSDKOutcomes;\n token: string;\n};\nexport const patchOnfidoSdkToken = async ({\n accountID,\n ...rest\n}: PatchOnfidoParams) => {\n const { data } = await instance.patch(\n `/accounts/${accountID}/onfido/sdk`,\n rest\n );\n return data;\n};\n","import Auth from \"@aws-amplify/auth\";\n\nimport axios, { AxiosRequestConfig } from \"axios\";\n\nconst instance = axios.create({ baseURL: (window as any).env.API_URL });\n\n// set auth header\ninstance.interceptors.request.use(async (config: AxiosRequestConfig) => {\n try {\n // check if authenticated\n const session = await Auth.currentSession();\n const idToken = session.getIdToken();\n config.headers.Authorization = `Bearer ${idToken.getJwtToken()}`;\n } catch (err) {\n // do nothing if not authenticated\n }\n return config;\n});\n\nexport default instance;\n","import ReactGA from \"react-ga4\";\n\nconst trackingID = window.env.GOOGLE_ANALYTICS_ID;\n\nif (trackingID) {\n ReactGA.initialize(trackingID);\n}\n\nexport const eventTracker = (action, data) => {\n if (trackingID && data) {\n ReactGA.event({\n action: action,\n category: data.category,\n label: data.label,\n value: data.value,\n });\n }\n};\n","export function setCookie(name, value, days) {\n let expires = \"\";\n if (days) {\n let date = new Date();\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n expires = \"; expires=\" + date.toUTCString();\n }\n document.cookie = name + \"=\" + (value || \"\") + expires + \"; path=/\";\n}\n\nexport function getCookie(name) {\n const nameEQ = name + \"=\";\n const cookies = document.cookie.split(\";\");\n for (let i = 0; i < cookies.length; i++) {\n let cookie = cookies[i];\n while (cookie.charAt(0) == \" \") cookie = cookie.substring(1, cookie.length);\n if (cookie.indexOf(nameEQ) == 0)\n return cookie.substring(nameEQ.length, cookie.length);\n }\n return \"\";\n}\n\nexport function eraseCookie(name) {\n document.cookie = name + \"=; Max-Age=-99999999;\";\n}\n","import { createAction, createReducer } from \"redux-act\";\nimport api from \"api\";\nimport { handleSessionExpire } from \"../alpacaAuth/session\";\nimport \"fast-text-encoding\";\nimport { getAccountIdForProduct } from \"selectors\";\nimport { isETC } from \"src/utils/clearingBroker\";\n\nconst REDUCER = \"trade\";\nconst NS = `@@${REDUCER}/`;\n\nconst _setTradeDetails = createAction(`${NS}SET_TRADE_DETAILS`);\n\n/**\n * loadTradeDetails loads the trading details for a specific account.\n * This includes the buying power, cash, cash withdrawable, portfolio value\n * and some other status flags.\n *\n * Note: Product/type may become an id in the future when multiple accounts are supported.\n * Account here needs all accounts and the account.details (for owner ID).\n *\n * @param {Object} account All of the user's accounts data (and owner details)\n * @param {String} product The type of account we're getting data for (currently paper or live, just one account for now)\n * @param {Boolean} getLast If true, get values for last trading day close\n */\nexport const loadTradeDetails = (\n account,\n product = \"paper\",\n getLast = false\n) => (dispatch, getState) => {\n const ownerId =\n (getState().account &&\n getState().account.details &&\n getState().account.details.owner_id) ||\n false;\n\n if (account) {\n const tradeEndPoint =\n product === \"paper\" ? \"paperTradeAccount\" : \"tradeAccount\";\n // Temporary: For ETC the endpoint switches to the V2 to properly reflect 2x buying power\n const clearingBroker =\n (getState().account &&\n getState().account.account &&\n getState().account.account.clearing_broker) ||\n \"APEX\";\n\n const accountId = getAccountIdForProduct(getState(), product);\n\n if (accountId) {\n let method = \"get\";\n\n if (isETC(clearingBroker)) {\n method = getLast ? \"getETCLast\" : \"getETC\";\n }\n\n return handleSessionExpire(\n dispatch(api[tradeEndPoint][method]({ accountId })).then((trade) =>\n dispatch(\n _setTradeDetails({ accountId, type: product, ownerId, trade })\n )\n ),\n dispatch\n );\n }\n return;\n }\n};\n\n// Export this reducer\nconst initialState = {};\nexport default createReducer(\n {\n [_setTradeDetails]: (state, { accountId, trade }) => {\n // ie. trade.bfe87e76-5ad3-41d6-a12d-918142bb38df\n const newState = { ...state };\n newState[accountId] = { ...newState[accountId], ...trade };\n return newState;\n },\n },\n initialState\n);\n"],"sourceRoot":""}