Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## Unreleased (develop)

- added: Home screen long-press shortcuts for "⚠️ Save 2FA First!" warning and "Contact Support".
- added: Show swap KYC/terms modal for NExchange
- added: Nym mixnet warning in Stake, Unstake, and Claim Rewards scenes
- changed: Migrate Thorchain Savers and Thorchain Yield endpoints off NineRealms to gateway.liquify.com.
Expand Down
1 change: 1 addition & 0 deletions index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'expo-modules-core'
import 'react-native-gesture-handler'
import './src/app'
import './src/perf'
Expand Down
6 changes: 6 additions & 0 deletions ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- ExpoQuickActions (5.0.0):
- ExpoModulesCore
- fast_float (6.1.4)
- FBLazyVector (0.79.2)
- Firebase/CoreOnly (10.29.0):
Expand Down Expand Up @@ -2889,6 +2891,7 @@ DEPENDENCIES:
- ExpoFont (from `../node_modules/expo-font/ios`)
- ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`)
- ExpoModulesCore (from `../node_modules/expo-modules-core`)
- ExpoQuickActions (from `../node_modules/expo-quick-actions/ios`)
- fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`)
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
- fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`)
Expand Down Expand Up @@ -3089,6 +3092,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/expo-keep-awake/ios"
ExpoModulesCore:
:path: "../node_modules/expo-modules-core"
ExpoQuickActions:
:path: "../node_modules/expo-quick-actions/ios"
fast_float:
:podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec"
FBLazyVector:
Expand Down Expand Up @@ -3347,6 +3352,7 @@ SPEC CHECKSUMS:
ExpoFont: cf508bc2e6b70871e05386d71cab927c8524cc8e
ExpoKeepAwake: bf0811570c8da182bfb879169437d4de298376e7
ExpoModulesCore: 471ae18809dc8a5c9a623193a317eef6048a4f8a
ExpoQuickActions: fdbda7f5874aed3dd2b1d891ec00ab3300dc7541
fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
FBLazyVector: 84b955f7b4da8b895faf5946f73748267347c975
Firebase: cec914dab6fd7b1bd8ab56ea07ce4e03dd251c2d
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"edge-login-ui-rn": "^3.35.5",
"ethers": "^5.7.2",
"expo": "^53.0.0",
"expo-quick-actions": "^5.0.0",
"jsrsasign": "^11.1.0",
"marked": "^15.0.9",
"p-debounce": "^4.0.0",
Expand Down
2 changes: 2 additions & 0 deletions src/components/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { SafeAreaProvider } from 'react-native-safe-area-context'
import { useHandler } from '../hooks/useHandler'
import { CrashScene } from './scenes/CrashScene'
import { EdgeCoreManager } from './services/EdgeCoreManager'
import { QuickActionsManager } from './services/QuickActionsManager'
import { StatusBarManager } from './services/StatusBarManager'
import { ThemeProvider } from './services/ThemeContext'

Expand Down Expand Up @@ -38,6 +39,7 @@ const MainApp: React.FC = () => {
fallback={<CrashScene />}
>
<StatusBarManager />
<QuickActionsManager />
<EdgeCoreManager />
</ErrorBoundary>
</GestureHandlerRootView>
Expand Down
51 changes: 51 additions & 0 deletions src/components/services/QuickActionsManager.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import * as QuickActions from 'expo-quick-actions'
import { useQuickActionCallback } from 'expo-quick-actions/hooks'
import * as React from 'react'
import { Linking, Platform } from 'react-native'

import { useHandler } from '../../hooks/useHandler'
import { lstrings } from '../../locales/strings'
import { showError } from './AirshipInstance'

const DO_NOT_UNINSTALL_URL =
'https://support.edge.app/en/articles/14439418-warning-don-t-uninstall-edge-without-your-login-credentials'
const CONTACT_SUPPORT_URL =
'https://support.edge.app/en/articles/14054649-need-help-reach-out-via-our-chat-bubble?chat=open'

export const QuickActionsManager: React.FC = () => {
React.useEffect(() => {
QuickActions.setItems([
{
id: 'do_not_uninstall',
title: lstrings.shortcut_do_not_uninstall_title,
subtitle: lstrings.shortcut_do_not_uninstall_subtitle,
icon: Platform.select({
ios: 'symbol:nosign',
default: 'prohibit'
}),
params: { url: DO_NOT_UNINSTALL_URL }
},
{
id: 'contact_support',
title: lstrings.shortcut_contact_support_title,
subtitle: lstrings.shortcut_contact_support_subtitle,
icon: Platform.select({
ios: 'symbol:message.fill',
default: 'message'
}),
params: { url: CONTACT_SUPPORT_URL }
}
]).catch(showError)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shorthand .catch(showError) loses stack traces

Low Severity

Both .catch(showError) calls (on QuickActions.setItems(…) and Linking.openURL(url)) use the shorthand form that loses the calling-site stack trace. The project convention (and other service files like Services.tsx and ContactsLoader.ts) consistently use .catch((error: unknown) => showError(error)) instead. This violates the preserve-stack-traces rule.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 4bec8ad. Configure here.

}, [])

const handleQuickAction = useHandler((action: QuickActions.Action) => {
const url = action.params?.url
if (typeof url === 'string') {
Linking.openURL(url).catch(showError)
}
})

useQuickActionCallback(handleQuickAction)

return null
}
6 changes: 6 additions & 0 deletions src/locales/en_US.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2551,6 +2551,12 @@ const strings = {
'Please ensure all details are correct before making the transfer.',
// #endregion

// Home screen long-press shortcuts (expo-quick-actions)
shortcut_do_not_uninstall_title: '⚠️ Save 2FA First!',
shortcut_do_not_uninstall_subtitle: 'Login requires 2FA & credentials!',
shortcut_contact_support_title: 'Contact Support',
shortcut_contact_support_subtitle: 'Get help from our live support agents',

unknown_error_message: 'An unknown error occurred.'
} as const

Expand Down
4 changes: 4 additions & 0 deletions src/locales/strings/enUS.json
Original file line number Diff line number Diff line change
Expand Up @@ -1990,5 +1990,9 @@
"ramp_account_number_label": "Account Number",
"ramp_routing_number_label": "Routing Number",
"ramp_bank_routing_warning": "Please ensure all details are correct before making the transfer.",
"shortcut_do_not_uninstall_title": "⚠️ Save 2FA First!",
"shortcut_do_not_uninstall_subtitle": "Login requires 2FA & credentials!",
"shortcut_contact_support_title": "Contact Support",
"shortcut_contact_support_subtitle": "Get help from our live support agents",
"unknown_error_message": "An unknown error occurred."
}
84 changes: 40 additions & 44 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1063,20 +1063,7 @@
"@babel/parser" "^7.27.2"
"@babel/types" "^7.27.1"

"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3":
version "7.28.0"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b"
integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==
dependencies:
"@babel/code-frame" "^7.27.1"
"@babel/generator" "^7.28.0"
"@babel/helper-globals" "^7.28.0"
"@babel/parser" "^7.28.0"
"@babel/template" "^7.27.2"
"@babel/types" "^7.28.0"
debug "^4.3.1"

"@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0", "@babel/traverse@^7.7.0":
"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3", "@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0", "@babel/traverse@^7.7.0":
version "7.28.0"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b"
integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==
Expand Down Expand Up @@ -1973,7 +1960,7 @@
resolve-from "^5.0.0"
semver "^7.6.0"

"@expo/image-utils@^0.7.6":
"@expo/image-utils@^0.7.6", "@expo/image-utils@~0.7.4":
version "0.7.6"
resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.7.6.tgz#b8442bef770e1c7b39997d57f666bffeeced0a7a"
integrity sha512-GKnMqC79+mo/1AFrmAcUcGfbsXXTRqOMNS1umebuevl3aaw+ztsYEFEiuNhHZW7PQ3Xs3URNT513ZxKhznDscw==
Expand Down Expand Up @@ -6771,7 +6758,7 @@ ajv-keywords@^3.5.2:
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==

ajv-keywords@^5.0.0:
ajv-keywords@^5.0.0, ajv-keywords@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16"
integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==
Expand All @@ -6798,6 +6785,16 @@ ajv@^8.0.0, ajv@^8.8.0:
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"

ajv@^8.9.0:
version "8.20.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9"
integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==
dependencies:
fast-deep-equal "^3.1.3"
fast-uri "^3.0.1"
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"

algo-msgpack-with-bigint@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6"
Expand Down Expand Up @@ -10621,6 +10618,15 @@ expo-modules-core@2.5.0:
dependencies:
invariant "^2.2.4"

expo-quick-actions@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/expo-quick-actions/-/expo-quick-actions-5.0.0.tgz#6b3c5c21190607f779be1588ebaf119577a3c120"
integrity sha512-NSsDhfbal11gXsHkJbvYVw7x0QUCKrEth2kBBKZUv03dX4J7ZPADSV89LyEpOVYXCkrw6LuanlEtKavg/BFaRA==
dependencies:
"@expo/image-utils" "~0.7.4"
schema-utils "^4.2.0"
sf-symbols-typescript "^2.1.0"

expo@^53.0.0:
version "53.0.20"
resolved "https://registry.yarnpkg.com/expo/-/expo-53.0.20.tgz#e11b553322de313d47c407367d8d48d3a073e3cc"
Expand Down Expand Up @@ -16414,6 +16420,16 @@ schema-utils@^4.0.0:
ajv-formats "^2.1.1"
ajv-keywords "^5.0.0"

schema-utils@^4.2.0:
version "4.3.3"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46"
integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==
dependencies:
"@types/json-schema" "^7.0.9"
ajv "^8.9.0"
ajv-formats "^2.1.1"
ajv-keywords "^5.1.0"

scrypt-js@3.0.1, scrypt-js@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
Expand Down Expand Up @@ -16658,6 +16674,11 @@ setprototypeof@1.2.0:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==

sf-symbols-typescript@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz#926d6e0715e3d8784cadf7658431e36581254208"
integrity sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==

sha.js@^2.3.6, sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.12, sha.js@^2.4.8:
version "2.4.12"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f"
Expand Down Expand Up @@ -17138,16 +17159,7 @@ string-length@^4.0.2:
char-regex "^1.0.2"
strip-ansi "^6.0.0"

"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"

string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
Expand Down Expand Up @@ -17256,7 +17268,7 @@ stringify-object@^3.3.0:
is-obj "^1.0.1"
is-regexp "^1.0.0"

"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
Expand All @@ -17270,13 +17282,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"

strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"

strip-ansi@^7.0.0, strip-ansi@^7.0.1:
version "7.1.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
Expand Down Expand Up @@ -18664,7 +18669,7 @@ wordwrapjs@^4.0.0:
reduce-flatten "^2.0.0"
typical "^5.2.0"

"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
Expand All @@ -18682,15 +18687,6 @@ wrap-ansi@^6.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"

wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"

wrap-ansi@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
Expand Down
Loading