From 9e667d477a5a395c37f74711de11c0e9a0b03612 Mon Sep 17 00:00:00 2001 From: Wei Yang Date: Mon, 17 Nov 2025 08:27:42 -0600 Subject: [PATCH 1/5] Add custom app icons and fix bottom navigation safe area MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add custom launcher icons from AppIcons source - Added ic_launcher.png and ic_launcher_round.png for all densities - Removed adaptive icon XMLs and webp files to use PNG icons directly - Replace safe area context with updated version - Installed react-native-safe-area-context from @AppAndFlow/react-native-safe-area-context - Implemented useSafeAreaInsets hook in bottom navigation - Fixed bottom tab bar overlapping with system UI on devices with gesture navigation - Update .gitignore to track app icon resources - Configured selective tracking of android/app/src/main/res/mipmap-*/ directories - Ensures custom app icons are version controlled 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- android/.gitignore | 12 +++++++++++- android/App.js | 12 ++++++++---- .../android/app/src/main/AndroidManifest.xml | 2 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4058 bytes .../main/res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4058 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2630 bytes .../main/res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2630 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5802 bytes .../main/res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5802 bytes .../src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9826 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 9826 bytes .../src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 15684 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15684 bytes android/package-lock.json | 5 ++--- android/package.json | 2 +- android/yarn.lock | 5 ++--- 16 files changed, 25 insertions(+), 13 deletions(-) create mode 100644 android/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 android/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 android/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/android/.gitignore b/android/.gitignore index d914c32..2a945dd 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -38,4 +38,14 @@ yarn-error.* # generated native folders /ios -/android +# Ignore most of android except app icons +/android/* +!/android/app/ +/android/app/* +!/android/app/src/ +/android/app/src/* +!/android/app/src/main/ +/android/app/src/main/* +!/android/app/src/main/res/ +/android/app/src/main/res/* +!/android/app/src/main/res/mipmap-*/ diff --git a/android/App.js b/android/App.js index 698f945..64bab93 100644 --- a/android/App.js +++ b/android/App.js @@ -54,7 +54,10 @@ import slip10 from "micro-key-producer/slip10.js"; import { randomBytes, secretbox } from "tweetnacl"; import bs58 from "bs58"; import { GestureHandlerRootView } from "react-native-gesture-handler"; -import { SafeAreaProvider } from "react-native-safe-area-context"; +import { + SafeAreaProvider, + useSafeAreaInsets, +} from "react-native-safe-area-context"; // Replaced @gorhom/bottom-sheet with simple Modal-based implementation import BottomSheet, { SimpleBottomSheetView as BottomSheetView, @@ -301,6 +304,9 @@ const NETWORKS = [ const apolloClient = createApolloClient("backpack-android", "1.0.0"); function AppContent() { + // Get safe area insets + const insets = useSafeAreaInsets(); + // Authentication states const [authState, setAuthState] = useState("loading"); // 'loading', 'setup', 'locked', 'unlocked' const [password, setPassword] = useState(null); @@ -3575,7 +3581,7 @@ function AppContent() { {/* Bottom Tab Bar */} - + { @@ -6954,12 +6960,10 @@ const styles = StyleSheet.create({ flexDirection: "row", backgroundColor: "transparent", borderTopWidth: 0, - paddingBottom: 35, paddingTop: 0, paddingHorizontal: 20, justifyContent: "space-around", alignItems: "flex-start", - height: 86, }, bottomTabItem: { flex: 1, diff --git a/android/android/app/src/main/AndroidManifest.xml b/android/android/app/src/main/AndroidManifest.xml index 8c091d8..c5ab1bd 100644 --- a/android/android/app/src/main/AndroidManifest.xml +++ b/android/android/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ - + diff --git a/android/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa0dffe5f0310f461f2ffc6b878bedbc8102754 GIT binary patch literal 4058 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 M07*qoM6N<$f&`4>t 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 o0RR6~d%)%Z000I_L_t&o0PB`;tiIjt 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 literal 0 HcmV?d00001 diff --git a/android/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..096827fb9baa6ea27da4d7a9031bdacc3b9521a0 GIT binary patch literal 5802 zcmV;b7FFqqP)N4LlDH6#F$($ zBr$5PF~(?OG)8m1<`dt!*O*)t)R>E6RCZ@~_BlJd>^!rvpC}Q4L;&KFOUp_Gd5&?)a1H)fl za5V-gfIJt+Ho@`Odi?l$1Hs@!Eq)C1ft&{6GTJe z?m;lf*0~U3NOC%zNlEr;Np|~mE@v@N2RpRq;^@;1$#;tOW5V5-IN=*Q z5mF@C7}Y3aw1O;*yB@kNNm0LP%XXcvO`TP! zeDTW)UA|G5HTy!rT@UF;cl}0oZ1|zk^w-vc)j2|8Xd={Wp5|&fgo}n)_t)Wt)_Se_x>06;0RbwH&pfgG3XP-QJ*6XR}U$ zPJ@g9ku($&es74H+9h>exRxk2O{SrqYV)r>fF34&;v|jlw={bM7;-2v(tvIa4a{P^sqXljZ z*HF0)fbt+@PfE>nxhA^`CY@hcQoU|cN#)(;<&`hxl5#LNMSabgBpyynw{J@+ET5y! zm|d=%yEI8I*<~2l-5v68d^FUx>9>0OntNr_#kJCX>LTSx&Qz_=aH#cOQkoid(bm{A zs{I`X>3&HvButV)v|!Q&mx)O>fj~s&QSODL01p%0SwMfVY2`j9``K)}{zgGY^6NS2#-r(W`^`zN!pm$^PdiCF z=c;77{M&}U=6>D3{*h4Ub&u%nSL~Hd7i^I3Qx+<9IVWj#fi%_KA{AafL_3e_u2xlMR6;=PRtfcJO>`eV&Zd&qR)6>&_nwnd9byC&Lv((eRQYtRkpy^BZ8o@Qc z3Uy!qJKekDexrHe7TNfjuPF6}vsAZMsJS~;)zf5P`4GPFs19LNW4Qpy=BQRkF!2Ok zBtheyN6$yge7L<5maz)hBmR13=A`VLyu5Qt$|`nOl~uf$pPlrU)2_adk&(17qo`0rrJcF7SX_FuVyt|?@L&6AsB^_bdfTPnH9TKjEgPntuhcoFX?1#*>TZ=vQ$vVH zb%?s!bn;^d;y28-nt0g|023`hY>;~&;^l=w$XkdkBM%H!XXznf7YXP9=mwL}@h!wk zSTs8j8qLP4hpmyEkvpZVa_T+#uH*yRj_jvXU8P&J8RvXno4YPYF4-%CD}SpWz2?bK z$Fc|Y=Eb{=hR=Le*5#e7)Qeor?Nd}w3n^{QBz$c|{w^XN(_9J?iq-?6^6chINe1VL z>v|DU7Oa;5bO7gj?W}yH9(e$D{iPvzzc~zg?bTy;7AvEa=w&P}U}xA}g|o|w3!by3 zrd^?*ytpVh|3-QAqVMbN^Y-XXvzEz*g4x0?U246jOKUh>ueSXCh~hnTL>ztp2nFiu z$new?HP@4934`<0R8J;QXJIg1WL-pFSb507+Chi9{)p7~&s$|n_O?Aj(&Hft_?a_M z!eW#u7B4(Bh$o%P?#j!*R|dNay0fPQ-PMa^eaI>5-v2;tc=cJe`G21f9j`t~-ETZi zp|_tS`TsAIc=vxuVf4s9kvQ}+5%dhm(L%5vpw~~>e{Y%V2jqvb>EkP+t)<8P%XeNO z!`DtiRYY}lHBSk$0G^IJ9I*rdHZnU;J5MuYr6IJC+TpeZ+#d*kKp|c7(Ur|fl$>os z+OkM;S!xb4!Z7nHml1ABVKn6Mg=dB-#|9;4PSGY7V?rBd7d0cUSL21Rvr?tbXFc^3ziNt5|Q=LTV=?|@=$r$0aiU^Bv1!fI^-=x z>iXsDUZl(q_Y2k6Ks*av>FMdqQqog*xLmI1D<)5S!QsfA#iSw#D$AHsv;c^(7rUm~ zib(RKz*Ha<8ZR+vq}zaWmKLlsBmg}mfP5q@9b_ad8%t-EA)$i=hRUN3u<9WrfjYp_ zA#Wj4*DtT7kzq?G;vE|gL}?g?E)A)NLb{=-+8G7KMNeh9TxT#v7_`y2WixhVenZu0*gc%f&m*Z5Fu4nOY$;uuVNbnAR50E)qovwa3vo5)*B$G5*UO5A^4C~ zN|}~oTS`RW3rmqXh`BsyiYWlxQg9SlBvKRx1oJOcRhyigoLmB1#+U>^<@sbevLyRX zq<#!o+$3=zVp_6ep8@@@lqil31F;5RY_68@GJt_Z00vMpv5G_hCYJ93S4#w703{Qv zNCaSF`5th!L;wa*GO>z804A320auG#0E7_4=O%+fQDVQXn0+WJ$-$tiM0_t4r%&uX z9m5+GLJ%MDQFBWRwYIkQK}$<3b#)!3Sb`vgptiPlYU$^rnf-Qlb}_Hk4^tw=*G6hb z>p*y0NdyDL#uSgwga<$fL4iP!iV6#9W6fGxbImHccFk%NYgVtMnswLFX`lNnb#``| zvtu|?5X5gRT|(=wTSM2fpX=BUd~B>)N9Ub;Hg)^`J*SO4%G(xPNv&VLhFTY|Vyy1L zqLtKg@wF6~RLw!)w~Ksl!(DGY>Lxq@d`3bxn?{Wu51o7VmuOqJ}2+2I22NrOsXq?y^*gB0+*H;*x=qZ-5YN8xMHr_3@(K-CwSiN$2n0zLd-ve?Y$pNa}x`SGI zSCp(O6iUmaj8}e7`M1|l{#_d=|3@3BVBdPu8ji3nUmbt@i5USP0IZ5fifaJyKu+Ri zq|WW;rDzWcA^62x4;u;x0W)Ipq6=xkyt&la=%M`lJle5+i)kZ7&yYo+FbnRub06)0 z_IYw-W)QelI@>ApxnEG`OAj+1GLiA(L!|PylW++bS+fA;c(BjcjB5b+`sPT^aysdE zk3T{8{Omq+nE~;r6QYOY?b|j}CKJ13TP;nlt}>S#1gM96mHzzdU+C8Fe2+3R>}DO> z@^m8Io=tjsRv$>xh(Nr~Ru&A-$0@}<0O&V}%*e=~Z+-hVdgq*lyNtxsenOmSqp0fG~9G1AYn%orgOD0O)K5u%Mn;BR8Qq zAp!t0u@l1He*4bd=1vDXKnP)y{;89u@$Uy43DLup86eK@xM?@N_Qo5Oo}Nz7MPpBb z_(%k~#lOZ3;Es$UVcBsw9Q4fo=ji))+}S$|;8F@q-S=qA_MMcPn%XBg zuo)JS#9R490D33`xmb$2y1EEUQ82v!hrY*x%;gCA9XH)f4GoQyoXmTE>_ef91t1;E zPUJF#0Q9VEv3M9$n-gjVSUm&bi!Qvt{Dq6W5Chpc`-^As^Wa!OthP~Q|0M{4fG%po z@i91|0)TbBosS;AF#Alp;v1KnJ;rilX2M@W2y+%J{rVE~M;RX6Xcw-IE-(Z7BYLZG zvp8V_AcP=4A0OxE=hLmX>^3`$(T@xy9=ym4AW*~^ypEl-ME3u%1Q|jWRMI(g%D;vg+I`vzO1x_u3NK; zk19I*)Q8Om6~YPtqy;30CZ6s zj*mgy1Avi?Z71Gp6&4nlq(g_%jS+p|;6eKFU3XJ)Q4t4W57pJx^X^CV+JW?wXH2K7 zS6oG2Z-@EYVOXjx(k+Q#4BKFQE8`jf?D_Fh9y^+g7BB3x^q|{#FT8gBMt(R4%pY8C z-uLhM)_2SRNEk4zV6DCO8anker;v}|mO;l=gC`IV(j#FEZW@brv^H@IfDpob=vI`M z(9yAnm~YSUy3y%y(4)V5oc{RCeo_^Mbi*)%0TOVmUAt)m zXRXk1cCds1^hcB?gSi-sDJLh#9Q{HFKGV?&OV9H!yhwN4`6J58 za>PZQn#gS~X{&9}^@2c(;K8vepxPdNC;*M0Z@ zf}VZu1@n))-0lYRjTzeG_2rdUEG4FuTVQCjh)8OehqR7n(tK`~Zhk}7OhP|O#P>yU z_)K^Ju-2=JN}YV*cFARz)0}x1(s}b1(wy@zptMd+W73K zzmMkTW)6_SgSuxPMEVdR{?#08Cne|&qn(MzdBi~5$adqEk4pg18LZFvO9znMA0QYu z!@;uY-xg)~9kQ)Zi3C3{B0=#XpZF8E0PwX5Bn}4D#frh&LpOALJQw<7XzTH=iE9AH zyK^50|A_#^IZ7YT0K}QJvAldD0AtDK2z(_1FapxXvPmKUW695Vo(NTJHNkZ z3|9@yS1bWgd_G^JzdP`Z5CYB+-LUV3=*NJ;9Fad5c!u>J2KWVMoE<#DVDOq_TJxa9 z+uHsEA{?F*90JEI5;-uyobckq$=l|=9SVlY9m^q8ECIk;rgU_8UhsN-`#8cHFGtV; ze9_*3e3J7zH~}}_j?N!;v^KuPjDuTn#Mz+}jE1f~Rs(XC#=7^{b^5$_@l4?3MB-yb zb4DP_pJ13A;C}?Q&JN#C8tV?PXWGCkIOFW_35LU4^wdfsbEJ3IfAo*#O&-tufWP}G zJ*2nlp-?cyU;L)3Cq?FaG{?SC2ZS{S=Z$cFfZ)1b-B5Wp7|_0-?SOi2W2Sy~y?uZl zFpUQJLLI z)_*X){-eV)+#epE?*1r@$h@VqB`61EO)m7*B z``__@f&mVg9*_=BzzsNJRcz^a17LZ@!vz;Y`vmx*$i#pX7RQ%B-to2QYmJB}(3g|r zDvdS($91uU@jwO=0T{^1glZB2m{7V0UMvxSft*aJCJ}%MrF-DT5&;;k literal 0 HcmV?d00001 diff --git a/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..19f7d81312d356de2b765b923230d465442ef69f GIT binary patch literal 9826 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 literal 0 HcmV?d00001 diff --git a/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..19f7d81312d356de2b765b923230d465442ef69f GIT binary patch literal 9826 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 literal 0 HcmV?d00001 diff --git a/android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e5492d064095ed53956a51e4156321aa820014fb GIT binary patch literal 15684 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 J6+iU+{~y)JqFev~ literal 0 HcmV?d00001 diff --git a/android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..e5492d064095ed53956a51e4156321aa820014fb GIT binary patch literal 15684 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 J6+iU+{~y)JqFev~ literal 0 HcmV?d00001 diff --git a/android/package-lock.json b/android/package-lock.json index 798f706..56c60c0 100644 --- a/android/package-lock.json +++ b/android/package-lock.json @@ -40,7 +40,7 @@ "react-native-qrcode-svg": "^6.3.20", "react-native-quick-crypto": "^0.7.17", "react-native-reanimated": "~4.1.1", - "react-native-safe-area-context": "^5.6.2", + "react-native-safe-area-context": "github:AppAndFlow/react-native-safe-area-context", "react-native-screens": "^4.18.0", "react-native-svg": "15.12.1", "react-native-webview": "^13.16.0", @@ -9986,8 +9986,7 @@ }, "node_modules/react-native-safe-area-context": { "version": "5.6.2", - "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz", - "integrity": "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==", + "resolved": "git+ssh://git@github.com/AppAndFlow/react-native-safe-area-context.git#8b2267a4726b7520e82d35f26d23bacce9ec44c9", "license": "MIT", "peerDependencies": { "react": "*", diff --git a/android/package.json b/android/package.json index c12fd2f..88ef219 100644 --- a/android/package.json +++ b/android/package.json @@ -41,7 +41,7 @@ "react-native-qrcode-svg": "^6.3.20", "react-native-quick-crypto": "^0.7.17", "react-native-reanimated": "~4.1.1", - "react-native-safe-area-context": "^5.6.2", + "react-native-safe-area-context": "github:AppAndFlow/react-native-safe-area-context", "react-native-screens": "^4.18.0", "react-native-svg": "15.12.1", "react-native-webview": "^13.16.0", diff --git a/android/yarn.lock b/android/yarn.lock index 8dbf394..317c37c 100644 --- a/android/yarn.lock +++ b/android/yarn.lock @@ -5015,10 +5015,9 @@ react-native-quick-crypto@^0.7.17: react-native-is-edge-to-edge "^1.2.1" semver "7.7.2" -react-native-safe-area-context@*, react-native-safe-area-context@^5.6.2: +react-native-safe-area-context@*, "react-native-safe-area-context@github:AppAndFlow/react-native-safe-area-context": version "5.6.2" - resolved "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz" - integrity sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg== + resolved "git+ssh://git@github.com/AppAndFlow/react-native-safe-area-context.git#8b2267a4726b7520e82d35f26d23bacce9ec44c9" react-native-screens@^4.18.0: version "4.18.0" From 8fe17c32553e4faddd542ad8cd8880cd52f2a770 Mon Sep 17 00:00:00 2001 From: Wei Yang Date: Mon, 17 Nov 2025 09:36:23 -0600 Subject: [PATCH 2/5] Fix XNT balance and transactions display by enabling cleartext HTTP traffic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: Android 9+ blocks cleartext HTTP traffic by default. The app's API server uses HTTP (http://162.250.126.66:4000), causing all network requests to fail with "Network request failed". Changes: - Added android:usesCleartextTraffic="true" to AndroidManifest.xml to allow HTTP connections to the API server - Added comprehensive debug logging throughout wallet loading, balance fetching, and transaction retrieval flows - Updated .gitignore to track AndroidManifest.xml for future changes - Debug logs now always captured (not just when debug drawer is open) The app now successfully: - Loads wallets from storage after unlock - Fetches balance data from API - Fetches transaction history - Registers wallets with the indexer - Displays XNT token balance and USD value Note: The AndroidManifest.xml file is in android/android/ which is gitignored. Manual change required: Add android:usesCleartextTraffic="true" to the tag in android/android/app/src/main/AndroidManifest.xml 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- android/.gitignore | 3 ++ android/App.js | 74 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 65 insertions(+), 12 deletions(-) diff --git a/android/.gitignore b/android/.gitignore index d914c32..3a6311b 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -39,3 +39,6 @@ yarn-error.* # generated native folders /ios /android + +# But track AndroidManifest for cleartext traffic configuration +!/android/app/src/main/AndroidManifest.xml diff --git a/android/App.js b/android/App.js index 698f945..1ce909a 100644 --- a/android/App.js +++ b/android/App.js @@ -481,16 +481,10 @@ function AppContent() { }, []); // Debug logging function - only logs when debug drawer is active - const addDebugLog = useCallback( - (message) => { - if (!showDebugDrawer) return; // Only log when debug drawer is open - const timestamp = new Date().toLocaleTimeString(); - setDebugLogs((prev) => - [...prev, `[${timestamp}] ${message}`].slice(-100) - ); // Keep last 100 logs - }, - [showDebugDrawer] - ); + const addDebugLog = useCallback((message) => { + const timestamp = new Date().toLocaleTimeString(); + setDebugLogs((prev) => [...prev, `[${timestamp}] ${message}`].slice(-100)); // Keep last 100 logs + }, []); // Wallet storage functions const saveWalletsToStorage = async (walletsToSave) => { @@ -510,11 +504,17 @@ function AppContent() { }; const loadWalletsFromStorage = async () => { + console.log("🔵 loadWalletsFromStorage called"); try { const storedWallets = await AsyncStorage.getItem("@wallets"); + console.log("📦 Raw stored wallets:", storedWallets ? "exists" : "null"); if (storedWallets) { const parsed = JSON.parse(storedWallets); - console.log("Loaded wallets from storage:", parsed.length); + console.log("✅ Loaded wallets from storage:", parsed.length); + console.log( + "📝 Wallet addresses:", + parsed.map((w) => w.publicKey).join(", ") + ); // Reconstruct keypairs from stored secret keys const walletsWithKeypairs = parsed.map((wallet) => { @@ -547,15 +547,30 @@ function AppContent() { (w) => String(w.id) === storedSelectedWalletId ); if (selectedWalletFromStorage) { + console.log( + "🟢 Setting selected wallet from storage:", + selectedWalletFromStorage.name, + selectedWalletFromStorage.publicKey + ); setSelectedWallet(selectedWalletFromStorage); console.log( "Restored selected wallet:", selectedWalletFromStorage.name ); } else if (walletsWithKeypairs.length > 0) { + console.log( + "🟡 No saved selection, using first wallet:", + walletsWithKeypairs[0].name, + walletsWithKeypairs[0].publicKey + ); setSelectedWallet(walletsWithKeypairs[0]); } } else if (walletsWithKeypairs.length > 0) { + console.log( + "🟠 No wallet ID stored, using first wallet:", + walletsWithKeypairs[0].name, + walletsWithKeypairs[0].publicKey + ); setSelectedWallet(walletsWithKeypairs[0]); } } catch (err) { @@ -641,7 +656,9 @@ function AppContent() { // Load wallets and master seed phrase on mount useEffect(() => { + console.log("🔐 Auth state changed to:", authState); if (authState === "unlocked") { + console.log("🔓 App unlocked, loading wallets..."); loadWalletsFromStorage(); loadMasterSeedPhrase(); loadDerivationIndex(); @@ -786,7 +803,13 @@ function AppContent() { ); const data = await response.json(); + console.log("API Response Data:", JSON.stringify(data, null, 2)); + if (data.balance !== undefined) { + console.log( + `✅ Balance API returned: balance=${data.balance}, tokens count=${data.tokens?.length}` + ); + // Format balance with up to 6 decimals for display const balanceStr = data.balance.toLocaleString("en-US", { minimumFractionDigits: 2, @@ -817,11 +840,19 @@ function AppContent() { token.symbol === "XNT" ? "💎" : token.symbol === "SOL" ? "◎" : "🪙", })); + console.log(`📊 Updating state with: + - balance: ${balanceStr} + - balanceUSD: ${usdStr} + - tokenPrice: ${price} + - tokens count: ${formattedTokens.length}`); + setBalance(balanceStr); setBalanceUSD(usdStr); setTokenPrice(price); setTokens(formattedTokens); + console.log("✅ State updated successfully"); + // Save to cache setBalanceCache((prev) => ({ ...prev, @@ -954,7 +985,18 @@ function AppContent() { // Load initial balance useEffect(() => { - if (!selectedWallet) return; + console.log("🔄 useEffect triggered for balance/transactions"); + console.log("selectedWallet:", selectedWallet); + console.log("currentNetwork:", currentNetwork); + + if (!selectedWallet) { + console.log("⚠️ No selected wallet, skipping balance/transaction check"); + return; + } + + console.log( + `✅ Calling checkBalance and checkTransactions for wallet: ${selectedWallet.publicKey}` + ); checkBalance(); checkTransactions(); }, [selectedWallet?.publicKey, currentNetwork]); @@ -2097,9 +2139,17 @@ function AppContent() { const updatedWallets = wallets .map((w) => ({ ...w, selected: false })) .concat(newWallet); + + console.log( + "💾 Saving new wallet to storage:", + newWallet.name, + newWallet.publicKey + ); setWallets(updatedWallets); setSelectedWallet(newWallet); + console.log("✅ Set new wallet as selectedWallet"); await saveWalletsToStorage(updatedWallets); + console.log("💾 Wallets saved to storage"); // Increment and save derivation index for next wallet const nextIndex = walletDerivationIndex + 1; From 9adba95299365a045c3af601eaaa10d34eaecb04 Mon Sep 17 00:00:00 2001 From: Wei Yang Date: Mon, 17 Nov 2025 09:55:02 -0600 Subject: [PATCH 3/5] Fix send transaction validation and address selector state issues This commit fixes two critical bugs in the send transaction flow: 1. Send Transaction Validation Error - Fixed handleSendSubmit to accept parameters from SendScreen - Changed validation to check passed parameters instead of stale App.js state - SendScreen's local state now properly syncs with handleSendSubmit - Added state storage after validation for confirmation screen 2. Address Selector Not Working - Added selectedAddressForSend state for screen communication - Connected AddressSelectorScreen with wallets prop and onSelect callback - SendScreen now receives selected address and updates input field via useEffect - Fixed AddressSelectorScreen to display wallet.publicKey instead of wallet.address - Clear selected address when opening send sheet to prevent stale selections Both issues stemmed from state synchronization problems where child components maintained local state that wasn't properly communicated to parent handlers. Files changed: - App.js: Added selectedAddressForSend state, updated handleSendSubmit signature, connected AddressSelectorScreen props, clear state on send sheet open - screens/SendScreen.js: Added useEffect to sync selected address from prop - screens/AddressSelectorScreen.js: Fixed to use wallet.publicKey property --- android/App.js | 23 +++++-- android/screens/AddressSelectorScreen.js | 36 +++++----- android/screens/SendScreen.js | 86 +++++++++++++----------- 3 files changed, 82 insertions(+), 63 deletions(-) diff --git a/android/App.js b/android/App.js index 1ce909a..8d84b37 100644 --- a/android/App.js +++ b/android/App.js @@ -330,6 +330,9 @@ function AppContent() { const [showBluetoothDrawer, setShowBluetoothDrawer] = useState(false); const [pairedDevices, setPairedDevices] = useState([]); + // State for address selector -> send screen communication + const [selectedAddressForSend, setSelectedAddressForSend] = useState(""); + // Wallet management states const [showAddWalletModal, setShowAddWalletModal] = useState(false); const [showCreateWalletModal, setShowCreateWalletModal] = useState(false); @@ -1225,6 +1228,8 @@ function AppContent() { }; const handleSend = async () => { + // Clear any previously selected address + setSelectedAddressForSend(""); await sendSheetRef.current?.present(); }; @@ -1237,7 +1242,7 @@ function AppContent() { Alert.alert("Copied", "Address copied to clipboard"); }; - const handleSendSubmit = async () => { + const handleSendSubmit = async (amount, address) => { // Dismiss keyboard when Send button is pressed Keyboard.dismiss(); @@ -1245,13 +1250,17 @@ function AppContent() { Alert.alert("Error", "No wallet selected"); return; } - if (!sendAddress || !sendAmount) { + if (!address || !amount) { Alert.alert("Error", "Please enter both address and amount"); return; } + // Store values in state for confirmation screen + setSendAmount(amount); + setSendAddress(address); + // Trim the address to remove any whitespace - const trimmedAddress = sendAddress.trim(); + const trimmedAddress = address.trim(); // Validate address format try { @@ -1262,7 +1271,7 @@ function AppContent() { } // Validate amount - const amountNum = parseFloat(sendAmount); + const amountNum = parseFloat(amount); if (isNaN(amountNum) || amountNum <= 0) { Alert.alert("Error", "Invalid amount"); return; @@ -5389,6 +5398,7 @@ function AppContent() { handleSendSubmit={handleSendSubmit} wallets={wallets} addressSelectorSheetRef={addressSelectorSheetRef} + selectedAddressFromSelector={selectedAddressForSend} onDismiss={() => sendSheetRef.current?.dismiss()} /> @@ -5514,6 +5524,11 @@ function AppContent() { backgroundColor="#000000" > { + setSelectedAddressForSend(address); + addressSelectorSheetRef.current?.dismiss(); + }} onDismiss={() => addressSelectorSheetRef.current?.dismiss()} /> diff --git a/android/screens/AddressSelectorScreen.js b/android/screens/AddressSelectorScreen.js index 4d91c44..1b01251 100644 --- a/android/screens/AddressSelectorScreen.js +++ b/android/screens/AddressSelectorScreen.js @@ -1,16 +1,16 @@ -import React from 'react'; +import React from "react"; import { View, Text, TouchableOpacity, StyleSheet, ScrollView, -} from 'react-native'; +} from "react-native"; export default function AddressSelectorScreen({ wallets = [], onSelect = () => {}, - onDismiss + onDismiss, }) { return ( @@ -34,7 +34,7 @@ export default function AddressSelectorScreen({ {wallet.name} - {wallet.address} + {wallet.publicKey} @@ -47,26 +47,26 @@ export default function AddressSelectorScreen({ const styles = StyleSheet.create({ container: { flex: 1, - backgroundColor: '#000000', + backgroundColor: "#000000", }, header: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", paddingHorizontal: 16, paddingVertical: 16, borderBottomWidth: 1, - borderBottomColor: '#1a1a1a', + borderBottomColor: "#1a1a1a", }, headerTitle: { fontSize: 18, - fontWeight: '600', - color: '#FFFFFF', + fontWeight: "600", + color: "#FFFFFF", }, headerClose: { fontSize: 24, - color: '#4A90E2', - fontWeight: '600', + color: "#4A90E2", + fontWeight: "600", }, content: { flex: 1, @@ -75,7 +75,7 @@ const styles = StyleSheet.create({ addressItem: { paddingVertical: 16, paddingHorizontal: 16, - backgroundColor: '#0a0a0a', + backgroundColor: "#0a0a0a", borderRadius: 12, marginBottom: 8, }, @@ -84,13 +84,13 @@ const styles = StyleSheet.create({ }, addressName: { fontSize: 16, - fontWeight: '600', - color: '#FFFFFF', + fontWeight: "600", + color: "#FFFFFF", marginBottom: 6, }, addressText: { fontSize: 12, - color: '#888888', - fontFamily: 'monospace', + color: "#888888", + fontFamily: "monospace", }, }); diff --git a/android/screens/SendScreen.js b/android/screens/SendScreen.js index 6bc00fc..e9c9488 100644 --- a/android/screens/SendScreen.js +++ b/android/screens/SendScreen.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from "react"; import { View, Text, @@ -6,7 +6,7 @@ import { TouchableOpacity, StyleSheet, ScrollView, -} from 'react-native'; +} from "react-native"; export default function SendScreen({ balance, @@ -14,11 +14,18 @@ export default function SendScreen({ handleSendSubmit, wallets, addressSelectorSheetRef, - onDismiss + selectedAddressFromSelector, + onDismiss, }) { + const [sendAmount, setSendAmount] = useState(""); + const [sendAddress, setSendAddress] = useState(""); - const [sendAmount, setSendAmount] = useState(''); - const [sendAddress, setSendAddress] = useState(''); + // Update sendAddress when an address is selected from the selector + useEffect(() => { + if (selectedAddressFromSelector) { + setSendAddress(selectedAddressFromSelector); + } + }, [selectedAddressFromSelector]); const onSend = () => { handleSendSubmit(sendAmount, sendAddress); @@ -31,7 +38,9 @@ export default function SendScreen({ - Send {getNativeTokenInfo().symbol} + + Send {getNativeTokenInfo().symbol} + × @@ -70,9 +79,7 @@ export default function SendScreen({ await addressSelectorSheetRef.current?.present(); }} > - - Select Address - + Select Address {/* Send Button */} - + Send @@ -100,31 +104,31 @@ export default function SendScreen({ const styles = StyleSheet.create({ container: { flex: 1, - backgroundColor: '#000000', + backgroundColor: "#000000", }, header: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", paddingHorizontal: 16, paddingVertical: 16, borderBottomWidth: 1, - borderBottomColor: '#1a1a1a', + borderBottomColor: "#1a1a1a", }, headerBack: { fontSize: 24, - color: '#4A90E2', - fontWeight: '600', + color: "#4A90E2", + fontWeight: "600", }, headerTitle: { fontSize: 18, - fontWeight: '600', - color: '#FFFFFF', + fontWeight: "600", + color: "#FFFFFF", }, headerClose: { fontSize: 32, - color: '#888888', - fontWeight: '300', + color: "#888888", + fontWeight: "300", }, content: { flex: 1, @@ -133,59 +137,59 @@ const styles = StyleSheet.create({ sendBalanceContainer: { marginBottom: 24, padding: 16, - backgroundColor: '#0a0a0a', + backgroundColor: "#0a0a0a", borderRadius: 12, }, sendBalanceLabel: { fontSize: 12, - color: '#888888', + color: "#888888", marginBottom: 4, }, sendBalanceText: { fontSize: 20, - fontWeight: '600', - color: '#4A90E2', + fontWeight: "600", + color: "#4A90E2", }, sendInputContainer: { marginBottom: 20, }, sendInputLabel: { fontSize: 12, - color: '#888888', + color: "#888888", marginBottom: 8, }, sendInput: { - backgroundColor: '#0a0a0a', + backgroundColor: "#0a0a0a", borderRadius: 8, paddingVertical: 12, paddingHorizontal: 16, fontSize: 16, - color: '#FFFFFF', + color: "#FFFFFF", borderWidth: 1, - borderColor: '#333333', + borderColor: "#333333", }, sendAddressHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", marginBottom: 8, }, sendSelectAddressText: { fontSize: 12, - color: '#4A90E2', - fontWeight: '600', + color: "#4A90E2", + fontWeight: "600", }, sendSubmitButton: { paddingVertical: 14, paddingHorizontal: 20, - backgroundColor: '#4A90E2', + backgroundColor: "#4A90E2", borderRadius: 8, - alignItems: 'center', + alignItems: "center", marginTop: 8, }, sendSubmitButtonText: { fontSize: 16, - fontWeight: '600', - color: '#FFFFFF', + fontWeight: "600", + color: "#FFFFFF", }, }); From b17120d69c3b315892d370080b93a1303c905dcb Mon Sep 17 00:00:00 2001 From: Wei Yang Date: Mon, 17 Nov 2025 10:04:34 -0600 Subject: [PATCH 4/5] Replace Alert popups with beautiful toast notifications Improved UI/UX by replacing default React Native Alert dialogs with react-native-toast-message for a more modern and polished look. Changes: - Installed react-native-toast-message package - Created custom toast configuration matching the dark theme - Replaced simple notification Alerts with toasts: - Success messages (copied address, wallet deleted) - Error messages (validation errors, invalid inputs) - Info messages (swap, stake, bridge placeholders) - Kept confirmation dialogs as Alert.alert for user decisions - Custom toast styles: - Dark background (#1a1a1a) - Color-coded left border (green for success, red for error, blue for info) - Rounded corners and shadow for depth - Bottom positioning for non-intrusive display The toasts provide better visual feedback with automatic dismissal and don't block the UI like traditional alerts. --- android/App.js | 164 +++++++++++++++++++++++++++++++++++--- android/package-lock.json | 11 +++ android/package.json | 1 + android/yarn.lock | 5 ++ 4 files changed, 172 insertions(+), 9 deletions(-) diff --git a/android/App.js b/android/App.js index 55d9cb8..3c141ed 100644 --- a/android/App.js +++ b/android/App.js @@ -37,6 +37,7 @@ import { Vibration, Animated, } from "react-native"; +import Toast from "react-native-toast-message"; import NetInfo from "@react-native-community/netinfo"; import { Keypair, @@ -1139,7 +1140,12 @@ function AppContent() { }); } - Alert.alert("Success", "Wallet deleted successfully"); + Toast.show({ + type: "success", + text1: "Success", + text2: "Wallet deleted successfully", + position: "bottom", + }); }, }, ] @@ -1245,7 +1251,13 @@ function AppContent() { console.log("📋 selectedWallet.address:", selectedWallet?.address); console.log("📋 selectedWallet.publicKey:", selectedWallet?.publicKey); Clipboard.setString(text); - Alert.alert("Copied", "Address copied to clipboard"); + Toast.show({ + type: "success", + text1: "Copied", + text2: "Address copied to clipboard", + position: "bottom", + visibilityTime: 2000, + }); }; const handleSendSubmit = async (amount, address) => { @@ -1253,11 +1265,21 @@ function AppContent() { Keyboard.dismiss(); if (!selectedWallet) { - Alert.alert("Error", "No wallet selected"); + Toast.show({ + type: "error", + text1: "Error", + text2: "No wallet selected", + position: "bottom", + }); return; } if (!address || !amount) { - Alert.alert("Error", "Please enter both address and amount"); + Toast.show({ + type: "error", + text1: "Error", + text2: "Please enter both address and amount", + position: "bottom", + }); return; } @@ -1272,14 +1294,24 @@ function AppContent() { try { new PublicKey(trimmedAddress); } catch (e) { - Alert.alert("Error", "Invalid recipient address"); + Toast.show({ + type: "error", + text1: "Error", + text2: "Invalid recipient address", + position: "bottom", + }); return; } // Validate amount const amountNum = parseFloat(amount); if (isNaN(amountNum) || amountNum <= 0) { - Alert.alert("Error", "Invalid amount"); + Toast.show({ + type: "error", + text1: "Error", + text2: "Invalid amount", + position: "bottom", + }); return; } @@ -1462,15 +1494,30 @@ function AppContent() { }; const handleSwap = () => { - Alert.alert("Swap", "Swap functionality would open here"); + Toast.show({ + type: "info", + text1: "Swap", + text2: "Swap functionality would open here", + position: "bottom", + }); }; const handleStake = () => { - Alert.alert("Stake", "Stake functionality would open here"); + Toast.show({ + type: "info", + text1: "Stake", + text2: "Stake functionality would open here", + position: "bottom", + }); }; const handleBridge = () => { - Alert.alert("Bridge", "Bridge functionality would open here"); + Toast.show({ + type: "info", + text1: "Bridge", + text2: "Bridge functionality would open here", + position: "bottom", + }); }; const copyAddress = () => { @@ -5556,6 +5603,105 @@ function AppContent() { onDismiss={() => ledgerSheetRef.current?.dismiss()} /> + + {/* Toast notifications */} + ( + + + {props.text1} + + + {props.text2} + + + ), + error: (props) => ( + + + {props.text1} + + + {props.text2} + + + ), + info: (props) => ( + + + {props.text1} + + + {props.text2} + + + ), + }} + /> ); } diff --git a/android/package-lock.json b/android/package-lock.json index 56c60c0..efff9b6 100644 --- a/android/package-lock.json +++ b/android/package-lock.json @@ -43,6 +43,7 @@ "react-native-safe-area-context": "github:AppAndFlow/react-native-safe-area-context", "react-native-screens": "^4.18.0", "react-native-svg": "15.12.1", + "react-native-toast-message": "^2.3.3", "react-native-webview": "^13.16.0", "react-native-worklets": "^0.6.1", "stream-browserify": "^3.0.0", @@ -10022,6 +10023,16 @@ "react-native": "*" } }, + "node_modules/react-native-toast-message": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/react-native-toast-message/-/react-native-toast-message-2.3.3.tgz", + "integrity": "sha512-4IIUHwUPvKHu4gjD0Vj2aGQzqPATiblL1ey8tOqsxOWRPGGu52iIbL8M/mCz4uyqecvPdIcMY38AfwRuUADfQQ==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/react-native-webview": { "version": "13.16.0", "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.16.0.tgz", diff --git a/android/package.json b/android/package.json index 88ef219..d07451e 100644 --- a/android/package.json +++ b/android/package.json @@ -44,6 +44,7 @@ "react-native-safe-area-context": "github:AppAndFlow/react-native-safe-area-context", "react-native-screens": "^4.18.0", "react-native-svg": "15.12.1", + "react-native-toast-message": "^2.3.3", "react-native-webview": "^13.16.0", "react-native-worklets": "^0.6.1", "stream-browserify": "^3.0.0", diff --git a/android/yarn.lock b/android/yarn.lock index 317c37c..2f2c916 100644 --- a/android/yarn.lock +++ b/android/yarn.lock @@ -5036,6 +5036,11 @@ react-native-svg@>=14.0.0, react-native-svg@15.12.1: css-tree "^1.1.3" warn-once "0.1.1" +react-native-toast-message@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/react-native-toast-message/-/react-native-toast-message-2.3.3.tgz" + integrity sha512-4IIUHwUPvKHu4gjD0Vj2aGQzqPATiblL1ey8tOqsxOWRPGGu52iIbL8M/mCz4uyqecvPdIcMY38AfwRuUADfQQ== + react-native-webview@*, react-native-webview@^13.16.0: version "13.16.0" resolved "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.16.0.tgz" From cde3a7581946960daa0ddede591c6f3ff68dc698 Mon Sep 17 00:00:00 2001 From: Wei Yang Date: Mon, 17 Nov 2025 11:21:39 -0600 Subject: [PATCH 5/5] Improve toast notification positioning and spacing Enhanced toast notifications to work better with devices that have software navigation buttons and provide better readability. Changes: - Added bottomOffset={80} to position toasts 80px above the bottom This ensures toasts don't overlap with software navigation keys - Increased padding: - paddingVertical: 18 (was 16) - paddingHorizontal: 20 (was 16) - Improved margins: - marginHorizontal: 20 (was 16) for more breathing room - marginBottom: 8 (new) for spacing between multiple toasts - Better text spacing: - marginBottom: 6 between title and subtitle (was 4) - lineHeight: 18 for improved text readability The toasts now appear comfortably above the navigation bar with better visual spacing and readability. --- android/App.js | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/android/App.js b/android/App.js index 3c141ed..f202339 100644 --- a/android/App.js +++ b/android/App.js @@ -5606,6 +5606,7 @@ function AppContent() { {/* Toast notifications */} ( {props.text1} - + {props.text2} @@ -5645,8 +5648,10 @@ function AppContent() { borderLeftColor: "#F44336", borderLeftWidth: 6, borderRadius: 12, - padding: 16, - marginHorizontal: 16, + paddingVertical: 18, + paddingHorizontal: 20, + marginHorizontal: 20, + marginBottom: 8, shadowColor: "#000", shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.3, @@ -5659,12 +5664,12 @@ function AppContent() { color: "#FFFFFF", fontSize: 14, fontWeight: "600", - marginBottom: 4, + marginBottom: 6, }} > {props.text1} - + {props.text2} @@ -5676,8 +5681,10 @@ function AppContent() { borderLeftColor: "#4A90E2", borderLeftWidth: 6, borderRadius: 12, - padding: 16, - marginHorizontal: 16, + paddingVertical: 18, + paddingHorizontal: 20, + marginHorizontal: 20, + marginBottom: 8, shadowColor: "#000", shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.3, @@ -5690,12 +5697,12 @@ function AppContent() { color: "#FFFFFF", fontSize: 14, fontWeight: "600", - marginBottom: 4, + marginBottom: 6, }} > {props.text1} - + {props.text2}