From 099de7a49e0075ab0abbe6c59fff144d2ced059d Mon Sep 17 00:00:00 2001 From: Mike Date: Mon, 23 Sep 2024 13:26:16 -0400 Subject: [PATCH] move tab config out of json --- .../RoutingTabBarController.swift | 73 +++++----------- .../dydxPresenters/_Features/tabs_v4.json | 2 +- .../_Features/tabs_v4_vault.json | 2 +- .../_v4/RootTab/dydxV4TabBarBuilder.swift | 82 +++++++++++------- .../icon_earn.imageset/icon_earn.pdf | Bin 1350 -> 2588 bytes .../icon_market.imageset/Contents.json | 2 +- .../icon_market.imageset/Vector-23.pdf | Bin 2977 -> 0 bytes .../icon_market.imageset/icon_market.pdf | Bin 0 -> 1481 bytes .../icon_portfolio.imageset/Contents.json | 12 +++ .../icon_portfolio.pdf | Bin 0 -> 1453 bytes .../icon_profile.imageset/Contents.json | 2 +- .../icon_profile.imageset/Vector-25.pdf | Bin 1912 -> 0 bytes .../icon_profile.imageset/icon_profile.pdf | Bin 0 -> 1249 bytes 13 files changed, 86 insertions(+), 89 deletions(-) delete mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Vector-23.pdf create mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/icon_market.pdf create mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/Contents.json create mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/icon_portfolio.pdf delete mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_profile.imageset/Vector-25.pdf create mode 100644 dydx/dydxViews/dydxViews/Media.xcassets/icon_profile.imageset/icon_profile.pdf diff --git a/PlatformRouting/PlatformRouting/_ViewController/RoutingTabBarController.swift b/PlatformRouting/PlatformRouting/_ViewController/RoutingTabBarController.swift index 78219de3d..3cf9a5de3 100644 --- a/PlatformRouting/PlatformRouting/_ViewController/RoutingTabBarController.swift +++ b/PlatformRouting/PlatformRouting/_ViewController/RoutingTabBarController.swift @@ -52,16 +52,6 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { private var actionPath: String? - @IBInspectable open var routingMap: String? { - didSet { - if routingMap != oldValue { - if let destinations = parser.asArray(JsonLoader.load(bundles: Bundle.particles, fileName: routingMap)) { - parse(array: destinations) - } - } - } - } - var previousController: UIViewController? override open func viewDidLoad() { @@ -104,18 +94,6 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { } } - public func parse(array: [Any]) { - if let data = array as? [[String: Any]] { - var maps = [TabbarItemInfo]() - for dictionary in data { - let routing = TabbarItemInfo() - routing.parse(dictionary: dictionary) - maps.append(routing) - } - self.maps = maps - } - } - open func diff(current: [TabbarItemInfo], old: [TabbarItemInfo]) -> Diff { return old.diff(current) { (object1, object2) -> Bool in object1.path == object2.path @@ -160,8 +138,8 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { } private func path(info: TabbarItemInfo) -> String? { - if let router = Router.shared as? MappedUIKitRouter, let path = info.path { - let request = RoutingRequest(path: path) + if let router = Router.shared as? MappedUIKitRouter { + let request = RoutingRequest(path: info.path) return router.transform(request: request).path } else { return nil @@ -225,13 +203,11 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { private func setup(viewController: UIViewController, info: TabbarItemInfo) { let tabbarItem = UITabBarItem() - tabbarItem.title = info.title?.localized ?? " " - if let image = info.image { - tabbarItem.image = UIImage.named(image, bundles: Bundle.particles) - } - if let selected = info.selected { - tabbarItem.selectedImage = UIImage.named(selected, bundles: Bundle.particles) - } + tabbarItem.title = info.title + tabbarItem.image = UIImage.named(info.image, bundles: Bundle.particles) +// if let selected = info.selected { +// tabbarItem.selectedImage = UIImage.named(selected, bundles: Bundle.particles) +// } viewController.tabBarItem = tabbarItem } @@ -241,11 +217,7 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { let viewController = viewControllers[i] if let tabbarItem = viewController.tabBarItem { let map = maps[i] - if let path = map.path { - tabbarItem.badgeValue = badging?.badge(for: path) - } else { - tabbarItem.badgeValue = nil - } + tabbarItem.badgeValue = badging?.badge(for: map.path) } } } @@ -276,24 +248,21 @@ open class RoutingTabBarController: UITabBarController, ParsingProtocol { } } -public class TabbarItemInfo: NSObject, ParsingProtocol { - override open var parser: Parser { - return RoutingTabBarController.parserOverwrite ?? super.parser +public struct TabbarItemInfo: Equatable { + public init(path: String, + title: String?, + image: String, + split: Bool) { + self.path = path + self.title = title + self.image = image + self.split = split } - - public var path: String? + + public var path: String public var title: String? - public var image: String? - public var selected: String? - public var split: Bool? - - public func parse(dictionary: [String: Any]) { - path = parser.asString(dictionary["path"]) - title = parser.asString(dictionary["title"]) - image = parser.asString(dictionary["image"]) - selected = parser.asString(dictionary["selected"]) - split = parser.asBoolean(dictionary["split"])?.boolValue - } + public var image: String + public var split: Bool } extension RoutingTabBarController: UITabBarControllerDelegate { diff --git a/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4.json b/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4.json index 3f80529e8..7deed7041 100644 --- a/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4.json +++ b/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4.json @@ -2,7 +2,7 @@ { "path":"/portfolio", "title":"", - "image":"icon_wallet", + "image":"icon_portfolio", "split":true }, { diff --git a/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4_vault.json b/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4_vault.json index 379919c6c..b0aa7d502 100644 --- a/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4_vault.json +++ b/dydx/dydxPresenters/dydxPresenters/_Features/tabs_v4_vault.json @@ -3,7 +3,7 @@ { "path":"/portfolio", "title":"", - "image":"icon_wallet", + "image":"icon_portfolio", "split":true }, { diff --git a/dydx/dydxPresenters/dydxPresenters/_v4/RootTab/dydxV4TabBarBuilder.swift b/dydx/dydxPresenters/dydxPresenters/_v4/RootTab/dydxV4TabBarBuilder.swift index a0a474d38..dfd94cb6f 100644 --- a/dydx/dydxPresenters/dydxPresenters/_v4/RootTab/dydxV4TabBarBuilder.swift +++ b/dydx/dydxPresenters/dydxPresenters/_v4/RootTab/dydxV4TabBarBuilder.swift @@ -32,20 +32,11 @@ public class dydxV4TabBarBuilder: NSObject, ObjectBuilderProtocol { } } - override public var selectedIndex: Int { - didSet { - if selectedIndex != oldValue { - update(index: oldValue, selected: false) - update(index: selectedIndex, selected: true) - } - } - } - public override func viewDidLoad() { super.viewDidLoad() createCenterButton() - routingMap = dydxBoolFeatureFlag.isVaultEnabled.isEnabled ? "tabs_v4_vault.json" : "tabs_v4.json" + maps = dydxBoolFeatureFlag.isVaultEnabled.isEnabled ? Self.tabBarItemInfosV2 : Self.tabBarItemInfos } override public func viewWillAppear(_ animated: Bool) { @@ -87,28 +78,53 @@ public class dydxV4TabBarBuilder: NSObject, ObjectBuilderProtocol { private func updateCenterButton() { centerButton?.buttonImage = UIImage.named("icon_trade", bundles: Bundle.particles) } +} - private func update(index: Int, selected: Bool) { - if index != NSNotFound { - if let item = tabBar.items?[index] { - update(item: item, index: index, selected: selected) - } - } - } - - private func update(item: UITabBarItem, index: Int, selected: Bool) { - item.title = selected ? "●" : " " -// if selected, [0, 3, 4].contains(index), wallet === nil { -// promptLogin() -// } - } - - override public func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { - if let items = tabBar.items { - for index in 0 ..< items.count { - let tab = items[index] - update(item: tab, index: index, selected: tab === item) - } - } - } +private extension dydxV4TabBarController { + static let tabBarItemInfos: [TabbarItemInfo] = [ + .init(path: "/portfolio", + title: DataLocalizer.localize(path: "APP.PORTFOLIO.PORTFOLIO"), + image: "icon_portfolio", + split: true), + .init(path: "/markets", + title: DataLocalizer.localize(path: "APP.GENERAL.MARKETS"), + image: "icon_market", + split: true), + .init(path: "/trade", + title: DataLocalizer.localize(path: "APP.GENERAL.TRADE"), + image: "icon_trade", + split: true), + .init(path: "/alerts", + title: DataLocalizer.localize(path: "APP.GENERAL.ALERTS"), + image: "icon_alerts", + split: true), + .init(path: "/my-profile", + title: DataLocalizer.localize(path: "APP.GENERAL.PROFILE"), + image: "icon_profile", + split: true) + ] + + static let tabBarItemInfosV2: [TabbarItemInfo] = [ + .init(path: "/portfolio", + title: DataLocalizer.localize(path: "APP.PORTFOLIO.PORTFOLIO"), + image: "icon_portfolio", + split: true), + .init(path: "/markets", + title: DataLocalizer.localize(path: "APP.GENERAL.MARKETS"), + image: "icon_market", + split: true), + .init(path: "/trade", + title: DataLocalizer.localize(path: "APP.GENERAL.TRADE"), + image: "icon_trade", + split: true), + .init(path: "/vault", + title: DataLocalizer.localize(path: "APP.VAULTS.EARN"), + image: "icon_earn", + split: true), + .init(path: "/my-profile", + title: DataLocalizer.localize(path: "APP.GENERAL.PROFILE"), + image: "icon_profile", + split: true) + ] } + diff --git a/dydx/dydxViews/dydxViews/Media.xcassets/icon_earn.imageset/icon_earn.pdf b/dydx/dydxViews/dydxViews/Media.xcassets/icon_earn.imageset/icon_earn.pdf index a6e9e134d73e427c1718e3b61e8f86fe681201dd..8116bc9f53866eb8285640a15242e17216bef0f6 100644 GIT binary patch delta 2099 zcmZvddpHvcAIE7dEr#AMJ0vriI~%paj7oFKagSWWFmj30+>XLXQJDKBAsm;Xh`B|U z3Zu>aGS)C%kPx*E<#sx6&-4EAzVG+X&+q%!_xU`}j|M6@oQ5D`eFH-91gIu902hKc z!g~gJ;X%-UqG^r~^a;5J)rKOVHa`&t0}2iy;BnVMe+sVT{a)*N27GtHwVQ2toU?a} zJT1mM`{q!x(1A7A7^oq$Xf^Gd{Ud=|P!PAZ+8n?QhN@9o+3uy1qzI}IJ zIJ6z{1Bl~Td;U%CDJ@^o8l%xVAQ{EM`R&A-fr|XXrNtzDgtbseTLBqg)I3Sdcl5LN zito3$uE;a6iisZ8Nu^Sr1x1RmIs;b{ZW<7^uZ(=|hgUZ&w)ZdnAsVC~y~`ALx3ioR z6lHFxl3QI){9ar6 zQfW!=QqMh60LAMNaKsGIt6j9LiwM{BI;vBxtgGP0iBIOmekZ0irCmRzukp)BOi8R^yLlsWOOoH z^69$Zk9O_gFOy7PfefNEJF;u~q|*SmnSte)>2o$18Q;er^eYQ^Z6d!UIIR|_8d!`* zOpzms!M)$K)VqF|gu;zbH4z-Xk)D}cXN093{6j?g+g{3)an7Z?wezlVS^8)1?3&%^ z;LVi%uwy%ew_X-+w`c8Rh5m)5EwiLd=an}eUQ7&Lep4}wJ4FNn4=Jrx^X|GEY8tMB zU(U)O9Xss-v;At?D#Mr?HaZYv%?!^;k^Bwl_2#5#S;uPx^fD3`m40GruC6q9%Q8NT z%8?pciD9~lu<`0i=aRv12p1m9kJZq&L~?MjR}x4@ntOgjDnY*HrYh=FpZp&m`_yyD zP1wZ!j{>xKPQ(J7!EOIYJjnR@9!cFZn=DT+E~l1oWf4`ng40a zx^i{em#VUQ^SD&FZM6589RzFx;>uBEx{|tIn$^@ zkKYPF5Y>NGhgTWc*=O4?5l;`Flk?D^bJ_;`3!<{5eaoHe&-t8)mG|+kN7tOTL3i;J zf0^krt49&l2MCmEA87uUp8cKSycW)tRvAo`!gSBx_B)?PzU=#31_t7Njfp)?t~C76 zsvC&x*Q%8}6TIeZXFPms9eIMlmg*+FMw%KI*v&eVSt$Hvq6Bq+W`eYIql9pbhyuwE zbCs9xxO8fTW1Hb|h`MlgjP&+JWc9*i@?l+rawtC=ol1d?LgOzjIB#-|?!X~Wa z+l+@-DBA_>?;S_r+5mYS#l}^U&F3@1>FwTW^q(twhCr^y#_p?rPLGs>SnV#23qm5h zZaZPky;O)8l(02olyAqn39kmgfKgmZ`v>XpVSNkB9LH+{OC2oT60q zOTSHN@0MQ~2fmE4K606QX{Urz-RM+z-vT5VY`x2j3Y=dqoib6KP88GSiX7LmO`7wq zNq;X_>mW)!>NA--yN{EO|0E*-DKxDsoUDf>4-ngTX!Mn}Mb$;j4hN&zC_8~ZX53xM zKX?q^u5VZr?mZCo86eZ@$g8Ox0U3It$O38a9G_p!FxcCy2%CT5ao%h6;YL-GQL2q+ zfY?~qRpwSNp{lqGJp{#zgTH?7X>qw3LyRyMx4o95wZknX`@ge1%->2 G*uMdrDh7oB literal 1350 zcmZuxO>fjd486~<@TF3V)X8|hN2)5(Eky_r%a&WkA!MiRqTK|N6cv6wp50`Ue)teM zZ{qiCkDa6C<<%*2#~6Zu=EqM4aCQdg=PcIi^vdKMFFwWkuD=IG;3|F9^=&M7thkJS zHdS1`zktQ{{H^NPZ-!j#4aDf2X7A-$KB{(1a3e5S%8l!w5j{C3Sm8W$Rn1V2ggI!( z&~q!DMmNbxJ$`4na?*GO6Eu-jY=&l*iEnnAg(s|HuaM`wCYA}xBo!4pv?z0ACm&6T zW~gHK%yP5_sYix8GA)35pt%nUodVL8Qfid2W$3s?k4is5J@;CBGmGE8!nq}-z)@;r zhHwnRBq`)JP)h@lC>?q)l9b@e&@C9CtO>Q=5Nf&dK`4LF-xF+KV@+acI2x^`+}CBL zl}Su;CFlYb1n!lT7?PIaE})}qC>Q5QDrr%%UeU;iDW1TWq)F@c4XfE#mS%n!=yCef zpdYrvp~yR-GfKNsyshh|@8IS;?G9P-?eDJ$#j?DM1MoSnH|0h12shJ6<|~{AX!1s; zRqUFFwu&93?OY9Xi>B^lO^RtXM{rrTgn=2L*#ajhFLv>9v!+xbRj`6lXVE-REWXIU zBV@*8pD?8YyDT^rz9{>0+uS`3eQe_`6X4ik%+nLBG0FhJgV9y(J*YE8qxuZ;6!;vX z8F>bUKvgHpTqtbFP~VoDZERV(y$_evj^nP`#S=K*tWOS2DOOF>Ln?UR;Np7oFH-jV TKVI4P`*IMaXGcfxzFhqWdfy_) diff --git a/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Contents.json b/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Contents.json index 19e3c6f80..eb657bfe5 100644 --- a/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Contents.json +++ b/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "Vector-23.pdf", + "filename" : "icon_market.pdf", "idiom" : "universal" } ], diff --git a/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Vector-23.pdf b/dydx/dydxViews/dydxViews/Media.xcassets/icon_market.imageset/Vector-23.pdf deleted file mode 100644 index 1898811277f55a8314563f546a4fb600063eebc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2977 zcmZuzU2ohr5Pava;EREzKqQj-BoG8>?4~H%qVA<{K_9NN;#_ejwWmvw_SbhPk+Zzm zdN9@_ad&ohq}!YOyLYc_(J5uM(eodFDy?6?)^FaZae4^`J^j=yYSR< zIgk63D(}XB4#T+n{;j@!pZ_;3>ThKWvtHVy;1#2%_jqeKDO32~nWn}`-`m>sA@Hv9 zMlZvp>Xgs*DLN@v_{!U=)&knXJKNb_yRK-uzUeA$3jiT-ZPB~FcC8*zu6DL|T>wo7 z7^0-at|?4w`nJg+)(=NxkHn6GMM~jlED#xa;SmYdph3Fvaj)6a(=tQ`u%+P0#qU6k<_waxeAEqC^UN#h~+^=o+An_f>KQ>BBBc$iI9`D(-}-p@AmaQ5E)pkwjruv7z-kdKs3Lf&X^+Q$#X~3NIgv7 z7j^5K7IpZf?F$d{H5dR{0Bd079&XKQ19jGPcI6vc0!wws;tGp*QJYUPIA&m%m`Rm3 z5d#$Iv?*BgMc!?qCGBCH>!n3`LJ*Nu35u@FCaq^xMI*8kDcOTS>=jihxsVDru_PhU z=^BmWwN0{#?UGG^MVkPN5yXLaHyZ(sHnH_)6MUe^3Ro0MFr2QoVRZSEcquoVWEou= z$5m~|c?e7PjviAtIVLtCN|LY%K}rlLnvsJ5^o&i&n}e11M0x5!2r^JGf}*Qr;{Y<7 z$fSfFlSmJQ*ej|MlxVdHzaf?pY{D2(6xMU%{8-?<-@YX_d!Ic$!WSPeTKFQtB2=8z z1R7Lq0S4i7TcfSfC=ne;LGr319N9_7>>-Ef4T9u!RK%z%3s8FUU@+iZuruiLarVTN zEJI{aREQX5WG1Se)#FgeN=8TO0lRiWS;NY2r)j<{`or&7%W##y{rlIb%lrM~7=fS1hr|Bu{6&9|wS-jU=TD-PX*VwO z=kqWwIxK#>nC^C-F5`rXVe3oa{r(J0V|!VlY&Q%LcgFI^!vm=5(7{fpI=Ay@oV8E* zFF>+P?Nz3&&D;HDf1DrV(a`kr9EmUI@uM=jQ=9DJuWp;BYBb<@S) z1AYzF{%fdp&?a2WXcJN0zl9RnWM@Bg^gbB747{JxF9yp|R52I33jDB=*SH3&`;BCad$%n7b-Li@6hKQN`?=8y~*DlNAG&Wr_ zFCvI{mu5xbs&y67oHjnukxHeH1x>#GTP<_dk$qjR=-k-+xl?a{e7!)f#i=1`f=WqA zz3=Ia)(s2fvR123bTM2yY2#i#Z`Cvz!|o0H|Nc95vot1J+se6&cWZf@{qlsE8L!U7 zb*c7*~e!0) zsm~2P8K+d++8#38IHPF6E%tN95uPi}Y&<2MPcgsOGEkdV*vPwX=PB)Gi!Xw&9sD@w z+}3!}?yR?Sk(R`i)K>`>Yj>En<#4G^SMlp@3Ophfa8WclV{d8Gqc~~(D^bG!yJC(h z7*+f`5N3XE&GngUueh}*Z#rn2wE9uEf%Wf0XSVBKyY>0&Z5bZLt88fk9?xH8ZEM)O zD)-dg$jSE(w=K}ydoIL<$#zomrR%egH|^dmsC1pfbIwh{R2JsPjq5p>_IGl7ysl6c z&f0Rp$nJpSkrJ+>CEF%^knUh)@LXMd?X$gKeb#H58DWZsL#u6_WmjrU7?`Xxj*Pw2anJ4$r^uEJ`c+OUPQy>}B z+}s$R-Av%3pzP|HmzQ5stPmXw&14~!1*r=90g36bT<4pbl9}j~U!f2U%)+1y49voC zhLH(O2*HAx6qH(=Us{x$TC4ynAV4`5l!=}5^GZ_lfHs11Jxnklu?Q%pUxv8288ks4YkU-H7%Fi!R0C^Z3!1}?N aRjEMNgA2^Wq7txo42?`Jxl~nM{oMd7bsk0l literal 0 HcmV?d00001 diff --git a/dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/Contents.json b/dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/Contents.json new file mode 100644 index 000000000..624a796dc --- /dev/null +++ b/dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "icon_portfolio.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/icon_portfolio.pdf b/dydx/dydxViews/dydxViews/Media.xcassets/icon_portfolio.imageset/icon_portfolio.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8c0750783da928ed30b2152e1bb017f4b555eccc GIT binary patch literal 1453 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 literal 0 HcmV?d00001