diff --git a/.gitignore b/.gitignore index 93d23f6..0eea59b 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,4 @@ test-ledger/ # General cache directories **/Cache/ **/cache/ +x1-app icons \ No newline at end of file diff --git a/android/App.js b/android/App.js index 95c5132..073a6a0 100644 --- a/android/App.js +++ b/android/App.js @@ -38,6 +38,7 @@ import { Animated, Switch, BackHandler, + ActivityIndicator, } from "react-native"; import NetInfo from "@react-native-community/netinfo"; import { @@ -58,6 +59,7 @@ import bs58 from "bs58"; import { GestureHandlerRootView } from "react-native-gesture-handler"; import { SafeAreaProvider, + SafeAreaView as SafeAreaViewContext, useSafeAreaInsets, } from "react-native-safe-area-context"; import { LinearGradient } from "expo-linear-gradient"; @@ -3448,15 +3450,15 @@ function AppContent() { // Show loading screen if (authState === "loading" || (authState === "unlocked" && !walletsLoaded)) { return ( - - Loading... + + + + + ); } @@ -4011,7 +4013,7 @@ function AppContent() { ref={networkSheetRef} backgroundColor={easterEggMode ? "#111827" : "#000"} > - + {/* Header */} {/* Header */} @@ -4246,7 +4248,7 @@ function AppContent() { ref={accountSheetRef} backgroundColor={easterEggMode ? "#111827" : "#000"} > - + {/* Header */} - + {/* Header */} @@ -4401,7 +4403,7 @@ function AppContent() { ref={sendSheetRef} backgroundColor={easterEggMode ? "#111827" : "#000"} > - + {/* Header */} sendSheetRef.current?.dismiss()}> @@ -4486,7 +4488,7 @@ function AppContent() { ref={addressSheetRef} backgroundColor={easterEggMode ? "#111827" : "#000"} > - + {/* Header */} Select Address @@ -4533,7 +4535,11 @@ function AppContent() { > {/* Activity List with BottomSheetScrollView */} {/* Header */} @@ -4551,12 +4557,15 @@ function AppContent() { {/* Transactions List */} {transactions.length === 0 ? ( - - No transactions yet - - Your transaction history will appear here - - + <> + + + No transactions yet + + Your transaction history will appear here + + + ) : ( transactions.map((tx) => ( setShowAddWalletModal(false)} > e.stopPropagation()} > @@ -4675,7 +4684,7 @@ function AppContent() { onPress={() => setShowCreateWalletModal(false)} > e.stopPropagation()} > @@ -4741,7 +4750,7 @@ function AppContent() { onPress={() => setShowImportWalletModal(false)} > e.stopPropagation()} > @@ -4987,14 +4996,18 @@ function AppContent() { { - console.log("OVERLAY PRESSED - Closing all modals"); + console.log("OVERLAY PRESSED - Cancelling changes"); + // Reset to original name + if (editingWallet) { + setEditWalletName(editingWallet.name); + } setShowChangeNameModal(false); editWalletSheetRef.current?.dismiss(); setEditingWallet(null); }} > e.stopPropagation()} > @@ -5002,8 +5015,12 @@ function AppContent() { { console.log( - "BACK BUTTON PRESSED (<) - Closing all modals" + "BACK BUTTON PRESSED (<) - Cancelling changes" ); + // Reset to original name + if (editingWallet) { + setEditWalletName(editingWallet.name); + } setShowChangeNameModal(false); editWalletSheetRef.current?.dismiss(); setEditingWallet(null); @@ -5014,7 +5031,11 @@ function AppContent() { Change Name { - console.log("X BUTTON PRESSED - Closing all modals"); + console.log("X BUTTON PRESSED - Cancelling changes"); + // Reset to original name + if (editingWallet) { + setEditWalletName(editingWallet.name); + } setShowChangeNameModal(false); editWalletSheetRef.current?.dismiss(); setEditingWallet(null); @@ -5033,52 +5054,62 @@ function AppContent() { value={editWalletName} onChangeText={(text) => { setEditWalletName(text); - if (editingWallet && text.trim()) { - const updatedWallets = wallets.map((w) => - w.id === editingWallet.id - ? { ...w, name: text.trim() } - : w - ); - setWallets(updatedWallets); - saveWalletsToStorage(updatedWallets); - } }} autoCorrect={false} /> - { - console.log("SAVE BUTTON PRESSED"); - console.log("editingWallet:", editingWallet); - console.log("editWalletName:", editWalletName); - if (editingWallet && editWalletName.trim()) { - console.log("Saving wallet name:", editWalletName.trim()); - const updatedWallets = wallets.map((w) => - w.id === editingWallet.id - ? { ...w, name: editWalletName.trim() } - : w - ); - setWallets(updatedWallets); - saveWalletsToStorage(updatedWallets); - console.log("Closing both modals"); + + { + console.log("CANCEL BUTTON PRESSED - Discarding changes"); + // Reset to original name + if (editingWallet) { + setEditWalletName(editingWallet.name); + } setShowChangeNameModal(false); editWalletSheetRef.current?.dismiss(); setEditingWallet(null); - } else { - console.log("Not saving - wallet or name is empty"); - } - }} - > - + + Cancel + + + + { + console.log("CONFIRM BUTTON PRESSED"); + console.log("editingWallet:", editingWallet); + console.log("editWalletName:", editWalletName); + if (editingWallet && editWalletName.trim()) { + console.log("Saving wallet name:", editWalletName.trim()); + const updatedWallets = wallets.map((w) => + w.id === editingWallet.id + ? { ...w, name: editWalletName.trim() } + : w + ); + setWallets(updatedWallets); + saveWalletsToStorage(updatedWallets); + console.log("Closing both modals"); + setShowChangeNameModal(false); + editWalletSheetRef.current?.dismiss(); + setEditingWallet(null); + } else { + console.log("Not saving - wallet or name is empty"); + } + }} + disabled={!editWalletName.trim()} > - Save - - + + Confirm + + + @@ -5089,7 +5120,7 @@ function AppContent() { ref={privateKeySheetRef} backgroundColor={easterEggMode ? "#111827" : "#000"} > - + Private Key @@ -5142,7 +5173,7 @@ function AppContent() { ref={seedPhraseSheetRef} backgroundColor={easterEggMode ? "#111827" : "#000"} > - + Seed Phrase @@ -5210,8 +5241,8 @@ function AppContent() { ref={ledgerSheetRef} backgroundColor={easterEggMode ? "#111827" : "#000"} > - - + + Connect Ledger - + Confirm Transaction @@ -5476,7 +5507,10 @@ function AppContent() { {/* Browser BottomSheet */} - + Browser @@ -5674,8 +5708,12 @@ function AppContent() { visible={showQRScanner} animationType="slide" onRequestClose={() => setShowQRScanner(false)} + statusBarTranslucent > - + {/* Top overlay */} - Scan QR Code - - Align QR code within the frame - + + Scan QR Code + + Align QR code within the frame + + {/* Middle section with scanning frame */} @@ -5717,7 +5757,7 @@ function AppContent() { - + )} @@ -6166,7 +6206,7 @@ function AppContent() { settingsNavigationStack.length - 1 ] === "exportSeed" ? ( // Export Seed Phrase Screen - + {masterSeedPhrase ? ( <> @@ -6203,7 +6243,7 @@ function AppContent() { ) : ( // Change Seed Phrase Screen - + {/* Mode Selector */} @@ -162,6 +168,12 @@ const SimpleActionSheet = forwardRef( borderTopRightRadius: cornerRadius, paddingBottom: 20 + insets.bottom, transform: [{ translateY }], + // Shadow/glow effect - more visible in both modes + shadowColor: backgroundColor === "#111827" ? "#888888" : "#AAAAAA", + shadowOffset: { width: 0, height: -4 }, + shadowOpacity: backgroundColor === "#111827" ? 0.4 : 0.6, + shadowRadius: 16, + elevation: 20, }, ]} > @@ -185,7 +197,7 @@ const styles = StyleSheet.create({ }, backdrop: { ...StyleSheet.absoluteFillObject, - backgroundColor: "rgba(0, 0, 0, 0.5)", + // backgroundColor will be set dynamically based on easter egg mode }, sheet: { height: SCREEN_HEIGHT * 0.9, diff --git a/android/package-lock.json b/android/package-lock.json index 43d4105..fbb1b6c 100644 --- a/android/package-lock.json +++ b/android/package-lock.json @@ -77,7 +77,6 @@ "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.14.0.tgz", "integrity": "sha512-0YQKKRIxiMlIou+SekQqdCo0ZTHxOcES+K8vKB53cIDpwABNR0P0yRzPgsbgcj3zRJniD93S/ontsnZsCLZrxQ==", "license": "MIT", - "peer": true, "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", @@ -143,7 +142,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -3225,7 +3223,6 @@ "integrity": "sha512-gXlD85hqDDC0C1e2on0pTJoV6pOL3ZJBRDbAzAqSa8Q6Y76tHWqsNTTBuipTjzr/9yFxqPp96p/i/P6lMMsvLg==", "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "canvaskit-wasm": "0.40.0", "react-reconciler": "0.31.0" @@ -3483,7 +3480,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.17.tgz", "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -4319,7 +4315,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -5433,7 +5428,6 @@ "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.23.tgz", "integrity": "sha512-b4uQoiRwQ6nwqsT2709RS15CWYNGF3eJtyr1KyLw9WuMAK7u4jjofkhRiO0+3o1C2NbV+WooyYTOZGubQQMBaQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", "@expo/cli": "54.0.16", @@ -5943,7 +5937,6 @@ "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.9.tgz", "integrity": "sha512-xCoQbR/36qqB6tew/LQ6GWICpaBmHLhg/Loix5Rku/0ZtNaXMJv08M9o1AcrdiGTn/Xf/BnLu6DgS45cWQEHZg==", "license": "MIT", - "peer": true, "dependencies": { "fontfaceobserver": "^2.1.0" }, @@ -6429,7 +6422,6 @@ "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", "license": "MIT", - "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -9448,7 +9440,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -9486,7 +9477,6 @@ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.5.tgz", "integrity": "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==", "license": "MIT", - "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.81.5", @@ -9568,7 +9558,6 @@ "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz", "integrity": "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==", "license": "MIT", - "peer": true, "dependencies": { "@egjs/hammerjs": "^2.0.17", "hoist-non-react-statics": "^3.3.0", @@ -9681,7 +9670,6 @@ "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.1.3.tgz", "integrity": "sha512-GP8wsi1u3nqvC1fMab/m8gfFwFyldawElCcUSBJQgfrXeLmsPPUOpDw44lbLeCpcwUuLa05WTVePdTEwCLTUZg==", "license": "MIT", - "peer": true, "dependencies": { "react-native-is-edge-to-edge": "^1.2.1", "semver": "7.7.2" @@ -9710,7 +9698,6 @@ "resolved": "git+ssh://git@github.com/AppAndFlow/react-native-safe-area-context.git", "integrity": "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==", "license": "MIT", - "peer": true, "peerDependencies": { "react": "*", "react-native": "*" @@ -9735,7 +9722,6 @@ "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.12.1.tgz", "integrity": "sha512-vCuZJDf8a5aNC2dlMovEv4Z0jjEUET53lm/iILFnFewa15b4atjVxU6Wirm6O9y6dEsdjDZVD7Q3QM4T1wlI8g==", "license": "MIT", - "peer": true, "dependencies": { "css-select": "^5.1.0", "css-tree": "^1.1.3", @@ -9761,7 +9747,6 @@ "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.16.0.tgz", "integrity": "sha512-Nh13xKZWW35C0dbOskD7OX01nQQavOzHbCw9XoZmar4eXCo7AvrYJ0jlUfRVVIJzqINxHlpECYLdmAdFsl9xDA==", "license": "MIT", - "peer": true, "dependencies": { "escape-string-regexp": "^4.0.0", "invariant": "2.2.4" @@ -9776,7 +9761,6 @@ "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.1.tgz", "integrity": "sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w==", "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-transform-arrow-functions": "^7.0.0-0", "@babel/plugin-transform-class-properties": "^7.0.0-0", @@ -9907,7 +9891,6 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -11232,7 +11215,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11681,7 +11663,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -11869,7 +11850,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/android/screens/ActivityScreen.js b/android/screens/ActivityScreen.js index eb802d0..1daa58d 100644 --- a/android/screens/ActivityScreen.js +++ b/android/screens/ActivityScreen.js @@ -29,7 +29,11 @@ export default function ActivityScreen({ - + {transactions.length === 0 ? ( No transactions yet @@ -128,7 +132,15 @@ const styles = StyleSheet.create({ }, content: { flex: 1, - padding: 16, + }, + emptyStateScrollContent: { + flexGrow: 1, + paddingHorizontal: 16, + paddingBottom: 16, + paddingTop: 0, + }, + emptyStateSpacer: { + height: 40, }, activityCard: { backgroundColor: "#0a0a0a", @@ -181,16 +193,21 @@ const styles = StyleSheet.create({ flex: 1, justifyContent: "center", alignItems: "center", - paddingVertical: 60, + paddingBottom: 40, + paddingHorizontal: 32, }, emptyStateText: { color: "#FFFFFF", fontSize: 16, fontWeight: "600", marginBottom: 8, + textAlign: "center", + width: "100%", }, emptyStateSubtext: { color: "#999999", fontSize: 14, + textAlign: "center", + width: "100%", }, });