From 2066d396f7352048211a2acfa09eed9f9550a576 Mon Sep 17 00:00:00 2001 From: Ivan Sorokin Date: Thu, 20 Aug 2020 00:25:52 +0300 Subject: [PATCH] [Wallet] Make invitation links use vlra.app domain (#4733) ### Description Add `vlra.app` to dynamic links, so invitation links can be opened on the devices. ### Tested iOS ### Related issues - Part of #4566 ### Backwards compatibility Yes --- packages/mobile/.env | 5 +++-- packages/mobile/.env.alfajores | 2 ++ packages/mobile/.env.mainnet | 2 ++ packages/mobile/ios/celo/Info.plist | 1 + packages/mobile/ios/celo/celo.entitlements | 1 + packages/mobile/src/config.ts | 3 +++ packages/mobile/src/firebase/dynamicLinks.ts | 4 +++- packages/mobile/src/geth/networkConfig.ts | 1 - packages/mobile/src/invite/saga.test.ts | 13 ++++++++----- packages/mobile/src/invite/saga.ts | 14 +++----------- packages/mobile/src/utils/appstore.ts | 16 ---------------- 11 files changed, 26 insertions(+), 36 deletions(-) delete mode 100644 packages/mobile/src/utils/appstore.ts diff --git a/packages/mobile/.env b/packages/mobile/.env index 9ec22bcf061..75ca4948c91 100644 --- a/packages/mobile/.env +++ b/packages/mobile/.env @@ -1,5 +1,5 @@ ENVIRONMENT=local -DEFAULT_TESTNET=alfajores +DEFAULT_TESTNET=mainnet SMS_RETRIEVER_APP_SIGNATURE=aBQdOa/7QJh # If FORNO_ENABLED_INITIALLY, local geth will not run initially. # If toggled on, it will use DEFAULT_SYNC_MODE. See src/geth/consts.ts for more info @@ -13,6 +13,7 @@ DEV_SETTINGS_ACTIVE_INITIALLY=true # Enable for true hot reloading while dev-ing UI DEV_RESTORE_NAV_STATE_ON_RELOAD=false APP_BUNDLE_ID=org.celo.mobile.dev +APP_STORE_ID=1520414263 APP_DISPLAY_NAME=Celo (dev) IOS_GOOGLE_SERVICE_PLIST=GoogleService-Info.dev.plist - +DYNAMIC_LINK_DOMAIN=https://vlra.app diff --git a/packages/mobile/.env.alfajores b/packages/mobile/.env.alfajores index 78b3433fb3a..5db3261e5f2 100644 --- a/packages/mobile/.env.alfajores +++ b/packages/mobile/.env.alfajores @@ -11,5 +11,7 @@ SECRETS_KEY=production SHOW_TESTNET_BANNER=true SHOW_GET_INVITE_LINK=true APP_BUNDLE_ID=org.celo.mobile.alfajores +APP_STORE_ID=1482389446 APP_DISPLAY_NAME=Celo IOS_GOOGLE_SERVICE_PLIST=GoogleService-Info.alfajores.plist +DYNAMIC_LINK_DOMAIN=http://l.celo.org diff --git a/packages/mobile/.env.mainnet b/packages/mobile/.env.mainnet index 02db1bb1266..10c7ae4847c 100644 --- a/packages/mobile/.env.mainnet +++ b/packages/mobile/.env.mainnet @@ -11,5 +11,7 @@ SECRETS_KEY=production SHOW_TESTNET_BANNER=false SHOW_GET_INVITE_LINK=false APP_BUNDLE_ID=co.clabs.valora +APP_STORE_ID=1520414263 APP_DISPLAY_NAME=Valora IOS_GOOGLE_SERVICE_PLIST=GoogleService-Info.mainnet.plist +DYNAMIC_LINK_DOMAIN=https://vlra.app diff --git a/packages/mobile/ios/celo/Info.plist b/packages/mobile/ios/celo/Info.plist index f03807df451..51cdad557bf 100644 --- a/packages/mobile/ios/celo/Info.plist +++ b/packages/mobile/ios/celo/Info.plist @@ -38,6 +38,7 @@ FirebaseDynamicLinksCustomDomains https://l.celo.org + https://vlra.app ITSAppUsesNonExemptEncryption diff --git a/packages/mobile/ios/celo/celo.entitlements b/packages/mobile/ios/celo/celo.entitlements index 833920cd98a..d82f2b52b76 100644 --- a/packages/mobile/ios/celo/celo.entitlements +++ b/packages/mobile/ios/celo/celo.entitlements @@ -7,6 +7,7 @@ com.apple.developer.associated-domains applinks:l.celo.org + applinks:vlra.app diff --git a/packages/mobile/src/config.ts b/packages/mobile/src/config.ts index aff2c2440eb..f856c38aa1b 100644 --- a/packages/mobile/src/config.ts +++ b/packages/mobile/src/config.ts @@ -79,3 +79,6 @@ export const MOONPAY_PUBLIC_KEY = keyOrUndefined( 'MOONPAY_PUBLIC_KEY' ) export const MOONPAY_RATE_API = `https://api.moonpay.io/v3/currencies/celo/price?apiKey=${MOONPAY_PUBLIC_KEY}` + +export const APP_STORE_ID = Config.APP_STORE_ID +export const DYNAMIC_LINK_DOMAIN = Config.DYNAMIC_LINK_DOMAIN diff --git a/packages/mobile/src/firebase/dynamicLinks.ts b/packages/mobile/src/firebase/dynamicLinks.ts index d9b8ace986d..ce1bf6c962f 100644 --- a/packages/mobile/src/firebase/dynamicLinks.ts +++ b/packages/mobile/src/firebase/dynamicLinks.ts @@ -1,4 +1,6 @@ import dynamicLinks, { FirebaseDynamicLinksTypes } from '@react-native-firebase/dynamic-links' +import { DYNAMIC_LINK_DOMAIN } from 'src/config' + import Logger from 'src/utils/Logger' const TAG = 'firebase/dynamicLink' @@ -15,7 +17,7 @@ export async function generateShortInviteLink({ try { const dynamicLinkParams: FirebaseDynamicLinksTypes.DynamicLinkParameters = { link, - domainUriPrefix: 'https://l.celo.org', + domainUriPrefix: DYNAMIC_LINK_DOMAIN, } if (bundleId) { diff --git a/packages/mobile/src/geth/networkConfig.ts b/packages/mobile/src/geth/networkConfig.ts index ab50cbd8e15..8f1f0c9938f 100644 --- a/packages/mobile/src/geth/networkConfig.ts +++ b/packages/mobile/src/geth/networkConfig.ts @@ -31,7 +31,6 @@ const signMoonpayUrlStaging = 'https://us-central1-celo-org-mobile.cloudfunctions.net/signMoonpayStaging' const signMoonpayUrlProd = 'https://us-central1-celo-mobile-mainnet.cloudfunctions.net/signMoonpayProd' - const networkConfigs: { [testnet: string]: NetworkConfig } = { [Testnets.integration]: { nodeDir: `.${Testnets.integration}`, diff --git a/packages/mobile/src/invite/saga.test.ts b/packages/mobile/src/invite/saga.test.ts index b8995de4b7d..efca6f24755 100644 --- a/packages/mobile/src/invite/saga.test.ts +++ b/packages/mobile/src/invite/saga.test.ts @@ -42,10 +42,6 @@ jest.mock('src/firebase/dynamicLinks', () => ({ generateShortInviteLink: jest.fn(async () => 'http://celo.page.link/PARAMS'), })) -jest.mock('src/utils/appstore', () => ({ - getAppStoreId: jest.fn(async () => '1482389446'), -})) - jest.mock('src/account/actions', () => ({ ...jest.requireActual('src/account/actions'), getPincode: async () => 'pin', @@ -55,6 +51,13 @@ jest.mock('src/transactions/send', () => ({ sendTransaction: async () => true, })) +jest.mock('src/config', () => { + return { + ...jest.requireActual('src/config'), + APP_STORE_ID: '1482389446', + } +}) + SendIntentAndroid.sendSms = jest.fn() SendSMS.send = jest.fn() @@ -258,7 +261,7 @@ describe(generateInviteLink, () => { expect(result).toBe('http://celo.page.link/PARAMS') expect(generateShortInviteLink).toBeCalledTimes(1) expect(generateShortInviteLink).toHaveBeenCalledWith({ - link: `https://celo.org/build/wallet?invite-code=${mockKey}`, + link: `https://valoraapp.com/?invite-code=${mockKey}`, appStoreId: '1482389446', bundleId: 'org.celo.mobile.alfajores', }) diff --git a/packages/mobile/src/invite/saga.ts b/packages/mobile/src/invite/saga.ts index 656f2264eae..6fa31a037b6 100644 --- a/packages/mobile/src/invite/saga.ts +++ b/packages/mobile/src/invite/saga.ts @@ -13,7 +13,7 @@ import { showError, showMessage } from 'src/alert/actions' import { InviteEvents, OnboardingEvents } from 'src/analytics/Events' import ValoraAnalytics from 'src/analytics/ValoraAnalytics' import { ErrorMessages } from 'src/app/ErrorMessages' -import { ALERT_BANNER_DURATION } from 'src/config' +import { ALERT_BANNER_DURATION, APP_STORE_ID } from 'src/config' import { transferEscrowedPayment } from 'src/escrow/actions' import { calculateFee } from 'src/fees/saga' import { generateShortInviteLink } from 'src/firebase/dynamicLinks' @@ -46,7 +46,6 @@ import { createTokenTransferTransaction, fetchTokenBalanceInWeiWithRetry } from import { waitForTransactionWithId } from 'src/transactions/saga' import { sendTransaction } from 'src/transactions/send' import { newTransactionContext } from 'src/transactions/types' -import { getAppStoreId } from 'src/utils/appstore' import { divideByWei } from 'src/utils/formatting' import Logger from 'src/utils/Logger' import { getContractKitAsync, getWallet, getWeb3 } from 'src/web3/contracts' @@ -103,16 +102,9 @@ export async function generateInviteLink(inviteCode: string) { bundleId = bundleId.replace(/\.(debug|dev)$/g, '.alfajores') // trying to fetch appStoreId needed to build a dynamic link - let appStoreId - try { - appStoreId = await getAppStoreId(bundleId) - } catch (error) { - Logger.error(TAG, 'Failed to load AppStore ID: ' + error.toString()) - } - const shortUrl = await generateShortInviteLink({ - link: `https://celo.org/build/wallet?invite-code=${inviteCode}`, - appStoreId, + link: `https://valoraapp.com/?invite-code=${inviteCode}`, + appStoreId: APP_STORE_ID, bundleId, }) diff --git a/packages/mobile/src/utils/appstore.ts b/packages/mobile/src/utils/appstore.ts deleted file mode 100644 index 4d4f71d4e88..00000000000 --- a/packages/mobile/src/utils/appstore.ts +++ /dev/null @@ -1,16 +0,0 @@ -interface AppInfo { - resultCount: number - results: Array<{ - trackId: number - }> -} - -export async function getAppStoreId(bundleId: string) { - const appStoreLookupUrl = `https://itunes.apple.com/lookup?bundleId=${bundleId}` - const response = await fetch(appStoreLookupUrl) - const appInfo: AppInfo = await response.json() - if (appInfo.resultCount !== 1) { - throw new Error('Can not determine AppStore ID: multiple or none results') - } - return appInfo.results[0].trackId.toString() -}