From 45a68b3fd863a7f07e17695d0165e8f035d067b3 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Mon, 16 Mar 2026 16:46:51 +0100 Subject: [PATCH 1/2] feat(settings): update design v60 --- Bitkit/AppScene.swift | 1 + .../Contents.json | 15 + .../arrow-counter-clockwise.pdf | Bin 0 -> 5971 bytes .../icons/barcode.imageset /Contents.json | 15 + .../icons/barcode.imageset /barcode.pdf | Bin 0 -> 5680 bytes .../icons/broadcast.imageset/Contents.json | 15 + .../icons/broadcast.imageset/broadcast.pdf | Bin 0 -> 6673 bytes .../caret-double-right.imageset/Contents.json | 15 + .../caret-double-right.pdf | Bin 0 -> 5716 bytes .../icons/cube.imageset/Contents.json | 15 + .../icons/cube.imageset/cube.pdf | Bin 0 -> 6277 bytes .../icons/database.imageset/Contents.json | 15 + .../icons/database.imageset/database.pdf | Bin 0 -> 5871 bytes .../Contents.json | 15 + .../device-mobile-speaker.pdf | Bin 0 -> 5688 bytes .../icons/eye-slash.imageset/Contents.json | 15 + .../icons/eye-slash.imageset/eye-slash.pdf | Bin 0 -> 8251 bytes .../icons/file-text.imageset/Contents.json | 15 + .../icons/file-text.imageset/file-text.pdf | Bin 0 -> 5903 bytes .../icons/git-branch.imageset/Contents.json | 15 + .../icons/git-branch.imageset/git-branch.pdf | Bin 0 -> 6002 bytes .../icons/git-diff.imageset/Contents.json | 15 + .../icons/git-diff.imageset/git-diff.pdf | Bin 0 -> 6278 bytes .../hand-pointing.imageset/Contents.json | 15 + .../hand-pointing.imageset/hand-pointing.pdf | Bin 0 -> 7703 bytes .../icons/hard-drives.imageset/Contents.json | 15 + .../hard-drives.imageset/hard-drives.pdf | Bin 0 -> 5719 bytes .../icons/list-dashes.imageset/Contents.json | 15 + .../list-dashes.imageset/list-dashes.pdf | Bin 0 -> 5501 bytes .../icons/lock-key.imageset/Contents.json | 15 + .../icons/lock-key.imageset/lock-key.pdf | Bin 0 -> 6344 bytes .../icons/question.imageset/Contents.json | 15 + .../icons/question.imageset/question.pdf | Bin 0 -> 6178 bytes .../icons/smiley.imageset/Contents.json | 15 + .../icons/smiley.imageset/smiley.pdf | Bin 0 -> 5965 bytes .../icons/stop-circle.imageset/Contents.json | 15 + .../stop-circle.imageset/stop-circle.pdf | Bin 0 -> 5984 bytes .../icons/translate.imageset/Contents.json | 15 + .../icons/translate.imageset/translate.pdf | Bin 0 -> 6120 bytes .../synonym-logo.imageset/Contents.json | 21 ++ .../synonym-logo.imageset/synonym-logo.png | Bin 0 -> 3620 bytes .../tether-logo.imageset/Contents.json | 21 ++ .../tether-logo.imageset/tether-logo.png | Bin 0 -> 3342 bytes Bitkit/Components/DrawerView.swift | 9 +- Bitkit/Components/SegmentedControl.swift | 9 +- ...tingsListLabel.swift => SettingsRow.swift} | 46 ++- Bitkit/Components/Social.swift | 6 +- Bitkit/Extensions/String+Utilities.swift | 30 +- Bitkit/MainNavView.swift | 21 +- .../Localization/en.lproj/Localizable.strings | 41 ++- Bitkit/ViewModels/NavigationViewModel.swift | 38 +- Bitkit/Views/Settings/AboutView.swift | 104 ------ .../Advanced/AdvancedSettingsView.swift | 159 ++++---- .../Advanced/CoinSelectionSettingsView.swift | 22 +- .../LightningConnectionDetailView.swift | 79 ++-- .../Advanced/LightningConnectionsView.swift | 24 +- Bitkit/Views/Settings/AppStatusView.swift | 2 +- .../Views/Settings/BlocktankRegtestView.swift | 347 +++++++++--------- Bitkit/Views/Settings/DevSettingsView.swift | 26 +- .../General/DefaultUnitSettingsView.swift | 31 +- .../General/LanguageSettingsScreen.swift | 11 +- .../General/LocalCurrencySettingsView.swift | 16 +- .../Settings/General/TagSettingsView.swift | 10 +- .../General/WidgetsSettingsScreen.swift | 82 +++++ .../General/WidgetsSettingsView.swift | 37 -- .../Views/Settings/GeneralSettingsView.swift | 137 +++---- Bitkit/Views/Settings/LdkDebugScreen.swift | 8 +- Bitkit/Views/Settings/MainSettings.swift | 107 ------ .../Views/Settings/MainSettingsScreen.swift | 43 +++ .../Notifications/NotificationsSettings.swift | 4 +- .../Settings/Quickpay/QuickpaySettings.swift | 6 +- .../Settings/Security/ChangePinScreen.swift | 76 ++++ .../DataBackupsScreen.swift} | 35 +- .../Settings/Security/DisablePinView.swift | 57 --- .../ResetScreen.swift} | 4 +- ...sView.swift => SecuritySettingsView.swift} | 160 ++++---- Bitkit/Views/Settings/SupportScreen.swift | 178 +++++++++ Bitkit/Views/Settings/SupportView.swift | 55 --- .../TransactionSpeedSettingsView.swift | 9 +- Bitkit/Views/Wallets/Receive/ReceiveQr.swift | 6 +- 80 files changed, 1347 insertions(+), 1016 deletions(-) create mode 100644 Bitkit/Assets.xcassets/icons/arrow-counter-clockwise.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/arrow-counter-clockwise.imageset/arrow-counter-clockwise.pdf create mode 100644 Bitkit/Assets.xcassets/icons/barcode.imageset /Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/barcode.imageset /barcode.pdf create mode 100644 Bitkit/Assets.xcassets/icons/broadcast.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/broadcast.imageset/broadcast.pdf create mode 100644 Bitkit/Assets.xcassets/icons/caret-double-right.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/caret-double-right.imageset/caret-double-right.pdf create mode 100644 Bitkit/Assets.xcassets/icons/cube.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/cube.imageset/cube.pdf create mode 100644 Bitkit/Assets.xcassets/icons/database.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/database.imageset/database.pdf create mode 100644 Bitkit/Assets.xcassets/icons/device-mobile-speaker.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/device-mobile-speaker.imageset/device-mobile-speaker.pdf create mode 100644 Bitkit/Assets.xcassets/icons/eye-slash.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/eye-slash.imageset/eye-slash.pdf create mode 100644 Bitkit/Assets.xcassets/icons/file-text.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/file-text.imageset/file-text.pdf create mode 100644 Bitkit/Assets.xcassets/icons/git-branch.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/git-branch.imageset/git-branch.pdf create mode 100644 Bitkit/Assets.xcassets/icons/git-diff.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/git-diff.imageset/git-diff.pdf create mode 100644 Bitkit/Assets.xcassets/icons/hand-pointing.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/hand-pointing.imageset/hand-pointing.pdf create mode 100644 Bitkit/Assets.xcassets/icons/hard-drives.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/hard-drives.imageset/hard-drives.pdf create mode 100644 Bitkit/Assets.xcassets/icons/list-dashes.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/list-dashes.imageset/list-dashes.pdf create mode 100644 Bitkit/Assets.xcassets/icons/lock-key.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/lock-key.imageset/lock-key.pdf create mode 100644 Bitkit/Assets.xcassets/icons/question.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/question.imageset/question.pdf create mode 100644 Bitkit/Assets.xcassets/icons/smiley.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/smiley.imageset/smiley.pdf create mode 100644 Bitkit/Assets.xcassets/icons/stop-circle.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/stop-circle.imageset/stop-circle.pdf create mode 100644 Bitkit/Assets.xcassets/icons/translate.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/icons/translate.imageset/translate.pdf create mode 100644 Bitkit/Assets.xcassets/synonym-logo.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/synonym-logo.imageset/synonym-logo.png create mode 100644 Bitkit/Assets.xcassets/tether-logo.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/tether-logo.imageset/tether-logo.png rename Bitkit/Components/{SettingsListLabel.swift => SettingsRow.swift} (69%) delete mode 100644 Bitkit/Views/Settings/AboutView.swift create mode 100644 Bitkit/Views/Settings/General/WidgetsSettingsScreen.swift delete mode 100644 Bitkit/Views/Settings/General/WidgetsSettingsView.swift delete mode 100644 Bitkit/Views/Settings/MainSettings.swift create mode 100644 Bitkit/Views/Settings/MainSettingsScreen.swift create mode 100644 Bitkit/Views/Settings/Security/ChangePinScreen.swift rename Bitkit/Views/Settings/{Backup/BackupSettings.swift => Security/DataBackupsScreen.swift} (76%) delete mode 100644 Bitkit/Views/Settings/Security/DisablePinView.swift rename Bitkit/Views/Settings/{Backup/ResetAndRestore.swift => Security/ResetScreen.swift} (96%) rename Bitkit/Views/Settings/{SecurityPrivacySettingsView.swift => SecuritySettingsView.swift} (70%) create mode 100644 Bitkit/Views/Settings/SupportScreen.swift delete mode 100644 Bitkit/Views/Settings/SupportView.swift diff --git a/Bitkit/AppScene.swift b/Bitkit/AppScene.swift index 17da0c518..bf74d8142 100644 --- a/Bitkit/AppScene.swift +++ b/Bitkit/AppScene.swift @@ -97,6 +97,7 @@ struct AppScene: View { if UserDefaults.standard.bool(forKey: "pinOnLaunch") && settings.pinEnabled { isPinVerified = false } + if migrations.needsPostMigrationSync { app.toast( type: .warning, diff --git a/Bitkit/Assets.xcassets/icons/arrow-counter-clockwise.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/arrow-counter-clockwise.imageset/Contents.json new file mode 100644 index 000000000..e84178605 --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/arrow-counter-clockwise.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "arrow-counter-clockwise.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/arrow-counter-clockwise.imageset/arrow-counter-clockwise.pdf b/Bitkit/Assets.xcassets/icons/arrow-counter-clockwise.imageset/arrow-counter-clockwise.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6c28c8d72576d6a7c8f395cecd0bc371e8cfc611 GIT binary patch literal 5971 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 literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/broadcast.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/broadcast.imageset/Contents.json new file mode 100644 index 000000000..8e5a73516 --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/broadcast.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "broadcast.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/broadcast.imageset/broadcast.pdf b/Bitkit/Assets.xcassets/icons/broadcast.imageset/broadcast.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2817a11379c98a79b5d633510a3784ec7512142d GIT binary patch literal 6673 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 D8ETZ} literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/caret-double-right.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/caret-double-right.imageset/Contents.json new file mode 100644 index 000000000..528c5fb61 --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/caret-double-right.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "caret-double-right.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/caret-double-right.imageset/caret-double-right.pdf b/Bitkit/Assets.xcassets/icons/caret-double-right.imageset/caret-double-right.pdf new file mode 100644 index 0000000000000000000000000000000000000000..154d89b67edbd97db44607987352a3ebc503a863 GIT binary patch literal 5716 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 IG}~qVKdwZsX8-^I literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/cube.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/cube.imageset/Contents.json new file mode 100644 index 000000000..9c36c08b7 --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/cube.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "cube.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/cube.imageset/cube.pdf b/Bitkit/Assets.xcassets/icons/cube.imageset/cube.pdf new file mode 100644 index 0000000000000000000000000000000000000000..75afbf287f2979c87bcc090a480d7f5d040eeb45 GIT binary patch literal 6277 zcma)A2{=?=*e6R8sgy_=7-J%96c&_s$^d|2^M#JrDQ1=bYcWocBHV_1lNi)Ru%v$#d=t1RhQpL>fYLaN&eN zl$0P)102DL;tY`igeHIpc%Y_K2g(@_90Y1%Xs|3YqmK=76f_o1K?6b+6;3jRghRV? zDyh;u&=^-71>%5n!V{Fm#2|RAve+rOp|qig2F@9;>qEks`WTsEd|WX|teC0_rxHz( z=I-GRph0NvZUnL-O<4?$B|6{~fp<_06;lDtBVipCO*FNa7Xc$>F=qyXHCQz@N{?A zNSA}|fpw&!!Gu|JvS>WsogRJqB$Pmg;<0N&xx7Wu15Ki+z?7it#`N(1rwI%pkWWAY zLRT{o7_25RjsV!<4Q43tww&I;8(1uyV1Y2IMqWk^oTp1=SEXPr8ByKI5G#oE>Jifq z+RA3_czFP2R1^wL0#eJ2gu?-AfSOvtm0O1k94(GSKvRH{)Wmt=F*p;QV+>5FHXfXV zK(*a~X-yo4hy{^=XSJ~52>E4+5k!`uW!W`a^21m>inoief#^MbS(2IAvaafaVJuVO z1!zk)q-Ti$ ze&8LOf4z6`B+;9{uspmsp@Dm03&rfQ;56TM%gQCxLgfzHB9~NQ@~*mGi{T-TRJC|M z!QCy#N`#n{kiU=e`8QPT5awa3JGnQ&Y0+8|rfZ%gp|=gv679*E8hy?KQ8!G-U!kTD`o$kM@5<A+uUd-gEH)3(S3%BHau1&0rCmM{~7 znWedI+H+N~nhprXpM!90G=?0$$&S}xzbb%bfr*}K6g<6wP2(DhYX{FJ(M?6n-RwKn zo}iFsY#r*V8lTd_U&6C_%6KlT@xHWsd4QiS8ofJrlVDw}H1BjE%K(bDa}Uq$`q2Sv zn!GjpsruUkj#O-u}T+8-eK>;Sk91r?2HW=kaI9XINy@OvV%6muxp`LN!^1-M)U8VlWcbesHH&M`mHR^%sN-_fHvW z#Dy$@w$38W)68QBPD9;~Tk3V0BMp#NrN`zf3eDKE9J1@o^~?{MATwpMC-CP!Zn(m> z$X3oLC-K?thb=Wdr~I%T-0q<r^CC&sYPXX=1D&#e%619>o~Bh zolg-uEY)I1a~x#hwx~A~x4=|Bggq_rC63MRqS^MuexZJ_40VDp{H7L$}4-?zE3|B(%ZXZPJr6d$JdFuVgp84u5r| zZL~e9{p}mOoND!I+of~NwSoAn_8v894Fi?w*U%+{Tk84hJ;hIo7q=;9`ecSa-GPxG zq71nVmG8IUy`>k`BpTgw>;9b^_#piG5lPw3mVN_!ug2WgJ(zFKQgZnS5r?Y+!Vw1A z%9zK;o;ZYQMQVjVIim01e6YDPRyo!#?`v*Uo=fh9yqMfydF0%l+@(U;!@+K|&R!c$ z%i#yklNoQc^4*`i%@v2bfA2CLi|rn}KU%op@ZBC-NW7ow@zVREXEuf3p*>!`<=DrQ zIuV(-ha4Nc8m<^k8#&yTH40FaO^!}Jp?C#~INf4r{ebpb>+Sg=lMiCltn#NN!qk|u zkrL0|oW7K@(bCCY*S=KWc-mf{^??z^j21fw%Py;x5J( zNuH0JhxR?18k7mf)!`)1L9PmwKz|rtHAeZo%x^Ae4vsw~5y0mrR3Tb&AY^yp{$Xrm zIjZ$##>>H-Pmk<9QdT!ypHcs%u0PcG{H{=aaS3sRcJD>AD?2ocwFfimGF&omo$|@= zttLryODRHqJYw2%zMgz*emCF9*8l9~#oaFwAHd?{f5b<_QjzD9U0zTmjuy*!U21+W zJWw@UI(eMN>$mGHZ0St0zO`pBtwMjXYBr4ZQAm4;9~_#HQRhD?u=*6X~H6O(wOJI*mSHg3P6_wjeBD*HIMb~vgD+?6@~L~dAzWa=Q% zB_+^Ad7j(2cy(ti6=4OliuWhyjda_%rshvt&J6iX`Fxwd$E_$>OyKYOTu|V`TXe|F z^sQs%^U|b-;#mT+Af^P4A0;Bqkx!7sN9T#I%^fX$QAf-AynX#stWypWokJ%h#gDcf zWjpHYE!j==c>C7R_V>>XcZ1r4TF>{^jjCEKp{DD&Sj4JjQV9aD>qiv{=0D~r>n zn>`0TN5Tep`>0!})B|uMzK;5zQS)J@ZMO+a!#_=3Su)dejI#;`4zutd}PunfTV<%p8|*J6=k<(~$Y8?quBEvA4$@Jm=0WpO_l6#K|L_IH`M!B*|9BbsgVe&e%ja+` z{=rAszjJHx=zSmmcKO|js-=1LkHHCpk~}b;Ns&WJhy8QMOXkCxqP6c-PAy)1+xYyp z=!sCB(oAST>+G*di*K^e9<+bzZXJE<{7zUjwbPDmV|hYjV*&^+*Roxzk>YxMuW&CSV-k}OZ)?+NSFl#O zp&pkIvy^lqOqoNi*^9|c#4lWwGclmWw-Bj5kjfTt%A3CwYwOzZ$ifBA)PiS1`O2`4 zlVRo_2Y;0#rGw@?{kGX%bb}kzv~K4Zy7p`HnGFSyle)V&Mgjz1Emcick6NX^t0;(1 zl}s6xg}dkJZcT;UdT`#MO1JSE^|4;cQK4(O4H0J7EFgNY+u}y;TLL3Wv=C%{b?jqt zOiIg(Di|x%sSP!88C_ioIbB`QMhR3s6Xp1Cw#yuC;{Va?!dKf*8L)j^=}Hl+Vk-z# zPebDvnvBCjz+Tk^VzatResvYt6Kl~ZI;Iq`ccqVD^gkFhL|RHl8hn7R7i@ePJ*x)M zjYu*D{+(p3)__4kl_rb@YuaOlbt?YP9vBINtZ#jpV`6I~hY?(w-+yzavOE@#65A&f z{Y03|F~O$JlEfNs2}$@BFl_v$#8)2K@2dc#A7M$Gg>O2nBaMgi>cU0FZW7gPor>~nU1Y7}q)oyzb6h>8g>^)J$cII2 zBX*t|Rv`uuQj1%A@^u%|xB@Ikx%fCI;vUN9G{xvQBLL+`&1FH)praRzrpl`3X`kl3s#$7bB2{gPBsT4(;dtI@}*YI_?^&!AlxP zr9Bd^O6!S5ymA?5dO8?Cru6=j_Sw-u>KAuj^;}-9z4^}zMKpQtToYnFJ|AgQ`?ApM z-ay{*bYx8g!noJOc~UA-G3b4y()JyjLL6C=&O|Giu|i2y^w8(ZkFMm&4P*RmpTlKS zH{UeYla8qzvEI(nGnHdEhCc0S}+ zPbWoxHxNne*d~m96W?_4eDU6|8DcyxY+-zuyVWFSL)!=D1WQQx?^4fu2 zq+ZOb=}#ZwPHPrXQhvaeto`hglOB0=%F3%HXOFXh>?6eK_?o~ATMV)cKBy8ua@k`0 z`%>zEwzKo*nxAog8#*ub^}XnmfSzO?Q_cP%%rowR`f%?bqVN4@sFa{NWPRbyJIeDB zbJfJNOZH#ty2u%Ekb$G@yz)Cx^S0Lt--=!h4#|}DsV(C1#)L-~a9&iO*prvHn|SVE z5aNP8pYf4YrR~?!SfT@Hn+8ej4-iV#v_K(2$nS_#SFeU-@f7t!UI4Fj0-&v+FjxZ!UE>OAXM!UWsU!@J3<2-o z6{#T(i$@rimhk|GC&P3k4z~fDu%+agS)&EI1=ffPjCQyc!4v({rPsTkh2ha#w|N$ zj>mc9NGKA{5eE=WV0M6Dns~B@8~O|o1T&D5{0nGR4T?m>QZWF#bWj`bbXz@#TK z_zTL|%wQ$g&aHmV*Za5r5DWk|5(1Kp%a)=5W|F)}60N1W0S z7=n|L)bvgQ0f)=NA&%UuG8hm;`V3)JrXUNH$KNtIP||yZEGm6b>SvsVr&2PDOMJUJu+=y=x4;L>tHI{zh;f&a4?F8ePYTuu%s_`mkT*V;@W zq491w5+|4!dYVA(9F&t*Kp?H9Lz3~p~~G7nj^$EE-SOTaR)AgHM+KxfbZ zte1esK^7H@_XHR)9N!cC1tp>vI0nX0@n=rYu1IUqvlh!WOlhGe?~zUgxl9 zo4f>_cRZEg%EUrJvt)O%M4}ga2iTKvG96ANEOF=j5_Kw;#?VA)z?Y5LF8)syI3O5P zU=YF=qYxY{1~EVe_3(kB6nvWxaqtaF7y&3rIGM9gSq++JqbiFiluu?%FFMQ-rnI=t z?9Fy`UOJv1z&Tlk!P3C+vZet5NCW280$zcm)F|q^jd*`)zr>O z$QSTzXM8ekzhPJK>VEFMz<^IF-5=6^WXy40B=hJg(X#m;W*&1f_thf^OHQp^-58Aa zF5N=xd(9hA>k~Xq@ewP!7txbgFZg2}!@5plQe@+i$~nxBN@3RQTE(Ii(V8Cnfw%nW zS_vW&;>|jxl3W_-U;9M@>MMk|331if>+@U)?%1u983`tE!b7$6{{Mh+F>Nk z*K;ZSTN=2$^76dqYSZRC8=nx;zFk-WOJAcku5eTDAM|$JCbF28o>?T{^B|EHo<~94 zq#zzD-|z#8>0qt(0@BqU4|rF@c*C?rUUHS3*1&L02K~Iebt^aW@;cQZmCL-v!4Z7| zrQGCTZl$$Xj;*a&Y1Jp0a0E=eWaX}HF=rZU|G{}6OcR>=f(yMvjsHq_og?!fg2>5V!T#%>@cn~wv#geEH(iDK#edseD-90Kf zeR7sQyH@+uF)ga}%8jg$J0a3Kf*I$j5lRLLQt}(mhbh)!aMIp;3L{@?Rhal2`s+$x zVi-kTdAEa`xaN8!BZ(2KsxxC~E1evDWWc>Bq$1frrN^ks{G@IMX06=tKeFc%ijpl4 zmFb-@`3^f2d;223X>T%h9Aar5nu}F^!Jl*Z#S|Fd2+)lijS}o>i3N^a2k+{sWlNJ?)=zM!N{w?A)-r$SzLa7hBmQxqV`jK z`)<)T5q0>0VzUd&wVy}OzSdgC9$)zgaXwl6S&~CiRT4326%tM~^SJI_=DE`&)}85Y z>TY$%`3`T_&MwhnmzLPUZQlsKTPl+^v$HbZUXy9P-Zt2t*otg(&PdMc&iP?@A*cR% z#IrrELv6`z9WPvR?`z*bI(Le@I*54j81=#B`o7AHOW4x>b+sb3-ZC~aC9UdNzFDD< zgz@{{GTwT;y|>GL(^aGBMyZ(YtGBMF5>FG)3@WI+Y<^{O?07@o)2;YncSY3#)OOs( zE!!eZ3=ZJybROcu^`rD79_}#?Xp(KJj5`qLlK(j`I^QGjY<_Is&wP4bcivnP;!b~; z^~)Y-y(0s+-N!Ru=offBCVejn_4?Xr@g=V7%dMfJAGoi_;6;>M>C_gVFz+0O7_Kcr zyIJSG&7sJwYj0iakJn!?n>52+Q!xuvS4oLUF;~9;M>#aRINfGF*Y7y<*7BV+GyC47 z(rwJx^1)K?p4{HF@}aWv9?#x%zXa9}-;^=dJK{UJG18d-QyR{T!1T?i@UI-J^sS7o zuw%vh9h_{P2%ow>l{j{1-1%$wVCd+Yk?x^=buS3?PUdI1z*TeSfAw+?1YHao3%X`( z5+4>g^yTVw7~eb6f_k!1;^R#4HO|sR!EiZ4iPWf zH9%;%hk4qP+0wuH(ViW9%4-H{GiyK9ybAR@BN}QfvsVUX&=Y2TL0GTEpg*%F(4QUH8;x@)8vQj_Bvv!OISRQK| zz0x@_GVn;)|FFrw=!|G3qnD|EG+cc zR4jMgs>8MNaanSG$ut>V7+Z=Y4pGpy=!a;^-7^%=ruOFE=>6rrK7IjdPHD0f_t5bu znf{D7!KCQ|eX5uiD{Ii75ANa%y9PIei~1sPD-@>Dg=MRck340Hcr^bd~HF3um933sAU9ZpjP-7E+ z<4Z@%&D48ODqhiQe;JIM-b*&U-}&>!bI;e^{!RV1LtgdWUI7t5)Mt8U;IBr@>F*SO z44*#*@B{?!;rlA6FJ$y}bol&h^QyTS?f1cn{R%<|q4Di<8u9^oqop(9jWGt-E5FT# zbu>J_CS@Las4NQ}_;mW`xc#uozqi{ybUht<;p8_r>RmA~<(=${QaC~yV5UzUCwe?HBF7>PUsoCq z$c6D!UO7rf*ivPG-a{*${_gF+!6l4@G+K>v;E8lQ^I_&E0Gq@_lhD*#kqqO~!m-6Z(tuNWbj1bpk%-YrkMV9KL z=*HTFIvIRg^OGvXN-nz<58^XBI}>v|JK+s`F|}Nb!@qdX^S8?UN3n}sEI*Z@@^PUm zMJ>XPFu0Mft`2w~A;6$o)e`2sNVRW~3aW|qS&Tzg45)Txj}YuXJQk*;sH_A%VATs1 zzMPs>mqMb@tiUTJhguf_gG5?#2$qz`YRg3YpEWQVVzRvS<^E#VU`a=9B{TW{_&9J>EiQ-617xKO+|zu!pOhK|gACj6hGNY|Kd&0@UV+YswMeCh10 z3jNqaJJgIx&6L+giEAuXW3C7)C@r?`|PYGUVinHa~)#FH!5?YZGfwo z?RoFYVc})BgjD!KR0WO1Ux}L-Zi+cFREq+TtKxJ-D*dT{NccxnKv= zP^H2~+#}2X#iZLUw1al!@k^@#CsXIK18>wkHsoi2ZI*g}E=!*oN1X@))+7n&-H?@T z;70SsjYJ?Wk?+`e+U|Pc-x7JXdMJ3cfnnaR)h&iBgh`T^zj6Um*7nSl@STjP%r(Wn zrt5n*;?Bn(-$r_4nv_wRh@6gdFxucKr+B$P>D|#@*`T}IrQvw#-p^P*gt)=3uJVC3 zRcCX5wtX%VIh~Q(U@47I*S<>ZNE15kV>gOrO_{s!4OEBpO~83>B6T!I8q6OYZp`$? z?P%=CzA1V^OpA{@idJv`<5}IY(T}Bff84n&n&Zdq(^OZVklX&yu4hMc7{Bwh;(pt? z6U8xJr}$QtY`mgrDAnM2PMC7L_T$56=LDNtxbJ_zpj#gj)DXy!RK@F1hsqs06krrZ z%bxOe#%c@`{;<8yJ{Rtb-{%s2jFbD1{DT6PbJ;{8l@}8Wp|l7?xnxWvK(|c<)YF0T zZy|-4WCjc|KU%nDx&d@f{4b<3dlg3n#7mn@rZ7Nm3tTw&QW#s}LTktppi`JMJV1v* z8NPs;0t6yfhr)vHy^8FN2DMyxL7@JATM+SEwFOn8!qDCC|ax8*4SyCvFE=#TYeab`rGR4w7jmWMP_5lqIz@r`91K{`RywC!Ku_JEY zFk2$v1JE!uz!d;n8BlaU%=CzKDhYc6bb>Y1`1*s*qp{q^hyH7=DpCauuH|&9NF?}O{R2a(fFb<{rl$Ir&Z=mYzc8ed3YhfE*CG+B z;4!g)F=$vK37`o;v0e1#EEd)HgTyAAQgRvH$=8 literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/device-mobile-speaker.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/device-mobile-speaker.imageset/Contents.json new file mode 100644 index 000000000..1486dd2e4 --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/device-mobile-speaker.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "device-mobile-speaker.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/device-mobile-speaker.imageset/device-mobile-speaker.pdf b/Bitkit/Assets.xcassets/icons/device-mobile-speaker.imageset/device-mobile-speaker.pdf new file mode 100644 index 0000000000000000000000000000000000000000..94677a2abdc92a1386471c10c9be317d3c8d3553 GIT binary patch literal 5688 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 REeH`-3yVQ)*kEpN@jqAJq)Pw* literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/eye-slash.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/eye-slash.imageset/Contents.json new file mode 100644 index 000000000..969759f92 --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/eye-slash.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "eye-slash.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/eye-slash.imageset/eye-slash.pdf b/Bitkit/Assets.xcassets/icons/eye-slash.imageset/eye-slash.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3690f6ae067591d8374e5aefe0587b73ec38afa7 GIT binary patch literal 8251 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 D0#_a3 literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/git-branch.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/git-branch.imageset/Contents.json new file mode 100644 index 000000000..2941a65ec --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/git-branch.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "git-branch.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/git-branch.imageset/git-branch.pdf b/Bitkit/Assets.xcassets/icons/git-branch.imageset/git-branch.pdf new file mode 100644 index 0000000000000000000000000000000000000000..05bf87c9ffce3e32c1a1206d4951b20e470c65fe GIT binary patch literal 6002 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

`l9z7i+L6* zonb5V^`NOu!AEnE=Ca?5aEF>W$Yd5A_|%9k;=3ycT2hByGETuJEC++d^DRk}~A&5^U>x9x&Zi z3*!2fD%6mxr^mf-+{u=y)v)h|g}~nRMQKIbQbIFJ?8kBhtu;ObV+6M!%*fGODlP7k ztaA$}_xhAtmvOwa^eunP(djQ=m--2eB>8>q z_KEK46Va2|7$qGr7P0{!6!;@(^iJ{J(Uq3t2hJt_f^B=>KlVY9g?*GT@X{rlW;{CO zHufR6x7Rkdr6rIjsN#kU3f{0X^l$h{8VD;=;=h%@wcVmTa{_7Au_ zSchx7#i&^c*1Rfz=F-_9dsY4J(P#D-0gtHQ^_&dz0Lr>l3h}NbQNcNjp&}+TWRt?@ z`6<=JqUgQMkcNq(7=e9w#my7(J4J6+A|HjzjA)pYp?Jh!mv8k8mo4#Mf)u!0{2v1xy<@)PByp8#*?WJcAY@-g8hyQ^xIiRkk`3wyLqpJ!nphJobq6&fJR_L z&8z>PfW-|5p4CuW!W7`Ji~#TX_5A$>zR)@h5{YQ{X(6m zsVal<@h1%fuJRu=Ec!1#C5#f7{)_pPFqpsjRKU~wPd*jwUvrf)f6GX2b8}e?Jc$f2U{G)v>VXNgOBtz(!P+BL6csT@ uB^BAf3EYhW0mUsG@-Q!x5f&sL09p`mm6$9rp}9+hMq^ZAJ9g+F+W$XMOHKFy literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/git-diff.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/git-diff.imageset/Contents.json new file mode 100644 index 000000000..416ad0367 --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/git-diff.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "git-diff.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/git-diff.imageset/git-diff.pdf b/Bitkit/Assets.xcassets/icons/git-diff.imageset/git-diff.pdf new file mode 100644 index 0000000000000000000000000000000000000000..79e7a522a226757f0a23814de6a4e4e62d19bf2f GIT binary patch literal 6278 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 YAwZUBbfBHtDMF~Js6eEo42~H759ip*&;S4c literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/hand-pointing.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/hand-pointing.imageset/Contents.json new file mode 100644 index 000000000..798be8db4 --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/hand-pointing.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "hand-pointing.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/hand-pointing.imageset/hand-pointing.pdf b/Bitkit/Assets.xcassets/icons/hand-pointing.imageset/hand-pointing.pdf new file mode 100644 index 0000000000000000000000000000000000000000..edbe95255ceec519e6c09327ed4bb39461312e86 GIT binary patch literal 7703 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 KE?-vEQu-g9DXJ*| literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/hard-drives.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/hard-drives.imageset/Contents.json new file mode 100644 index 000000000..b320970d6 --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/hard-drives.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "hard-drives.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/hard-drives.imageset/hard-drives.pdf b/Bitkit/Assets.xcassets/icons/hard-drives.imageset/hard-drives.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0939363b42120fc89b37bb86892e43ab4ede83f0 GIT binary patch literal 5719 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 Q5n4+R4coZUa);G_0JLG7MgRZ+ literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/list-dashes.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/list-dashes.imageset/Contents.json new file mode 100644 index 000000000..7da1884ca --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/list-dashes.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "list-dashes.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/list-dashes.imageset/list-dashes.pdf b/Bitkit/Assets.xcassets/icons/list-dashes.imageset/list-dashes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4e7f8e65a579d25ad9aa5fed9a4279043e21c26d GIT binary patch literal 5501 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 Z2Ly@|lLb{YH$)f|^oO}?m+=9U{{hi;TqXbj literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/lock-key.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/lock-key.imageset/Contents.json new file mode 100644 index 000000000..0100d4a72 --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/lock-key.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "lock-key.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/lock-key.imageset/lock-key.pdf b/Bitkit/Assets.xcassets/icons/lock-key.imageset/lock-key.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ce72eab326704bc72cee4b1dd158073de49cff44 GIT binary patch literal 6344 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 literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/question.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/question.imageset/Contents.json new file mode 100644 index 000000000..fd3293f15 --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/question.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "question.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/question.imageset/question.pdf b/Bitkit/Assets.xcassets/icons/question.imageset/question.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9aac3752295fe8eb142ed0a361a97dc783bdd32b GIT binary patch literal 6178 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 LL|NHvulfG~yE_^- literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/icons/stop-circle.imageset/Contents.json b/Bitkit/Assets.xcassets/icons/stop-circle.imageset/Contents.json new file mode 100644 index 000000000..0d8d7715c --- /dev/null +++ b/Bitkit/Assets.xcassets/icons/stop-circle.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "stop-circle.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Bitkit/Assets.xcassets/icons/stop-circle.imageset/stop-circle.pdf b/Bitkit/Assets.xcassets/icons/stop-circle.imageset/stop-circle.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59047f7b65a8124dc698955b57680a7861b8352b GIT binary patch literal 5984 zcma)Ac|25a)TdIKEUijX7cB^5FvHlgXE&Bal*Y`(SZ2m7Od<+xvXm^92w4*O5wce# zG+HQGD}E_SDHM`;@0~%^@BO^*{bS}n=bq<#mgk)3InUXFGcb}zDX1cLgg_4h1tmryn6R@GN;UU5bM-i(&xM2{aOwL86cW7!~hIVKN|9 zx#rCZAQI;BsZ5$T2c1Yjg5IDHNM_KHC=gg0>uZ(!c!r3MXnvN zQ#FYMbq0yy4Z?^Ll7YgXI5J)PgA-QHzne>MZa( z7oKDE0_v>msYEv>9uAuY>x(Cmd^l^s`G_RbktE^*ht5t>r{ZZ0ZImW*(U{}p|5SlX zgrW)xL*#rMLWB7*2FZ{f{&1W^Z?i!Ty}>DifYXGVJF3cx@OKVXd7cVqlqJ)L4mbgd z^9#*cZl{9_$Fl<@H?MGb8Wdo5G!TS%pv;=XRat}!EiFhR;~7w58i0Nz0%)^WkBf;k zBEjDPq>(rD*#IO^h%gfL%%?XRqdH5m1eCc_W=&%y6~~is>pDd0DgI-T^1Qr`HPt6A z;&}>B%3nJX;+?kk0uO%W>b3U{uCYG8#?WAyv(9qEEmVdBarGMO?&W-ZcFrdR5RcT< z&Wg$AFWtuYXwiCefBx&cITgV{ACtQJlYgep@Whap8Yt2-`0LURyI2Jn5Z8;3FI(9d ziuElOCH1`F3##=G9i{khDy)d;zEm&xQ;1>rKx|B8tz*>;?q}6{)|7xkVbaE$Zil|N z{3$w#B4V4H^h(8fG_lhfB0=?)>$eK?)a=_H>^|izk21EuB4@G&Xo~ekq{JSlVrnJ} zOh~R_yFuUPz-f|b#EcIi(6w7#2sB7wPp0;Yc19_s)^!Pke94zlxPLK zwcpGn@ryR__~hpL%+w~&cr`vDCVz`w0;H_c8I`|fa1pyrpH1GRV_Yg@MPqOS?5geYI*D+-P1 zL6q{6LwOYit{)btTxQ!No_HMKUttZ%USCeqUmhb$T#Ay|-yn8i37`IXoWOeFl@cq9 zcsrMG(5b^=?f6=C_vrUui+G047A_Z#)LHk;<=L)He6je=xhutL;uY78g)HsCu{LZG z&Z-^kab~GHFW+CA)#ElH8Mt(7NXAz))@DB3_KOJ96?Hl&YdJeW7O~;f+Eh&Hh;>G` zr`^&V!Pe07&_pzCP4C4;BKFZAN! zr$0X!!|yG4uC~Qe(ETL+KHtA;YA6L^|JD8of8MrevD%<}v0pn`VwJ+$2;_tQ9<$+H z!{QUirsz`wy2lUeP$ieGWrY=oN$LrvMp7dbjS?kf*G8UJcz|=2^xa)>u3e|nJkU5$ zU-CS|B1~mISyXwNO2C;^t4f*jdyIf?0?Wg0Xt}oHOk2{`m z&$|6OE|qGDH^v`0pW~6YDLXOEA)940eEHwfwU&*zMyE4b7jH7m2QIWoZ!m04FU)rS zi18HsuEacdGDEbvy~yAI@8?|ykUpl4CLQ)zbF5RD-jB*cJH8Cp>>7I$dl?&Sx>EKC z>G=C4(R@>U6(TBfA6&j3Vy5O)$hx3iimjPC-(xo)eC#A|;*)3PGW%xi~d zoCnjx!o#-sU@>3kj?RrmF3;iywtgc9h*n+E&PY#vn&D?}w0L4pZ-4tM92wJ&!N#6{;1f^_AKuRnn}U z9*}oir0#F$@`RhAOP^7+zX{W-q#^FM=yKV82ZMix^3NufUTKkb{% z*yP%hsN1CXe&616=~-{x>iz1YEypZfvy?4^)s>TCldROEk(dKbF3z`EFAUql-`c#B zWM))6EZxeCD<3HJ?aq0XTs~Mf+U@l!mBKx%!v0$;8U8b50M#=S{Yb1 zQWa1YSGk{+aCFaD^Y=63H^wiG6ptSK(lu~uc-7agLDdH@iS!QUCz;?CGm+D;c>6+P zLPkQe%*+!`#}~lkZXz_WaI0XsB)zg)10w|J#Q z>8`NNg**F*4HdYj&(fatZg{wR`|k3ZzS^|fk2SAP9Sz@j%1la53S-oL+Aey%L5Wds zT1}c~dglIs{O-FnxlRRjWB@g;Ip@>9Hv60TmWP6lMNVyga``qYG4X3+EGh+iJjwG3 zLr$Ya$?q)t->p5>ePyGjtaX7KkD+FcB$+w;cC#wYrm82-EV~od5@y0{hErf&{gA-g zJ{)9oxMlcyN8i`JhwB4P%^zV?FDRO{U(JcTe6=&dEj~VBr-i@in-uLGh}ErbI-)m~ z4%Dgi?WNhe%5^A+HZmUPHcZ8Ah-YG)P)>iAGl;JL0y#?Q9Rt?F^vmHLtiGPWSD6iphWVC}JWSjwGniWj@J>D2{|@>l*xgOZ(- zr70e#Mx&%Onl<<|j{3`YGO2BCfrqBQFS&W5<;2tQ?wY|p4l}s1+D}8Juc{2k3{Q<8 z9_Jqy7-DuEO>-z<9UT5po$>Rs*@qoJc2LIiJA(6GlzeO8{g=0qm(+2g@MY-ait#N| z&dE4!T(4uZ!wu`Qnwm^@?KoJF4L`)=#CG(9!PI-{UR zMNJ<2>)-ywlod~xB@L*vHM_n>+(*V)yvUq#%Rb^WYG&AlIbFU zOzZWn=ZAa`{Rp&PQ6P1PFjiB(>iJdD)!2=1kx_nm1DmVY`wo!DM}}Urc@y#v4VTew z)Tj5?>`S=$xh?6|)ru#TuW7Z@Mxz!LS1j&!{CfGq>rGc6yVriur@qT4DB`F3K z>)~?xJB6P^k;lQML7}^se-ShkHu*9<6#2%gdS+7hedwiLd0~|B=r$Qm*`VCv(#bQ8 zu|_wlzD=EOYj~U`VRdS6SvoTK>BO&5hau%hw_ExC(n3w3Xpj_+_l=c;XLz!NwS9c`P}+*cIO=c6I7Oz zWs6YAxl%(6-AtGGK#Gvu^rRZKjA#FndkJYB9hY)CI*<)=xLO{D=`>#?f3wto6uap8 z@>2;eALpu4%skl%K$__5>*47j5rAt|8{ptPm+CwhToW6z7<+9QaP7(&p*Vj8JfNtc zqzFGy)e9HC+?rLN;!UC1LYGP|w>}DhMcQx~7L>KPA-HHN+ z+8~*xl*CiR#KHDR;Xq?q)u(YT9#X=Str=?4gU%w|*QdmtGrSb+DyUQ(Qh)QZU?# zc+4?*SJ2Of+t-1X>*GI2vZ-cIY=jRB9iV%vM}%dfBTs02@U&WP@?z6qWshaohpNYG z^<_E@hE=zZ$&T`)h2%F}xAQUS-+H!h*)JtWyOkHp!sXOyg#v~u8EU&tA84JFoQN+A zv$l)4b+XJO`pjylU3zSWu~o(zd~B|1SZZth{){^|9S1Vk%idR!6hyTx(ZG7<`9xZc z0xJ=^nX-UPt;e+ICMkDmIoFXJ26BX=4QoX6_K%qAhvz&Dc_UHew^<_Ej$b(VM!mVr zN-aTl#Dr0Vg+N-s)uc03{h9C2PkIi#h~amN5D|{NU-muHw9ny2myl!G%S?RvaX#t; zQ`XD8L+7GOi`$Y&x0mha$?M*%)MTe8+v1r@vDv=CZTs4O0IEW7<%wN1EzC@Nryda1 zE<{iu6mMdzd$0R)hrL`FJ*Y40cCl$4uy3T0=#hdse@p%XjZ5t2!=+hV+*^m?dvr4gL0x zAz0^wjD*7d>vHa&?S9~l{Zg``DXTYmX7x0WN!3N*Kaw5Jj@g?n1~s3>D8+d)oVaEr zB7C()!7U^>+2`_=NoD}3+0opU)*YmClWlI_;LPHRfU$JRWC{a9n?vDVf&q@ixlWV~ zNT)Dq1dtBE+sPc&0wj{~dK4CX$yVTOACQ)FFDT64Z*wAkt2U=A-jxpZyJknW3>uTb z;Oar2yT2p#DP#uR{sG|aW_JIWH|cjj05%B+px{=(oSwE21!_*rqT}3W{Wd3?(^BKg zG=y4A5P8Ag#sT{6EHl{aoF3i0*CAn?J$Fuds4GArFyT(s|4+c;<^tDhxCLPevKVII zk@@xf{RLQP97iJ#VO}Gyd$|_DNH!D-tjj{Hejh2Yzbx=HFB7sGg>xFf1Lz!q)&Tr{ z6wGxT0Zzot8fH%d{XrUz2D*Vz-vo{h7|eh~r+VX$Ku)lO`)q#z&5Oa&C`2X!YL-YF zk=%XoGF(hfAj3aM?&O87wuKy!E!>!2Y~|vmFo#-f0Ngp7<;6kmHu~bg=DJEB>ZN*9 z+#$9FK4L+3Art`=2Eh$&&hdyrqm|Kso8UYR1$mP5g*;DFQ-PM_Pa5WLJ}mk#K4pvw zltPQ=Dq}Ez^QkIA3-Je^8gzXBK~uq~{3TZfgMpHG@mv+vzjao@qM^`S%!gJ~`J0AP z`AZkH5*o_Vxw#A)p5zVE5O8#u7(f{$t)i%g!8$9dDk-U|wwp7-;<_mBD9^S$SMfBTtpell2NQ)Q%zCZ9|=`0ycNsxXSD zFCPr1qXR=&0%UKx4@?aNZ9xcp5Oxet`q2OYhH$d7T!QRbV=I7;BjD&b5Y*G-qtU4V z&Yw?bFEap#_XFrKPr#c<)`i1iM1n5d5oM)n6<`GT5Y2+AfL*Y)JwDhEk0HSK>hb9? zwVD0_{vaES=}#ilw3)ha9D(8qXoK$%jDYJw>QM<^+P21~OOwEnF5HJs570&+f`Won zg49(gRBr?lgTWwF)evfG%HRxT+EFqc$5bZMq*)wGEXDv0PbCJ>i4-ynV#Rq<7<5oo zws}he2>2EL00x!BVkh7c015C1$aES4se(lOx&pLfWeJ(4!m>dHPw_`EaRK0TRkj_F zQ*{V6LHsTf(g7l6;JklV!w~2FlWIi`J$ZoqzlvJ5geB@%X0|%3+|H(F z*}Mu}@_Ycni-Ci(W>t7`M4~?{1gwt;G7Ui_tn%m5672vSm9B@>LHsgi`S?FoV1r;% zfmw)HNkee3lEnZS)FTK=Q}Asm$H6zKV)&pcVV91k8V35#Le*DLsGzJF{xp~iOm!vB ztZ2KqtsXB85bUzT;;3ML*;4@koC6ltGOxxjykKYnDj5tu3}Fl$A>skseTHmKgeejF z21A%axnT_8DFlcKd{(L(h1Og`tYPYGDNCj?)9)q`v0HmY8Yn?CXO%fQ57pJ2vP$A8 zJ*9l*L^vsXOFRc|{iZDs+&0@pY&J3Ga@AjFvOR$AMA)?1rhgqbx4r8Le!jo8wEmLV zUA%TD{k>J!4aefa+Jefk(D&(mZ!^ASEpnVEuQgVs=JGzy_HaKCY)lZ6oaI{I6p0Be z6C)12Ayj(aC`upBet->+=n&WXCRQ6pUa3iqAJ*de|$ zPI4rtD*sgv{wglJA<2{o7%z_vZ1>f5M5A@*#RzMWQjU!h&TF`hE@1hE1lLQgzr)$P zPFVjj7GuxdWw6)i?UmSPsC>Z+!L#~XpSeGi+s2)M6E9pZQJ18;btZi65SA&tT`;eH zY{-?V>AKFbK5xit4j!_0M|kdM3#K?XcGpF|{XCELkv2;9u-$yZ(Oa_6S(7%o`M&mR z3k13%Dr0IcW%6?NfjD)MxKBpN8n=bAwST#>qJcuB5dMyxa3`^R&>s;;9pD z4^nXHsw7J;*&PWdo9Zum`Xa4Tno~Giw*4z95_|BWI8O4`@oqB`{D|(oO~-iqPJetf zgWFfqp|#yw!21;KA@?gSEu@NI(54{1AkG(Y67``E5y&yEY8{FA3sq|F|fd`xiUM_DVDER9v5@eo^{T|30}( zPPAP_8!@8N;?DFMUMt{KZ!hhHuYQ6&nYQ4WN=)TJA&Az#*L}+UWPB5S7(P}$ zc6Z(Ga`(#gir#U5mN>d&nh-2jou-$Yll3}Jy6t-VXxF7SRJ&VNT25d7H?z3>hR)ay z#kR5bwDuRz-3w|BY7Z|)a6Swtp7#iNaHV0WI_mfJ4amL5kM3tPA2$9+^ZiqShg&x`Fi zV`-|3e`NUBGsfhcN$g`qi_m8I=ISKfB=@2Zh4Dqcg{O)V3%?i93i}EdOObbnd+odX z-HZ>7-1eEuer{6i{}1Wwy=ebWJvJYcdOzM8EB)sA$pcYJxs@64Ea-G#K7E^Kdx}Ae z;lBs>oyp02?bUFkAUaMIf2&0_@EHRvv~H$0Ov^f`S8i`JPXU@ z(@A%fPbSYJ2JTM}t3?8JfN})vykr^Tv(0%MZ1A(<=91>fBuAw%5t3w;RGD0qc&Y3N zp|KL%`Yij|u<#SbU5XWTBlX$!@9PGmkDU~awvbkmMw|AZwvQ7szGpg|U6<{fbImch zxWAUF)T^S62o6YWEBJ8mg~N?v>%*bP&n}2RO}&jwN%@?TfXu{1r29UlEA6?bcI2<- zS38DkM#`u5Gq;9_9!D-7O}B6j>}OV4EY!@!aNUn;k22@9z^X7Wze{HBnh3S^XrH*+ zGxB-liBQOX%fB&M@v7$CmkSb8FZU*UB_$=xS_SQYnW-nkx2elZU+jjO^J9&XeN;P7 zr5+WrCi*{xjSJ_6lNe|hq)SRDt!T8@%`dZf>d@@#;OXG;`I`dT68Fg4dft_k_-?(U zaK!F~SM@*TX$|-0$e5DEG8A!)f^on+#!&8`r1&*=wG71XsTc@47MkIjAy4s%o;oMJ zr)>}So?}7Ey^MetFG3Fg__F54iS`q%C;RKh_Bt(MXX-zUmkm^#%$P*add%|9@{cq6 zj%7QQFx@8J)#QFlwRk7>)*HIyYZJAGP@5sq@1RQWeo9{~zlnZ(@0z>vaoxe29ft!C ze+{wWDUrU9pQ)?Z&~ce~IYIO_;@pv-LmFRsKDHO02(+lvq#YL;fzTJ40fn_)^1Kj+J5zhBCRs9D}x%6At?|+;{RtakLOQ zu*cN6CTK{90Qv8g7}XPB14A~upC+L!AGB`aeSP8khNEjrUiDYR6nM zUsjc*WGZKjsiXXh%r<4huH8QAS!33Cf$_*ZV~^y8!iF>U7o1?`$UJH5_Ko3Z%1qES z3j@LFu!~wbeyTyo$K_Kg zdIffYA}of!XOq~@UXl3ysP!g zn*Z}qi-9P9J}7+j!EHm8zFbc&JLPu=AvuH+z0ohJog{p=3Db>XNt#)Yxg1+RRT9OIMt)R_ITG^ zbNQrfc5=G&?p;RM-@b{POCx0S*0r0q`?l`Ze9>nko+T+?E!`=Rv^UTr7G7X__y_z#=Zb=+9{N1+( z50*vWtZQo6`at-z?s|_W;pZZiIYY!$}_`ovyWUPjO9cH&1_~EGjN5Q=8apqJH!3bE6w&S2QlB z^f;o;vtTBQ@fR;la&6uiL$8*&^a@jg%gZ>j!~g5H^HSp@uNje|HY4Wf7? z0uz-!RHc0P=)Bs}laz*Tj^3<0C?ShyXs2|!`0h41uV!^Mt~=!-v2^OGk66i6)a)s) z$*@wm*59!_$x^m1#bWn&U9@eX9uf8odL-k~HB8$W5fd}zbz9EzPGQPJsk^dqKqgb@Alotv z`#KI|NnCD;*#a~QgNg@eFlb|2My&t>5obtYLf3s2Ro3(K1&LmUe!eY>_^H~mt~gH` z*mzqS+0m&CJe{ovZMl;GZlYv5)Q5sW`{dHbw_?)I&IDu<7KVhH63cqpfe6?pSz^a} zFZpd*HmkSCmT3a^x07qBi`SS~GwQ($sSip)#Z1=J)f|zV66iAoVR{i{QgZyQMqxzYXy(p}I zCujivqk%C1pe5|oT5f&9SQ)njIuL;%fQqF8UI5s^fwBW4GbYjkNVub*6YQae-)}@K zVz5*Sfq@6xHu9!KZ-1Nuo0BCC`a!T4uj=`&p0J|VuSWhF2}`io2ZLI8OX_05z8~$^ zyk>jK2<+*SDBj?-RW4$JX7Q=QkZ3-3W<$R)Gzz7Tf_Vw7U`WuBtS{shOiKgIkKZvg z80FtE4C;@0>S%Sa{C}ONjz<4EPZQMT_j#Is@@Z&l{jpX+%8ju;F;0Rf{#qk{#_3K0seh31oyF*#uRKlVe3KL7v# literal 0 HcmV?d00001 diff --git a/Bitkit/Assets.xcassets/synonym-logo.imageset/Contents.json b/Bitkit/Assets.xcassets/synonym-logo.imageset/Contents.json new file mode 100644 index 000000000..3336f23a9 --- /dev/null +++ b/Bitkit/Assets.xcassets/synonym-logo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "synonym-logo.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Bitkit/Assets.xcassets/synonym-logo.imageset/synonym-logo.png b/Bitkit/Assets.xcassets/synonym-logo.imageset/synonym-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1d871d71cd7166394f82fb3f39496f503c158fae GIT binary patch literal 3620 zcmV+<4%_jGP)}G!F=q$mKt(V6$qt^;11QE~dkFlY! z;eY<$=l-(kM6YeQ_uIhA2FY1lS1X6Z9q|!(`ROZ)1|WEBPfb;y4aVz@Gtw)sBE|ZMNv)%bXv|Q zTt1Y?Gf)&|F|1$!==>-<_hvRKghR${3zqe(R& zuLje!p8^y`Sr-09j&&qYs^xI_yu?6dGoUESGC((yR7JkP8(0_^Z+cZr5txedY%wU|e{0l_Zmzg#h<#3Y&q$|GEpnOi8Eek5RuK-!r7h$c536@}wr&t>YFOq_bP zTKx$JVjr=!KktNS&2hyNbd>R5a3JW+5Ch@7{Ar(a4`q$t-b~PMG=f3wo+>R-Ly~bX^zAV&!Q}m%M`1~7i_4ZI_HveU0x&m5t&82(p zAHeY)PL~q+m$iUt1P=%K#m*vLmMypj4{`5bM9yFL#Xe`tT&E896~da;XA+X=e1awr z=e-w{bPuZg%f9>B>$m=XTSx%i8b7*kBXIiS)Zp6wN)mABe0^^Mmp?Zj1$3jnq|q0F z=UsKn(#mUyE9s>d+T$-0dYq|kufO*9G4_YH1it9r&t9W`^$mLJ%PTIFuIR~IFkOt3 zl~doNLAN=3F0%M6&^fy~u3-XD_R)}U%s>W^cS!GqwC6%TO+d4%OreLm>k>-(sv@_YLysYp+w|W22bKcfA z3>EAz{Bw)Q_|%SHn?HR2`@+PRe4^a-5+Xo1aI}TEv+E3ajoG)!CB#ALc8~fN@*_>z zMniCc8jsHxSN=)nz+l?G)(!N9+F_y~LRrgOGii4*>5$hvhMvh*1oHF|^H5=r@Ik)c zRyd4J>;8ohw_w_%ib*Hjzru8OIE+nf=2@p^3bgo!@=D{oMcV>s;6R~F2Z|T5| z{1}kUl}CdhxOawzsKGh1%T5|H5iUZ{pn9`uHjvJ(4+iA2kk(nW^7c2Ah8){{CQT?l zQ9?S6BbfRT)wLNR9hLk1VU$mhP?I=U=L7}kI!p+l>2CJOhQq9^`WCjPn; zw?a8zrjy2?Tz1o`tEjj=W!W+59_>zmvc~h<jC*E zsBX?W<&e^?V=|?JXZrjY%&*>G_B?09#J}!|&%GF?6SqPh6Da$okgkY)2D`)u6Z|SD zx5XO5?a0x6**U?!Nw{~_lNU^hA6ZACbkfM@hT=U3o)?e_be+vW9&%2~$}(Lb7v5x9 z`v#)$3J$L~8uq;H%n2d&IAp5OXi58vTtK*LFKQ-~#^FL5J9RL7;gM+sqb zg-o#$Wa`j7BR^NEhHyT+@78Asn}Dx6e-{uYb>3a?D5tL@GNXd+9!Pg9qK3D+8Cq7gv!Z~x*`r=+P51q_3POxe2sE%WkqeGpu`r4B#@KN#d! z!Z;=K90oq4#ZO@TToA`k;d%{`@0ReQllEa+0{abft1YC#)fFc|hNgSq8SqFAdeVe*54A*Pm%6#6O@ zFmf*>uVN1o1YBn&l|JN85LeBQNX=X`ksr&Yn%E)j_00SFioo^T94q>#f&@<~#3|r( zc_Un(!d|Y0>lYBued=}ZKrRFEseVF&Z_cl))Gjf?np>mDSplQs+auJD!HgO9K_)+hAC(CP8|^K~ws#F~dBH&lPE(?U zX^=V$)yEF`#hV4ltFyTgk1eDL{CXmx%)vQQ-wDE+TWUd+FfXA#5qdXX1(DE^>h3#}2hOS4M@rnWxQ4K> zY=pIG|0lXB{WL*w4Pidd{Sx~RM46D}sLU*)5jSYumHRr!@NI;uO_VSl zvBTli1_ihmrwJw^T@CzDEs-)5J9|g>{eY`C1N%LU9)vVFhy5j!riRB0ndc;BprC{! z<3aF5eDSEma}Ab@ki(C@LhFokMhXzjtSP^GUh9b!K0|mbl}B)DwpoIi^?=O>2~$Z3 z7O)r6(n!|p)jac(`q)BTdmNpaMYLxwOA_|Om|73+H;e9aMU&+q6DV(|KurEc_j7S_ z3!mm?x{Ztp0r@#s5%p9={Gb zQB1dL|Bp9!$N|ThRFv>#Zd(}lhuYD7-;N>NkUzkWs9|9$H{sibgb)21c-%fU?9Yp; z;Q-KWn!aJ8jG=*!LTkDNg{Ho0A4WY}D;M4&zGk9i|2WSE%E##(<>+XLkj zMjLYNDwrLN7dqGQ#7OMu8&F0iu|3vss$jgyMT|MjJ_w9I=&iyN-g78KLPy_#GCJBG zEimrLk%p`e=b@lqj}w_^Dw}~P2+Bvi(Dee8Nr-5Vn^S6!l@tN@E1zSiVaDNTpI36a znaCt>XWYzcR*>0!@ffGzA3IEY+#kcx|0tk*-cgs2Q)&{JrsXtbTZW-1%1B_`{GK)y zMx5h)V4lvrkV`#%a|4Q^90!=L`7{FP1~X0!L^s_335Ol`tD26Y92@9nSPnhkyYfPa z?h!qbgif=$@WQ6TVf=Q+wW28VAUc=(KxaNlTW!YBEd9T41)>p3&3c$|;2IRM;rWaWiN*{SeSOe4Al%I?kq9qhdNy qYyV5b?Z05Z_ig=T*RCkaiSRF$X3se984WN10000O4*AAJ4+2U7e>LD2npq7@TpeDeGexShQ|=|q$o;{sBw%?yVU4Tt8rA6zl@+;O|dpSY~!%6k8K@mGte>h z^QJI7Lo@^BTcH7pb-SIfXo6;aYF6@4CeKyq;OKakfLH8l;CGd4SAMb%gc&EQa)#JiD@1cp*}uS z7obQ6cPh86co;Z!%Dv})E~~^R-)B7sf3j{Y`&yLB&_%5CD$$^&$}}X?1jPM@=3xFG z-Cug1F{k{l?e++y=e|~XbPL;i;hZz|v81w=;Az{4TsLiwT?omP@_SrQpuY49a(tg< zW4&#hOA8_GGG-u2pBKWVKlO2K94T{{IA!*RY0CPTQATd*Apa($k&Il!I8uR2@Ki8d z$~L9+jgFPD6$dOCQ|oU784EP^b8s+_6c@{h^@{nb0{64=_9-iu6^-u>%j%KGok+sq zL7mr^rgO-Pz>e~qkQ~dGQeOqhOwn&lyQuHM!C?&<)c3qX*yF%!6Y4kn`X?IMX(0X4 zXrO@#O$Y=QAk3-+x#LK^u|Z2|3zk_z#=x0qd+^%tI_;Y4f$Gmdv%llt2Es^nex5M> z%FLWE!wVW&z7=Ya1^5l41S;x+6yR=HGldYPH0{T_rVfb4HMQQyB=60c?Z)8QaS3;# zejc_78jM_>DrvxwWERj)zh9`Xlc2oM5|U0xb_rp_Xfsc3JCd8K)1~8;*>Z9WqYcjj zQz;?6ZQOd0CL}3!S_tRPvg`$!66DO`6n0e~%lh~LIU{&qtfTkJjWZiI@VOnQEjh+U zN{2=&kfyYGYR!) zx+V=CXT5r|61s)JhkXcs`-Xh~(m9WfR>3#W(aZ)F04sb6{gY#auNp98W)gdTYI|{T z{9cqGcgBV;2D}}Vv2y;F>U`zK#z-a_1h?aq6qeXS7`%T&vfY?s>7?ayVt-mXp`8iH zF->fXn48aX(YSoLu5DlJNICU}<()$_9}@~Q z?8&v>K(k*=K?uEB*IcgJmuHSxnQIbc;8X!?UqF-M6Rwgx-*M*U@*26$qo;|aD?Fp; zcjDG-8A;D&-A2;AWX>LY$1_MHqApSgT?*-^i88+eGTj+gXwk|B7v(-&BT9Y7c%U3%v9I@7~2)kmPCu+`~m zL4sVtc|azX^%I7JWPD6$H5EIm5RiYSMTQ;7y0Hr_Y|u;uug``2RS+h0{Y%J?2^bq+ zpTxF{&0u4z_Z6Jl-|YwI*%l2*1`?sR03oj_gxbT@aZEOrbKNPk4>v;j;H|Y#sKw z&R~~`EWeMP$IXvb*o!cl1-CblF*TH@K+@J5Y0t_Kh?j_Y3th}vRV8vef&nM^ouJgW z<|pdWP<#1wXWUk%$1q_YyDW1bq;8Ct>LI8TWEToJ*#fo;Y!li}j&ddyAy7A6<5)n` zIEwK`_k_F8kzK93u29}ctU*$Y&J_u>gIjTxA@x}yfbYm`$b{M=8E&m#_3(XS>kQpKq`WSCDIM;CkYQ#&J!*7tSr-`0SJC z2IRfxxSK?%vton)LreO{5sTh=jdh%T%SDqECX}ZgfG zAq-rXZG5=A9_*IM+h3nNu^y99vAHXqDa0zBSIQ8~Uy5;jJy;*cNO;W(p}%>t;@~HQplh3gPWP_@$l?Xu;v~HK7oghZ5p%bT9^*9rnEMF2JjB z-#c8~Jr|6lRS>2S&OOq<#R%@#JzPEu=E8%9H2Vy`A=G2sI2SkWi1_+}@tkkH&r#Yu z+68UgC%h*VSHcE+quJdv#Pe;OzlYQrOyoMY%Pga;8)#4J;Ap!vF)%-+a}GlnFTNT1 z;qqxZ8~eM0U(j4oz#x6;bNK_WqxL!QbPf2%T`c%RI@O-HUe|L>{ za1w~G4@x6}_oZ!8#yRvuwsEA9EJbNk_F?vTq7(LCY1VHW zQ>ib`0(OD7`V0lPtqN$iX;A;4JXV(DdmBpt3Z6laE7YD~Y6__QUF^YyN1{;YM)gMFIFyxO_B>E!Kq#AQ`>p%nHb=?)Hv&{gLWT; z@*b_5^MVYyNCx5`e^~i8>~;kyGX77AHC(^nZL<&DSHb097(9dgKV%G?Mh^q&d0JXq zJS6vIXXUL5h;uur$xLtO2lFxmxt`daG7$bpO|kq&A^kbV<+|AFL2exm09dvc@P|w| zrWoBaM0NIuT~ zE~Vd(q?3*TV1?^M=@q37Gzho@(sp#iyVsVUU&(}1=XnTSKgj3eC(U{D?M$bnbya>@p8}vzFFK1G? z;TI^1qWnx|!ns}QK+$RwxS}Y^&^TQF#R: View { private let defaultActiveColor: Color @Namespace private var underlineNamespace - init(selectedTab: Binding, tabs: [T], activeColor: Color = .brandAccent) { + init(selectedTab: Binding, tabs: [T], activeColor: Color = .textPrimary) { _selectedTab = selectedTab tabItems = tabs.map { TabItem($0) } defaultActiveColor = activeColor } - init(selectedTab: Binding, tabItems: [TabItem], defaultActiveColor: Color = .brandAccent) { + init(selectedTab: Binding, tabItems: [TabItem], defaultActiveColor: Color = .textPrimary) { _selectedTab = selectedTab self.tabItems = tabItems self.defaultActiveColor = defaultActiveColor @@ -32,7 +32,7 @@ struct SegmentedControl: View { HStack(spacing: 8) { ForEach(tabItems, id: \.tab) { tabItem in Button(action: { - withAnimation(.spring(response: 0.35, dampingFraction: 0.8)) { + withAnimation(.easeInOut(duration: 0.2)) { selectedTab = tabItem.tab } }) { @@ -43,6 +43,7 @@ struct SegmentedControl: View { Rectangle() .frame(height: 2) .foregroundColor(Color.white64) + if selectedTab == tabItem.tab { Rectangle() .frame(height: 2) @@ -51,7 +52,7 @@ struct SegmentedControl: View { } } } - .frame(maxWidth: .infinity) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom) .contentShape(Rectangle()) } .buttonStyle(PlainButtonStyle()) diff --git a/Bitkit/Components/SettingsListLabel.swift b/Bitkit/Components/SettingsRow.swift similarity index 69% rename from Bitkit/Components/SettingsListLabel.swift rename to Bitkit/Components/SettingsRow.swift index 38328a2bf..f3a11e3f6 100644 --- a/Bitkit/Components/SettingsListLabel.swift +++ b/Bitkit/Components/SettingsRow.swift @@ -1,15 +1,32 @@ import SwiftUI -enum SettingsListRightIcon { +/// Section header for settings screens +struct SettingsSectionHeader: View { + let title: String + + init(_ title: String) { + self.title = title + } + + var body: some View { + CaptionMText(title) + .frame(height: 50) + .frame(maxWidth: .infinity, alignment: .leading) + .accessibilityAddTraits(.isHeader) + } +} + +enum SettingsRowRightIcon { case chevron case checkmark } -struct SettingsListLabel: View { +struct SettingsRow: View { let title: String let iconName: String? + let iconColor: Color? let rightText: String? - let rightIcon: SettingsListRightIcon? + let rightIcon: SettingsRowRightIcon? let toggle: Binding? let disabled: Bool? let testIdentifier: String? @@ -17,14 +34,16 @@ struct SettingsListLabel: View { init( title: String, iconName: String? = nil, + iconColor: Color? = .brandAccent, rightText: String? = nil, - rightIcon: SettingsListRightIcon? = .chevron, + rightIcon: SettingsRowRightIcon? = .chevron, toggle: Binding? = nil, disabled: Bool? = nil, testIdentifier: String? = nil ) { self.title = title self.iconName = iconName + self.iconColor = iconColor self.rightText = rightText self.rightIcon = rightIcon self.toggle = toggle @@ -36,16 +55,12 @@ struct SettingsListLabel: View { VStack(spacing: 0) { HStack(alignment: .center, spacing: 0) { if let iconName { - Label { - BodyMText(title, textColor: .textPrimary) - } icon: { - CircularIcon(icon: iconName, iconColor: .textPrimary) - .padding(.trailing, 8) - } - } else { - BodyMText(title, textColor: .textPrimary) + CircularIcon(icon: iconName, iconColor: iconColor ?? .brandAccent, backgroundColor: .black) + .padding(.trailing, 8) } + BodyMText(title, textColor: .textPrimary) + Spacer() if let toggle { @@ -57,7 +72,7 @@ struct SettingsListLabel: View { } else { if let rightText { - BodyMText(rightText, textColor: .textPrimary) + BodyMText(rightText, textColor: .textSecondary) .padding(.trailing, 5) .accessibilityIdentifier("Value") } @@ -80,10 +95,7 @@ struct SettingsListLabel: View { } .frame(height: 50) - // Bottom border - Rectangle() - .fill(Color.white10) - .frame(height: 1) + CustomDivider() } } } diff --git a/Bitkit/Components/Social.swift b/Bitkit/Components/Social.swift index 63b873cf8..09f9082ab 100644 --- a/Bitkit/Components/Social.swift +++ b/Bitkit/Components/Social.swift @@ -3,11 +3,7 @@ import SwiftUI struct Social: View { @Environment(\.openURL) private var openURL - let backgroundColor: Color - - init(backgroundColor: Color = .white16) { - self.backgroundColor = backgroundColor - } + let backgroundColor: Color = .clear var body: some View { HStack { diff --git a/Bitkit/Extensions/String+Utilities.swift b/Bitkit/Extensions/String+Utilities.swift index 454f6efdf..2c14c562f 100644 --- a/Bitkit/Extensions/String+Utilities.swift +++ b/Bitkit/Extensions/String+Utilities.swift @@ -1,15 +1,31 @@ import Foundation extension String { - /// Truncates a string to a maximum length and adds ellipsis in the middle - /// - Parameter maxLength: The maximum length of the string - /// - Returns: The truncated string with ellipsis in the middle - func ellipsis(maxLength: Int) -> String { + enum EllipsisStyle { + /// Ellipsis in the middle: "ab...de" + case middle + /// Ellipsis at the end: "abcde..." + case end + } + + /// Truncates a string to a maximum length and adds ellipsis. + /// - Parameters: + /// - maxLength: The maximum length of the string + /// - style: `.middle` (default) keeps start and end with "..." in between; `.end` keeps prefix and "..." at the end + /// - Returns: The truncated string with ellipsis + func ellipsis(maxLength: Int, style: EllipsisStyle = .middle) -> String { if count <= maxLength { return self } - let start = prefix(maxLength / 2) - let end = suffix(maxLength / 2) - return "\(start)...\(end)" + + switch style { + case .middle: + let half = maxLength / 2 + let start = prefix(half) + let end = suffix(half) + return "\(start)...\(end)" + case .end: + return String(prefix(maxLength)) + "..." + } } } diff --git a/Bitkit/MainNavView.swift b/Bitkit/MainNavView.swift index 1829d883a..f7471edc1 100644 --- a/Bitkit/MainNavView.swift +++ b/Bitkit/MainNavView.swift @@ -320,14 +320,8 @@ struct MainNavView: View { case let .widgetEdit(widgetType): WidgetEditView(id: widgetType) // Settings - case .settings: MainSettings() - case .generalSettings: GeneralSettingsView() - case .securitySettings: SecurityPrivacySettingsView() - case .backupSettings: BackupSettings() - case .advancedSettings: AdvancedSettingsView() - case .support: SupportView() - case .about: AboutView() - case .devSettings: DevSettingsView() + case .settings: MainSettingsScreen() + case .support: SupportScreen() // General settings case .languageSettings: LanguageSettingsScreen() @@ -338,16 +332,16 @@ struct MainNavView: View { case .quickpayIntro: QuickpayIntroView() case .customSpeedSettings: CustomSpeedView() case .tagSettings: TagSettingsView() - case .widgetsSettings: WidgetsSettingsView() + case .widgetsSettings: WidgetsSettingsScreen() case .notifications: NotificationsSettings() case .notificationsIntro: NotificationsIntro() // Security settings - case .disablePin: DisablePinView() - case .changePin: PinChangeView() + case .changePin: ChangePinScreen() // Backup settings - case .resetAndRestore: ResetAndRestore() + case .dataBackups: DataBackupsScreen() + case .reset: ResetScreen() // Support settings case .reportIssue: ReportIssue() @@ -363,9 +357,10 @@ struct MainNavView: View { case .electrumSettings: ElectrumSettingsScreen() case .rgsSettings: RgsSettingsScreen() case .addressViewer: AddressViewer() + case .devSettings: DevSettingsView() // Dev settings - case .blocktankRegtest: BlocktankRegtestView() + case .blocktankRegtest: BlocktankRegtestScreen() case .ldkDebug: LdkDebugScreen() case .vssDebug: VssDebugScreen() case .probingTool: ProbingToolScreen() diff --git a/Bitkit/Resources/Localization/en.lproj/Localizable.strings b/Bitkit/Resources/Localization/en.lproj/Localizable.strings index a508858dc..729fda157 100644 --- a/Bitkit/Resources/Localization/en.lproj/Localizable.strings +++ b/Bitkit/Resources/Localization/en.lproj/Localizable.strings @@ -532,6 +532,7 @@ "security__pin_not_match" = "Try again, this is not the same PIN."; "security__pin_disable_title" = "Disable PIN"; "security__pin_disable_text" = "PIN code is currently enabled. If you want to disable your PIN, you need to enter your current PIN code first."; +"security__pin_enable_button" = "Enable PIN"; "security__pin_disable_button" = "Disable PIN"; "security__pin_enter" = "Please enter your PIN code"; "security__pin_last_attempt" = "Last attempt. Entering the wrong PIN again will reset your wallet."; @@ -612,13 +613,10 @@ "settings__dev_disabled_title" = "Dev Options Disabled"; "settings__dev_disabled_message" = "Developer options are now disabled throughout the app."; "settings__general_title" = "General"; -"settings__security_title" = "Security and Privacy"; -"settings__backup_title" = "Back up or Restore"; +"settings__security_title" = "Security"; "settings__advanced_title" = "Advanced"; -"settings__about_title" = "About"; +"settings__data_backups_nav_title" = "Data Backups"; "settings__support_title" = "Support"; -"settings__about__title" = "About Bitkit"; -"settings__about__text" = "Thank you for being a responsible Bitcoiner.\nChange your wallet, change the world.\n\nBitkit hands you the keys to your money, profile, contacts, and web accounts.\n\nBitkit was crafted by Synonym Software Ltd."; "settings__about__legal" = "Legal"; "settings__about__share" = "Share"; "settings__about__version" = "Version"; @@ -637,7 +635,7 @@ "settings__general__denomination_label" = "Bitcoin denomination"; "settings__general__denomination_modern" = "Modern (₿ 10 000)"; "settings__general__denomination_classic" = "Classic (₿ 0.00010000)"; -"settings__general__speed" = "Transaction speed"; +"settings__general__speed" = "Transaction Speed"; "settings__general__speed_title" = "Transaction Speed"; "settings__general__speed_default" = "Default Transaction Speed"; "settings__general__speed_fee_custom" = "Set Custom Fee"; @@ -648,9 +646,17 @@ "settings__general__language" = "Language"; "settings__general__language_title" = "Language"; "settings__general__language_other" = "Interface language"; -"settings__widgets__nav_title" = "Widgets and Suggestions"; -"settings__widgets__showWidgets" = "Widgets and Suggestions"; +"settings__general__section_interface" = "Interface"; +"settings__general__section_payments" = "Payments"; +"settings__widgets__nav_title" = "Widgets"; +"settings__widgets__section_display" = "Display"; +"settings__widgets__section_reset" = "Reset To Defaults"; +"settings__widgets__showWidgets" = "Show Widgets"; "settings__widgets__showWidgetTitles" = "Show Widget Titles"; +"settings__widgets__reset_widgets" = "Reset Widgets"; +"settings__widgets__reset_widgets_dialog_title" = "Reset Widgets?"; +"settings__widgets__reset_widgets_dialog_description" = "Are you sure you want to reset the widgets? The default widget set with default configurations will be displayed."; +"settings__widgets__reset_suggestions" = "Reset Suggestions Cards"; "settings__notifications__nav_title" = "Background Payments"; "settings__notifications__intro__title" = "Get Paid\nPassively"; "settings__notifications__intro__text" = "Turn on notifications to get paid, even when your Bitkit app is closed."; @@ -682,17 +688,22 @@ "settings__security__warn_100" = "Warn when sending over $100"; "settings__security__pin" = "PIN Code"; "settings__security__pin_change" = "Change PIN Code"; +"settings__security__section_backup" = "Back up or reset"; +"settings__security__section_privacy" = "Privacy"; +"settings__security__section_safety" = "Safety"; +"settings__security__section_pin" = "PIN Code"; "settings__security__pin_launch" = "Require PIN on launch"; "settings__security__pin_idle" = "Require PIN when idle"; "settings__security__pin_payments" = "Require PIN for payments"; "settings__security__pin_enabled" = "Enabled"; "settings__security__pin_disabled" = "Disabled"; -"settings__security__use_bio" = "Use {biometryTypeName} instead"; +"settings__security__use_bio" = "{biometryTypeName} instead of PIN"; "settings__security__footer" = "When enabled, you can use {biometryTypeName} instead of your PIN code to unlock your wallet or send payments."; -"settings__backup__title" = "Back Up Or Restore"; +"settings__reset_nav_title" = "Reset"; "settings__backup__wallet" = "Back up your wallet"; -"settings__backup__export" = "Export wallet data to phone"; -"settings__backup__reset" = "Reset and restore wallet"; +"settings__backup__data" = "Data backups"; +"settings__backup__export" = "Export wallet data"; +"settings__backup__reset" = "Reset wallet"; "settings__backup__failed_title" = "Data Backup Failure"; "settings__backup__failed_message" = "Bitkit failed to back up wallet data. Retrying in {interval, plural, one {# minute} other {# minutes}}."; "settings__backup__latest" = "latest data backups"; @@ -708,7 +719,7 @@ "settings__backup__category_profile" = "Profile"; "settings__backup__category_contacts" = "Contacts"; "settings__support__title" = "Support"; -"settings__support__text" = "Need help? Report your issue from within Bitkit, visit the help center, check the status, or reach out to us on our social channels."; +"settings__support__text" = "Need help? Report your issue from within Bitkit or visit our help center."; "settings__support__report" = "Report Issue"; "settings__support__help" = "Help Center"; "settings__support__status" = "App Status"; @@ -745,9 +756,10 @@ "settings__status__backup__ready" = "Backed up"; "settings__status__backup__pending" = "Backing up..."; "settings__status__backup__error" = "Failed to complete a full backup"; +"settings__adv__section_debug" = "Debug"; "settings__adv__section_payments" = "Payments"; "settings__adv__section_networks" = "Networks"; -"settings__adv__section_other" = "Other"; +"settings__adv__address_type_title" = "Address Type"; "settings__adv__address_type" = "Bitcoin Address Type"; "settings__adv__monitored_address_types" = "Monitored Address Types"; "settings__adv__addr_type_failed_title" = "Failed"; @@ -967,6 +979,7 @@ "wallet__drawer__widgets" = "Widgets"; "wallet__drawer__shop" = "Shop"; "wallet__drawer__settings" = "Settings"; +"wallet__drawer__support" = "Support"; "wallet__drawer__status" = "App Status"; "wallet__send" = "Send"; "wallet__receive" = "Receive"; diff --git a/Bitkit/ViewModels/NavigationViewModel.swift b/Bitkit/ViewModels/NavigationViewModel.swift index b43a79bc0..942182348 100644 --- a/Bitkit/ViewModels/NavigationViewModel.swift +++ b/Bitkit/ViewModels/NavigationViewModel.swift @@ -33,6 +33,7 @@ enum Route: Hashable { case savingsAdvanced case savingsProgress case scanner + case support // Shop case shopIntro @@ -46,37 +47,33 @@ enum Route: Hashable { case widgetDetail(WidgetType) case widgetEdit(WidgetType) - // Main Settings - case settings - case generalSettings - case securitySettings - case backupSettings - case advancedSettings - case support - case about - case devSettings + // Support + case reportIssue + case appStatus - // General settings + // Settings + // General/Interface + case settings case languageSettings case currencySettings case unitSettings - case transactionSpeedSettings - case customSpeedSettings case tagSettings case widgetsSettings + + // General/Payments + case transactionSpeedSettings + case customSpeedSettings case quickpay case quickpayIntro case notifications case notificationsIntro - // Security settings - case disablePin + // Security + case dataBackups + case reset case changePin - /// Backup settings - case resetAndRestore - - // Advanced settings + // Advanced/Payments case coinSelection case addressTypePreference case connections @@ -86,10 +83,7 @@ enum Route: Hashable { case electrumSettings case rgsSettings case addressViewer - - // Support settings - case reportIssue - case appStatus + case devSettings // Dev settings case blocktankRegtest diff --git a/Bitkit/Views/Settings/AboutView.swift b/Bitkit/Views/Settings/AboutView.swift deleted file mode 100644 index a8d5c8766..000000000 --- a/Bitkit/Views/Settings/AboutView.swift +++ /dev/null @@ -1,104 +0,0 @@ -import SwiftUI - -struct DiagonalCut: Shape { - func path(in rect: CGRect) -> Path { - var path = Path() - - let leftCutX = rect.maxX * 0.15 - path.move(to: CGPoint(x: leftCutX, y: rect.maxY)) - - let topCutY = rect.maxY * 0.63 - path.addLine(to: CGPoint(x: rect.maxX, y: topCutY)) - - // Line to the top-right corner - path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY)) - // Line to the bottom-right corner - path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY)) - // Line to the bottom-left corner - path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY)) - // Close the path back to the starting point - path.closeSubpath() - - return path - } -} - -struct AboutView: View { - @Environment(\.openURL) private var openURL - - private var appVersion: String { - let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown" - let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown" - return "\(version) (\(build))" - } - - private var shareText: String { - return t( - "settings__about__shareText", - variables: ["appStoreUrl": Env.appStoreUrl, "playStoreUrl": Env.playStoreUrl] - ) - } - - var body: some View { - ZStack { - // Orange diagonal background - Color.brandAccent - .clipShape(DiagonalCut()) - .ignoresSafeArea() - - VStack(alignment: .leading, spacing: 0) { - NavigationBar(title: t("settings__about__title")) - .padding(.bottom, 16) - - BodyMText(t("settings__about__text")) - .padding(.vertical, 16) - - VStack(spacing: 0) { - Button(action: { - openURL(URL(string: Env.termsOfServiceUrl)!) - }) { - SettingsListLabel(title: t("settings__about__legal")) - } - - ShareLink(item: shareText, message: Text(shareText)) { - SettingsListLabel(title: t("settings__about__share")) - } - - Button(action: { - openURL(URL(string: Env.githubReleasesUrl)!) - }) { - SettingsListLabel( - title: t("settings__about__version"), - rightText: appVersion, - rightIcon: nil - ) - } - } - - Spacer(minLength: 32) - - VStack(alignment: .center, spacing: 0) { - Image("logo") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 82) - .accessibilityIdentifier("AboutLogo") - } - .frame(maxWidth: .infinity) - .padding(.bottom, 32) - - Social(backgroundColor: .clear) - } - .navigationBarHidden(true) - .padding(.horizontal, 16) - .bottomSafeAreaPadding() - } - } -} - -#Preview { - NavigationView { - AboutView() - } - .preferredColorScheme(.dark) -} diff --git a/Bitkit/Views/Settings/Advanced/AdvancedSettingsView.swift b/Bitkit/Views/Settings/Advanced/AdvancedSettingsView.swift index c693806d4..5d24873fd 100644 --- a/Bitkit/Views/Settings/Advanced/AdvancedSettingsView.swift +++ b/Bitkit/Views/Settings/Advanced/AdvancedSettingsView.swift @@ -1,113 +1,100 @@ import SwiftUI struct AdvancedSettingsView: View { - @EnvironmentObject var navigation: NavigationViewModel - @EnvironmentObject var suggestionsManager: SuggestionsManager - @EnvironmentObject var settings: SettingsViewModel - @State private var showingResetAlert = false + @EnvironmentObject private var settings: SettingsViewModel + @EnvironmentObject private var wallet: WalletViewModel + + @AppStorage("showDevSettings") private var showDevSettings = Env.isDebug var body: some View { VStack(alignment: .leading, spacing: 0) { - NavigationBar(title: t("settings__advanced_title")) - .padding(.bottom, 16) - ScrollView(showsIndicators: false) { - VStack(alignment: .leading, spacing: 16) { - // PAYMENTS Section - VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("settings__adv__section_payments")) - .padding(.bottom, 8) - - NavigationLink(value: Route.addressTypePreference) { - SettingsListLabel( - title: t("settings__adv__address_type"), - rightText: settings.selectedAddressType.localizedTitle + VStack(alignment: .leading, spacing: 0) { + // Debug Section + if showDevSettings { + SettingsSectionHeader(t("settings__adv__section_debug")) + + NavigationLink(value: Route.devSettings) { + SettingsRow( + title: t("settings__dev_title"), + iconName: "game-controller" ) } - .accessibilityIdentifier("AddressTypePreference") - - NavigationLink(value: Route.coinSelection) { - SettingsListLabel(title: t("settings__adv__coin_selection")) - } - .accessibilityIdentifier("CoinSelectPreference") + .padding(.bottom, 16) + .accessibilityIdentifier("DevSettings") + } - // NavigationLink(destination: Text("Coming soon")) { - // SettingsListLabel(title: t("settings__adv__payment_preference")) - // } + // Payments section + SettingsSectionHeader(t("settings__adv__section_payments")) - // NavigationLink(destination: Text("Coming soon")) { - // SettingsListLabel(title: t("settings__adv__gap_limit")) - // } + NavigationLink(value: Route.addressTypePreference) { + SettingsRow( + title: t("settings__adv__address_type_title"), + iconName: "list-dashes", + rightText: settings.selectedAddressType.localizedTitle + ) } + .accessibilityIdentifier("AddressTypePreference") - // NETWORKS Section - VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("settings__adv__section_networks")) - .padding(.top, 24) - .padding(.bottom, 8) - - NavigationLink(value: Route.connections) { - SettingsListLabel(title: t("settings__adv__lightning_connections")) - } - .accessibilityIdentifier("Channels") + NavigationLink(value: Route.coinSelection) { + SettingsRow( + title: t("settings__adv__coin_selection"), + iconName: "coins", + rightText: settings.coinSelectionMethod.localizedTitle + ) + } + .accessibilityIdentifier("CoinSelectPreference") - NavigationLink(value: Route.node) { - SettingsListLabel(title: t("settings__adv__lightning_node")) - } - .accessibilityIdentifier("LightningNodeInfo") + NavigationLink(value: Route.addressViewer) { + SettingsRow( + title: t("settings__adv__address_viewer"), + iconName: "eye" + ) + } + .accessibilityIdentifier("AddressViewer") - NavigationLink(value: Route.electrumSettings) { - SettingsListLabel(title: t("settings__adv__electrum_server")) - } - .accessibilityIdentifier("ElectrumConfig") + // Networks section + SettingsSectionHeader(t("settings__adv__section_networks")) + .padding(.top, 16) - NavigationLink(value: Route.rgsSettings) { - SettingsListLabel(title: t("settings__adv__rgs_server")) - } - .accessibilityIdentifier("RGSServer") + NavigationLink(value: Route.connections) { + SettingsRow( + title: t("settings__adv__lightning_connections"), + iconName: "bolt-hollow", + rightText: String(wallet.channels?.count ?? 0) + ) } + .accessibilityIdentifier("Channels") - // OTHER Section - VStack(alignment: .leading, spacing: 0) { - CaptionMText( - t("settings__adv__section_other") + NavigationLink(value: Route.node) { + SettingsRow( + title: t("settings__adv__lightning_node"), + iconName: "git-branch", + rightText: wallet.nodeId?.ellipsis(maxLength: 5, style: .end) ) - .padding(.top, 24) - .padding(.bottom, 8) - - NavigationLink(value: Route.addressViewer) { - SettingsListLabel(title: t("settings__adv__address_viewer")) - } - .accessibilityIdentifier("AddressViewer") - - // SettingsListLabel(title: t("settings__adv__rescan"), rightIcon: nil) + } + .accessibilityIdentifier("LightningNodeInfo") - Button(action: { - showingResetAlert = true - }) { - SettingsListLabel(title: t("settings__adv__suggestions_reset")) - } - .accessibilityIdentifier("ResetSuggestions") + NavigationLink(value: Route.electrumSettings) { + SettingsRow( + title: t("settings__adv__electrum_server"), + iconName: "hard-drives" + ) + } + .accessibilityIdentifier("ElectrumConfig") - Spacer() + NavigationLink(value: Route.rgsSettings) { + SettingsRow( + title: t("settings__adv__rgs_server"), + iconName: "broadcast" + ) } + .accessibilityIdentifier("RGSServer") } + .padding(.top, 16) + .padding(.horizontal, 16) + .bottomSafeAreaPadding() } } - .navigationBarHidden(true) - .padding(.horizontal, 16) - .bottomSafeAreaPadding() - .alert(t("settings__adv__reset_title"), isPresented: $showingResetAlert) { - Button(t("settings__adv__reset_confirm"), role: .destructive) { - suggestionsManager.resetDismissed() - navigation.reset() - } - .accessibilityIdentifier("DialogConfirm") - - Button(t("common__dialog_cancel"), role: .cancel) {} - .accessibilityIdentifier("DialogCancel") - } message: { - Text(t("settings__adv__reset_desc")) - } } } diff --git a/Bitkit/Views/Settings/Advanced/CoinSelectionSettingsView.swift b/Bitkit/Views/Settings/Advanced/CoinSelectionSettingsView.swift index b2587c31a..7a32a9b59 100644 --- a/Bitkit/Views/Settings/Advanced/CoinSelectionSettingsView.swift +++ b/Bitkit/Views/Settings/Advanced/CoinSelectionSettingsView.swift @@ -117,14 +117,12 @@ struct CoinSelectionSettingsView: View { var body: some View { VStack(alignment: .leading, spacing: 0) { NavigationBar(title: t("settings__adv__coin_selection")) - .padding(.bottom, 16) ScrollView(showsIndicators: false) { - VStack(spacing: 0) { + VStack(spacing: 32) { // COIN SELECTION METHOD Section VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("settings__adv__cs_method")) - .padding(.bottom, 8) + SettingsSectionHeader(t("settings__adv__cs_method")) VStack(spacing: 0) { ForEach(CoinSelectionMethod.allCases, id: \.self) { method in @@ -136,9 +134,7 @@ struct CoinSelectionSettingsView: View { settingsViewModel.coinSelectionMethod = method } - if method != CoinSelectionMethod.allCases.last { - Divider() - } + CustomDivider() } } } @@ -147,9 +143,7 @@ struct CoinSelectionSettingsView: View { // AUTOPILOT MODE Section (only show if Autopilot is selected) if settingsViewModel.coinSelectionMethod == .autopilot { VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("settings__adv__cs_auto_mode")) - .padding(.top, 24) - .padding(.bottom, 8) + SettingsSectionHeader(t("settings__adv__cs_auto_mode")) VStack(spacing: 0) { ForEach(CoinSelectionAlgorithm.supportedAlgorithms, id: \.self) { algorithm in @@ -165,16 +159,12 @@ struct CoinSelectionSettingsView: View { } } } - - // Add spacing at the bottom - Spacer() - .frame(height: 32) } + .padding(.horizontal, 16) + .bottomSafeAreaPadding() } } .navigationBarHidden(true) - .padding(.horizontal, 16) - .bottomSafeAreaPadding() } } diff --git a/Bitkit/Views/Settings/Advanced/LightningConnectionDetailView.swift b/Bitkit/Views/Settings/Advanced/LightningConnectionDetailView.swift index 661cce2f3..f2b7aff4c 100644 --- a/Bitkit/Views/Settings/Advanced/LightningConnectionDetailView.swift +++ b/Bitkit/Views/Settings/Advanced/LightningConnectionDetailView.swift @@ -66,12 +66,12 @@ struct LightningConnectionDetailView: View { ) .padding(.bottom, 28) - VStack(alignment: .leading, spacing: 32) { + VStack(alignment: .leading, spacing: 16) { // STATUS Section - VStack(alignment: .leading, spacing: 16) { - Divider() + VStack(alignment: .leading, spacing: 0) { + CustomDivider() - CaptionMText(t("lightning__status")) + SettingsSectionHeader(t("lightning__status")) HStack(alignment: .center, spacing: 8) { let status = detailedStatus(for: channel) @@ -84,15 +84,15 @@ struct LightningConnectionDetailView: View { BodyMSBText(status.text, textColor: status.color) } + .padding(.bottom, 16) - Divider() + CustomDivider() } // ORDER DETAILS Section if let order = channelDetails.linkedOrder { VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("lightning__order_details")) - .padding(.bottom, 16) + SettingsSectionHeader(t("lightning__order_details")) DetailRow(label: t("lightning__order"), value: order.id) @@ -116,8 +116,7 @@ struct LightningConnectionDetailView: View { // BALANCE Section VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("lightning__balance")) - .padding(.bottom, 16) + SettingsSectionHeader(t("lightning__balance")) DetailRowWithAmount( label: t("lightning__receiving_label"), @@ -140,49 +139,45 @@ struct LightningConnectionDetailView: View { // FEES Section VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("lightning__fees")) - .padding(.bottom, 16) - + SettingsSectionHeader(t("lightning__fees")) DetailRowWithAmount(label: t("lightning__base_fee"), amount: UInt64(channel.forwardingFeeBaseMsat / 1000)) DetailRow(label: t("lightning__fee_rate"), value: "\(channel.forwardingFeeProportionalMillionths) ppm") } // OTHER Section - VStack(alignment: .leading, spacing: 16) { - CaptionMText(t("lightning__other")) - - VStack(spacing: 0) { - DetailRow( - label: t("lightning__is_usable"), - value: channel.isUsable ? t("common__yes") : t("common__no"), - valueTestId: channel.isUsable ? "IsUsableYes" : "IsUsableNo" - ) + VStack(alignment: .leading, spacing: 0) { + SettingsSectionHeader(t("lightning__other")) - // TODO: Add channel opening date - // if let formattedDate = formatDate(channel.fundingTxo) { - // DetailRow(label: t("lightning__opened_on"), value: formattedDate) - // } + DetailRow( + label: t("lightning__is_usable"), + value: channel.isUsable ? t("common__yes") : t("common__no"), + valueTestId: channel.isUsable ? "IsUsableYes" : "IsUsableNo" + ) - if let closedAt = channel.displayedClosedAt { - if let formattedCloseDate = formatDate(closedAt) { - DetailRow(label: t("lightning__closed_on"), value: formattedCloseDate) - } + // TODO: Add channel opening date + // if let formattedDate = formatDate(channel.fundingTxo) { + // DetailRow(label: t("lightning__opened_on"), value: formattedDate) + // } + + if let closedAt = channel.displayedClosedAt { + if let formattedCloseDate = formatDate(closedAt) { + DetailRow(label: t("lightning__closed_on"), value: formattedCloseDate) } + } - DetailRow(label: t("lightning__channel_id"), value: channel.channelIdString) + DetailRow(label: t("lightning__channel_id"), value: channel.channelIdString) - if let txid = channel.displayedFundingTxoTxid, let vout = channel.fundingTxoVout { - DetailRow(label: t("lightning__channel_point"), value: "\(txid):\(vout)") - } + if let txid = channel.displayedFundingTxoTxid, let vout = channel.fundingTxoVout { + DetailRow(label: t("lightning__channel_point"), value: "\(txid):\(vout)") + } - DetailRow( - label: t("lightning__channel_node_id"), - value: channel.counterpartyNodeIdString - ) + DetailRow( + label: t("lightning__channel_node_id"), + value: channel.counterpartyNodeIdString + ) - if let reason = channel.closureReason { - DetailRow(label: t("lightning__closure_reason"), value: reason) - } + if let reason = channel.closureReason { + DetailRow(label: t("lightning__closure_reason"), value: reason) } } } @@ -352,7 +347,7 @@ struct LightningConnectionDetailView: View { .frame(height: 50) } - Divider() + CustomDivider() } .frame(height: 51) } @@ -371,7 +366,7 @@ struct LightningConnectionDetailView: View { .frame(height: 50) } - Divider() + CustomDivider() } .frame(height: 51) } diff --git a/Bitkit/Views/Settings/Advanced/LightningConnectionsView.swift b/Bitkit/Views/Settings/Advanced/LightningConnectionsView.swift index 318783829..1cd390ad2 100644 --- a/Bitkit/Views/Settings/Advanced/LightningConnectionsView.swift +++ b/Bitkit/Views/Settings/Advanced/LightningConnectionsView.swift @@ -61,14 +61,13 @@ struct LightningConnectionsView: View { } .padding(.bottom, 16) - Divider() + CustomDivider() // Pending Connections section if !pendingConnections.isEmpty { - VStack(alignment: .leading, spacing: 16) { - CaptionMText(t("lightning__conn_pending")) - .padding(.top, 16) + SettingsSectionHeader(t("lightning__conn_pending")) + VStack(alignment: .leading, spacing: 16) { ForEach(Array(pendingConnections.enumerated()), id: \.element.channelId) { index, channel in let labelIndex = pendingConnections.count - index Button { @@ -93,7 +92,7 @@ struct LightningConnectionsView: View { ) .padding(.bottom, 16) - Divider() + CustomDivider() } } .buttonStyle(PlainButtonStyle()) @@ -105,10 +104,9 @@ struct LightningConnectionsView: View { // Open Connections section if !openChannels.isEmpty { - VStack(alignment: .leading, spacing: 16) { - CaptionMText(t("lightning__conn_open")) - .padding(.top, 16) + SettingsSectionHeader(t("lightning__conn_open")) + VStack(alignment: .leading, spacing: 16) { ForEach(Array(openChannels.enumerated()), id: \.element.channelId) { index, channel in let labelIndex = openChannels.count - index Button { @@ -133,7 +131,7 @@ struct LightningConnectionsView: View { ) .padding(.bottom, 16) - Divider() + CustomDivider() } .opacity((!channel.isChannelReady || !channel.isUsable) ? 0.64 : 1.0) } @@ -144,10 +142,9 @@ struct LightningConnectionsView: View { // Closed Connections section if showClosedConnections && !closedChannels.isEmpty { - VStack(alignment: .leading, spacing: 16) { - CaptionMText(t("lightning__conn_closed")) - .padding(.top, 16) + SettingsSectionHeader(t("lightning__conn_closed")) + VStack(alignment: .leading, spacing: 16) { ForEach(Array(closedChannels.enumerated()), id: \.element.channelId) { index, channel in let labelIndex = closedChannels.count - index Button { @@ -172,7 +169,7 @@ struct LightningConnectionsView: View { ) .padding(.bottom, 16) - Divider() + CustomDivider() } .opacity(0.64) } @@ -196,7 +193,6 @@ struct LightningConnectionsView: View { } Spacer() - // .frame(height: 32) HStack(spacing: 16) { CustomButton(title: t("lightning__conn_button_export_logs"), variant: .secondary) { diff --git a/Bitkit/Views/Settings/AppStatusView.swift b/Bitkit/Views/Settings/AppStatusView.swift index 7cc129760..daa2e0699 100644 --- a/Bitkit/Views/Settings/AppStatusView.swift +++ b/Bitkit/Views/Settings/AppStatusView.swift @@ -159,7 +159,7 @@ struct AppStatusView: View { description: description, status: status, onTap: { - navigation.navigate(.backupSettings) + navigation.navigate(.dataBackups) } ) .accessibilityIdentifier("Status-backup") diff --git a/Bitkit/Views/Settings/BlocktankRegtestView.swift b/Bitkit/Views/Settings/BlocktankRegtestView.swift index 53176c339..130ed77b3 100644 --- a/Bitkit/Views/Settings/BlocktankRegtestView.swift +++ b/Bitkit/Views/Settings/BlocktankRegtestView.swift @@ -1,57 +1,41 @@ import SwiftUI -struct RegtestButton: View { - let title: String - let action: () async throws -> Void - - @EnvironmentObject var app: AppViewModel - @State private var isLoading = false - - var body: some View { - Button(isLoading ? "Loading..." : title) { - isLoading = true - Task { - do { - try await action() - } catch { - Logger.error("Regtest action failed: \(error.localizedDescription)", context: "BlocktankRegtestView") - app.toast(type: .error, title: "Regtest action failed: \(error.localizedDescription)") - } - isLoading = false - } - } - .disabled(isLoading) - .opacity(isLoading ? 0.5 : 1) - } -} - -struct BlocktankRegtestView: View { +struct BlocktankRegtestScreen: View { @EnvironmentObject var app: AppViewModel @EnvironmentObject var wallet: WalletViewModel + @State private var result: String = "" - @State private var mineBlockCount: String = "1" + @State private var selectedMineBlockCount: Int = 1 @State private var depositAmount: String = "100000" @State private var depositAddress: String = "" @State private var paymentInvoice: String = "" @State private var paymentAmount: String = "" @State private var forceCloseAfterSeconds: String = "" @State private var showingResult = false + @State private var isDepositLoading = false + @State private var isMiningLoading = false + @State private var isPayInvoiceLoading = false + @State private var isClosingChannelLoading = false + + private let mineBlockOptions = [1, 3, 20, 144] var body: some View { VStack(alignment: .leading, spacing: 0) { NavigationBar(title: "Blocktank Regtest") .padding(.horizontal, 16) - List { - serverInfoSection - depositSection - miningSection - lightningPaymentSection - channelCloseSection + ScrollView(showsIndicators: false) { + VStack(alignment: .leading, spacing: 16) { + depositSection + miningSection + lightningPaymentSection + channelCloseSection + } + .padding(.horizontal, 16) + .bottomSafeAreaPadding() } } .navigationBarHidden(true) - .bottomSafeAreaPadding() .onAppear { // Generate a fresh address when the view appears Task { @@ -66,190 +50,207 @@ struct BlocktankRegtestView: View { } } - var serverInfoSection: some View { - Section { - Text(Env.blocktankClientServer) - } footer: { - Text("These actions are executed on the staging Blocktank server node.") - } - } - var depositSection: some View { - Section { - HStack { - TextField("Address", text: $depositAddress) - .lineLimit(1) - .truncationMode(.middle) + VStack(alignment: .leading, spacing: 0) { + SettingsSectionHeader("Deposit") - Button { - if let string = UIPasteboard.general.string { - depositAddress = string - } - } label: { - Image(systemName: "doc.on.clipboard") - } + VStack(alignment: .leading, spacing: 8) { + HStack { + TextField("Address", text: $depositAddress) + .lineLimit(1) + .truncationMode(.middle) - Button { - Task { - do { - let newAddress = try await LightningService.shared.newAddress() - depositAddress = newAddress - } catch { - app.toast(type: .error, title: "Failed to generate address", description: error.localizedDescription) + Button { + if let string = UIPasteboard.general.string { + depositAddress = string } + } label: { + Image(systemName: "doc.on.clipboard") } - } label: { - Image(systemName: "arrow.clockwise") - } - } - - TextField("Amount (sats)", text: $depositAmount) - .keyboardType(.numberPad) - RegtestButton(title: "Make Deposit") { - Logger.debug("Initiating regtest deposit with amount: \(depositAmount)", context: "BlocktankRegtestView") - guard let amount = UInt64(depositAmount) else { - Logger.error("Invalid deposit amount: \(depositAmount)", context: "BlocktankRegtestView") - throw ValidationError("Invalid amount") + Button { + Task { + do { + let newAddress = try await LightningService.shared.newAddress() + depositAddress = newAddress + } catch { + app.toast(type: .error, title: "Failed to generate address", description: error.localizedDescription) + } + } + } label: { + Image(systemName: "arrow.clockwise") + } } - // Generate a new address for each deposit - let newAddress = try await LightningService.shared.newAddress() - Logger.debug("Generated new address for deposit: \(newAddress)", context: "BlocktankRegtestView") - - let txId = try await CoreService.shared.blocktank.regtestDepositFunds( - address: newAddress, - amountSat: amount - ) - Logger.debug("Deposit successful with txId: \(txId)", context: "BlocktankRegtestView") - app.toast(type: .success, title: "Success", description: "Deposit successful. TxID: \(txId)") + TextField("Amount (sats)", text: $depositAmount) + .keyboardType(.numberPad) - // Update the displayed address to the new one - depositAddress = newAddress + CustomButton(title: "Deposit", size: .small, isDisabled: depositAmount.isEmpty, isLoading: isDepositLoading) { + isDepositLoading = true + defer { isDepositLoading = false } + do { + Logger.debug("Initiating regtest deposit with amount: \(depositAmount)", context: "BlocktankRegtestScreen") + guard let amount = UInt64(depositAmount) else { + Logger.error("Invalid deposit amount: \(depositAmount)", context: "BlocktankRegtestScreen") + throw ValidationError("Invalid amount") + } - // Sync wallet after deposit without waiting - Task { - try? await wallet.sync() + let newAddress = try await LightningService.shared.newAddress() + Logger.debug("Generated new address for deposit: \(newAddress)", context: "BlocktankRegtestScreen") + + let txId = try await CoreService.shared.blocktank.regtestDepositFunds( + address: newAddress, + amountSat: amount + ) + Logger.debug("Deposit successful with txId: \(txId)", context: "BlocktankRegtestScreen") + app.toast(type: .success, title: "Success", description: "Deposit successful. TxID: \(txId)") + depositAddress = newAddress + Task { try? await wallet.sync() } + } catch { + Logger.error("Regtest action failed: \(error.localizedDescription)", context: "BlocktankRegtestScreen") + app.toast(type: .error, title: "Regtest action failed: \(error.localizedDescription)") + } } } - .disabled(depositAmount.isEmpty) - .tint(.orange) - } header: { - Text("Deposit") } } var miningSection: some View { - Section { - HStack { - TextField("Block count", text: $mineBlockCount) - .keyboardType(.numberPad) - - RegtestButton(title: "Mine Blocks") { - Logger.debug("Starting regtest mining with block count: \(mineBlockCount)", context: "BlocktankRegtestView") - guard let count = UInt32(mineBlockCount) else { - Logger.error("Invalid block count: \(mineBlockCount)", context: "BlocktankRegtestView") - throw ValidationError("Invalid block count") + VStack(alignment: .leading, spacing: 0) { + SettingsSectionHeader("Mining") + + VStack(alignment: .leading, spacing: 8) { + HStack(spacing: 8) { + ForEach(mineBlockOptions, id: \.self) { count in + Button { + selectedMineBlockCount = count + } label: { + BodyMSBText("\(count)", textColor: selectedMineBlockCount == count ? .white : .textSecondary) + .frame(maxWidth: .infinity) + .padding(.vertical, 10) + .background(selectedMineBlockCount == count ? Color.brandAccent : Color.white10) + .cornerRadius(8) + } + .buttonStyle(PlainButtonStyle()) } - try await CoreService.shared.blocktank.regtestMineBlocks(count) - Logger.debug("Successfully mined \(count) blocks", context: "BlocktankRegtestView") - app.toast(type: .success, title: "Success", description: "Successfully mined \(count) blocks") + } - // Sync wallet after mining blocks without waiting - Task { - try? await wallet.sync() + CustomButton(title: "Mine Blocks", size: .small, isDisabled: selectedMineBlockCount == 0, isLoading: isMiningLoading) { + isMiningLoading = true + defer { isMiningLoading = false } + do { + let count = UInt32(selectedMineBlockCount) + Logger.debug("Starting regtest mining with block count: \(count)", context: "BlocktankRegtestScreen") + try await CoreService.shared.blocktank.regtestMineBlocks(count) + Logger.debug("Successfully mined \(count) blocks", context: "BlocktankRegtestScreen") + app.toast(type: .success, title: "Success", description: "Successfully mined \(count) blocks") + Task { try? await wallet.sync() } + } catch { + Logger.error("Regtest action failed: \(error.localizedDescription)", context: "BlocktankRegtestScreen") + app.toast(type: .error, title: "Regtest action failed: \(error.localizedDescription)") } } - .tint(.orange) } - } header: { - Text("Mining") } } var lightningPaymentSection: some View { - Section { - HStack { - TextField("Invoice", text: $paymentInvoice) + VStack(alignment: .leading, spacing: 0) { + SettingsSectionHeader("Lightning Payment") + + VStack(alignment: .leading, spacing: 8) { + HStack { + TextField("Invoice", text: $paymentInvoice) - Button { - if let string = UIPasteboard.general.string { - paymentInvoice = string + Button { + if let string = UIPasteboard.general.string { + paymentInvoice = string + } + } label: { + Image(systemName: "doc.on.clipboard") } - } label: { - Image(systemName: "doc.on.clipboard") } - } - TextField("Amount (optional, sats)", text: $paymentAmount) - .keyboardType(.numberPad) + TextField("Amount (optional, sats)", text: $paymentAmount) + .keyboardType(.numberPad) - RegtestButton(title: "Pay Invoice") { - Logger.debug("Initiating regtest payment with invoice: \(paymentInvoice), amount: \(paymentAmount)", context: "BlocktankRegtestView") - let amount = paymentAmount.isEmpty ? nil : UInt64(paymentAmount) ?? 0 - let paymentId = try await CoreService.shared.blocktank.regtestPayInvoice(paymentInvoice, amountSat: amount) - Logger.debug("Payment successful with ID: \(paymentId)", context: "BlocktankRegtestView") - app.toast(type: .success, title: "Success", description: "Payment successful. ID: \(paymentId)") + CustomButton(title: "Pay Invoice", size: .small, isDisabled: paymentInvoice.isEmpty, isLoading: isPayInvoiceLoading) { + isPayInvoiceLoading = true + defer { isPayInvoiceLoading = false } + do { + Logger.debug( + "Initiating regtest payment with invoice: \(paymentInvoice), amount: \(paymentAmount)", + context: "BlocktankRegtestScreen" + ) + let amount = paymentAmount.isEmpty ? nil : UInt64(paymentAmount) ?? 0 + let paymentId = try await CoreService.shared.blocktank.regtestPayInvoice(paymentInvoice, amountSat: amount) + Logger.debug("Payment successful with ID: \(paymentId)", context: "BlocktankRegtestScreen") + app.toast(type: .success, title: "Success", description: "Payment successful. ID: \(paymentId)") + } catch { + Logger.error("Regtest action failed: \(error.localizedDescription)", context: "BlocktankRegtestScreen") + app.toast(type: .error, title: "Regtest action failed: \(error.localizedDescription)") + } + } } - .disabled(paymentInvoice.isEmpty) - .tint(.orange) - } header: { - Text("Lightning Payment") } } var channelCloseSection: some View { - Section { - TextField("Force close after (seconds)", text: $forceCloseAfterSeconds) - .keyboardType(.numberPad) - - if let channels = wallet.channels, !channels.isEmpty { - ForEach(channels, id: \.channelId) { channel in - VStack(alignment: .leading) { - Text(channel.channelId) - .font(.caption) - - Text("Ready: \(channel.isChannelReady ? "✅" : "❌")") - Text("Usable: \(channel.isUsable ? "✅" : "❌")") - - RegtestButton(title: "Close This Channel") { - Logger.debug("Closing channel: \(channel.channelId)", context: "BlocktankRegtestView") - - let closeAfter = forceCloseAfterSeconds.isEmpty ? nil : UInt64(forceCloseAfterSeconds) + VStack(alignment: .leading, spacing: 0) { + SettingsSectionHeader("Channel close from Blocktank side") - let closingTxId = try await CoreService.shared.blocktank.regtestRemoteCloseChannel( - channel: channel, - forceCloseAfterSeconds: closeAfter - ) + VStack(alignment: .leading, spacing: 8) { + TextField("Force close after (seconds)", text: $forceCloseAfterSeconds) + .keyboardType(.numberPad) - Logger.debug("Channel closed successfully with txId: \(closingTxId)", context: "BlocktankRegtestView") - app.toast(type: .success, title: "Success", description: "Channel closed. Closing TxID: \(closingTxId)") + if let channels = wallet.channels, !channels.isEmpty { + ForEach(channels, id: \.channelId) { channel in + VStack(alignment: .leading) { + CaptionMText(channel.channelId, textColor: .textSecondary) + + HStack(spacing: 6) { + BodyMText("Ready:", textColor: .textPrimary) + Image(systemName: channel.isChannelReady ? "checkmark.circle.fill" : "xmark.circle.fill") + .font(.system(size: 17)) + .foregroundColor(channel.isChannelReady ? .greenAccent : .redAccent) + } + HStack(spacing: 6) { + BodyMText("Usable:", textColor: .textPrimary) + Image(systemName: channel.isUsable ? "checkmark.circle.fill" : "xmark.circle.fill") + .font(.system(size: 17)) + .foregroundColor(channel.isUsable ? .greenAccent : .redAccent) + } + + CustomButton(title: "Close This Channel", size: .small, isDisabled: false, isLoading: isClosingChannelLoading) { + isClosingChannelLoading = true + defer { isClosingChannelLoading = false } + do { + Logger.debug("Closing channel: \(channel.channelId)", context: "BlocktankRegtestScreen") + let closeAfter = forceCloseAfterSeconds.isEmpty ? nil : UInt64(forceCloseAfterSeconds) + let closingTxId = try await CoreService.shared.blocktank.regtestRemoteCloseChannel( + channel: channel, + forceCloseAfterSeconds: closeAfter + ) + Logger.debug("Channel closed successfully with txId: \(closingTxId)", context: "BlocktankRegtestScreen") + app.toast(type: .success, title: "Success", description: "Channel closed. Closing TxID: \(closingTxId)") + } catch { + Logger.error("Regtest action failed: \(error.localizedDescription)", context: "BlocktankRegtestScreen") + app.toast(type: .error, title: "Regtest action failed: \(error.localizedDescription)") + } + } + .padding(.top, 8) } - .tint(.red) - .padding(.top, 8) + .padding(.vertical, 4) } - .padding(.vertical, 4) + } else { + BodyMText("No channels available") + .padding(.vertical, 8) } - } else { - Text("No channels available") - .foregroundColor(.secondary) - .padding(.vertical, 8) } - } header: { - Text("Channel close from Blocktank side") } } } -#Preview { - NavigationStack { - BlocktankRegtestView() - .environmentObject(AppViewModel()) - .environmentObject(WalletViewModel()) - } - .preferredColorScheme(.dark) -} - private struct ValidationError: LocalizedError { let message: String diff --git a/Bitkit/Views/Settings/DevSettingsView.swift b/Bitkit/Views/Settings/DevSettingsView.swift index 73e4d2756..0e3544b1d 100644 --- a/Bitkit/Views/Settings/DevSettingsView.swift +++ b/Bitkit/Views/Settings/DevSettingsView.swift @@ -18,12 +18,12 @@ struct DevSettingsView: View { VStack(alignment: .leading, spacing: 0) { if Env.network == .regtest { NavigationLink(value: Route.blocktankRegtest) { - SettingsListLabel(title: "Blocktank Regtest") + SettingsRow(title: "Blocktank Regtest") } } if Env.network == .regtest { - SettingsListLabel( + SettingsRow( title: "Override Fees", rightIcon: nil, toggle: $feeEstimatesManager.devOverrideFeeEstimates @@ -31,19 +31,19 @@ struct DevSettingsView: View { } NavigationLink(value: Route.ldkDebug) { - SettingsListLabel(title: "LDK") + SettingsRow(title: "LDK") } NavigationLink(value: Route.vssDebug) { - SettingsListLabel(title: "VSS") + SettingsRow(title: "VSS") } NavigationLink(value: Route.probingTool) { - SettingsListLabel(title: "Probing Tool") + SettingsRow(title: "Probing Tool") } NavigationLink(value: Route.orders) { - SettingsListLabel(title: "Orders") + SettingsRow(title: "Orders") } Button { @@ -57,7 +57,7 @@ struct DevSettingsView: View { } } } label: { - SettingsListLabel(title: "Generate Test Activities", rightIcon: nil) + SettingsRow(title: "Generate Test Activities", rightIcon: nil) } Button { @@ -71,11 +71,11 @@ struct DevSettingsView: View { } } } label: { - SettingsListLabel(title: "Reset All Activities", rightIcon: nil) + SettingsRow(title: "Reset All Activities", rightIcon: nil) } NavigationLink(value: Route.logs) { - SettingsListLabel(title: "Show Logs") + SettingsRow(title: "Show Logs") } Button { @@ -100,7 +100,7 @@ struct DevSettingsView: View { } } } label: { - SettingsListLabel(title: "Export Logs", rightIcon: nil) + SettingsRow(title: "Export Logs", rightIcon: nil) } Button { @@ -117,13 +117,13 @@ struct DevSettingsView: View { } } } label: { - SettingsListLabel(title: "Test Push Notification", rightIcon: nil) + SettingsRow(title: "Test Push Notification", rightIcon: nil) } Button { fatalError("Simulate Crash") } label: { - SettingsListLabel(title: "Simulate Crash", rightIcon: nil) + SettingsRow(title: "Simulate Crash", rightIcon: nil) } Button { @@ -139,7 +139,7 @@ struct DevSettingsView: View { } } } label: { - SettingsListLabel(title: "Wipe Wallet", rightIcon: nil) + SettingsRow(title: "Wipe Wallet", rightIcon: nil) } } .padding(.horizontal, 16) diff --git a/Bitkit/Views/Settings/General/DefaultUnitSettingsView.swift b/Bitkit/Views/Settings/General/DefaultUnitSettingsView.swift index e5d2b53e4..6a8efe7f0 100644 --- a/Bitkit/Views/Settings/General/DefaultUnitSettingsView.swift +++ b/Bitkit/Views/Settings/General/DefaultUnitSettingsView.swift @@ -6,64 +6,61 @@ struct DefaultUnitSettingsView: View { var body: some View { VStack(alignment: .leading, spacing: 0) { NavigationBar(title: t("settings__general__unit_title")) + .padding(.horizontal, 16) ScrollView(showsIndicators: false) { - VStack(alignment: .leading, spacing: 8) { - CaptionMText(t("settings__general__unit_display")) - .padding(.vertical, 16) - .frame(maxWidth: .infinity, alignment: .leading) + VStack(alignment: .leading, spacing: 0) { + SettingsSectionHeader(t("settings__general__unit_display")) Button(action: { currency.primaryDisplay = .bitcoin }) { - SettingsListLabel( + SettingsRow( title: t("settings__general__unit_bitcoin"), iconName: "b-unit", + iconColor: .textPrimary, rightIcon: currency.primaryDisplay == .bitcoin ? .checkmark : nil ) } - .buttonStyle(PlainButtonStyle()) if let rate = currency.convert(sats: 1)?.currency { Button(action: { currency.primaryDisplay = .fiat }) { - SettingsListLabel( + SettingsRow( title: rate, iconName: "globe", + iconColor: .textPrimary, rightIcon: currency.primaryDisplay == .fiat ? .checkmark : nil ) } - .buttonStyle(PlainButtonStyle()) } BodyMText(t("settings__general__unit_note", variables: ["currency": currency.selectedCurrency])) .padding(.vertical, 16) - } - VStack(alignment: .leading, spacing: 8) { - CaptionMText(t("settings__general__denomination_label")) - .padding(.vertical, 16) - .frame(maxWidth: .infinity, alignment: .leading) + CustomDivider() + + SettingsSectionHeader(t("settings__general__denomination_label")) + .padding(.top, 16) ForEach(BitcoinDisplayUnit.allCases, id: \.self) { unit in Button(action: { currency.displayUnit = unit }) { - SettingsListLabel( + SettingsRow( title: t("settings__general__denomination_\(unit.rawValue)"), rightIcon: currency.displayUnit == unit ? .checkmark : nil ) } - .buttonStyle(PlainButtonStyle()) .accessibilityIdentifier(unit.testIdentifier) } } + .padding(.horizontal, 16) + .bottomSafeAreaPadding() } } .navigationBarHidden(true) - .padding(.horizontal, 16) - .bottomSafeAreaPadding() } } diff --git a/Bitkit/Views/Settings/General/LanguageSettingsScreen.swift b/Bitkit/Views/Settings/General/LanguageSettingsScreen.swift index d6c0a4957..97d58429d 100644 --- a/Bitkit/Views/Settings/General/LanguageSettingsScreen.swift +++ b/Bitkit/Views/Settings/General/LanguageSettingsScreen.swift @@ -8,7 +8,7 @@ struct LanguageSettingsScreen: View { Button(action: { selectLanguage(language) }) { - SettingsListLabel( + SettingsRow( title: language.name, rightIcon: languageManager.currentLanguage.code == language.code ? .checkmark : nil ) @@ -26,22 +26,21 @@ struct LanguageSettingsScreen: View { var body: some View { VStack(alignment: .leading, spacing: 0) { NavigationBar(title: t("settings__general__language_title")) + .padding(.horizontal, 16) ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("settings__general__language_other")) - .padding(.vertical, 16) - .frame(maxWidth: .infinity, alignment: .leading) + SettingsSectionHeader(t("settings__general__language_other")) ForEach(SupportedLanguage.allLanguages, id: \.id) { language in languageRow(language) } } + .padding(.horizontal, 16) + .bottomSafeAreaPadding() } } .navigationBarHidden(true) - .padding(.horizontal, 16) - .bottomSafeAreaPadding() .alert("Language Changed", isPresented: $showAlert) { Button("OK", role: .cancel) {} } message: { diff --git a/Bitkit/Views/Settings/General/LocalCurrencySettingsView.swift b/Bitkit/Views/Settings/General/LocalCurrencySettingsView.swift index d92f79e3f..a6144fa5a 100644 --- a/Bitkit/Views/Settings/General/LocalCurrencySettingsView.swift +++ b/Bitkit/Views/Settings/General/LocalCurrencySettingsView.swift @@ -2,6 +2,8 @@ import SwiftUI struct LocalCurrencySettingsView: View { @EnvironmentObject var currency: CurrencyViewModel + @EnvironmentObject var navigation: NavigationViewModel + @State private var searchText = "" private let mostUsedCurrencies = ["USD", "GBP", "CAD", "CNY", "EUR"] @@ -25,7 +27,7 @@ struct LocalCurrencySettingsView: View { } private func currencyRow(_ rate: FxRate) -> some View { - SettingsListLabel( + SettingsRow( title: "\(rate.quote) (\(rate.currencySymbol))", rightIcon: currency.selectedCurrency == rate.quote ? .checkmark : nil, testIdentifier: "Currency-\(rate.quote)" @@ -35,6 +37,7 @@ struct LocalCurrencySettingsView: View { currency.selectedCurrency = rate.quote Task { await currency.refresh() + navigation.navigateBack() } } .accessibilityAddTraits(.isButton) @@ -64,10 +67,7 @@ struct LocalCurrencySettingsView: View { ScrollView(showsIndicators: false) { if !availableMostUsed.isEmpty { VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("settings__general__currency_most_used")) - .padding(.top, 16) - .padding(.bottom, 8) - .frame(maxWidth: .infinity, alignment: .leading) + SettingsSectionHeader(t("settings__general__currency_most_used")) ForEach(availableMostUsed, id: \.quote) { rate in currencyRow(rate) @@ -76,15 +76,13 @@ struct LocalCurrencySettingsView: View { } VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("settings__general__currency_other")) - .padding(.top, 24) - .padding(.bottom, 8) - .frame(maxWidth: .infinity, alignment: .leading) + SettingsSectionHeader(t("settings__general__currency_other")) ForEach(otherCurrencies, id: \.quote) { rate in currencyRow(rate) } } + .padding(.top, 16) CaptionText(t("settings__general__currency_footer")) .padding(.top, 16) diff --git a/Bitkit/Views/Settings/General/TagSettingsView.swift b/Bitkit/Views/Settings/General/TagSettingsView.swift index e9601854e..61ec7bc61 100644 --- a/Bitkit/Views/Settings/General/TagSettingsView.swift +++ b/Bitkit/Views/Settings/General/TagSettingsView.swift @@ -1,18 +1,16 @@ import SwiftUI struct TagSettingsView: View { - @EnvironmentObject var app: AppViewModel @EnvironmentObject var tagManager: TagManager var body: some View { VStack(alignment: .leading, spacing: 0) { NavigationBar(title: t("settings__general__tags")) + .padding(.horizontal, 16) ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("settings__general__tags_previously")) - .padding(.top, 24) - .padding(.bottom, 16) + SettingsSectionHeader(t("settings__general__tags_previously")) TagsListView( tags: tagManager.lastUsedTags, @@ -22,10 +20,10 @@ struct TagSettingsView: View { } ) } + .padding(.horizontal, 16) + .bottomSafeAreaPadding() } } .navigationBarHidden(true) - .padding(.horizontal, 16) - .bottomSafeAreaPadding() } } diff --git a/Bitkit/Views/Settings/General/WidgetsSettingsScreen.swift b/Bitkit/Views/Settings/General/WidgetsSettingsScreen.swift new file mode 100644 index 000000000..c60e42ca1 --- /dev/null +++ b/Bitkit/Views/Settings/General/WidgetsSettingsScreen.swift @@ -0,0 +1,82 @@ +import SwiftUI + +struct WidgetsSettingsScreen: View { + @EnvironmentObject var navigation: NavigationViewModel + @EnvironmentObject var settings: SettingsViewModel + @EnvironmentObject var suggestionsManager: SuggestionsManager + @EnvironmentObject var widgets: WidgetsViewModel + + @State private var showWidgetsResetAlert = false + @State private var showSuggestionsResetAlert = false + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + NavigationBar(title: t("settings__widgets__nav_title")) + .padding(.horizontal, 16) + + ScrollView(showsIndicators: false) { + VStack(alignment: .leading, spacing: 0) { + SettingsSectionHeader(t("settings__widgets__section_display")) + + SettingsRow( + title: t("settings__widgets__showWidgets"), + toggle: $settings.showWidgets + ) + + SettingsRow( + title: t("settings__widgets__showWidgetTitles"), + toggle: $settings.showWidgetTitles + ) + + SettingsSectionHeader(t("settings__widgets__section_reset")) + .padding(.top, 16) + + Button(action: { + showWidgetsResetAlert = true + }) { + SettingsRow( + title: t("settings__widgets__reset_widgets"), + iconName: "arrow-counter-clockwise" + ) + } + + Button(action: { + showSuggestionsResetAlert = true + }) { + SettingsRow( + title: t("settings__widgets__reset_suggestions"), + iconName: "arrow-counter-clockwise" + ) + } + } + .padding(.horizontal, 16) + .bottomSafeAreaPadding() + } + } + .navigationBarHidden(true) + .alert(t("settings__widgets__reset_widgets_dialog_title"), isPresented: $showWidgetsResetAlert) { + Button(t("settings__adv__reset_confirm"), role: .destructive) { + widgets.clearWidgets() + navigation.reset() + } + .accessibilityIdentifier("DialogConfirm") + + Button(t("common__dialog_cancel"), role: .cancel) {} + .accessibilityIdentifier("DialogCancel") + } message: { + Text(t("settings__widgets__reset_widgets_dialog_description")) + } + .alert(t("settings__adv__reset_title"), isPresented: $showSuggestionsResetAlert) { + Button(t("settings__adv__reset_confirm"), role: .destructive) { + suggestionsManager.resetDismissed() + navigation.reset() + } + .accessibilityIdentifier("DialogConfirm") + + Button(t("common__dialog_cancel"), role: .cancel) {} + .accessibilityIdentifier("DialogCancel") + } message: { + Text(t("settings__adv__reset_desc")) + } + } +} diff --git a/Bitkit/Views/Settings/General/WidgetsSettingsView.swift b/Bitkit/Views/Settings/General/WidgetsSettingsView.swift deleted file mode 100644 index 30e5a99b2..000000000 --- a/Bitkit/Views/Settings/General/WidgetsSettingsView.swift +++ /dev/null @@ -1,37 +0,0 @@ -import SwiftUI - -struct WidgetsSettingsView: View { - @EnvironmentObject var settings: SettingsViewModel - - var body: some View { - VStack(alignment: .leading, spacing: 0) { - NavigationBar(title: t("settings__widgets__nav_title")) - .padding(.horizontal, 16) - - ScrollView(showsIndicators: false) { - VStack(alignment: .leading, spacing: 0) { - SettingsListLabel( - title: t("settings__widgets__showWidgets"), - toggle: $settings.showWidgets - ) - - SettingsListLabel( - title: t("settings__widgets__showWidgetTitles"), - toggle: $settings.showWidgetTitles - ) - } - .padding(.horizontal, 16) - .bottomSafeAreaPadding() - } - } - .navigationBarHidden(true) - } -} - -#Preview { - NavigationView { - WidgetsSettingsView() - .environmentObject(SettingsViewModel.shared) - } - .preferredColorScheme(.dark) -} diff --git a/Bitkit/Views/Settings/GeneralSettingsView.swift b/Bitkit/Views/Settings/GeneralSettingsView.swift index 454d14e84..ccbc84f53 100644 --- a/Bitkit/Views/Settings/GeneralSettingsView.swift +++ b/Bitkit/Views/Settings/GeneralSettingsView.swift @@ -8,82 +8,93 @@ struct GeneralSettingsView: View { @StateObject private var languageManager = LanguageManager.shared var body: some View { - VStack(alignment: .leading, spacing: 0) { - NavigationBar(title: t("settings__general_title")) + ScrollView(showsIndicators: false) { + VStack(alignment: .leading, spacing: 0) { + // Interface section + SettingsSectionHeader(t("settings__general__section_interface")) - ScrollView(showsIndicators: false) { - VStack(alignment: .leading, spacing: 0) { - NavigationLink(value: Route.languageSettings) { - SettingsListLabel( - title: t("settings__general__language"), - rightText: languageManager.currentLanguageDisplayName - ) - } + NavigationLink(value: Route.languageSettings) { + SettingsRow( + title: t("settings__general__language"), + iconName: "translate", + rightText: languageManager.currentLanguageDisplayName + ) + } - NavigationLink(value: Route.currencySettings) { - SettingsListLabel( - title: t("settings__general__currency_local"), - rightText: currency.selectedCurrency - ) - } - .accessibilityIdentifier("CurrenciesSettings") + NavigationLink(value: Route.currencySettings) { + SettingsRow( + title: t("settings__general__currency_local"), + iconName: "coins", + rightText: "\(currency.selectedCurrency) (\(currency.symbol))" + ) + } + .accessibilityIdentifier("CurrenciesSettings") - NavigationLink(value: Route.unitSettings) { - SettingsListLabel( - title: t("settings__general__unit"), - rightText: currency.primaryDisplay == .bitcoin ? currency.primaryDisplay.rawValue : currency.selectedCurrency - ) - } - .accessibilityIdentifier("UnitSettings") + NavigationLink(value: Route.unitSettings) { + SettingsRow( + title: t("settings__general__unit"), + iconName: currency.primaryDisplay == .bitcoin ? "b-unit" : "globe", + rightText: currency.primaryDisplay == .bitcoin ? currency.primaryDisplay.rawValue : currency.selectedCurrency + ) + } + .accessibilityIdentifier("UnitSettings") + + NavigationLink(value: Route.widgetsSettings) { + SettingsRow( + title: t("settings__widgets__nav_title"), + iconName: "cube", + rightText: settings.showWidgets ? t("common__on") : t("common__off") + ) + } + .accessibilityIdentifier("WidgetsSettings") - NavigationLink(value: Route.transactionSpeedSettings) { - SettingsListLabel( - title: t("settings__general__speed"), - rightText: settings.defaultTransactionSpeed.title + if !tagManager.lastUsedTags.isEmpty { + NavigationLink(value: Route.tagSettings) { + SettingsRow( + title: t("settings__general__tags"), + iconName: "tag", + rightText: String(tagManager.lastUsedTags.count) ) } - .accessibilityElement(children: .contain) - .accessibilityIdentifier("TransactionSpeedSettings") + .accessibilityIdentifier("TagsSettings") + } - if !tagManager.lastUsedTags.isEmpty { - NavigationLink(value: Route.tagSettings) { - SettingsListLabel( - title: t("settings__general__tags"), - rightText: String(tagManager.lastUsedTags.count) - ) - } - .accessibilityIdentifier("TagsSettings") - } + // Payments section + SettingsSectionHeader(t("settings__general__section_payments")) + .padding(.top, 16) - NavigationLink(value: Route.widgetsSettings) { - SettingsListLabel( - title: t("settings__widgets__nav_title"), - rightText: settings.showWidgets ? t("common__on") : t("common__off") - ) - } - .accessibilityIdentifier("WidgetsSettings") + NavigationLink(value: Route.transactionSpeedSettings) { + SettingsRow( + title: t("settings__general__speed"), + iconName: settings.defaultTransactionSpeed.iconName, + rightText: settings.defaultTransactionSpeed.title + ) + } + .accessibilityElement(children: .contain) + .accessibilityIdentifier("TransactionSpeedSettings") - NavigationLink(value: app.hasSeenQuickpayIntro ? Route.quickpay : Route.quickpayIntro) { - SettingsListLabel( - title: t("settings__quickpay__nav_title"), - rightText: settings.enableQuickpay ? t("common__on") : t("common__off") - ) - } - .accessibilityIdentifier("QuickpaySettings") + NavigationLink(value: app.hasSeenQuickpayIntro ? Route.quickpay : Route.quickpayIntro) { + SettingsRow( + title: t("settings__quickpay__nav_title"), + iconName: "caret-double-right", + rightText: settings.enableQuickpay ? t("common__on") : t("common__off") + ) + } + .accessibilityIdentifier("QuickpaySettings") - NavigationLink(value: app.hasSeenNotificationsIntro ? Route.notifications : Route.notificationsIntro) { - SettingsListLabel( - title: t("settings__notifications__nav_title"), - rightText: settings.enableNotifications ? t("common__on") : t("common__off") - ) - } - .accessibilityIdentifier("NotificationsSettings") + NavigationLink(value: app.hasSeenNotificationsIntro ? Route.notifications : Route.notificationsIntro) { + SettingsRow( + title: t("settings__notifications__nav_title"), + iconName: "bell", + rightText: settings.enableNotifications ? t("common__on") : t("common__off") + ) } + .accessibilityIdentifier("NotificationsSettings") } + .padding(.top, 16) + .padding(.horizontal, 16) + .bottomSafeAreaPadding() } - .navigationBarHidden(true) - .padding(.horizontal, 16) - .bottomSafeAreaPadding() } } diff --git a/Bitkit/Views/Settings/LdkDebugScreen.swift b/Bitkit/Views/Settings/LdkDebugScreen.swift index 69d1556cb..49439a570 100644 --- a/Bitkit/Views/Settings/LdkDebugScreen.swift +++ b/Bitkit/Views/Settings/LdkDebugScreen.swift @@ -17,7 +17,7 @@ struct LdkDebugScreen: View { VStack(alignment: .leading, spacing: 32) { // Add Peer VStack(alignment: .leading, spacing: 8) { - CaptionMText("Add Peer") + SettingsSectionHeader("Add Peer") TextField("039b8d4d...a8f3eae3@127.0.0.1:9735", text: $nodeUri) @@ -37,7 +37,7 @@ struct LdkDebugScreen: View { // Network Graph Storage VStack(alignment: .leading, spacing: 8) { - CaptionMText("Network Graph Storage") + SettingsSectionHeader("Network Graph Storage") HStack(spacing: 8) { CustomButton(title: "Log Graph Info", size: .small) { @@ -56,7 +56,7 @@ struct LdkDebugScreen: View { // Node VStack(alignment: .leading, spacing: 8) { - CaptionMText("Node") + SettingsSectionHeader("Node") HStack(spacing: 8) { CustomButton(title: "Restart", size: .small, isLoading: isRestartingNode) { @@ -69,7 +69,7 @@ struct LdkDebugScreen: View { // Peer Simulation VStack(alignment: .leading, spacing: 8) { - CaptionMText("Peer Simulation") + SettingsSectionHeader("Peer Simulation") Picker("Peer Simulation", selection: Binding( get: { WalletViewModel.peerSimulation }, diff --git a/Bitkit/Views/Settings/MainSettings.swift b/Bitkit/Views/Settings/MainSettings.swift deleted file mode 100644 index d558b1119..000000000 --- a/Bitkit/Views/Settings/MainSettings.swift +++ /dev/null @@ -1,107 +0,0 @@ -import SwiftUI - -struct MainSettings: View { - @EnvironmentObject private var app: AppViewModel - - @AppStorage("showDevSettings") private var showDevSettings = Env.isDebug - @State private var cogTapCount = 0 - - var body: some View { - VStack(alignment: .leading, spacing: 0) { - NavigationBar(title: t("settings__settings")) - - GeometryReader { geometry in - ScrollView(showsIndicators: false) { - VStack(alignment: .leading, spacing: 0) { - NavigationLink(value: Route.generalSettings) { - SettingsListLabel( - title: t("settings__general_title"), - iconName: "gear-six" - ) - } - .accessibilityIdentifier("GeneralSettings") - - NavigationLink(value: Route.securitySettings) { - SettingsListLabel( - title: t("settings__security_title"), - iconName: "shield" - ) - } - .accessibilityIdentifier("SecuritySettings") - - NavigationLink(value: Route.backupSettings) { - SettingsListLabel( - title: t("settings__backup_title"), - iconName: "rewind" - ) - } - .accessibilityIdentifier("BackupSettings") - - NavigationLink(value: Route.advancedSettings) { - SettingsListLabel( - title: t("settings__advanced_title"), - iconName: "sliders" - ) - } - .accessibilityIdentifier("AdvancedSettings") - - NavigationLink(value: Route.support) { - SettingsListLabel( - title: t("settings__support_title"), - iconName: "chat" - ) - } - .accessibilityIdentifier("Support") - - NavigationLink(value: Route.about) { - SettingsListLabel( - title: t("settings__about_title"), - iconName: "info" - ) - } - .accessibilityIdentifier("About") - - if showDevSettings { - NavigationLink(value: Route.devSettings) { - SettingsListLabel( - title: t("settings__dev_title"), - iconName: "game-controller" - ) - } - .accessibilityIdentifier("DevSettings") - } - - Spacer() - - Image("cog") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 256, height: 256) - .frame(maxWidth: .infinity, alignment: .center) - .onTapGesture { - cogTapCount += 1 - - // Toggle dev settings every 5 taps - if cogTapCount >= 5 { - showDevSettings.toggle() - cogTapCount = 0 - - app.toast( - type: .success, - title: t(showDevSettings ? "settings__dev_enabled_title" : "settings__dev_disabled_title"), - description: t(showDevSettings ? "settings__dev_enabled_message" : "settings__dev_disabled_message") - ) - } - } - .accessibilityIdentifier("DevOptions") - - Spacer() - } - .frame(minHeight: geometry.size.height) - } - } - } - .navigationBarHidden(true) - .padding(.horizontal, 16) - } -} diff --git a/Bitkit/Views/Settings/MainSettingsScreen.swift b/Bitkit/Views/Settings/MainSettingsScreen.swift new file mode 100644 index 000000000..93088c337 --- /dev/null +++ b/Bitkit/Views/Settings/MainSettingsScreen.swift @@ -0,0 +1,43 @@ +import SwiftUI + +enum SettingsTab: String, CaseIterable, CustomStringConvertible { + case general + case security + case advanced + + var description: String { + switch self { + case .general: return t("settings__general_title") + case .security: return t("settings__security_title") + case .advanced: return t("settings__advanced_title") + } + } +} + +struct MainSettingsScreen: View { + @State private var selectedTab: SettingsTab = .general + + private var settingsTabItems: [TabItem] { + SettingsTab.allCases.map { TabItem($0) } + } + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + NavigationBar(title: t("settings__settings")) + .padding(.horizontal, 16) + + SegmentedControl(selectedTab: $selectedTab, tabItems: settingsTabItems) + .padding(.horizontal, 16) + + Group { + switch selectedTab { + case .general: GeneralSettingsView() + case .security: SecuritySettingsView() + case .advanced: AdvancedSettingsView() + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + .navigationBarHidden(true) + } +} diff --git a/Bitkit/Views/Settings/Notifications/NotificationsSettings.swift b/Bitkit/Views/Settings/Notifications/NotificationsSettings.swift index 0ef7fbe1e..eeae11de8 100644 --- a/Bitkit/Views/Settings/Notifications/NotificationsSettings.swift +++ b/Bitkit/Views/Settings/Notifications/NotificationsSettings.swift @@ -29,7 +29,7 @@ struct NotificationsSettings: View { VStack(alignment: .leading, spacing: 0) { NavigationBar(title: t("settings__notifications__nav_title")) - SettingsListLabel( + SettingsRow( title: t("settings__notifications__settings__toggle"), toggle: $settings.enableNotifications, disabled: isDenied @@ -51,7 +51,7 @@ struct NotificationsSettings: View { CaptionMText(t("settings__notifications__settings__privacy__label")) .padding(.top, 32) - SettingsListLabel( + SettingsRow( title: t("settings__notifications__settings__privacy__text"), toggle: $settings.enableNotificationsAmount ) diff --git a/Bitkit/Views/Settings/Quickpay/QuickpaySettings.swift b/Bitkit/Views/Settings/Quickpay/QuickpaySettings.swift index d19182eb1..ca920ec57 100644 --- a/Bitkit/Views/Settings/Quickpay/QuickpaySettings.swift +++ b/Bitkit/Views/Settings/Quickpay/QuickpaySettings.swift @@ -13,7 +13,7 @@ struct QuickpaySettings: View { GeometryReader { geometry in ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 0) { - SettingsListLabel( + SettingsRow( title: t("settings__quickpay__settings__toggle"), toggle: $settings.enableQuickpay, testIdentifier: "QuickpayToggle" @@ -24,8 +24,8 @@ struct QuickpaySettings: View { ) .padding(.top, 16) - VStack(alignment: .leading, spacing: 16) { - CaptionMText(t("settings__quickpay__settings__label")) + VStack(alignment: .leading, spacing: 0) { + SettingsSectionHeader(t("settings__quickpay__settings__label")) CustomSlider(value: $settings.quickpayAmount, steps: sliderSteps) } .padding(.top, 32) diff --git a/Bitkit/Views/Settings/Security/ChangePinScreen.swift b/Bitkit/Views/Settings/Security/ChangePinScreen.swift new file mode 100644 index 000000000..7ab33adfb --- /dev/null +++ b/Bitkit/Views/Settings/Security/ChangePinScreen.swift @@ -0,0 +1,76 @@ +import SwiftUI + +struct ChangePinScreen: View { + @EnvironmentObject private var settings: SettingsViewModel + @EnvironmentObject private var sheets: SheetViewModel + + var navTitle: String { + settings.pinEnabled ? t("security__pin_disable_title") : t("settings__security__pin") + } + + var description: String { + settings.pinEnabled ? t("security__pin_disable_text") : t("security__pin_security_text") + } + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + NavigationBar(title: navTitle) + .padding(.bottom, 16) + + BodyMText(description) + + Spacer() + + Image("shield-figure") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 256, height: 256) + .frame(maxWidth: .infinity) + .padding(.top, 32) + + Spacer() + + HStack(alignment: .center, spacing: 16) { + if settings.pinEnabled { + CustomButton(title: t("security__cp_title"), variant: .secondary) { + sheets.showSheet(.security, data: SecurityConfig(showLaterButton: false)) + } + .accessibilityIdentifier("PINCode") + + CustomButton(title: t("security__pin_disable_button")) { + sheets.showSheet(.security, data: SecurityConfig(showLaterButton: false)) + } + .accessibilityIdentifier("DisablePin") + } else { + CustomButton(title: t("security__pin_enable_button")) { + sheets.showSheet(.security, data: SecurityConfig(showLaterButton: false)) + } + .accessibilityIdentifier("EnablePin") + } + } + + // CustomButton( + // title: t("security__pin_disable_button"), + // destination: PinCheckView( + // title: t("security__pin_enter"), + // explanation: "", + // onCancel: {}, + // onPinVerified: { pin in + // do { + // try settings.removePin(pin: pin) + // dismiss() + // } catch { + // Logger.error("Failed to remove PIN: \(error)", context: "DisablePinView") + // // Still dismiss even if there's an error, as the PIN was verified + // dismiss() + // } + // } + // ) + // ) + // .accessibilityIdentifier("DisablePin") + } + .navigationBarHidden(true) + .padding(.horizontal, 16) + .bottomSafeAreaPadding() + } +} diff --git a/Bitkit/Views/Settings/Backup/BackupSettings.swift b/Bitkit/Views/Settings/Security/DataBackupsScreen.swift similarity index 76% rename from Bitkit/Views/Settings/Backup/BackupSettings.swift rename to Bitkit/Views/Settings/Security/DataBackupsScreen.swift index de0909a96..31b84c1a2 100644 --- a/Bitkit/Views/Settings/Backup/BackupSettings.swift +++ b/Bitkit/Views/Settings/Security/DataBackupsScreen.swift @@ -1,19 +1,5 @@ import SwiftUI -private struct SettingsLabel: View { - let text: String - - init(_ text: String) { - self.text = text - } - - var body: some View { - CaptionMText(text) - .frame(height: 40) - .frame(maxWidth: .infinity, alignment: .leading) - } -} - private struct StatusItemView: View { let imageName: String let title: String @@ -51,8 +37,7 @@ private struct StatusItemView: View { } } -struct BackupSettings: View { - @EnvironmentObject var sheets: SheetViewModel +struct DataBackupsScreen: View { @StateObject private var viewModel = BackupViewModel() private var allSynced: Bool { @@ -64,26 +49,12 @@ struct BackupSettings: View { var body: some View { VStack(alignment: .leading, spacing: 0) { - NavigationBar(title: t("settings__backup_title")) + NavigationBar(title: t("settings__data_backups_nav_title")) GeometryReader { geometry in ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 0) { - Button(action: { - sheets.showSheet(.backup, data: BackupConfig(view: .mnemonic)) - }) { - SettingsListLabel(title: t("settings__backup__wallet")) - } - .accessibilityIdentifier("BackupWallet") - - NavigationLink(value: Route.resetAndRestore) { - SettingsListLabel(title: t("settings__backup__reset")) - } - .accessibilityIdentifier("ResetAndRestore") - HStack(alignment: .center, spacing: 8) { - SettingsLabel(t("settings__backup__latest")) - if Env.isE2E, allSynced { Image("check") .resizable() @@ -112,6 +83,8 @@ struct BackupSettings: View { viewModel.triggerBackup(for: category) } ) + + Divider() } Spacer() diff --git a/Bitkit/Views/Settings/Security/DisablePinView.swift b/Bitkit/Views/Settings/Security/DisablePinView.swift deleted file mode 100644 index f285e0425..000000000 --- a/Bitkit/Views/Settings/Security/DisablePinView.swift +++ /dev/null @@ -1,57 +0,0 @@ -import SwiftUI - -struct DisablePinView: View { - @Environment(\.dismiss) private var dismiss - @EnvironmentObject var settings: SettingsViewModel - - var body: some View { - VStack(alignment: .leading, spacing: 0) { - NavigationBar(title: t("security__pin_disable_title")) - .padding(.bottom, 16) - - BodyMText(t("security__pin_disable_text")) - - Spacer() - - Image("shield-figure") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 256, height: 256) - .frame(maxWidth: .infinity) - .padding(.top, 32) - - Spacer() - - CustomButton( - title: t("security__pin_disable_button"), - destination: PinCheckView( - title: t("security__pin_enter"), - explanation: "", - onCancel: {}, - onPinVerified: { pin in - do { - try settings.removePin(pin: pin) - dismiss() - } catch { - Logger.error("Failed to remove PIN: \(error)", context: "DisablePinView") - // Still dismiss even if there's an error, as the PIN was verified - dismiss() - } - } - ) - ) - .accessibilityIdentifier("DisablePin") - } - .navigationBarHidden(true) - .padding(.horizontal, 16) - .bottomSafeAreaPadding() - } -} - -#Preview { - NavigationStack { - DisablePinView() - } - .preferredColorScheme(.dark) - .environmentObject(SettingsViewModel.shared) -} diff --git a/Bitkit/Views/Settings/Backup/ResetAndRestore.swift b/Bitkit/Views/Settings/Security/ResetScreen.swift similarity index 96% rename from Bitkit/Views/Settings/Backup/ResetAndRestore.swift rename to Bitkit/Views/Settings/Security/ResetScreen.swift index 97bcd23ab..89e55da30 100644 --- a/Bitkit/Views/Settings/Backup/ResetAndRestore.swift +++ b/Bitkit/Views/Settings/Security/ResetScreen.swift @@ -1,6 +1,6 @@ import SwiftUI -struct ResetAndRestore: View { +struct ResetScreen: View { @EnvironmentObject var app: AppViewModel @EnvironmentObject var sheets: SheetViewModel @EnvironmentObject var wallet: WalletViewModel @@ -10,7 +10,7 @@ struct ResetAndRestore: View { var body: some View { VStack(alignment: .leading, spacing: 0) { - NavigationBar(title: t("settings__backup__title")) + NavigationBar(title: t("settings__reset_nav_title")) VStack(spacing: 0) { BodyMText(t("security__reset_text")) diff --git a/Bitkit/Views/Settings/SecurityPrivacySettingsView.swift b/Bitkit/Views/Settings/SecuritySettingsView.swift similarity index 70% rename from Bitkit/Views/Settings/SecurityPrivacySettingsView.swift rename to Bitkit/Views/Settings/SecuritySettingsView.swift index 8cff031b8..70a2c4653 100644 --- a/Bitkit/Views/Settings/SecurityPrivacySettingsView.swift +++ b/Bitkit/Views/Settings/SecuritySettingsView.swift @@ -1,7 +1,7 @@ import LocalAuthentication import SwiftUI -struct SecurityPrivacySettingsView: View { +struct SecuritySettingsView: View { @EnvironmentObject var app: AppViewModel @EnvironmentObject var sheets: SheetViewModel @EnvironmentObject var settings: SettingsViewModel @@ -12,12 +12,9 @@ struct SecurityPrivacySettingsView: View { private var biometryTypeName: String { switch Env.biometryType { - case .touchID: - return t("security__bio_touch_id") - case .faceID: - return t("security__bio_face_id") - default: - return t("security__bio_face_id") // Default to Face ID + case .touchID: return t("security__bio_touch_id") + case .faceID: return t("security__bio_face_id") + default: return t("security__bio_face_id") // Default to Face ID } } @@ -29,71 +26,57 @@ struct SecurityPrivacySettingsView: View { var body: some View { VStack(alignment: .leading, spacing: 0) { - NavigationBar(title: t("settings__security__title")) - .padding(.bottom, 16) - .padding(.horizontal, 16) - ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 0) { - // Privacy Settings Section - SettingsListLabel( - title: t("settings__security__swipe_balance_to_hide"), - toggle: $settings.swipeBalanceToHide, - testIdentifier: "SwipeBalanceToHide" - ) - - SettingsListLabel( - title: t("settings__security__hide_balance_on_open"), - toggle: $settings.hideBalanceOnOpen, - testIdentifier: "HideBalanceOnOpen" - ) - - SettingsListLabel( - title: t("settings__security__clipboard"), - toggle: $settings.readClipboard, - testIdentifier: "AutoReadClipboard" - ) + // Backup section + SettingsSectionHeader(t("settings__security__section_backup")) + + Button(action: { + sheets.showSheet(.backup, data: BackupConfig(view: .mnemonic)) + }) { + SettingsRow( + title: t("settings__backup__wallet"), + iconName: "lock-key" + ) + } + .accessibilityIdentifier("BackupWallet") - SettingsListLabel( - title: t("settings__security__warn_100"), - toggle: $settings.warnWhenSendingOver100, - testIdentifier: "SendAmountWarning" - ) + NavigationLink(value: Route.dataBackups) { + SettingsRow( + title: t("settings__backup__data"), + iconName: "database" + ) + } + .accessibilityIdentifier("BackupSettings") - // PIN Code Section - if !settings.pinEnabled { - Button { - sheets.showSheet(.security, data: SecurityConfig(showLaterButton: false)) - } label: { - SettingsListLabel( - title: t("settings__security__pin"), - rightText: t("settings__security__pin_disabled") - ) - } - .accessibilityIdentifier("PINCode") - } else { - NavigationLink(value: Route.disablePin) { - SettingsListLabel( - title: t("settings__security__pin"), - rightText: t("settings__security__pin_enabled") - ) - } - .accessibilityIdentifier("PINCode") + NavigationLink(value: Route.reset) { + SettingsRow( + title: t("settings__backup__reset"), + iconName: "arrow-counter-clockwise" + ) } + .accessibilityIdentifier("ResetAndRestore") + + // Safety section + SettingsSectionHeader(t("settings__security__section_safety")) + .padding(.top, 16) + + NavigationLink(value: Route.changePin) { + SettingsRow( + title: t("settings__security__pin"), + iconName: "shield", + rightText: settings.pinEnabled ? t("settings__security__pin_enabled") : t("settings__security__pin_disabled") + ) + } + .accessibilityIdentifier("PINCode") if settings.pinEnabled { - NavigationLink(value: Route.changePin) { - SettingsListLabel( - title: t("settings__security__pin_change") - ) - } - .accessibilityIdentifier("PINChange") - Button { showPinCheckForPayments = true } label: { - SettingsListLabel( + SettingsRow( title: t("settings__security__pin_payments"), + iconName: "coins", rightIcon: nil, toggle: Binding( get: { settings.requirePinForPayments }, @@ -104,9 +87,9 @@ struct SecurityPrivacySettingsView: View { .accessibilityIdentifier("EnablePinForPayments") if isBiometricAvailable { - // Biometrics toggle with custom handling - SettingsListLabel( + SettingsRow( title: t("settings__security__use_bio", variables: ["biometryTypeName": biometryTypeName]), + iconName: "smiley", toggle: Binding( get: { settings.useBiometrics }, set: { newValue in @@ -115,18 +98,46 @@ struct SecurityPrivacySettingsView: View { ), testIdentifier: "UseBiometryInstead" ) - - // Footer text for Biometrics - BodySText(t("settings__security__footer", variables: ["biometryTypeName": biometryTypeName])) - .padding(.top, 16) } } + + SettingsRow( + title: t("settings__security__warn_100"), + iconName: "warning", + toggle: $settings.warnWhenSendingOver100, + testIdentifier: "SendAmountWarning" + ) + + // Privacy section + SettingsSectionHeader(t("settings__security__section_privacy")) + .padding(.top, 16) + + SettingsRow( + title: t("settings__security__swipe_balance_to_hide"), + iconName: "hand-pointing", + toggle: $settings.swipeBalanceToHide, + testIdentifier: "SwipeBalanceToHide" + ) + + SettingsRow( + title: t("settings__security__hide_balance_on_open"), + iconName: "eye-slash", + toggle: $settings.hideBalanceOnOpen, + testIdentifier: "HideBalanceOnOpen" + ) + + SettingsRow( + title: t("settings__security__clipboard"), + iconName: "clipboard", + toggle: $settings.readClipboard, + testIdentifier: "AutoReadClipboard" + ) } + .padding(.top, 16) .padding(.horizontal, 16) .bottomSafeAreaPadding() } } - .navigationBarHidden(true) .navigationDestination(isPresented: $showPinCheckForPayments) { PinCheckView( title: t("security__pin_enter"), @@ -137,10 +148,7 @@ struct SecurityPrivacySettingsView: View { } ) } - .alert( - t("security__bio_error_title"), - isPresented: $showingBiometricError - ) { + .alert(t("security__bio_error_title"), isPresented: $showingBiometricError) { Button(t("common__ok")) { // Error handled, user acknowledged } @@ -155,7 +163,7 @@ struct SecurityPrivacySettingsView: View { requestBiometricPermission { success in if success { settings.useBiometrics = true - Logger.debug("Biometric authentication enabled", context: "SecurityPrivacySettingsView") + Logger.debug("Biometric authentication enabled", context: "SecuritySettingsView") } else { // Authentication failed - keep toggle off // The toggle will automatically revert since we're not setting the value @@ -167,7 +175,7 @@ struct SecurityPrivacySettingsView: View { requestBiometricPermission { success in if success { settings.useBiometrics = false - Logger.debug("Biometric authentication disabled", context: "SecurityPrivacySettingsView") + Logger.debug("Biometric authentication disabled", context: "SecuritySettingsView") } else { // Authentication failed - keep toggle on // The toggle will automatically revert since we're not setting the value @@ -234,12 +242,12 @@ struct SecurityPrivacySettingsView: View { showingBiometricError = true } - Logger.error("Biometric authentication error: \(error)", context: "SecurityPrivacySettingsView") + Logger.error("Biometric authentication error: \(error)", context: "SecuritySettingsView") } } #Preview { - SecurityPrivacySettingsView() + SecuritySettingsView() .environmentObject(SheetViewModel()) .environmentObject(SettingsViewModel.shared) .preferredColorScheme(.dark) diff --git a/Bitkit/Views/Settings/SupportScreen.swift b/Bitkit/Views/Settings/SupportScreen.swift new file mode 100644 index 000000000..8b5c97061 --- /dev/null +++ b/Bitkit/Views/Settings/SupportScreen.swift @@ -0,0 +1,178 @@ +import SwiftUI + +private struct DiagonalCut: Shape { + var cornerRadius: CGFloat = 36 + + func path(in rect: CGRect) -> Path { + var path = Path() + let r = min(cornerRadius, rect.width / 4, rect.height / 4) + + let leftCutY = rect.maxY - 210 + path.move(to: CGPoint(x: rect.minX, y: leftCutY)) + + let rightCutY = rect.maxY - 300 + path.addLine(to: CGPoint(x: rect.maxX, y: rightCutY)) + + // Right edge to just above bottom-right corner + path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY - r)) + // Rounded bottom-right corner + path.addArc( + center: CGPoint(x: rect.maxX - r, y: rect.maxY - r), + radius: r, + startAngle: Angle(radians: 0), + endAngle: Angle(radians: .pi / 2), + clockwise: false + ) + // Bottom edge to just before bottom-left corner + path.addLine(to: CGPoint(x: rect.minX + r, y: rect.maxY)) + // Rounded bottom-left corner + path.addArc( + center: CGPoint(x: rect.minX + r, y: rect.maxY - r), + radius: r, + startAngle: Angle(radians: .pi / 2), + endAngle: Angle(radians: .pi), + clockwise: false + ) + path.closeSubpath() + + return path + } +} + +struct SupportScreen: View { + @EnvironmentObject private var app: AppViewModel + @Environment(\.openURL) private var openURL + + @State private var versionTapCount = 0 + + @AppStorage("showDevSettings") private var showDevSettings = Env.isDebug + + private var appVersion: String { + let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown" + let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown" + return "\(version) (\(build))" + } + + private var shareText: String { + return t( + "settings__about__shareText", + variables: ["appStoreUrl": Env.appStoreUrl, "playStoreUrl": Env.playStoreUrl] + ) + } + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + NavigationBar(title: t("settings__support__title")) + .padding(.horizontal, 16) + .padding(.bottom, 16) + + GeometryReader { geometry in + ScrollView(showsIndicators: false) { + ZStack { + // Orange diagonal background (scrolls with content) + Color.brandAccent + .clipShape(DiagonalCut()) + .ignoresSafeArea() + + VStack(alignment: .leading, spacing: 0) { + BodyMText(t("settings__support__text")) + .padding(.bottom, 16) + + VStack(spacing: 0) { + NavigationLink(value: Route.reportIssue) { + SettingsRow(title: t("settings__support__report"), iconName: "warning") + } + + Button(action: { + openURL(URL(string: Env.helpUrl)!) + }) { + SettingsRow(title: t("settings__support__help"), iconName: "question") + } + + NavigationLink(value: Route.appStatus) { + SettingsRow(title: t("settings__support__status"), iconName: "power") + } + .accessibilityIdentifier("AppStatus") + + Button(action: { + openURL(URL(string: Env.termsOfServiceUrl)!) + }) { + SettingsRow(title: t("settings__about__legal"), iconName: "file-text") + } + + ShareLink(item: shareText, message: Text(shareText)) { + SettingsRow(title: t("settings__about__share"), iconName: "share") + } + + Button(action: { + onVersionTap() + }) { + SettingsRow( + title: t("settings__about__version"), + iconName: "stack", + rightText: appVersion, + rightIcon: nil + ) + } + } + + Spacer(minLength: 32) + + VStack(alignment: .center, spacing: 0) { + Image("logo") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(maxHeight: 100) + .accessibilityIdentifier("AboutLogo") + } + .frame(maxWidth: .infinity) + .padding(.bottom, 16) + + Social() + .padding(.bottom, 16) + + BodyMText("Bitkit was crafted by Synonym Software, S.A. DE C.V. ©2025. All rights reserved.") + .padding(.bottom, 16) + + HStack(alignment: .center, spacing: 10) { + Image("synonym-logo") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(height: 24) + + Image("tether-logo") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(height: 16) + } + .frame(maxWidth: .infinity, alignment: .center) + .frame(height: 24) + .padding(.bottom, 32) + } + .frame(minHeight: geometry.size.height) + .padding(.horizontal, 16) + .bottomSafeAreaPadding() + } + } + } + .ignoresSafeArea() + } + .navigationBarHidden(true) + } + + private func onVersionTap() { + versionTapCount += 1 + + // When tapped 5 times, toggle developer mode + if versionTapCount >= 5 { + versionTapCount = 0 + showDevSettings.toggle() + + app.toast( + type: .info, + title: t(showDevSettings ? "settings__dev_enabled_title" : "settings__dev_disabled_title"), + description: t(showDevSettings ? "settings__dev_enabled_message" : "settings__dev_disabled_message") + ) + } + } +} diff --git a/Bitkit/Views/Settings/SupportView.swift b/Bitkit/Views/Settings/SupportView.swift deleted file mode 100644 index af614d099..000000000 --- a/Bitkit/Views/Settings/SupportView.swift +++ /dev/null @@ -1,55 +0,0 @@ -import SwiftUI - -struct SupportView: View { - @Environment(\.openURL) private var openURL - - var body: some View { - VStack(spacing: 0) { - NavigationBar(title: t("settings__support__title")) - .padding(.bottom, 16) - - BodyMText(t("settings__support__text")) - .padding(.bottom, 16) - - VStack(spacing: 0) { - NavigationLink(value: Route.reportIssue) { - SettingsListLabel(title: t("settings__support__report")) - } - - Button(action: { - openURL(URL(string: Env.helpUrl)!) - }) { - SettingsListLabel(title: t("settings__support__help")) - } - - NavigationLink(value: Route.appStatus) { - SettingsListLabel(title: t("settings__support__status")) - } - .accessibilityIdentifier("AppStatus") - } - - Spacer(minLength: 32) - - VStack { - Image("question-mark") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxHeight: 256) - } - - Spacer(minLength: 32) - - Social() - } - .navigationBarHidden(true) - .padding(.horizontal, 16) - .bottomSafeAreaPadding() - } -} - -#Preview { - NavigationView { - SupportView() - } - .preferredColorScheme(.dark) -} diff --git a/Bitkit/Views/Settings/TransactionSpeed/TransactionSpeedSettingsView.swift b/Bitkit/Views/Settings/TransactionSpeed/TransactionSpeedSettingsView.swift index e95b42aff..ed9c0183a 100644 --- a/Bitkit/Views/Settings/TransactionSpeed/TransactionSpeedSettingsView.swift +++ b/Bitkit/Views/Settings/TransactionSpeed/TransactionSpeedSettingsView.swift @@ -66,8 +66,7 @@ struct TransactionSpeedSettingsView: View { ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 0) { - CaptionMText(t("settings__general__speed_default")) - .frame(height: 50) + SettingsSectionHeader(t("settings__general__speed_default")) VStack(spacing: 0) { TransactionSpeedSettingsRow( @@ -79,7 +78,7 @@ struct TransactionSpeedSettingsView: View { } ) - Divider() + CustomDivider() TransactionSpeedSettingsRow( speed: .normal, @@ -90,7 +89,7 @@ struct TransactionSpeedSettingsView: View { } ) - Divider() + CustomDivider() TransactionSpeedSettingsRow( speed: .slow, @@ -101,7 +100,7 @@ struct TransactionSpeedSettingsView: View { } ) - Divider() + CustomDivider() TransactionSpeedSettingsRow( speed: .custom(satsPerVByte: 1), // Placeholder diff --git a/Bitkit/Views/Wallets/Receive/ReceiveQr.swift b/Bitkit/Views/Wallets/Receive/ReceiveQr.swift index 9e7e8ddfa..1ff1238e0 100644 --- a/Bitkit/Views/Wallets/Receive/ReceiveQr.swift +++ b/Bitkit/Views/Wallets/Receive/ReceiveQr.swift @@ -46,13 +46,13 @@ struct ReceiveQr: View { // Show unified tab when we have a Lightning invoice (even if channels not yet usable) if !wallet.bolt11.isEmpty { return [ - TabItem(.savings), - TabItem(.unified, activeColor: .white), + TabItem(.savings, activeColor: .brandAccent), + TabItem(.unified, activeColor: .textPrimary), TabItem(.spending, activeColor: .purpleAccent), ] } else { return [ - TabItem(.savings), + TabItem(.savings, activeColor: .textPrimary), TabItem(.spending, activeColor: .purpleAccent), ] } From dc6aa7728f40fc262e360accb0dfc1096188c91a Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Mon, 23 Mar 2026 18:43:51 +0100 Subject: [PATCH 2/2] feat(security): update PIN screens --- .../Contents.json | 21 ++ .../shield-check-figure.png | Bin 0 -> 251473 bytes Bitkit/Components/Home/Suggestions.swift | 4 +- Bitkit/Components/PinInput.swift | 1 - .../Localization/en.lproj/Localizable.strings | 11 +- Bitkit/ViewModels/SheetViewModel.swift | 4 +- Bitkit/Views/Security/AuthCheck.swift | 2 +- Bitkit/Views/Security/PinCheckView.swift | 37 ++- .../Settings/Security/ChangePinScreen.swift | 39 +-- .../Settings/Security/PinChangeView.swift | 259 ------------------ .../SecuritySheet/SecurityChangePin.swift | 177 ++++++++++++ .../SecurityChangePinSuccess.swift | 37 +++ .../SecuritySheet/SecurityDisablePin.swift | 102 +++++++ .../SecuritySheet/SecurityIntro.swift | 7 +- ...curityPin.swift => SecuritySetupPin.swift} | 21 +- .../SecuritySheet/SecuritySheet.swift | 34 ++- .../SecuritySheet/SecuritySuccess.swift | 12 +- .../Views/Wallets/Send/LnurlPayConfirm.swift | 30 +- .../Wallets/Send/SendConfirmationView.swift | 29 +- Bitkit/Views/Wallets/Send/SendPinScreen.swift | 103 +++++++ Bitkit/Views/Wallets/Send/SendSheet.swift | 28 +- 21 files changed, 564 insertions(+), 394 deletions(-) create mode 100644 Bitkit/Assets.xcassets/Illustrations/shield-check-figure.imageset/Contents.json create mode 100644 Bitkit/Assets.xcassets/Illustrations/shield-check-figure.imageset/shield-check-figure.png delete mode 100644 Bitkit/Views/Settings/Security/PinChangeView.swift create mode 100644 Bitkit/Views/Settings/Security/SecuritySheet/SecurityChangePin.swift create mode 100644 Bitkit/Views/Settings/Security/SecuritySheet/SecurityChangePinSuccess.swift create mode 100644 Bitkit/Views/Settings/Security/SecuritySheet/SecurityDisablePin.swift rename Bitkit/Views/Settings/Security/SecuritySheet/{SecurityPin.swift => SecuritySetupPin.swift} (85%) create mode 100644 Bitkit/Views/Wallets/Send/SendPinScreen.swift diff --git a/Bitkit/Assets.xcassets/Illustrations/shield-check-figure.imageset/Contents.json b/Bitkit/Assets.xcassets/Illustrations/shield-check-figure.imageset/Contents.json new file mode 100644 index 000000000..61dfde1ad --- /dev/null +++ b/Bitkit/Assets.xcassets/Illustrations/shield-check-figure.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "shield-check-figure.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Bitkit/Assets.xcassets/Illustrations/shield-check-figure.imageset/shield-check-figure.png b/Bitkit/Assets.xcassets/Illustrations/shield-check-figure.imageset/shield-check-figure.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba767e79c73424b128141f1315567df0cdc5ee3 GIT binary patch literal 251473 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%0D*0xNB|Tluoglq3Skf^^Y;A-R~q~S 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 Void @@ -9,8 +16,6 @@ struct PinCheckView: View { @State private var pinInput: String = "" @State private var errorMessage: String = "" @State private var errorIdentifier: String? - @EnvironmentObject private var settings: SettingsViewModel - @Environment(\.dismiss) private var dismiss private func handlePinChange(_ pin: String) { if pin.count == 4 { @@ -39,9 +44,7 @@ struct PinCheckView: View { Haptics.notify(.error) if settings.hasExceededPinAttempts() { - // Exceeded maximum attempts - this should be handled by the app level - // TODO: wipe app - errorIdentifier = "WrongPIN" + wipeWallet() return } @@ -58,6 +61,23 @@ struct PinCheckView: View { } } + private func wipeWallet() { + Task { + do { + try await AppReset.wipe( + app: app, + wallet: wallet, + session: session, + toastType: .warning + ) + sheets.hideSheet() + } catch { + Logger.error("Failed to wipe wallet after PIN attempts exceeded: \(error)", context: "PinCheckView") + app.toast(error) + } + } + } + var body: some View { VStack(spacing: 0) { NavigationBar(title: title, showMenuButton: false) @@ -71,6 +91,9 @@ struct PinCheckView: View { CaptionText(errorMessage, textColor: .brandAccent) .padding(.bottom, 16) .accessibilityIdentifier(errorIdentifier ?? "WrongPIN") + .onTapGesture { + sheets.showSheet(.forgotPin) + } } // PIN input component @@ -110,7 +133,11 @@ struct PinCheckView: View { print("PIN verified!") } ) + .environmentObject(AppViewModel()) .environmentObject(SettingsViewModel.shared) + .environmentObject(SheetViewModel()) + .environmentObject(WalletViewModel()) + .environmentObject(SessionManager()) } .preferredColorScheme(.dark) } diff --git a/Bitkit/Views/Settings/Security/ChangePinScreen.swift b/Bitkit/Views/Settings/Security/ChangePinScreen.swift index 7ab33adfb..bdaec4a6f 100644 --- a/Bitkit/Views/Settings/Security/ChangePinScreen.swift +++ b/Bitkit/Views/Settings/Security/ChangePinScreen.swift @@ -5,11 +5,15 @@ struct ChangePinScreen: View { @EnvironmentObject private var sheets: SheetViewModel var navTitle: String { - settings.pinEnabled ? t("security__pin_disable_title") : t("settings__security__pin") + settings.pinEnabled ? t("security__pin_change_title") : t("settings__security__pin") } var description: String { - settings.pinEnabled ? t("security__pin_disable_text") : t("security__pin_security_text") + settings.pinEnabled ? t("security__pin_change_text") : t("security__pin_security_text") + } + + var image: String { + settings.pinEnabled ? "shield-check-figure" : "shield-figure" } var body: some View { @@ -21,53 +25,32 @@ struct ChangePinScreen: View { Spacer() - Image("shield-figure") + Image(image) .resizable() .aspectRatio(contentMode: .fit) .frame(width: 256, height: 256) .frame(maxWidth: .infinity) - .padding(.top, 32) Spacer() HStack(alignment: .center, spacing: 16) { if settings.pinEnabled { CustomButton(title: t("security__cp_title"), variant: .secondary) { - sheets.showSheet(.security, data: SecurityConfig(showLaterButton: false)) + sheets.showSheet(.security, data: SecurityConfig(initialRoute: .changePin)) } - .accessibilityIdentifier("PINCode") + .accessibilityIdentifier("ChangePin") CustomButton(title: t("security__pin_disable_button")) { - sheets.showSheet(.security, data: SecurityConfig(showLaterButton: false)) + sheets.showSheet(.security, data: SecurityConfig(initialRoute: .disablePin)) } .accessibilityIdentifier("DisablePin") } else { CustomButton(title: t("security__pin_enable_button")) { - sheets.showSheet(.security, data: SecurityConfig(showLaterButton: false)) + sheets.showSheet(.security, data: SecurityConfig(initialRoute: .setupPin)) } .accessibilityIdentifier("EnablePin") } } - - // CustomButton( - // title: t("security__pin_disable_button"), - // destination: PinCheckView( - // title: t("security__pin_enter"), - // explanation: "", - // onCancel: {}, - // onPinVerified: { pin in - // do { - // try settings.removePin(pin: pin) - // dismiss() - // } catch { - // Logger.error("Failed to remove PIN: \(error)", context: "DisablePinView") - // // Still dismiss even if there's an error, as the PIN was verified - // dismiss() - // } - // } - // ) - // ) - // .accessibilityIdentifier("DisablePin") } .navigationBarHidden(true) .padding(.horizontal, 16) diff --git a/Bitkit/Views/Settings/Security/PinChangeView.swift b/Bitkit/Views/Settings/Security/PinChangeView.swift deleted file mode 100644 index 63d7e204e..000000000 --- a/Bitkit/Views/Settings/Security/PinChangeView.swift +++ /dev/null @@ -1,259 +0,0 @@ -import SwiftUI - -/// View for changing the PIN or disabling it -struct PinChangeView: View { - @Environment(\.dismiss) private var dismiss - @EnvironmentObject private var app: AppViewModel - @EnvironmentObject private var session: SessionManager - @EnvironmentObject private var settings: SettingsViewModel - @EnvironmentObject private var sheets: SheetViewModel - @EnvironmentObject private var wallet: WalletViewModel - - @State private var pinInput: String = "" - @State private var currentPin: String = "" - @State private var newPin: String = "" - @State private var step: PinChangeStep = .verifyCurrentPin - @State private var errorMessage: String = "" - @State private var errorIdentifier: String? - - enum PinChangeStep { - case verifyCurrentPin - case enterNewPin - case confirmNewPin - case success - } - - /// Computed properties for title and description - var navTitle: String { - switch step { - case .verifyCurrentPin: - return t("security__cp_title", comment: "Change PIN") - case .enterNewPin: - return t("security__cp_setnew_title", comment: "Set new PIN title") - case .confirmNewPin: - return t("security__cp_retype_title", comment: "Retype New PIN") - case .success: - return t("security__cp_changed_title", comment: "PIN changed title") - } - } - - var description: String { - switch step { - case .verifyCurrentPin: - return t("security__cp_text", comment: "Change PIN description") - case .enterNewPin: - return t("security__cp_setnew_text", comment: "Set new PIN description") - case .confirmNewPin: - return t("security__cp_retype_text", comment: "Retype PIN description") - case .success: - return t("security__cp_changed_text", comment: "PIN changed description") - } - } - - private func handlePinComplete(_ pin: String) { - switch step { - case .verifyCurrentPin: - handleCurrentPinVerification(pin) - case .enterNewPin: - handleNewPinEntry(pin) - case .confirmNewPin: - handleNewPinConfirmation(pin) - case .success: - // Should not reach here as PIN input is hidden in success state - break - } - } - - private func handleCurrentPinVerification(_ pin: String) { - if settings.pinCheck(pin: pin) { - // Current PIN is correct - proceed to new PIN entry - currentPin = pin - step = .enterNewPin - resetPinInput() - Haptics.notify(.success) - } else { - handleIncorrectCurrentPin() - } - } - - private func handleNewPinEntry(_ pin: String) { - // Store the new PIN and move to confirmation - newPin = pin - step = .confirmNewPin - resetPinInput() - Haptics.notify(.success) - } - - private func handleNewPinConfirmation(_ pin: String) { - if pin == newPin { - // PINs match - update the PIN - updatePin() - } else { - // PINs don't match - go back to enter new PIN - handlePinMismatch() - } - } - - private func updatePin() { - do { - try settings.removePin(pin: currentPin, resetSettings: false) - try settings.setPin(newPin) - step = .success - resetPinInput() - Haptics.notify(.success) - } catch { - Logger.error("Failed to change PIN: \(error)", context: "PinChangeView") - errorMessage = t("security__cp_try_again", comment: "Try again, this is not the same PIN") - errorIdentifier = "WrongPIN" - pinInput = "" - Haptics.notify(.error) - } - } - - private func handlePinMismatch() { - errorMessage = t("security__cp_try_again", comment: "Try again, this is not the same PIN") - errorIdentifier = "WrongPIN" - pinInput = "" - Haptics.notify(.error) - } - - private func resetPinInput() { - pinInput = "" - errorMessage = "" - errorIdentifier = nil - } - - private func handleIncorrectCurrentPin() { - pinInput = "" - Haptics.notify(.error) - - if settings.hasExceededPinAttempts() { - handleWalletWipe() - return - } - - updateErrorMessageForRemainingAttempts() - } - - private func handleWalletWipe() { - Task { - do { - try await AppReset.wipe( - app: app, - wallet: wallet, - session: session, - toastType: .warning - ) - } catch { - Logger.error("Failed to wipe wallet after PIN attempts exceeded: \(error)", context: "PinChangeView") - app.toast(error) - } - } - } - - private func updateErrorMessageForRemainingAttempts() { - let remainingAttempts = settings.getRemainingPinAttempts() - - if remainingAttempts == 1 { - // Last attempt warning - errorMessage = t( - "security__pin_last_attempt", - comment: "Last attempt. Entering the wrong PIN again will reset your wallet." - ) - errorIdentifier = "LastAttempt" - } else { - // Show remaining attempts - errorMessage = t( - "security__pin_attempts", - comment: "%d attempts remaining. Forgot your PIN?", - variables: ["attemptsRemaining": "\(remainingAttempts)"] - ) - errorIdentifier = "AttemptsRemaining" - } - } - - private func handlePinChange(_ pin: String) { - if pin.count == 4 { - handlePinComplete(pin) - } else if pin.count == 1 { - // Clear error message when user starts typing - errorMessage = "" - } - } - - var body: some View { - VStack(spacing: 0) { - NavigationBar(title: navTitle, showBackButton: step != .success) - - if step == .success { - successScreen - } else { - descriptionSection - errorSection - pinInputSection - } - } - .navigationBarHidden(true) - .padding(.horizontal, 16) - .bottomSafeAreaPadding() - } - - private var descriptionSection: some View { - BodyMText(description) - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.top, 32) - .padding(.bottom, 49) - } - - private var successScreen: some View { - VStack(spacing: 0) { - BodyMText(t("security__cp_changed_text")) - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.top, 32) - - Spacer() - - Image("check") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 274, height: 274) - - Spacer() - - CustomButton(title: t("common__ok")) { - dismiss() - } - } - } - - private var errorSection: some View { - Group { - if !errorMessage.isEmpty { - BodySText(errorMessage, textColor: .brandAccent) - .frame(maxWidth: .infinity, alignment: .center) - .onTapGesture { - sheets.showSheet(.forgotPin) - } - .accessibilityIdentifier(errorIdentifier ?? "WrongPIN") - } - } - } - - private var pinInputSection: some View { - PinInput(pinInput: $pinInput, verticalSpace: true) { pin in - handlePinChange(pin) - } - .padding(.top, 16) - } -} - -#Preview { - NavigationStack { - PinChangeView() - } - .preferredColorScheme(.dark) - .environmentObject(AppViewModel()) - .environmentObject(SettingsViewModel.shared) - .environmentObject(SheetViewModel()) - .environmentObject(WalletViewModel()) -} diff --git a/Bitkit/Views/Settings/Security/SecuritySheet/SecurityChangePin.swift b/Bitkit/Views/Settings/Security/SecuritySheet/SecurityChangePin.swift new file mode 100644 index 000000000..b448d9f0e --- /dev/null +++ b/Bitkit/Views/Settings/Security/SecuritySheet/SecurityChangePin.swift @@ -0,0 +1,177 @@ +import SwiftUI + +private enum Step: Hashable { + case verifyCurrentPin + case enterNewPin + case confirmNewPin +} + +struct SecurityChangePin: View { + @EnvironmentObject private var app: AppViewModel + @EnvironmentObject private var settings: SettingsViewModel + @EnvironmentObject private var sheets: SheetViewModel + @EnvironmentObject private var session: SessionManager + @EnvironmentObject private var wallet: WalletViewModel + + @Binding var navigationPath: [SecurityRoute] + + @State private var pinInput: String = "" + @State private var currentPin: String = "" + @State private var newPin: String = "" + @State private var errorMessage: String = "" + @State private var errorIdentifier: String? + @State private var step: Step = .verifyCurrentPin + + private var navTitle: String { + switch step { + case .verifyCurrentPin: t("security__cp_title") + case .enterNewPin: t("security__cp_setnew_title") + case .confirmNewPin: t("security__cp_retype_title") + } + } + + private var text: String { + switch step { + case .verifyCurrentPin: t("security__cp_text") + case .enterNewPin: t("security__cp_setnew_text") + case .confirmNewPin: t("security__cp_retype_text") + } + } + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + SheetHeader(title: navTitle) + .padding(.horizontal, 16) + + VStack(spacing: 0) { + BodyMText(text, accentFont: Fonts.bold) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.bottom, 32) + + Spacer() + + if !errorMessage.isEmpty { + BodySText(errorMessage, textColor: .brandAccent) + .padding(.bottom, 16) + .accessibilityIdentifier(errorIdentifier ?? "WrongPIN") + } + } + .padding(.horizontal, 32) + + PinInput(pinInput: $pinInput) { pin in + if pin.count == 4 { + handlePinComplete(pin) + } else if pin.count == 1 { + errorMessage = "" + errorIdentifier = nil + } + } + } + .navigationBarHidden(true) + .allowSwipeBack(false) + .sheetBackground() + } + + private func handlePinComplete(_ pin: String) { + switch step { + case .verifyCurrentPin: + handleVerifyCurrentPin(pin) + case .enterNewPin: + handleEnterNewPin(pin) + case .confirmNewPin: + handleConfirmNewPin(pin) + } + } + + private func handleVerifyCurrentPin(_ pin: String) { + if settings.pinCheck(pin: pin) { + currentPin = pin + step = .enterNewPin + resetPinInput() + Haptics.notify(.success) + } else { + handleIncorrectCurrentPin() + } + } + + private func handleEnterNewPin(_ pin: String) { + newPin = pin + step = .confirmNewPin + resetPinInput() + Haptics.notify(.success) + } + + private func handleConfirmNewPin(_ pin: String) { + guard pin == newPin else { + errorMessage = t("security__cp_try_again") + errorIdentifier = "WrongPIN" + pinInput = "" + return + } + + // PINs match - update PIN + do { + try settings.removePin(pin: currentPin, resetSettings: false) + try settings.setPin(newPin) + pinInput = "" + errorMessage = "" + errorIdentifier = nil + navigationPath.append(.changePinSuccess) + } catch { + Logger.error("Failed to change PIN: \(error)", context: "SecurityChangePin") + errorMessage = t("security__cp_try_again") + errorIdentifier = "WrongPIN" + pinInput = "" + } + } + + private func handleIncorrectCurrentPin() { + pinInput = "" + + if settings.hasExceededPinAttempts() { + handleWalletWipe() + return + } + + let remainingAttempts = settings.getRemainingPinAttempts() + if remainingAttempts == 1 { + errorMessage = t( + "security__pin_last_attempt", + comment: "Last attempt. Entering the wrong PIN again will reset your wallet." + ) + errorIdentifier = "LastAttempt" + } else { + errorMessage = t( + "security__pin_attempts", + comment: "%d attempts remaining. Forgot your PIN?", + variables: ["attemptsRemaining": "\(remainingAttempts)"] + ) + errorIdentifier = "AttemptsRemaining" + } + + Haptics.notify(.error) + } + + private func handleWalletWipe() { + Task { + do { + try await AppReset.wipe( + app: app, + wallet: wallet, + session: session, + toastType: .warning + ) + sheets.hideSheet() + } catch { + Logger.error("Failed to wipe wallet after PIN attempts exceeded: \(error)", context: "SecurityChangePin") + app.toast(error) + } + } + } + + private func resetPinInput() { + pinInput = "" + errorMessage = "" + errorIdentifier = nil + } +} diff --git a/Bitkit/Views/Settings/Security/SecuritySheet/SecurityChangePinSuccess.swift b/Bitkit/Views/Settings/Security/SecuritySheet/SecurityChangePinSuccess.swift new file mode 100644 index 000000000..d8372d693 --- /dev/null +++ b/Bitkit/Views/Settings/Security/SecuritySheet/SecurityChangePinSuccess.swift @@ -0,0 +1,37 @@ +import SwiftUI + +struct SecurityChangePinSuccess: View { + @EnvironmentObject private var navigation: NavigationViewModel + @EnvironmentObject private var sheets: SheetViewModel + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + SheetHeader(title: t("security__cp_changed_title")) + + VStack(spacing: 0) { + BodyMText(t("security__cp_changed_text")) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.bottom, 32) + + Spacer() + + Image("check") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 256, height: 256) + + Spacer() + + CustomButton(title: t("common__ok")) { + sheets.hideSheet() + navigation.navigateBack() + } + } + .padding(.horizontal, 16) + } + .navigationBarHidden(true) + .allowSwipeBack(false) + .padding(.horizontal, 16) + .sheetBackground() + } +} diff --git a/Bitkit/Views/Settings/Security/SecuritySheet/SecurityDisablePin.swift b/Bitkit/Views/Settings/Security/SecuritySheet/SecurityDisablePin.swift new file mode 100644 index 000000000..6b8ed18be --- /dev/null +++ b/Bitkit/Views/Settings/Security/SecuritySheet/SecurityDisablePin.swift @@ -0,0 +1,102 @@ +import SwiftUI + +struct SecurityDisablePin: View { + @EnvironmentObject private var app: AppViewModel + @EnvironmentObject private var navigation: NavigationViewModel + @EnvironmentObject private var session: SessionManager + @EnvironmentObject private var settings: SettingsViewModel + @EnvironmentObject private var sheets: SheetViewModel + @EnvironmentObject private var wallet: WalletViewModel + + @State private var pinInput: String = "" + @State private var errorMessage: String = "" + @State private var errorIdentifier: String? + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + SheetHeader(title: t("security__pin_disable_button")) + .padding(.horizontal, 16) + + VStack(spacing: 0) { + BodyMText(t("security__pin_disable_text")) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.bottom, 32) + + Spacer() + + if !errorMessage.isEmpty { + BodySText(errorMessage, textColor: .brandAccent) + .padding(.bottom, 16) + .accessibilityIdentifier(errorIdentifier ?? "WrongPIN") + .onTapGesture { + sheets.showSheet(.forgotPin) + } + } + } + .padding(.horizontal, 32) + + PinInput(pinInput: $pinInput) { pin in + if pin.count == 4 { + onPinEntered(pin) + } else if pin.count == 1 { + errorMessage = "" + errorIdentifier = nil + } + } + } + .navigationBarHidden(true) + .allowSwipeBack(false) + .sheetBackground() + } + + private func onPinEntered(_ pin: String) { + if settings.pinCheck(pin: pin) { + do { + try settings.removePin(pin: pin) + navigation.navigateBack() + sheets.hideSheet() + } catch { + Logger.error("Failed to disable PIN: \(error)", context: "SecurityDisablePin") + errorMessage = t("security__cp_try_again") + errorIdentifier = "WrongPIN" + pinInput = "" + } + return + } + + pinInput = "" + + if settings.hasExceededPinAttempts() { + handleWalletWipe() + return + } + + let remainingAttempts = settings.getRemainingPinAttempts() + if remainingAttempts == 1 { + errorMessage = t("security__pin_last_attempt") + errorIdentifier = "LastAttempt" + } else { + errorMessage = t("security__pin_attempts", variables: ["attemptsRemaining": "\(remainingAttempts)"]) + errorIdentifier = "AttemptsRemaining" + } + + Haptics.notify(.error) + } + + private func handleWalletWipe() { + Task { + do { + try await AppReset.wipe( + app: app, + wallet: wallet, + session: session, + toastType: .warning + ) + sheets.hideSheet() + } catch { + Logger.error("Failed to wipe wallet after PIN attempts exceeded: \(error)", context: "SecurityDisablePin") + app.toast(error) + } + } + } +} diff --git a/Bitkit/Views/Settings/Security/SecuritySheet/SecurityIntro.swift b/Bitkit/Views/Settings/Security/SecuritySheet/SecurityIntro.swift index b477a007f..e89af3994 100644 --- a/Bitkit/Views/Settings/Security/SecuritySheet/SecurityIntro.swift +++ b/Bitkit/Views/Settings/Security/SecuritySheet/SecurityIntro.swift @@ -3,7 +3,6 @@ import SwiftUI struct SecurityIntro: View { @EnvironmentObject private var sheets: SheetViewModel @Binding var navigationPath: [SecurityRoute] - let showLaterButton: Bool var body: some View { VStack(alignment: .leading, spacing: 0) { @@ -13,14 +12,14 @@ struct SecurityIntro: View { description: t("security__pin_security_text"), image: "shield-figure", continueText: t("security__pin_security_button"), - cancelText: showLaterButton ? t("common__later") : nil, + cancelText: t("common__later"), accentColor: .greenAccent, testID: "SecureWallet", onCancel: { sheets.hideSheet() }, onContinue: { - navigationPath.append(.pin) + navigationPath.append(.setupPin) } ) } @@ -28,6 +27,6 @@ struct SecurityIntro: View { } #Preview { - SecurityIntro(navigationPath: .constant([.intro]), showLaterButton: true) + SecurityIntro(navigationPath: .constant([.intro])) .environmentObject(SheetViewModel()) } diff --git a/Bitkit/Views/Settings/Security/SecuritySheet/SecurityPin.swift b/Bitkit/Views/Settings/Security/SecuritySheet/SecuritySetupPin.swift similarity index 85% rename from Bitkit/Views/Settings/Security/SecuritySheet/SecurityPin.swift rename to Bitkit/Views/Settings/Security/SecuritySheet/SecuritySetupPin.swift index 4497c1cca..6a30f4da8 100644 --- a/Bitkit/Views/Settings/Security/SecuritySheet/SecurityPin.swift +++ b/Bitkit/Views/Settings/Security/SecuritySheet/SecuritySetupPin.swift @@ -1,6 +1,6 @@ import SwiftUI -struct SecurityPin: View { +struct SecuritySetupPin: View { @EnvironmentObject private var settings: SettingsViewModel @Binding var navigationPath: [SecurityRoute] @State private var pinInput: String = "" @@ -40,14 +40,12 @@ struct SecurityPin: View { } .padding(.horizontal, 32) - VStack(spacing: 0) { - PinInput(pinInput: $pinInput) { pin in - if pin.count == 4 { - handlePinComplete(pin) - } else if pin.count == 1 { - errorMessage = "" - errorIdentifier = nil - } + PinInput(pinInput: $pinInput) { pin in + if pin.count == 4 { + handlePinComplete(pin) + } else if pin.count == 1 { + errorMessage = "" + errorIdentifier = nil } } } @@ -91,8 +89,3 @@ struct SecurityPin: View { } } } - -#Preview { - SecurityPin(navigationPath: .constant([.pin])) - .environmentObject(SettingsViewModel.shared) -} diff --git a/Bitkit/Views/Settings/Security/SecuritySheet/SecuritySheet.swift b/Bitkit/Views/Settings/Security/SecuritySheet/SecuritySheet.swift index 4b1a90054..532611a2b 100644 --- a/Bitkit/Views/Settings/Security/SecuritySheet/SecuritySheet.swift +++ b/Bitkit/Views/Settings/Security/SecuritySheet/SecuritySheet.swift @@ -2,27 +2,31 @@ import SwiftUI enum SecurityRoute: Hashable { case intro - case pin + case setupPin case biometrics case noBiometrics case success + case changePin + case changePinSuccess + case disablePin } struct SecurityConfig { - let showLaterButton: Bool + let initialRoute: SecurityRoute - init(showLaterButton: Bool = false) { - self.showLaterButton = showLaterButton + init(initialRoute: SecurityRoute = .intro) { + self.initialRoute = initialRoute } } struct SecuritySheetItem: SheetItem { let id: SheetID = .security - let showLaterButton: Bool let size: SheetSize = .medium + let initialRoute: SecurityRoute - static let withLaterButton = SecuritySheetItem(showLaterButton: true) - static let withoutLaterButton = SecuritySheetItem(showLaterButton: false) + init(initialRoute: SecurityRoute = .intro) { + self.initialRoute = initialRoute + } } struct SecuritySheet: View { @@ -32,7 +36,7 @@ struct SecuritySheet: View { var body: some View { Sheet(id: .security, data: config) { NavigationStack(path: $navigationPath) { - viewForRoute(.intro) + viewForRoute(config.initialRoute) .navigationDestination(for: SecurityRoute.self) { route in viewForRoute(route) } @@ -44,15 +48,21 @@ struct SecuritySheet: View { private func viewForRoute(_ route: SecurityRoute) -> some View { switch route { case .intro: - SecurityIntro(navigationPath: $navigationPath, showLaterButton: config.showLaterButton) - case .pin: - SecurityPin(navigationPath: $navigationPath) + SecurityIntro(navigationPath: $navigationPath) + case .setupPin: + SecuritySetupPin(navigationPath: $navigationPath) case .biometrics: SecurityBiometrics(navigationPath: $navigationPath) case .noBiometrics: SecurityNoBiometrics(navigationPath: $navigationPath) case .success: - SecuritySuccess(navigationPath: $navigationPath) + SecuritySuccess() + case .changePin: + SecurityChangePin(navigationPath: $navigationPath) + case .changePinSuccess: + SecurityChangePinSuccess() + case .disablePin: + SecurityDisablePin() } } } diff --git a/Bitkit/Views/Settings/Security/SecuritySheet/SecuritySuccess.swift b/Bitkit/Views/Settings/Security/SecuritySheet/SecuritySuccess.swift index 7a57c1bbc..cc153e6a5 100644 --- a/Bitkit/Views/Settings/Security/SecuritySheet/SecuritySuccess.swift +++ b/Bitkit/Views/Settings/Security/SecuritySheet/SecuritySuccess.swift @@ -3,23 +3,17 @@ import SwiftUI struct SecuritySuccess: View { @EnvironmentObject private var sheets: SheetViewModel @EnvironmentObject private var settings: SettingsViewModel - @Binding var navigationPath: [SecurityRoute] private var biometryTypeName: String { switch Env.biometryType { - case .touchID: - return t("security__bio_touch_id") - case .faceID: - return t("security__bio_face_id") - default: - return t("security__bio_face_id") // Default to Face ID + case .touchID: t("security__bio_touch_id") + default: t("security__bio_face_id") } } var body: some View { VStack(alignment: .leading, spacing: 0) { SheetHeader(title: t("security__success_title")) - .padding(.horizontal, 16) VStack(spacing: 0) { BodyMText( @@ -67,7 +61,7 @@ struct SecuritySuccess: View { } #Preview { - SecuritySuccess(navigationPath: .constant([.success])) + SecuritySuccess() .environmentObject(SheetViewModel()) .environmentObject(SettingsViewModel.shared) } diff --git a/Bitkit/Views/Wallets/Send/LnurlPayConfirm.swift b/Bitkit/Views/Wallets/Send/LnurlPayConfirm.swift index 5c823477c..5999401b8 100644 --- a/Bitkit/Views/Wallets/Send/LnurlPayConfirm.swift +++ b/Bitkit/Views/Wallets/Send/LnurlPayConfirm.swift @@ -8,11 +8,12 @@ struct LnurlPayConfirm: View { @EnvironmentObject var wallet: WalletViewModel @EnvironmentObject var currency: CurrencyViewModel @EnvironmentObject var settings: SettingsViewModel + @Binding var navigationPath: [SendRoute] + let requestPinCheck: () async -> Bool + @State private var showWarningAlert = false @State private var alertContinuation: CheckedContinuation? - @State private var showPinCheck = false - @State private var pinCheckContinuation: CheckedContinuation? @State private var showingBiometricError = false @State private var biometricErrorMessage = "" @State private var comment = "" @@ -137,9 +138,8 @@ struct LnurlPayConfirm: View { throw CancellationError() } } else { - showPinCheck = true - let shouldProceed = try await waitForPinCheck() - if !shouldProceed { + let shouldProceed = await requestPinCheck() + guard shouldProceed else { throw CancellationError() } } @@ -173,20 +173,6 @@ struct LnurlPayConfirm: View { } message: { Text(biometricErrorMessage) } - .navigationDestination(isPresented: $showPinCheck) { - PinCheckView( - title: t("security__pin_send_title"), - explanation: t("security__pin_send"), - onCancel: { - pinCheckContinuation?.resume(returning: false) - pinCheckContinuation = nil - }, - onPinVerified: { _ in - pinCheckContinuation?.resume(returning: true) - pinCheckContinuation = nil - } - ) - } } private func waitForAlertDismissal() async throws -> Bool { @@ -195,12 +181,6 @@ struct LnurlPayConfirm: View { } } - private func waitForPinCheck() async throws -> Bool { - return try await withCheckedThrowingContinuation { continuation in - pinCheckContinuation = continuation - } - } - private func performPayment() async throws { guard let lnurlPayData = app.lnurlPayData else { throw NSError(domain: "LNURL", code: -1, userInfo: [NSLocalizedDescriptionKey: "Missing LNURL pay data"]) diff --git a/Bitkit/Views/Wallets/Send/SendConfirmationView.swift b/Bitkit/Views/Wallets/Send/SendConfirmationView.swift index e6da1d454..1e5e23e37 100644 --- a/Bitkit/Views/Wallets/Send/SendConfirmationView.swift +++ b/Bitkit/Views/Wallets/Send/SendConfirmationView.swift @@ -11,8 +11,8 @@ struct SendConfirmationView: View { @EnvironmentObject var tagManager: TagManager @Binding var navigationPath: [SendRoute] - @State private var showPinCheck = false - @State private var pinCheckContinuation: CheckedContinuation? + let requestPinCheck: () async -> Bool + @State private var showingBiometricError = false @State private var biometricErrorMessage = "" @State private var transactionFee: Int = 0 @@ -142,9 +142,8 @@ struct SendConfirmationView: View { throw CancellationError() } } else { - showPinCheck = true - let shouldProceed = try await waitForPinCheck() - if !shouldProceed { + let shouldProceed = await requestPinCheck() + guard shouldProceed else { throw CancellationError() } } @@ -195,26 +194,6 @@ struct SendConfirmationView: View { Text(warning.message) } } - .navigationDestination(isPresented: $showPinCheck) { - PinCheckView( - title: t("security__pin_send_title"), - explanation: t("security__pin_send"), - onCancel: { - pinCheckContinuation?.resume(returning: false) - pinCheckContinuation = nil - }, - onPinVerified: { _ in - pinCheckContinuation?.resume(returning: true) - pinCheckContinuation = nil - } - ) - } - } - - private func waitForPinCheck() async throws -> Bool { - return try await withCheckedThrowingContinuation { continuation in - pinCheckContinuation = continuation - } } private func performPayment() async throws { diff --git a/Bitkit/Views/Wallets/Send/SendPinScreen.swift b/Bitkit/Views/Wallets/Send/SendPinScreen.swift new file mode 100644 index 000000000..3be9610e3 --- /dev/null +++ b/Bitkit/Views/Wallets/Send/SendPinScreen.swift @@ -0,0 +1,103 @@ +import SwiftUI + +struct SendPinScreen: View { + @EnvironmentObject private var app: AppViewModel + @EnvironmentObject private var session: SessionManager + @EnvironmentObject private var settings: SettingsViewModel + @EnvironmentObject private var sheets: SheetViewModel + @EnvironmentObject private var wallet: WalletViewModel + + let onCancel: () -> Void + let onPinVerified: () -> Void + + @State private var pinInput: String = "" + @State private var errorMessage: String = "" + @State private var errorIdentifier: String? + @State private var hasResolvedPinCheck = false + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + SheetHeader(title: t("security__pin_send_title"), showBackButton: true) + .padding(.horizontal, 16) + + VStack(spacing: 0) { + BodyMText(t("security__pin_send")) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.bottom, 32) + + Spacer() + + if !errorMessage.isEmpty { + BodySText(errorMessage, textColor: .brandAccent) + .padding(.bottom, 16) + .accessibilityIdentifier(errorIdentifier ?? "WrongPIN") + .onTapGesture { + sheets.showSheet(.forgotPin) + } + } + } + .padding(.horizontal, 32) + + PinInput(pinInput: $pinInput) { pin in + if pin.count == 4 { + onPinEntered(pin) + } else if pin.count == 1 { + errorMessage = "" + errorIdentifier = nil + } + } + } + .navigationBarHidden(true) + .allowSwipeBack(false) + .sheetBackground() + .onDisappear { + if !hasResolvedPinCheck { + hasResolvedPinCheck = true + onCancel() + } + } + } + + private func onPinEntered(_ pin: String) { + if settings.pinCheck(pin: pin) { + hasResolvedPinCheck = true + onPinVerified() + return + } + + pinInput = "" + + if settings.hasExceededPinAttempts() { + handleWalletWipe() + return + } + + let remainingAttempts = settings.getRemainingPinAttempts() + if remainingAttempts == 1 { + errorMessage = t("security__pin_last_attempt") + errorIdentifier = "LastAttempt" + } else { + errorMessage = t("security__pin_attempts", variables: ["attemptsRemaining": "\(remainingAttempts)"]) + errorIdentifier = "AttemptsRemaining" + } + + Haptics.notify(.error) + } + + private func handleWalletWipe() { + Task { + do { + try await AppReset.wipe( + app: app, + wallet: wallet, + session: session, + toastType: .warning + ) + sheets.hideSheet() + } catch { + Logger.error("Failed to wipe wallet after PIN attempts exceeded: \(error)", context: "SendPinScreen") + app.toast(error) + } + } + } +} diff --git a/Bitkit/Views/Wallets/Send/SendSheet.swift b/Bitkit/Views/Wallets/Send/SendSheet.swift index 8318f8e10..23dc08175 100644 --- a/Bitkit/Views/Wallets/Send/SendSheet.swift +++ b/Bitkit/Views/Wallets/Send/SendSheet.swift @@ -10,6 +10,7 @@ enum SendRoute: Hashable { case feeCustom case tag case quickpay + case pin case pending(paymentHash: String) case success(paymentId: String) case failure @@ -49,6 +50,7 @@ struct SendSheet: View { @State private var navigationPath: [SendRoute] = [] @State private var hasValidatedAfterSync = false + @State private var pinCheckContinuation: CheckedContinuation? /// Show sync overlay when node is not ready for payments /// For lightning: need node running AND at least one usable channel (peer connected). @@ -257,6 +259,26 @@ struct SendSheet: View { hasValidatedAfterSync = true } + private func requestPinCheck() async -> Bool { + // Prevent stacking multiple PIN screens if already presented. + if navigationPath.last != .pin { + navigationPath.append(.pin) + } + + return await withCheckedContinuation { continuation in + pinCheckContinuation = continuation + } + } + + private func resolvePinCheck(_ approved: Bool) { + pinCheckContinuation?.resume(returning: approved) + pinCheckContinuation = nil + + if navigationPath.last == .pin { + navigationPath.removeLast() + } + } + @ViewBuilder private func viewForRoute(_ route: SendRoute) -> some View { switch route { @@ -269,7 +291,7 @@ struct SendSheet: View { case .utxoSelection: SendUtxoSelectionView(navigationPath: $navigationPath) case .confirm: - SendConfirmationView(navigationPath: $navigationPath) + SendConfirmationView(navigationPath: $navigationPath, requestPinCheck: requestPinCheck) case .feeRate: SendFeeRate(navigationPath: $navigationPath) case .feeCustom: @@ -278,6 +300,8 @@ struct SendSheet: View { SendTagScreen(navigationPath: $navigationPath) case .quickpay: SendQuickpay(navigationPath: $navigationPath) + case .pin: + SendPinScreen(onCancel: { resolvePinCheck(false) }, onPinVerified: { resolvePinCheck(true) }) case let .pending(paymentHash): SendPendingScreen(paymentHash: paymentHash, navigationPath: $navigationPath) case let .success(paymentId): @@ -287,7 +311,7 @@ struct SendSheet: View { case .lnurlPayAmount: LnurlPayAmount(navigationPath: $navigationPath) case .lnurlPayConfirm: - LnurlPayConfirm(navigationPath: $navigationPath) + LnurlPayConfirm(navigationPath: $navigationPath, requestPinCheck: requestPinCheck) case .lnurlWithdrawAmount: LnurlWithdrawAmount { navigationPath.append(.lnurlWithdrawConfirm)