From 10cb851a5a050ad58682a9f71a6a96b374a4427e Mon Sep 17 00:00:00 2001 From: VincentMeilinger Date: Thu, 25 Jan 2024 22:51:08 +0100 Subject: [PATCH] Code cleanup --- .../project.pbxproj | 52 +++++++--- .../UserInterfaceState.xcuserstate | Bin 65230 -> 71672 bytes .../{Views => }/Alerts.swift | 0 .../Nextcloud_Cookbook_iOS_ClientApp.swift | 2 +- .../{MainViewModel.swift => AppState.swift} | 6 +- .../ViewModels/RecipeEditViewModel.swift | 6 +- .../Views/MainView.swift | 26 ++--- .../CategoryPickerView.swift | 0 .../KeywordPickerView.swift | 0 .../{ => RecipeEditing}/RecipeEditView.swift | 0 .../{ => Recipes}/CategoryDetailView.swift | 2 +- .../Views/{ => Recipes}/RecipeCardView.swift | 2 +- .../{ => Recipes}/RecipeDetailView.swift | 4 +- .../Views/{ => Recipes}/TimerView.swift | 0 .../{ => ReusableViews}/CollapsibleView.swift | 0 .../Views/SettingsView.swift | 2 +- .../Views/Tabs/RecipeTabView.swift | 93 +++++++++--------- .../Views/Tabs/SearchTabView.swift | 43 ++++---- 18 files changed, 131 insertions(+), 107 deletions(-) rename Nextcloud Cookbook iOS Client/{Views => }/Alerts.swift (100%) rename Nextcloud Cookbook iOS Client/ViewModels/{MainViewModel.swift => AppState.swift} (99%) rename Nextcloud Cookbook iOS Client/Views/{ => RecipeEditing}/CategoryPickerView.swift (100%) rename Nextcloud Cookbook iOS Client/Views/{ => RecipeEditing}/KeywordPickerView.swift (100%) rename Nextcloud Cookbook iOS Client/Views/{ => RecipeEditing}/RecipeEditView.swift (100%) rename Nextcloud Cookbook iOS Client/Views/{ => Recipes}/CategoryDetailView.swift (97%) rename Nextcloud Cookbook iOS Client/Views/{ => Recipes}/RecipeCardView.swift (98%) rename Nextcloud Cookbook iOS Client/Views/{ => Recipes}/RecipeDetailView.swift (99%) rename Nextcloud Cookbook iOS Client/Views/{ => Recipes}/TimerView.swift (100%) rename Nextcloud Cookbook iOS Client/Views/{ => ReusableViews}/CollapsibleView.swift (100%) diff --git a/Nextcloud Cookbook iOS Client.xcodeproj/project.pbxproj b/Nextcloud Cookbook iOS Client.xcodeproj/project.pbxproj index af531b4..a7f4128 100644 --- a/Nextcloud Cookbook iOS Client.xcodeproj/project.pbxproj +++ b/Nextcloud Cookbook iOS Client.xcodeproj/project.pbxproj @@ -14,7 +14,7 @@ A70171942AA8E72000064C43 /* Nextcloud_Cookbook_iOS_ClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70171932AA8E72000064C43 /* Nextcloud_Cookbook_iOS_ClientTests.swift */; }; A701719E2AA8E72000064C43 /* Nextcloud_Cookbook_iOS_ClientUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A701719D2AA8E72000064C43 /* Nextcloud_Cookbook_iOS_ClientUITests.swift */; }; A70171A02AA8E72000064C43 /* Nextcloud_Cookbook_iOS_ClientUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A701719F2AA8E72000064C43 /* Nextcloud_Cookbook_iOS_ClientUITestsLaunchTests.swift */; }; - A70171AD2AA8EF4700064C43 /* MainViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70171AC2AA8EF4700064C43 /* MainViewModel.swift */; }; + A70171AD2AA8EF4700064C43 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70171AC2AA8EF4700064C43 /* AppState.swift */; }; A70171AF2AB2116B00064C43 /* NetworkHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70171AE2AB2116B00064C43 /* NetworkHandler.swift */; }; A70171B12AB211DF00064C43 /* CustomError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70171B02AB211DF00064C43 /* CustomError.swift */; }; A70171B42AB2122900064C43 /* NetworkRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70171B32AB2122900064C43 /* NetworkRequests.swift */; }; @@ -85,7 +85,7 @@ A70171992AA8E72000064C43 /* Nextcloud Cookbook iOS ClientUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Nextcloud Cookbook iOS ClientUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; A701719D2AA8E72000064C43 /* Nextcloud_Cookbook_iOS_ClientUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Nextcloud_Cookbook_iOS_ClientUITests.swift; sourceTree = ""; }; A701719F2AA8E72000064C43 /* Nextcloud_Cookbook_iOS_ClientUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Nextcloud_Cookbook_iOS_ClientUITestsLaunchTests.swift; sourceTree = ""; }; - A70171AC2AA8EF4700064C43 /* MainViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewModel.swift; sourceTree = ""; }; + A70171AC2AA8EF4700064C43 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = ""; }; A70171AE2AB2116B00064C43 /* NetworkHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkHandler.swift; sourceTree = ""; }; A70171B02AB211DF00064C43 /* CustomError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomError.swift; sourceTree = ""; }; A70171B32AB2122900064C43 /* NetworkRequests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkRequests.swift; sourceTree = ""; }; @@ -185,6 +185,7 @@ A781E75F2AF8228100452F6F /* RecipeImport */, A9CA6CED2B4C084100F78AB5 /* RecipeExport */, A703226B2ABAF60D00D7C4ED /* Extensions */, + A76B8A702AE002AE00096CEC /* Alerts.swift */, A76B8A6E2ADFFA8800096CEC /* SupportedLanguage.swift */, A7AEAE632AD5521400135378 /* Localizable.xcstrings */, A70171852AA8E71F00064C43 /* Assets.xcassets */, @@ -234,7 +235,7 @@ A70171B72AB2445700064C43 /* ViewModels */ = { isa = PBXGroup; children = ( - A70171AC2AA8EF4700064C43 /* MainViewModel.swift */, + A70171AC2AA8EF4700064C43 /* AppState.swift */, A79AA8E12AFF8C14007D25F2 /* RecipeEditViewModel.swift */, ); path = ViewModels; @@ -244,18 +245,12 @@ isa = PBXGroup; children = ( A70171832AA8E71900064C43 /* MainView.swift */, + A70171CC2AB501B100064C43 /* SettingsView.swift */, A977D0DC2B6002DA009783A9 /* Tabs */, A7FB0D782B25C65200A3469E /* Onboarding */, - A70171BD2AB4987900064C43 /* CategoryDetailView.swift */, - A70171C12AB498C600064C43 /* RecipeCardView.swift */, - A70171BF2AB498A900064C43 /* RecipeDetailView.swift */, - A70D7CA02AC73CA700D53DBF /* RecipeEditView.swift */, - A70171CC2AB501B100064C43 /* SettingsView.swift */, - A7F3F8E72ACBFC760076C227 /* KeywordPickerView.swift */, - A7F3F8E92ACC221C0076C227 /* CategoryPickerView.swift */, - A76B8A702AE002AE00096CEC /* Alerts.swift */, - A7CD3FD12B2C546A00D764AD /* CollapsibleView.swift */, - A9D89AAF2B4FE97800F49D92 /* TimerView.swift */, + A9C3BE502B630E3900562C79 /* Recipes */, + A9C3BE512B630E8300562C79 /* RecipeEditing */, + A9C3BE522B630F1300562C79 /* ReusableViews */, ); path = Views; sourceTree = ""; @@ -335,6 +330,35 @@ path = Tabs; sourceTree = ""; }; + A9C3BE502B630E3900562C79 /* Recipes */ = { + isa = PBXGroup; + children = ( + A70171BD2AB4987900064C43 /* CategoryDetailView.swift */, + A70171C12AB498C600064C43 /* RecipeCardView.swift */, + A70171BF2AB498A900064C43 /* RecipeDetailView.swift */, + A9D89AAF2B4FE97800F49D92 /* TimerView.swift */, + ); + path = Recipes; + sourceTree = ""; + }; + A9C3BE512B630E8300562C79 /* RecipeEditing */ = { + isa = PBXGroup; + children = ( + A70D7CA02AC73CA700D53DBF /* RecipeEditView.swift */, + A7F3F8E72ACBFC760076C227 /* KeywordPickerView.swift */, + A7F3F8E92ACC221C0076C227 /* CategoryPickerView.swift */, + ); + path = RecipeEditing; + sourceTree = ""; + }; + A9C3BE522B630F1300562C79 /* ReusableViews */ = { + isa = PBXGroup; + children = ( + A7CD3FD12B2C546A00D764AD /* CollapsibleView.swift */, + ); + path = ReusableViews; + sourceTree = ""; + }; A9CA6CED2B4C084100F78AB5 /* RecipeExport */ = { isa = PBXGroup; children = ( @@ -528,7 +552,7 @@ A79AA8ED2B063AD5007D25F2 /* NextcloudApi.swift in Sources */, A70171822AA8E71900064C43 /* Nextcloud_Cookbook_iOS_ClientApp.swift in Sources */, A74D33C32AFCD1C300D06555 /* RecipeScraper.swift in Sources */, - A70171AD2AA8EF4700064C43 /* MainViewModel.swift in Sources */, + A70171AD2AA8EF4700064C43 /* AppState.swift in Sources */, A76B8A6F2ADFFA8800096CEC /* SupportedLanguage.swift in Sources */, A977D0E02B600318009783A9 /* RecipeTabView.swift in Sources */, A703226F2ABB1DD700D7C4ED /* ColorExtension.swift in Sources */, diff --git a/Nextcloud Cookbook iOS Client.xcodeproj/project.xcworkspace/xcuserdata/vincie.xcuserdatad/UserInterfaceState.xcuserstate b/Nextcloud Cookbook iOS Client.xcodeproj/project.xcworkspace/xcuserdata/vincie.xcuserdatad/UserInterfaceState.xcuserstate index c2a67e2fcdeccb9ad84bd09bc5f9127ed0188d32..b16e423ae92597e814d61556f01178c47ebf1c7c 100644 GIT binary patch literal 71672 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 delta 30941 zcmb5W2Ur!y_Xd1tcedQ^dud8XET~9FI!FfrdvAz>ilQiBH{Kn4i&0mN8chT{Ce|dz z7>y;dm#8TkOEksws8M5z(QoEnu9{!+|DNyjKD%6JW@qPp&zW=1oSnPBZ-;09rWXyQ zm|2Slt%a7y0Gcdl6W1N|06jr3&>Qpt#b6*P0cD^Zj0NMs3t&2!0cL`^;6<eKwYFhqpna_sTKi+Ci~523k@|^-G()pANAt9m7HE-{Xqi@M z8{L@prhVujx(VHiZcT^MZRiL(l8&Mi=_ERtPN8$?BDy=>o9;sopa;=I=;8DTx{@AE z*U$^-7wLucOY|aoF};K~>812CdO5v{uBGefb@Udxp58^m*66}7%s6x6TS>zg|ER4 za3kCXx5FK9C)@?!h5O+9@E|+}&%z7vQ}{W&4!?k3!Q1c-ybFJY_uv!8!T^S1XvWG2 zjLI}-ycr*+8Pl9;!6Y%sObV0Aq%rN7bS8tzWOA7TrXy3%3};3#70gIx6jRBJX2vk~ zDyEvLVWu*6#$XULo0-EbU|wRDG0T}%%&W{cW;?Tk*~#o;b~A4>dzg2b{men;2y>LV z#9U@RXRa_;nQP2-<_qQ<=6mJ`<~Qac^E>kg^C$Bc^N6*uEX%PxtFbz3W8GMHwlV9+ zHe*||t=KR&oQ-4S?Q8;@!e+DiY)7^$+l?K-7PAA{61I%3W^339>_m1FYiA91Iy;k{ z&%VSiVpp&$*;VXXwwB$=?qYYdZ?bQ(Z?k*Yee8Se2keLJQT8l*j{S(e#eU0v$9~WL z!2Zbo#Qx0w!ro@@v466Ev5z>&F&xWroXXiXPUl*1AzVwY71x>z<=SvzTsRlO#c)Yn zGMB|=b2(fdSHN}TI&n+5<=o5ME8J>sEmzBJ;5Ksg+*WQow}X3=dyCu4y~`co-sg^R zA8^OH6Wkf@EO&vs$bH6L;;wSnxSQOU+%4`~?nmw??hbdCd%*q1{b}d^;-2sp9`X!t z0)Z#=pX^=GXHZ_>KHFemj4RKhB@vPx7aD z`)U3Rf0jSTf5e~XKjE+P*ZAxF*Zep9&-^d^ZT=2_m;ZzR(`vK2S>3H3R!^&!wUM>4 z)!XW0^|c0CTUbM^Vb*YKoHgE>U`@1USTn7Ct^KV1tplvZ)`8X%>mci3YpJ!&T5cU} z9b+ADonSSr$U4nB-8#d%!1|)yy1}~9y2-lPy2V;=-D-W^`i6Czb-Q)9^h>mln2 z>q+Y=>qYCw)}O3DTYs_Mw%)Pcwf<_oXT5KIVExVdrvL;>pam!hf+)BN?t+KlDR>D1 zLZA>YBnXK@l8`K<2&qDv&`wAfGK3tVNa!kb6Z#4Lg#m)SSQsh{6AS?f(}d~53}L1) zOPDRp5#|c>goVN~VY#qcSR-r@HVT`B&B7L8r?5*nDV!2c3ulD0!a3n1;kr3^7yeEA|univz@BaiCZt4iX28rDB;_E{+z*h~vcxq9G!2nmA9KFRl~UiyOp^ z;wEvkxJ9fNw~DWeZ-_g^cfiuc6(;sfzF z@lOdzltfEbNs#O|$xU*Xno7;2=28nOL~1Fuk|Lx?DN0I|lB8rQMM{-&q+F?38Yq=W zgQUSysZ=Hnk%mgcq;hGbR3nX*#!2I)7o@4uENQkhN17`wmX=8M(pKqp=?!U{v|ZXE z?UZ&&yQMd!cck~FgVIsym~>A1NIEZFwo9K&ze@L{`_cpHH|e4DyYz?jr}UTfNVdqF z%*%?b%3g9Kxv}gmH<5$oBsp15kyGU~xt*LYXULgymYgl;%bn!Tau>Om+*>Y@2g!rw zQn^eXDUXt8$+P7-@?3eIJYQZQzbG%1Uy>KeOXXMOTDeZHm+f2S-SV6AY59zNRz4?x zB%hZr$QR|0!NNKEiD?W;^;-~m40ZOpa zN{LV+l>{YG$xt$tzDhr(zcN56Rt731${=O1QmT|G<;rMfj51!Cpco2LrYX~v`N{&j zvR>JsY*aQWo0Tm}y|Pt#U3o*4`R-wwMtSYIp>Y;k7UTT0EsK%=aYNDE?CaWoGs+y*@Q`6N9 zHAgK{JE+~%?rMM4K0qy2hpNL=Lq+N|b-Fr3ovF@JXRCA6x#~Q1p}I_6uC7+ss2kLc z>LzuwxMiwK^|pFPy{rDJ-c$cl zA8GEIhvunyX^phTnz!bo`D%Wezt%)+sfF9M2rXVq&=R!_EmP~O_0#%m1GHjopjM&{ z(gtg#TA5a^jn>9#<2AcxXmhl=TCG;6t<%`$+pv`(FD&`%(Kz`&s)%yRF^P?rOhkziEH#v<`Jimvu$Ad+J`gpB|()(c9{A zdc2;XC+bOhvYw)+>gjrxo~`HW9raFnXT7^VLa)?E>oxjVeWE@|pQ_vS>G}+Pjy_j^ zQD3Mp(M|njeTBYSU#qXzH|wwKJM=g8cl7u4!}<~Z1O0RTihfnUreD{;&~NBB^)L0W z^shVV-{`mWZ}so=`}za@H~pdhyZ(p%r~a1>*hHITlWmGkwP`kQn~yEP7Ho^Q#n@tP zZEbP3L|c+A&6aJ;w-wrY+xpuE*aq1K+lHFMr8Mx$?s{n(@DGS;8xa_p&^9nKCL$s* zJ~kmR0)HYCqVOpqes{I6lLnwrBrnyP~>y)73l{Vbmt$%c=SX};od1q7PF)6*Q_ zA<)H|ujBh}&t$!m5nimR`B~Xr%PPtS*OZl-j8~8518_l)^6K(I6=hv;X|d*x3onKHyGSPQkg)O4w9PQRM^AE)JA;GmR4bEVSwE&DLr@W%3%(p7Pv}{yO`H=Fms^SinHRXfL zva6~pt8g!E!c1?UAZC4dL}VcTHhN@#%V5hW%UH`a%PPw@%Q?$=%$ zez5#xxodfZLCZh`je$Q1070NRhy@8C6|@5xAPWouBftW%80-RPEslQ_aQ?MKHT-S( z1AZ_&2m6>|zK5BvLaWBWoM&rJEj(`e`StU*gn%TFY-x&nO*1+eLygIXY|JobVwxrY zKy#blz)p>bNNY+4kI1YXIl8K>y1Kk_RF9I1v1KmF1Xx`Xq__% z4DR=o@UCSw>%bsTYMI}?Ls$Ht3l3En0*2Lsp+=Q4?NcxuvrvK6V_D#2)cRDo(x zV;&2ru+|tB0~ytZVI~JACXNSF)`JOPBA5gw8)J=$#uVcP!+sG=1$KPB0T7th=b8Mv z=Z`8an_!GH#v2pN9f5u5Szxvq85BU*fjMS)P;iFxvUwmGOfx27+9vesHms_wq%<&6 zv$#6#@2IULwXUM2j-sig$Xptf*kmPG^;7}DO3QpV`xEEC3zpfIIbaQV)w~nb2E1na zH;MMD1$F0{5MroA!Vv_*HG7)S8+bt7~7RG#Ifhp;OO~2sDZr0O-Mpu+q z*F;2o3@92hD_7N;JAD&VwrfpT#jTNVKyXNCcyxSndUk$MmmYlv3>q?`vS$1gW5%2p z7caZO@m9Ip=#rXYy~_zJdF7*O)(N6yMmB9Hb;~NLDbc_MRnu+e&KAw|9Y==l?blMX z;H%ud*5Me(?A)|Dr%@Lgd;2(A$fU)Hi@4s;R_kvDH4lP;K}{T0Dyho3imRHoSl3K! zj_(kt_UuqrGrqEFga$9PY}MM)P9g24JjU(X$aP_&qmPKlC`X-!>-I<=CkRn$4;HeZOp(H3hdggyQ6_)km!5dpr=<|uim)6iJ24H6!z`c z|7ram=^Cytw$%+RF>6EHz`>&qsuQ;j2tBs z!pUt8dH;x;j;^j7Q{}h~8`6x^=nG@VIeKei#g!8#ubViD0By%<+=UmW+Mj~hJ9j#+ zN7d`5iPLd?pw_2HdD-})%F?om>I*Yx&3@K!oI7qfcfmRwYm$Z-Ehp!X99>yeqcIm2 zzO?8mti4lz#x0k4)tO68&^#S3e|d$YE}zJ)+m7h;4|g2d@OF#u>t1=aZuOdAm%R!; z*wp#8?zOeS?Z!C22e+HI$nmYV4)?jvYr}dh(+v)oUuHG7TX>6Z@v($iQY;0Q(b%F+ zvdpl|v23;+x17Ot^<&Gomfwh10W1(eD-Z#qKpeJIy|GytinAeeasHzg>;QYg0dN?6 z34Q=Sfx8r>+;HY2h-!+n9Qjl~Y6Mk-vl>&WSE&Qk5uCHQf|C>XsNbnawB46(LARvC z=ybXh&Nd972h-DWcEO}K;`G4*`UriD{uXjLDbN^(!X%gl^I;)g_AiFZ;THG~JOq!z z6YzWZ0RG9yj4xiNw_?KaioBAUj2GS}Q^#z@3+>&^MZ9!=!~(oj4rW8xP_~e*U`OG# z@GLvKjD3||$8KVeu@~6S@Ur#~j>1b=5wBX~xkN6F>%x_A!?{YX3a?XlaeKIv+-1Dt z{E_QYuCdQ}ZzI;i6e<;; z+gU;|WBU>4Wb8(u+LU7^d$p&EETMH&0aa)mFy61DI)G&3pfTCp64NTpdB1Mh+fm)A z9#l`NmvP9rgaC^`sA0cE^~L(!pBi9MsbXp%RYDD-27^kfj2eQ!4Wr7uaLW*jvx8lV2d&Em;WL5&1eR3*OY8RG-vBkW|4;G64h<4dc_ZEL8p)HrIq@u6|d zIANT6>SU=w4(E52I6o}c@=-+UVb$ZyhtxEOVuqvQB&i^# z$IVqf*U{x^hd;&T@{#Z> z)KM>6=96ze7w{!3sa4b~eTb9mT2oa%YN&C+IA5%FG9%NYOrQ9syzmc18xHi! zI^jlj)LP5@=L;@Ub-0&xn92>*BJ9$`29;Eo^~Hay$|_1~%Ey&qLO(XnI@~(7nc9K_ zn(kc+>!{7sO^^d|3}@wMY@w3Ozo!L z#3Fs0+C#l#T*c!2!MJREh5%!HYkdDtdA>{S%Y7=)Z;a1f0(C0VAuweFbr@T{52z2R zqsA5Ex^cs}X?*oesynHZSY}s^Ygjak+IhCqfJ->%95r8%8i)UNl|LtCSJ5She82pc ze6Km=`?X8Hx=X%a68RdpjC1DoY?$Y@sshh@r!ZWxMSQkel_kH_v@)YEFt7W{Y^clo>)R? zU}#ntGFif;B?T?o_w4d>3EgfL|WgdF1xt$KCn_E2V=%#ct$ch{|=>9(ZT7&;aK z8Ua{GhtMr>uaAw8?n5doN~;@sx4XLUHmI_6;=dG&PNfFZ?dWuB2%Sl1QRN5-#wQ54 zA;1ycYK?&He~bm4OXsMVf+Q6DckE6%a6X=QbBziJEg?@paO4|`|N5BICPXxRWXoNsx z1iTUOLBJOQzj_)ub&Q@#&!T5z9h+-uih#dU$q;CQKnnyyh?aqt4mHcCUnXjXy=Z_- z&t4&Vwwhi;4g>-b2y&hcJ5F_2T|-&4{{f zr$Z2E{vZ0L`=th_-D%J(+STnI`dz19?RDr?E23B1jVGjw|5eyx&2w<&s2XhbtBFAi zDXB@cm*X#qE&r`%hp?I*p+6w@i#|rwEP|+60s?IuCJcf2|5dY-^r>fR))s-Vf2!Ge zLed5LBKd$DU~#shd~{h>86I)PGe4y<|Nr#t zmQ&ASU3%v3(z73(dKO3Y%v@`XwLkS9^p8&UigS^CpMFBr>jC{6{gD2h{)7IL{)>J@ z|4lzeAQ6Ei1dDrS<%_g-UWfGf9VwobzmOMclbpd>fqo8YeQdz zvlG~QG5?BmU`N>LnO5~dpxZyR3icq}^n|@&Z-^_qBhUkZo(S|Z>_sjuc`o8{75#rQ zP_W#oIK5qpgALGgfsNq^YFtEB!56TCz-m|n$HH-NJe&Y0!bxy4!~u6d1o|T|0D)oz z1|m>`z#s$$BT$M!Sv{QEpdi!WbT|Vm$Sk5DLtF}iC*CN8y)0Ic(GK&I4VM!AScY)+ z#p&kY3c|rktRMJ5U>MO4e8R>j#x=UNu#TulEds-9;W`9H5cTK_H^F)=UAUQ;o(gPw z;8tRKM*f%SY1KKnoo|Eb@pg5)8@}z-j<+1zF@|WzR-#`cv37Vu_#WJEPVU~Af(Ojy z-NWq9<%#g3>+mzN;sKBSr&x~@NGIS)cnY3IU>pMD5tx9$#HY66`8f9fqg36TX(o8Z zDON|qh{Uno{$IrUHT>QZx*mQ5Z^3WjcL=}P^M$~41ZE&G zb3M)oCetA}*6D!7_{411YnqLL49>mQG7JKaQ-B{CvjZ!r>sJ@s4!7Cc?q zFdF0jzso1a!xF-HAux|9(|q$rADHmLhN58U0$ z%nD{@Z`@(EW2uC|F7x4l*3Lx?^9r*XFOQ$4a2-w7;o>!x`8dJuTwS?t@*1-dFM^r1 zOf61ztYg+Qn6oz#z;pU-1oj~C4gz~OGMkvq%oe5|=R#gb;9UgvA@Cjo`w=*R!22Yb z5E6m^?S4EU1lS#T-(u!Fa4wqMDxKhT6u#pq+!(g{YvA{^aG#@a2kMpI95dR`@<7Ao z3kMf1cv^VKQMh5&+#PS@fi<-Jz}YfXFV6fP7hbep- z{rkY4AcVQWd`Sdy6M+-8%vT7UGQyvWN}2DRVZ%u?taP9&c3^&F?%;{e{KWjs{KDKu z02{P32;iZdThH8Oer4`4_YwFAf%6DlK;WvW4E{Nq`5PN~<}m^n4g1F|z>8_@d02|2 zS;#WIs~t~w@G}4e@Mu3l;9~@?;CqhtWv#4)vl6Vp;t2jT1TNLFGOHkP8G+BucT3wt z)`Rsl!^;Ahb*vZL$ZS)VmdSdvJ`EGq`J9LKXM;#50c;=w*Aci;$2MVu5%>~;TmQhz zhB)zlVQw$$=J7OoV%s>2Zx(9>W@KrEnKz_~4;#TolTIU99QR@7zQ)dijU~?F8*~3q ze{XD|GFxZT=lIH?pScKIsdw*JzI!{#1ohN zbQkC7ekj)PQ=*Ep#PIO&?$u>g)#2vtaXIFrVV@q8frohTfhIM~+q^QgS(I}`gYbyh!3f;JsUCI+mfKKv7+X%g#15wx zvLo0E{D8#qVaKplW`|)}p5Rvm9^g?qJ_ulSxQhp8-W=Br567$JGh)X(hkmb*Yv5(o zUCOE*CWM{LPBD|q6Ik{Ib}G)PB$vmNyh_*Lb`=L5e%m=V#7@H&@^{B2pp>0aM;`3B z$ezW{A;e*`^k*%L{mG+$61UKK_rFZv;r$!4i`k__GD}!&m;OfJaUHwNf=%NSbII^t zHue>E4e4q%qAa!StB3;Tqv3uTY#qA=+ZvoJUC(Y{H{y)xW<*hlq7elV#UP4B6t|JB zXK^6HzQJz8;RwYeO27iAVi6UGonhY*@2TuNgyFpirycFZ+Env&MO(99MMqzDKYI`d zB|sR7h-zXUtC;DF6SOBugX8Q8L@9_;>)2E5X+&v=3NnX{j4Wo) zvsWyhTW}ipBKtA>3HvEd=U!qjv!5eMN0bdwZisS6ln0_b5#@!bMu=*>#S+3^!$I6c z_6Bpdxt={izuIlD2~04Lmu`f zNG1olX0qdiqkL*z@WC)==;adB-<-t}c(HgQVD19&T;eD~QlM#6_VML-PQ>+`l@kyZ zjHsq{oJ3$YbHU_noG*sSxpD5C2j|IoagDgfoHyr#sOE^mqsF|qL{uw8wMJAZqS_!T zYzyb-h*U95u8Adt!w(e^74C>roiHN_%qR!U^n`%j8%EoJor}aUxhON3lq4!)N8AlPK;&E=~VEGLPov!P{=f*VO^;neV~Kui0Xx?K8Wgvr~zaxeGyRu5j6-=rHC4W zs9}g2j;IQp%t6#BM2#k+tKzD;8g48%jvLQS;3jgDxXIiU?geftXXgwKanrcz+zf6e zH;bFi&Ee*9^SJqTZUOfqw~%{@TZE`8M9oFi8brN?s8fjg5>dY)T19kIL?A59fI#5_z{9%Blr+8;y>&Jx6END zsH9>IR5+41KiJ)EPmLJ2%2}Oargs?e%xQ41Ig8VZwQ=~OGV{h%x92We@2pM7>BOGq zRODeMP7$BGc#E?-vsjyK22C1fPBz4V9+3@s?PpnGZkw}RcCj|bJU_X_>^Q;pTrazw zwYe_iyKRa!*!c|Z-#xwKY@1)KjdEaITf>^I$7;{@w%^&JfZU6i@@-RCbCA99b1e=# zTND**lkli}n9C(-fe2$RQ&f3nHknztIpLZ5_b){W#vf~-^pE@hM zo0`$nG~!ru&DDT^G`Qky&=X(X-+X_(_j9AU;jHTY46o;Nwcj{v`x53zj=z4a{@kE` zaMt$6_nrD&@oi^u@pHowO^?aXqrC5IQi2E6*KBv&8|Mh0!TG~kIk;FGi-kGVJohgv7HgFbQc_YxGxY`OxemOXEh-%hq)lz{T$Qi0 zY7Fjs%5Y~uf*%jI!bt``kPqUU@WFgj{Isw+-+~X}v8}E~R1KoWB5E9>#v^J1q9!70 z5~8quol?)Yb|xA4a6SSgTSE9~V!U5)7;kKr5Ta&b8;rlrcBVM_bZjnpY{RBDm~B2A zn{7Ua&m{-8Ylt$OXPjk_wde**%6H&9;XDK15mD1>`Ob)%PVx-B`R;r#V$hrMJ#iX} znt|;(--p=qng6oqx=&H?`wb~hSEmE{!47x84|2GJInORPOExqr<;(dR!pd-d1Yg0A zWmLSTk=f^g%G7;}ANyDtXKv-Go zVr4l_{o-6VX5|$JE9v}v!V2zenTwT|Fe^Bl;P_wyogY{1$}i_v5H?;$)XTN}N<^(7 zY`Ipx7~slyI^nPNpgmc;c-xfef;X@+F{sb{0@E}fxVO8 z#qZ|dK7H6HP?Ktbi|3JdL9siYe@*f=BuBkKh z(OkRG_+R-4PGWGJjEQ-Z5c2~ea0k(cGX5_s&Xm;ikNCg&$NUqk#R{yHm9|1FgQ&L= zwFgn}APNVMn5TV+dJj?i5p@7j@7G&7Coxu$o@JFSAy$WCqJ*XVl#Ec zp$yiE)+q$|Bm(>@0saC3e(k@2`%egNr!^?UPFJ@xt#h0V;6)2ohMRZ1hpJ-ob0toQM;p0=KIg2G7x4C(;^b(Da*M?f{Teqy~rKz(Zc%zDXs+4{NliuJ1X zn)SN%3q(Cc6jr=H%-gd(aFd%2_`b2;vVM!j_&vr)g9dywi)azi64q#1b^y$INC5th zXvzifFCyAUAldrZ`UKH521r9hGgz`=TAJ3RK@0*Ta2Th6JLGBw-aI#_m8T@A1Vl4I z!Df!OVhnlcUw{#&BqZYCd?OKZoxfu2TY1f4g0`YP}M@0M83Y`({?+~icT_9dg=z)cbpC$iY zC-lZbr2{eMpbc)J!=LW3a&b0LaQZdD;n(P3LO^dUWjfGd$Aof$_%&g;FhZyhMhc^Z zN@27xMyL|15xGTkM7KcX4lNPg3elL9P(-&ubXdJGwgLY{VUjQz<0pQN4tL>?LUbIW zmg0 zXyH|%meBAT8DlJ=0pmh++y9!;Zhr>1Yt%5KD_z~z3vW2};&q2!BobPPf27+IT1ti8 z!U00do5EYd+rl2<9bvEVuCPydPuP#>WJISRIu+4rh;E1IbVO$$Iup@Yw%PT<`wg@l zX;6z}gq9o^E%{H?qJx8#Y~d5a%BP6VZI}$gWx~qmAekJ9&LfinpD-tqYw$OPuLvh! zBD#I8@HL_f2q&F{?}Q%-re?wqWG)mENIw%uMgIzMB>coz74?*-5=3|5IvYE zL8)^Vh{T(T{)q0^09Pd5?EjnvVu;uZLlv?14X72d_7yv3ffz1EVW?sR5&u9eelePe zzXZ>Mii3VlHMRkrm?Sz~m*{X^bQwk`MiWj-9AXx;MB=){Y%xd774yV=vAtLz7K%k8 z9`R5_4?}c0qK6}T1fnYtJrdEQ5M7Dr(e+}d2H@SCVit+(qQ|&^*E|*TM5mZV;?6|e zWt9szacANPkW3ClR}(Sg6Be`R8hn*VoSBFx;@DboETYFb#4Jt}i8G^{iIa(##}i0X z38V@C7Bg4k>T9|<%c1Y$OozTtdUln=42TQFmkALsiVMY;#6{v_afxV(OT}g4azsx- z^b3fditsK6+CVfy^fW|INAwIt&#V_$G!U`cxqC)jONf}|B4Q2#7VN2s1}tdMfNg|{ z?TDW3VqzC&;@=x+TqEBr?jtO`i|Dzv;(LgmM_6bq9u$ud4LC$JU_RCW*Zvs-$6Guh zo_4}L<$(JlhU?r0L#ivq3*vSBphvtYek^_>eky(@UJ@^hpNm(-tKv08zl7*Th+d57 zC5Sc=y%f>Q5RG|w8R7jH^vbQ`7tSdzeg&tC-;nJb;&%k}D%T``l{`+R*Ex4|(7Sf) zJM17|BwkO%UhfqbZsPUCN8;b)K=f)vuW_ES4(!*OH{h3`#A5ssgXq_4B@WSRG5!{I zQBp8KNh0uTF?>lS698MVe=C8XkE<&W$rtBEB~QsqY9uw5yd@t*uSfI-L~lfRuL!*v z(OWjsvn(M}fD~w%ND{3rh~(-K{f5!Ph$jzVY`q5K2aV>OT?OXdUCHM8UH*+--M5z7 zkda~sv9(qTL-gxr$K8IuQnW<2BuOz+ETXp|dV8G|C&eRr2cmbHb9QI@NNG}rLs$}i zf`fhZZY(TGB^q7ln50sk)D`QdlrOcH3Zz1*Na`SUlsZYBr7nnm3(;>QdJm%CLG)fk zV=dW-Xsjjs5q+Ru>gE)b)Jy73ds+2}cV~A`HA^I?)aey9#C6uc1TDlAQ1ZfgMJ`vF$)=GFHA0;wsY?r1H z;0BS=F(RYsL`KIQuG-HP)JXHB7oF%AIMAOW=%*9($DQa+=~aS$skBU5F1;+RkXA~o zq*tWX5+2bRM4v_UIYfVi=<|rafar^e{utq{FZ8GN(reC{DXnvcozfUCOt;<&kan-05c&|{9$q+`WL)#b)GR3uE!d(RmR!yT3JB! zomyE!^j-7j`WBrv+0DU(Y$HtkiZRI^go%6qX2QFT_EG~EvX6{+4B}N z&KV)c$gy%;ONbngsen|&jDReHB7!7Tha^<*2J&R`;7iU$kals=o^Vkh7m@=(h#=!U zV=k6z&;_8Y+?}w|4MDC}?t!3reohN-xsTl6$woiS1|-qCT#VU(g4y9hb8mTwT<%0Y zjG%@jSa;T&U~S_vxl*1)P>+_!$W?N+TqBQ_$I0X63Gze)H3W48Z3wy{=#HQVf}RL( zZ-R{wY+Nr-Za{5!<|5?j1hp$vhrUm95iro{t>wi8^%4YKvAVpB%!U8VMYs^JmR}`^ z*C6OuE5C-IKaqdqbu!+Lhi8JkfgmQ2P@ZKG8hgJkZ+8OT<^UY@&+5{*lwu8Cgekp%V;C_W*M6LV{f{_HS_xJKo zPPji3xKVZT&oB(ZXuKDU?Br^LcXG+UI<~I5x_Kb~?quMhgMrw8T!A(Hv0^0@JW(tP zP$-2~pu#Au!YMq$yTxEUf(ZyFBAA3=GJ+`xrXsve47RIR1SbWG;@t71*a!vbE($V< zi+1dIg1Jr#lt4^@5`FC0EH)@|E^Vfl{axDR^48 zN3Z}vJn@PU#Q*JxU?&7SBiIGOuJuYoP^xsp;Q`L4C?qI_-CUS^l4uDiAt4f1bfvgV-f64PAyFyp zgEd(pQ7P>EZ$npdLo0IiHba^1kiRm^A^!o-u5%cDd;lo=w zq8!D*ln=1;hhwnwSB_!l538{ApZg(Jl5@%hCvLnS1Dm>W1UF8^;TBHZmz1vv?#s&O z$`$3Ra!t9ee4*S>ZYp0QH~~Ry@g^aNg);@g7Z99^pdCR2K~%4N-GKW$Yj+ZwDnAk2 z(_FY`AqwxcAUloW{07{A65M|wINgQ&F~R*rwU7hB83@jFo-uA!b8En@a;g>MR`EQX zU8@QR&N0E;EgCDTj&Z3ffjt+)R&50KJPbSiZC~$3sxup-I~Tsg6=B)zRu0wMxZGyAHwi2yQ@dBZ8X{+>GEB1nUtoGOyRGW1Zqx zC-R3>oRv{YRtA#aKasRM+(BF&e2aX2+i3z+l9f>xAh^xN1j)*%i)eRpAh_Ll=r~~> zs$8RgStU6cbp?VuYgJ6rE{Et}RY^)lB`F!WoA7`^A^0X1{pm%1KI#_rbtmMl4vpVK zAd`#>eA5Yem%5)o-mSi=zNNmc?or=S_p0xz`_%Uk+>7A52<}4=f5#K;0D|u$co4xu z2p+Ci4>&EodRRT8et;n#C6JG}tllw%H+RA_1oBy@#;YF_$e$qifeZ2_0{OD~xq2C{ zMDRldkCHRq-)h&IYRz1*Z>l8iqT(5NyjJ}h!4m{_pYK$Xby2@3uyMFsr~X7>pZX8+ z>)Q3;c1;>GQJSmQ`|3j{FL<91wgl%0FFz4pPC4hq-x~e_T)p~OeWF=3pivsFL5t)Qr|j!`r@VH9R%1*J^DL{K8@Qv`8(6;Ay5s6GuRzcnzoJ5WH#r zb=b!{Npm_s&FTEUdajxT`C67ne4m!Bktw_V-`v$>V2!4z37FqZ` zf$zc~@1uZFZ44iRh9 z9U}hie;Sl(^R#6I^?YrC_M)~>dr4cQE!LK3riM-2?+E^Z;GYO$6a5H5e1pdbK0%BH zF`!;s?ws!0ssBd)(VcJFYnvfHB%hf|w!MS?w^^0)}@e zwRT>+N&sKbE@~fZpJ<*OrxiO{TzU^w0i{beZ+XVq>R%r1TYduVAqCIZsYNZM1rmds@h{6 zZ+oiM@L(I)>Hsm`4#Ya6^9~{F7%pObFe07o7-M|RzNU|luIe_2jCI|C*#EhDtOKp} zM!GlNs-`zaOkl0&=|&3aS4nciG)p@--# z^;UXog!fG|7&KBF|9W1ZS*ibob9Ve>QQ>M9)lR%HWV>!$R0u_3^Cz| zi9}44`NpNyZh9IRu+|vu(0o0^@!jlqxka#^qv!r(pQhekCmS900>nhrk}Zi3&5f5^ z+4U|u&dQM2bTnv+-a{W~3EiUi)O+c@^*(xEy`SD+AD|Z_29KmIV&V~#h?r!=q#~vr zVlohuwM8${2kC?LQoT$cq7T)F>E(#YK};@U@(`1cnD&Ul_bo(B5n?(#&zP`5ALXPh zcFFZc=HH)ZKHCzZS37IsinTLl=dTu+H?KTjJHc6-P^?`v7vC(!+f&9o+YzC^;H*tD z1FxNZu6UZWIAzK8i_hI?wzCxPCOYT1QOy_G&t0>?S({D<*!M=}b2W>dHJRp)8>gQu zUhXW;UUI#{Ja8r0y!KVTU0h5?wO+V z!A^bGKMUT{-zEj2&*ZyTfA^nF_UrHCiJ~7sOs85M?{M#I-upVPzy6_)pDS+BkLt(t z1x*?`JVtOE^Ct`XbrZ-~xAg1pYOH=(kIrNY9PxMdq&n!(1 zYyCMG&Fu1!WdKBdQHWaY#~$HwPGx9wh1HL`6?KUW`-abZ!t$~%>mM#hA? zc9`hj>%ZX5)cOzlkNQvg&xjd>n8AoCMNHXx{kBcNqu)0v`N6cu%)I9yEgpIP{=P2uJv<=!A#Ed{p1!6|7vvD?Fzm1qth^fRK zk_2mW6a4INp7^#V-lp3;{^J^Ymd(r7i1;&R3}UK`@WGbAW|SrHg3Z^W+Wc((yT^Xl z7}}j1c5Q*Sp#D#{=#w{itiwf3Ec2Z|1aLhcur;-{#;IXEyymtRHpbS{*2*!+v4|Om z$BCHnh?%g_dW$+~3$uk&C#jS8p{{WaF%uCp3IFQ%8X0*L{Qj8q!T1-@2S66K&nFF)Ft8#2X*+ z9!C&weCx1224bc;Oi~tNX5d>s+wEoR=bVD*pBvt6CC=jMt{q~}?`N|OaaPX6o2Vv} zw^TH?G_izQA}xuQG)reo5ByH00pcjJ2EV**E`Fr)invy+!>@1Kf?wLUP27PWKKvs7 zB}tMZX_5`UiOmz|=Dj6fsf`ql-@+Cx#o}~%0)7))3eJ=F#P3~OE`5eyjn)Le06Lk zcf1NqRXeFu)%7^czJ*`x^+>Y5vV$(I*-VxNIu<26p3uFcS9YO`@D z^9p`d*G~L$uJ^Hj{}#WH>nHpwuDjYj{PHa?JqEvZE8doB%e9TRjkm3JW84(Crf#j> z;@#5SGTpM>a^3RXy0~?7>*3bRt&dwjw`#YAZfo35yIpp>>UQ1jrrTF;-?%+=hwh9! z>(0Ad-R(`>!`-9YW8CB16Wo*B^W5{@+q)OKSGn8W=eaL%U+BKbeTn;0_t)HO-PgHq zaNp#<#eJ*$M;^RKghwBbsUEc+2R+VsT=MwbD_Myc&D?c=>q+cm;X2@(T3|^NR3_@`~{)@GAD2;AMKP^}_Ev@!ITF@AbOZ zG4BNLZr&x{gS-cOmw8utkM$n!J;{5D_f+qd-gVyZdmr*X;xoZ#rq2?er9R7jR`{&) zS?%+x&sLu|e75`8clzx1dCO;y&t9L)KKFcO-w@w8-!8tzzQcVhd`J0?_O0@*@wNLR z-|46Td*e9KVi!-TZp^_44cEXZL%}Z?oT9e((7m_B-Ww*6$;~ z3w}TPJ@%LVoB7B4ck}Pz-^;&`e?R{L{saA&`mgcd=)c*&-v4#~ZFc`1{`>up`=9my z$p3=>#{ta)LINTKIt6qOs0ly;(*tG(%nn!-uq5EMfZBj{0UH8#1-u#XcECFUKLtDp z_&bma6a(D@(*m;sD+4D4&JJ7{xFT?8;O@YKfhPh_1)d2!7kEDK^T4Zt*8^_^ei`_6 z;9o&%P)JZ_(14&3L8F332UQ2z#|DiLS`ze1&^tlz2EEsMLF;9$>soJUy{UD5>(^Uv zYki^hmDX2VUvK?w>-()Aw*I5_qt=gch~*#JIy53QDl{fEAv7s8B{VIxXXwPxS)pq} zUkj}bT^G6`bW`Y-(5<0wgl-Sr8M-_4Wa#P8v!Ne_UI_g-^wZGGp;tq{2>mkj>(E=F zf7;u$Xp_(;tIg0h_BI>Z>}zv941{T6eqn)OO~RUmwFqk&mJ*f|RuEPc)-kMe*nqII zu%Th)VI#t-!fL|Cg-r;X6gDSpS=i>VU19sej)$EKJ0Es2?31voVb{ZMgnb$Ib=YrV zPr`+8DLg2=Rd^fxo07=z)bN7vqVSI4ox{6^cMrGs3@;5I5JxR$a9hBBR`A$I`UTJcac9t2~l2AjiY>`{Gw8#+DG+> z8W=Swsx)dy)cL5-qwYjKh!&&WqXVLYqJyKyMcbq2M=y$A9la%bXY~H)_oEL*ABjF4 zeIfd@=$~W!Vw%UK#AL+uj+qoQC1z@j5i>1jM$GJ(xiRx&?CWDT#%zwMk9j?2Tg;A_ zy)hre9E~|1b28?1%-NWaVy?w}5py%#Y@7N)+!(xZWR>UrdT^ajI?3&ou+Pb$5Y8%|PS=$zESGPUg_Hx@_+TLmVYuo#6 ze{1`D+dtbrYWq0O5=X^(+2b0=`Na9f1;ho#HH~W#*D@|NE-Wr0t|+b|Zc*H>xKHCA z#RtZx#Se&|96uv|cKqD<`SDBR*TlaTUmL$Jenb4G_$~2UiRnS^r*=Mz3p_$J}IgdY=rNw}ME zKjF7TI+0D}6NSWPiBX9$iER_(6SEU@6Y~=b5_=`~N$i(6AaO+EsKn8URf$UyUrVe@ zT%WixDKM!`Qg~8iQcO~MQjetGN&W0e#Yuyb%94g9jYt}mG$yGgX>QVjq=iX~l9nVb zOInfiO46F7wMlhJ>yr*8-AIPX&6C?Fk4|2iygT_q^6li`lmAM7oMK6_rr1(EQW~ZB zr1+-H=`*_U!4bcb0 zsgF{hq=7U#ZCu*)w3%tM)8?hUoc4O!_OxC0w71gUN!yopAnj1v2WiLBPNsd4_GQ}F zX}8k8OZzeHm$bWS_tJh#`#tT?c3$n;w(HYwO1rh~j<)+D-I^Yfo}Jzyy>oiE^d9NO z>BG`Tq>oG=onDn*lRiFuM*8gZdFd~vFG^pMzCHcD^h4=K(vPN}Nb<%- zoY6TGbEf3jbEf6Y%$c3DG-r9vikwwBn{u|~Y|VKi=iQw5at`Di%sG?uQO<>&k8|$l zf?PV6$>nn0bNzAybAxl6=eEp^%8kv9&rQrt$xX}6%N>|IB6n==wA}gj+=aP|bC>46 zoVzx+E_Z$I#@x-h^|{A$zsckCg7U)hBJ*PM;_?#nlJh#{_0AiRSCUtnHzcn*Z&Kcr zys3Fc-t4@2c?=vJ3JG3JN+DbS~&t(6gXVLH~k*1%nGF z6}(Vj6ihFeRWPSue!;?m#RX=;@`9BGuM})AI9+hL;7%b|m{?d?SY9~4a82Pm_QDSf zPZypmyioW_;nl(~3coD;rtsS$zNlSMdC|C{iA7V2>_yXxW)!V2dZXyAq60;TicS`t zFZ#6TtD;*)-xvKNR#kgFkYL$`)z zhl)eHLV@?7aiFQ78K8NfrJ&`YpF!I|J3$9QCqZXG5Kt^A4wMSI2+9E!fXYA>AR(v< zbQx3)Qh?MT3&;j?fLcLqATOv3)C1}}H~HL(bEnU7&$-Y24PFRd3;r1#1l|JP2HpV< z1|J0<2cH6K!B(&f>;ZRxyTQHS>)-(R7685jz6ZV^_FdTFu z=o{#}2vkH?1TKOQksom>f*w&EQ4+z4D2vcXT#a}U@jl{H#8~84k;@`CM(&I}5_v8% zJ~AmXH8L$SBQh%z9f<`Zb0Z%_zKnbw`8M)>)P$%>Q8S~CM}W{h>H57Ft>Q>Z~sK28Aj(QP&G#VTo5gi>3i$+E#L?=b3L<7;5Xis!Uba!-b zv_ErK3Sr@Y*CMafe3;>Qvi($kVVtg?V zWB!SG8S^G)^gQl7^*rM|>wM|?^7Df8qVwYOw_!iPR>9W8Ho`W;w!?P8_Q3YRLSYFo zG^`L-1Y^S3FfObdCV+`x5||8Tf;GaLV9hWGtQFPb_#@TKtO@Rjh@@OAL5@B{E8@Z<1P@KE?UcsLviPk<-G z)o?T126w<);qCBF_*Hl>{0{sLVjN;FVm{(W#A3uxh!u#{h;@h!h)syYh@*((h?9uZ zh!Dg%L>K~!h(tsqaEK~I3*uhfy41t8smC{c+dhhU0F=-Hv+}Hxl=kX~dLvIpq{kOQbW zsP9ofpcbN*pq8OlqSm0+qc);8qkci{K>do^i#mWhj5>-sfjW%}L7hW|qaskzC>RQX zLZK2-DX275CMp|6LR~^pP=%;B@#Eqr#7~T$5}zGUioX<3i7$*FOPH20BVlI3oCJD8 zc>+H{m{66tAaQl#+QjvV8xw)*M15j?VnbqM(z2wWq|HfNleQ25vCEoCCnzwBm6*ENLWnRK=_pq zLO4eVCqxjU2`~bJfFdLkQV3}TGJ#5<5sC=Kgc1UWz#~);gai>mOt29GgwJ_P@($-E z=dto?^RDJS&Kt>loj02Io;Z#;l{lR^lQ^3=mpG631925`E%9e!5E0ly{DlZ2!iY#> z0x^l0M$9B;6E6}e#6lvSSWc`YiiuL9f~X>Dh_%FKVkhx7@eksk#D~Nu#An2Rh%bq6 zi0_CW^JnJI$)B4)FaL-9h51YJm*ua>U!A`;e|`S({KWj?d|iHj{wV23(yydQ5|%_F zkx5h%jZ{h!lBxjGWl}XsK~j-wNR6Z>lAYuvxk(<|S*I1C&C!T0Vm)B+JHZRu}jM@9r>?D&AtRQTpGAELY_gMM_xc)L|#H(L*7jOg}j}-i@ck> zmwb|Zh8#);lOf~?GKNeh)5r`mlguIW$Q5J(Sw+^6Eo3{{Np_Pv$X(yyuprxR-psm1L&{@!3&{NP?aI@g|g1ZIx3mz3b zp-!aEq0Xl+pe~{=qpqN?rmm&#r0%8$Q;$-?)Cg)c6-Gr;Zk^40~KhbHc|Vi{nSC~Z`2{`4eD*`9qL``edyEOeriWG!+gP zj?%uTZKds@?WY~01=G&ZAhZZt6fK4Zqrquuv`iYBhNb1w2s8mrLDSH5G(F8kv(TDo z&9rV>FYP+*PugSJU$p16SF|^@ceD@mDfI8@>jC;k`eyns^d0nH>3iu1=!fY?=_lwg zI)aX*$I}z(DfBdYCOw;uq36(Z=@oP{JwX3hw4~@rQF0NzNLA!1>MimY4Ho@Y^n1~x zqNhcF7riKYRrIE4lre!ZiSZ3%I%6hdHY13!hjEY*%s9$8#W>3dWt?Lm7$`;>BZC3t zF)lF*7&HcxQNrLb${5uQJ;TH3V01Hj8Ggnf<2ob2xW%}`xW^b}d|-TH{LA=KJid5h z@#Nxfil-NUTRf|HWAT~dtm3j_OYv>ySIni%{md9sM9?>l`bb6~T&T!B_|uij~MpVWqLiEGmn}Dq{;wN?78e^Y+xmO4SPL%BYPA33_FS) z%Z_8C*vae*>~wY}o5Uuwi`gu8CHpeFnyp}K*tKjuyPn<3?q%O&KVUy*|HXdJ9$~*` zkFr0oKeNA-&Mlo^x}bDn>EhC#N>`MwDqT~$zH~!rQ0eK?)KYe7ed%wdA2~}n`#9%0 zcn*bA$SDFi#T*_-%#m`cISP)7Q^V16tej>}3&+LraJ-y9IWIVGIHQ~ooH6cK+zH%? z+_~KO+?CvQ+zs4K+-=+)++VqSxTm-g+%#?`7tO_TbGdn35|_-Sa_QV+u9Pe1D!3|c z4Y!u7=Nh>tu7%sgZRQShN6UUJ+gk=8%4lWUvhK1cyotPTd9!(QdGmNnd24y=c^h~^ zyv@9=yaT+$yraAmywkk1yi^{JN8|xKGLOb9;uZ5)yeeJ|uZ~yGGx3^u%{&Ls$?N0Y zkPDQ88i7_& zCukN73myqx3*HMp3C4sIgcF5Rgj0nJgsX*ng!_eughzzOg{OpPg&<*=5GsrkW(c!| z7ll|MPDl{u3jrZnNEOnAMM9;pUHGJOYGqJmcx5h7DX6qmUaP!a`A6lSl@BVPSB_SG zsQg^{MKoUYwP=!PifF26zUW8MV$n~c6{1z5!=g}8xF|vtC5jcriBO^h5k`a)T@sau z%0v|+p-3We~JGVzYxC>kBUEtKS`!aW=MXNER`&mtdgvkY>;e{Y>^z4 zoRuIY36f;V1xbb^TY{0`Bm_x5Ah{%|kO(CriCA)3QY}$P)Dn$EC(%plC4G{=FVDKX z^)mD_@v`i4>*YI_KS{rqPL@uUPM3Z!T_Rm3T`657T`%1r4U+DW?w1~t9+4iGo|Gm^ zFG_Qz1ZlpMBBe^{QifD0t&&QlTB$+WAZ?U3OC8cysax7F{ap&YlD?I`mwu9t$;QdP zmQ9vTmCcaNlC6@hm93X;kOj%M$hOIL%6^sYmF<@ul)+>~nM~FudsIEWdUJJXbw)L_ zy1ZIYEvgn*E35U@#%go5wYs_5QSGdDRrgi*S6{0hs=iTutNOis;(w>R>Hk??bLI2o z3*-ys>*X8eI{^7E`BC{P`B^zg4v|O5qvhx27v#C}5;;fClk?@3a74?;#D}O1zQLI*MQfyUhSL{?A zRGd_tQG_bM3Wy>?5wA#6q$<)CSqikGR3TOX)ru<$m7-Qrr>IvnDBKF4;+kSeaYJ!O zaaVC)@lf$bIZioGxj?x{xm3Aaxk|ZK`Li-exkb56c~W^s8KML!!AgiSQW>L!DG^Gf zGG0km%9QQON2;l+&8l$KMOB%~plVXtRZf*l)vX#-T~`gOZmMpp?x>!r{sB}kRc}=9 zR3Fsy)GO3$)$7$8)mzou)w|TY)hE?pb(k8WMyiw4sp@n!T8&lbstIa_ny;=^>(xfJ zS#4D}t6S7AwMX5d?pEJX-&5aLKU6RM(yp|JGGB%M`~Z! zzO8*<`?23VcN-GJ^l-LUSa?swf?-CNyz-ACPL-B{hYy07ad*L_n5 zOt1U4ZdTpKx-)fIb!Byyy4(7%^h@>o^)dQ*eUd&^pQgv^NqVxLs;BFV^(;MG&(TZt zGW`|3O0Ut^>bvyU^*8mu>;KR{&_C8c)j!jJ)cWO(%z!YU42gymLz*GefHq(OL#`puz%lR)6$XK!(jYcS4RV9Rpf+d>wT3RkaS;SYxh{U<8a5Bh^SVRv3jwrBQ3FGu9g$jaFl`(P8W{0s-T57*&y zRA^$GxTbOw-y}8Fm}*UWlhI^0SxikPuc^z_WAd2>OxH{!rhm=j%@fU&&C|^@&9lwl znU|YanzsPv9p+!nd(DT;!RBM;6XpnWycusMngKJ#Txc#bGtF!>*IaHEn001@*=RPI z8_i8-yV+@WnLTE&xzqfhaYEyo#*>Zdjl4!{<51&U%N)x>%M!~n%L>Z|%XZ5y%Wlg) z%K^(FORxoG39~>gQI_+TSWBLz$WmefIF>Stz#_7UEtf5ImU>HrrPb1I>9kz6_$>pL z-z-Cxhn82?$=0dX8P-|W@2vBz3#^N*ORdYTtE{`N`>Y47hpfTYW7d<_Gu9C6Ict~| zVntiI)<)~F^;6TbrlU>qO$AM|CQXyB$et;OcDUAF~nH*L3VcWn1;4{VQYPi)U@&uuT7r#JuH9NL`S zT+wWA{-b%!zSzFo4g}ke*-zR}+r#ZJJKP>;N7)nXNp_4KXD8V6?U(EnyVS0;8|@~$ z#csE^*j@HE`+)tL{jU9?{fYgVeZ>CC{?`7^G0E|rW3A(7N04KSW1C~AW4B|UdbVa zomeNqneV*hq&T_G%TANi;=V*1fHWR!Xa?wYPP|HPaR3I_(N~MYy6}=UoY|3|F@6qASOh>ms=5u3}e- zi{s+CDqIb&R#&^L)79T#sC@UGH6=Tx0GD?uqUx?y2qt?$z!+?)~mV z?j!Ew?o;lwZjd|74RuGkGXQtC`=T4`#<>aZd^g}GyQyxPyU49{x4WOTO>GNm3vbJ9 z6SP^{uC?86`=jm8wg+v`+eX_yw0&wD^NjOM@XYdj=b7hO;92BZ;@RUl;W_IG^?*GQ zo+!_GPpl{1ljX_xP&|d6B2S5@)Klgu_gwMRdrTgS$L4W(0H>$N)93Mf2HSVFA8m)W zN41}Chqoi!6WWv8FSKX01MQUd!uFzeW;?r`+g{!-Xs>KHwYRnpwm)zG54?}Pe|evK zN4&2A@2K~K_p|p)$DEGuJAUX`*s-KzS;xwbH680aHg;_4*xRwc<6uW{=iJU^ohv$5 zb*}Av-!-voa@RLq)4TrcdeQZ=>vh*?cU!l=d!YMT_s~`KRr6KL)uyZVo{}C>kGSV@ zPjxT47w9GT7WC5kKz*=2cwby!yl=bjurJtm#0MPnh55pL5MP8Z-k0D@^d;dk8aG+}7@<8>#m4V)YkAtfRHw|tX+&_49 z@WkNh!H_}7VB}!TVC*1b5J(!#8q6J{4;2sbhN_2Zh73cFq3)sHA^*_e(Dk9f(5;~- zL(hhu4~-1H9(p_UZs^1ClHuUt^kKoUY*;g_8@3O(4|fiC5BCfQhHnl3K74oh{_w-$ ze}-QUzaD-&JU09#FfK4Pur#nNurjbFur9D6uqm)LusyIVuqUuDaB6qpOduq1F3=IU l7PuZ54&1yEdgJ_!*c*r&sQ-!YL`= diff --git a/Nextcloud Cookbook iOS Client/Views/Alerts.swift b/Nextcloud Cookbook iOS Client/Alerts.swift similarity index 100% rename from Nextcloud Cookbook iOS Client/Views/Alerts.swift rename to Nextcloud Cookbook iOS Client/Alerts.swift diff --git a/Nextcloud Cookbook iOS Client/Nextcloud_Cookbook_iOS_ClientApp.swift b/Nextcloud Cookbook iOS Client/Nextcloud_Cookbook_iOS_ClientApp.swift index 5498875..f831488 100644 --- a/Nextcloud Cookbook iOS Client/Nextcloud_Cookbook_iOS_ClientApp.swift +++ b/Nextcloud Cookbook iOS Client/Nextcloud_Cookbook_iOS_ClientApp.swift @@ -11,7 +11,7 @@ import SwiftUI @main struct Nextcloud_Cookbook_iOS_ClientApp: App { - @StateObject var mainViewModel = MainViewModel() + @StateObject var mainViewModel = AppState() @AppStorage("onboarding") var onboarding = true @AppStorage("language") var language = Locale.current.language.languageCode?.identifier ?? "en" diff --git a/Nextcloud Cookbook iOS Client/ViewModels/MainViewModel.swift b/Nextcloud Cookbook iOS Client/ViewModels/AppState.swift similarity index 99% rename from Nextcloud Cookbook iOS Client/ViewModels/MainViewModel.swift rename to Nextcloud Cookbook iOS Client/ViewModels/AppState.swift index 1c204a7..b1278c9 100644 --- a/Nextcloud Cookbook iOS Client/ViewModels/MainViewModel.swift +++ b/Nextcloud Cookbook iOS Client/ViewModels/AppState.swift @@ -10,7 +10,7 @@ import SwiftUI import UIKit -@MainActor class MainViewModel: ObservableObject { +@MainActor class AppState: ObservableObject { @Published var categories: [Category] = [] @Published var recipes: [String: [Recipe]] = [:] @Published var recipeDetails: [Int: RecipeDetail] = [:] @@ -513,7 +513,7 @@ import UIKit -extension MainViewModel { +extension AppState { func loadLocal(path: String) async -> T? { do { return try await dataStore.load(fromPath: path) @@ -612,7 +612,7 @@ extension DateFormatter { // Timer logic -extension MainViewModel { +extension AppState { func createTimer(forRecipe recipeId: String, duration: DurationComponents) -> RecipeTimer { let timer = RecipeTimer(duration: duration) timers[recipeId] = timer diff --git a/Nextcloud Cookbook iOS Client/ViewModels/RecipeEditViewModel.swift b/Nextcloud Cookbook iOS Client/ViewModels/RecipeEditViewModel.swift index b335fcc..a91be4d 100644 --- a/Nextcloud Cookbook iOS Client/ViewModels/RecipeEditViewModel.swift +++ b/Nextcloud Cookbook iOS Client/ViewModels/RecipeEditViewModel.swift @@ -9,7 +9,7 @@ import Foundation import SwiftUI @MainActor class RecipeEditViewModel: ObservableObject { - @ObservedObject var mainViewModel: MainViewModel + @ObservedObject var mainViewModel: AppState @Published var recipe: RecipeDetail = RecipeDetail() @Published var prepDuration: DurationComponents = DurationComponents() @@ -29,12 +29,12 @@ import SwiftUI var waitingForUpload: Bool = false - init(mainViewModel: MainViewModel, uploadNew: Bool) { + init(mainViewModel: AppState, uploadNew: Bool) { self.mainViewModel = mainViewModel self.uploadNew = uploadNew } - init(mainViewModel: MainViewModel, recipeDetail: RecipeDetail, uploadNew: Bool) { + init(mainViewModel: AppState, recipeDetail: RecipeDetail, uploadNew: Bool) { self.mainViewModel = mainViewModel self.recipe = recipeDetail self.uploadNew = uploadNew diff --git a/Nextcloud Cookbook iOS Client/Views/MainView.swift b/Nextcloud Cookbook iOS Client/Views/MainView.swift index 5222847..b148126 100644 --- a/Nextcloud Cookbook iOS Client/Views/MainView.swift +++ b/Nextcloud Cookbook iOS Client/Views/MainView.swift @@ -8,19 +8,19 @@ import SwiftUI struct MainView: View { - @StateObject var viewModel = MainViewModel() + @StateObject var viewModel = AppState() @StateObject var groceryList = GroceryList() - - @State var selectedCategory: Category? = nil - @State var showLoadingIndicator: Bool = false + @StateObject var recipeViewModel = RecipeTabView.ViewModel() + @StateObject var searchViewModel = SearchTabView.ViewModel() enum Tab { - case recipes, search, groceryList, settings + case recipes, search, groceryList } var body: some View { TabView { - RecipeTabView(selectedCategory: $selectedCategory, showLoadingIndicator: $showLoadingIndicator) + RecipeTabView() + .environmentObject(recipeViewModel) .environmentObject(viewModel) .environmentObject(groceryList) .tabItem { @@ -29,6 +29,7 @@ struct MainView: View { .tag(Tab.recipes) SearchTabView() + .environmentObject(searchViewModel) .environmentObject(viewModel) .environmentObject(groceryList) .tabItem { @@ -42,16 +43,9 @@ struct MainView: View { Label("Grocery List", systemImage: "storefront") } .tag(Tab.groceryList) - - SettingsView() - .environmentObject(viewModel) - .tabItem { - Label("Settings", systemImage: "gearshape") - } - .tag(Tab.settings) } .task { - showLoadingIndicator = true + recipeViewModel.presentLoadingIndicator = true await viewModel.getCategories() await viewModel.updateAllRecipeDetails() @@ -63,11 +57,11 @@ struct MainView: View { } return false }) { - self.selectedCategory = cat + recipeViewModel.selectedCategory = cat } } - showLoadingIndicator = false await groceryList.load() + recipeViewModel.presentLoadingIndicator = false } } } diff --git a/Nextcloud Cookbook iOS Client/Views/CategoryPickerView.swift b/Nextcloud Cookbook iOS Client/Views/RecipeEditing/CategoryPickerView.swift similarity index 100% rename from Nextcloud Cookbook iOS Client/Views/CategoryPickerView.swift rename to Nextcloud Cookbook iOS Client/Views/RecipeEditing/CategoryPickerView.swift diff --git a/Nextcloud Cookbook iOS Client/Views/KeywordPickerView.swift b/Nextcloud Cookbook iOS Client/Views/RecipeEditing/KeywordPickerView.swift similarity index 100% rename from Nextcloud Cookbook iOS Client/Views/KeywordPickerView.swift rename to Nextcloud Cookbook iOS Client/Views/RecipeEditing/KeywordPickerView.swift diff --git a/Nextcloud Cookbook iOS Client/Views/RecipeEditView.swift b/Nextcloud Cookbook iOS Client/Views/RecipeEditing/RecipeEditView.swift similarity index 100% rename from Nextcloud Cookbook iOS Client/Views/RecipeEditView.swift rename to Nextcloud Cookbook iOS Client/Views/RecipeEditing/RecipeEditView.swift diff --git a/Nextcloud Cookbook iOS Client/Views/CategoryDetailView.swift b/Nextcloud Cookbook iOS Client/Views/Recipes/CategoryDetailView.swift similarity index 97% rename from Nextcloud Cookbook iOS Client/Views/CategoryDetailView.swift rename to Nextcloud Cookbook iOS Client/Views/Recipes/CategoryDetailView.swift index 706e762..06607db 100644 --- a/Nextcloud Cookbook iOS Client/Views/CategoryDetailView.swift +++ b/Nextcloud Cookbook iOS Client/Views/Recipes/CategoryDetailView.swift @@ -13,7 +13,7 @@ import SwiftUI struct CategoryDetailView: View { @State var categoryName: String @State var searchText: String = "" - @ObservedObject var viewModel: MainViewModel + @ObservedObject var viewModel: AppState @Binding var showEditView: Bool var body: some View { diff --git a/Nextcloud Cookbook iOS Client/Views/RecipeCardView.swift b/Nextcloud Cookbook iOS Client/Views/Recipes/RecipeCardView.swift similarity index 98% rename from Nextcloud Cookbook iOS Client/Views/RecipeCardView.swift rename to Nextcloud Cookbook iOS Client/Views/Recipes/RecipeCardView.swift index 5f2b44d..abefdd1 100644 --- a/Nextcloud Cookbook iOS Client/Views/RecipeCardView.swift +++ b/Nextcloud Cookbook iOS Client/Views/Recipes/RecipeCardView.swift @@ -9,7 +9,7 @@ import Foundation import SwiftUI struct RecipeCardView: View { - @State var viewModel: MainViewModel + @State var viewModel: AppState @State var recipe: Recipe @State var recipeThumb: UIImage? @State var isDownloaded: Bool? = nil diff --git a/Nextcloud Cookbook iOS Client/Views/RecipeDetailView.swift b/Nextcloud Cookbook iOS Client/Views/Recipes/RecipeDetailView.swift similarity index 99% rename from Nextcloud Cookbook iOS Client/Views/RecipeDetailView.swift rename to Nextcloud Cookbook iOS Client/Views/Recipes/RecipeDetailView.swift index 361fd0d..8bd3794 100644 --- a/Nextcloud Cookbook iOS Client/Views/RecipeDetailView.swift +++ b/Nextcloud Cookbook iOS Client/Views/Recipes/RecipeDetailView.swift @@ -10,7 +10,7 @@ import SwiftUI struct RecipeDetailView: View { - @ObservedObject var viewModel: MainViewModel + @ObservedObject var viewModel: AppState @State var recipe: Recipe @State var recipeDetail: RecipeDetail? @State var recipeImage: UIImage? @@ -214,7 +214,7 @@ fileprivate struct ShareView: View { fileprivate struct RecipeDurationSection: View { - @ObservedObject var viewModel: MainViewModel + @ObservedObject var viewModel: AppState @State var recipeDetail: RecipeDetail var body: some View { diff --git a/Nextcloud Cookbook iOS Client/Views/TimerView.swift b/Nextcloud Cookbook iOS Client/Views/Recipes/TimerView.swift similarity index 100% rename from Nextcloud Cookbook iOS Client/Views/TimerView.swift rename to Nextcloud Cookbook iOS Client/Views/Recipes/TimerView.swift diff --git a/Nextcloud Cookbook iOS Client/Views/CollapsibleView.swift b/Nextcloud Cookbook iOS Client/Views/ReusableViews/CollapsibleView.swift similarity index 100% rename from Nextcloud Cookbook iOS Client/Views/CollapsibleView.swift rename to Nextcloud Cookbook iOS Client/Views/ReusableViews/CollapsibleView.swift diff --git a/Nextcloud Cookbook iOS Client/Views/SettingsView.swift b/Nextcloud Cookbook iOS Client/Views/SettingsView.swift index 902f3d4..5fa365b 100644 --- a/Nextcloud Cookbook iOS Client/Views/SettingsView.swift +++ b/Nextcloud Cookbook iOS Client/Views/SettingsView.swift @@ -11,7 +11,7 @@ import SwiftUI struct SettingsView: View { - @EnvironmentObject var viewModel: MainViewModel + @EnvironmentObject var viewModel: AppState @ObservedObject var userSettings = UserSettings.shared @State fileprivate var alertType: SettingsAlert = .NONE diff --git a/Nextcloud Cookbook iOS Client/Views/Tabs/RecipeTabView.swift b/Nextcloud Cookbook iOS Client/Views/Tabs/RecipeTabView.swift index 3ee7ff7..d9c266f 100644 --- a/Nextcloud Cookbook iOS Client/Views/Tabs/RecipeTabView.swift +++ b/Nextcloud Cookbook iOS Client/Views/Tabs/RecipeTabView.swift @@ -10,25 +10,18 @@ import SwiftUI struct RecipeTabView: View { - @Binding var selectedCategory: Category? - @Binding var showLoadingIndicator: Bool - - @EnvironmentObject var viewModel: MainViewModel - @StateObject var userSettings: UserSettings = UserSettings.shared - - @State private var showEditView: Bool = false - @State private var serverConnection: Bool = false - + @EnvironmentObject var viewModel: RecipeTabView.ViewModel + @EnvironmentObject var mainViewModel: AppState var body: some View { NavigationSplitView { - List(selection: $selectedCategory) { + List(selection: $viewModel.selectedCategory) { // Categories - ForEach(viewModel.categories) { category in + ForEach(mainViewModel.categories) { category in if category.recipe_count != 0 { NavigationLink(value: category) { HStack(alignment: .center) { - if selectedCategory != nil && category.name == selectedCategory!.name { + if viewModel.selectedCategory != nil && category.name == viewModel.selectedCategory!.name { Image(systemName: "book") } else { Image(systemName: "book.closed.fill") @@ -52,53 +45,59 @@ struct RecipeTabView: View { } .navigationTitle("Cookbooks") .toolbar { - RecipeTabViewToolBar( - viewModel: viewModel, - showEditView: $showEditView, - serverConnection: $serverConnection, - showLoadingIndicator: $showLoadingIndicator - ) + RecipeTabViewToolBar() + } + .navigationDestination(isPresented: $viewModel.presentSettingsView) { + SettingsView() } } detail: { NavigationStack { - if let category = selectedCategory { + if let category = viewModel.selectedCategory { CategoryDetailView( categoryName: category.name, - viewModel: viewModel, - showEditView: $showEditView + viewModel: mainViewModel, + showEditView: $viewModel.presentEditView ) .id(category.id) // Workaround: This is needed to update the detail view when the selection changes } } } .tint(.nextcloudBlue) - .sheet(isPresented: $showEditView) { + .sheet(isPresented: $viewModel.presentEditView) { RecipeEditView( viewModel: RecipeEditViewModel( - mainViewModel: viewModel, + mainViewModel: mainViewModel, uploadNew: true ), - isPresented: $showEditView + isPresented: $viewModel.presentEditView ) } .task { - self.serverConnection = await viewModel.checkServerConnection() + viewModel.serverConnection = await mainViewModel.checkServerConnection() } .refreshable { - self.serverConnection = await viewModel.checkServerConnection() - await viewModel.getCategories() + viewModel.serverConnection = await mainViewModel.checkServerConnection() + await mainViewModel.getCategories() } } + + class ViewModel: ObservableObject { + @Published var presentEditView: Bool = false + @Published var presentSettingsView: Bool = false + + @Published var presentLoadingIndicator: Bool = false + @Published var presentConnectionPopover: Bool = false + @Published var serverConnection: Bool = false + + @Published var selectedCategory: Category? = nil + } } fileprivate struct RecipeTabViewToolBar: ToolbarContent { - @ObservedObject var viewModel: MainViewModel - @Binding var showEditView: Bool - @Binding var serverConnection: Bool - @Binding var showLoadingIndicator: Bool - @State private var presentPopover: Bool = false + @EnvironmentObject var mainViewModel: AppState + @EnvironmentObject var viewModel: RecipeTabView.ViewModel var body: some ToolbarContent { // Top left menu toolbar item @@ -106,20 +105,26 @@ fileprivate struct RecipeTabViewToolBar: ToolbarContent { Menu { Button { Task { - showLoadingIndicator = true + viewModel.presentLoadingIndicator = true UserSettings.shared.lastUpdate = Date.distantPast - await viewModel.getCategories() - for category in viewModel.categories { - await viewModel.getCategory(named: category.name, fetchMode: .preferServer) + await mainViewModel.getCategories() + for category in mainViewModel.categories { + await mainViewModel.getCategory(named: category.name, fetchMode: .preferServer) } - await viewModel.updateAllRecipeDetails() - showLoadingIndicator = false + await mainViewModel.updateAllRecipeDetails() + viewModel.presentLoadingIndicator = false } } label: { Text("Refresh all") Image(systemName: "icloud.and.arrow.down") } + Button { + viewModel.presentSettingsView = true + } label: { + Text("Settings") + Image(systemName: "gearshape") + } } label: { Image(systemName: "ellipsis.circle") } @@ -129,18 +134,18 @@ fileprivate struct RecipeTabViewToolBar: ToolbarContent { ToolbarItem(placement: .topBarTrailing) { Button { print("Check server connection") - presentPopover = true + viewModel.presentConnectionPopover = true } label: { - if showLoadingIndicator { + if viewModel.presentLoadingIndicator { ProgressView() - } else if serverConnection { + } else if viewModel.serverConnection { Image(systemName: "checkmark.icloud") } else { Image(systemName: "xmark.icloud") } - }.popover(isPresented: $presentPopover) { + }.popover(isPresented: $viewModel.presentConnectionPopover) { VStack(alignment: .leading) { - Text(serverConnection ? LocalizedStringKey("Connected to server.") : LocalizedStringKey("Unable to connect to server.")) + Text(viewModel.serverConnection ? LocalizedStringKey("Connected to server.") : LocalizedStringKey("Unable to connect to server.")) .bold() Text("Last updated: \(DateFormatter.utcToString(date: UserSettings.shared.lastUpdate))") @@ -156,7 +161,7 @@ fileprivate struct RecipeTabViewToolBar: ToolbarContent { ToolbarItem(placement: .topBarTrailing) { Button { print("Add new recipe") - showEditView = true + viewModel.presentEditView = true } label: { Image(systemName: "plus.circle.fill") } diff --git a/Nextcloud Cookbook iOS Client/Views/Tabs/SearchTabView.swift b/Nextcloud Cookbook iOS Client/Views/Tabs/SearchTabView.swift index 96add22..e5fea0e 100644 --- a/Nextcloud Cookbook iOS Client/Views/Tabs/SearchTabView.swift +++ b/Nextcloud Cookbook iOS Client/Views/Tabs/SearchTabView.swift @@ -10,26 +10,17 @@ import SwiftUI struct SearchTabView: View { - @EnvironmentObject var viewModel: MainViewModel - - var body: some View { - RecipeSearchView(viewModel: viewModel) - } -} - -struct RecipeSearchView: View { - @ObservedObject var viewModel: MainViewModel - @State var searchText: String = "" - @State var allRecipes: [Recipe] = [] + @EnvironmentObject var viewModel: SearchTabView.ViewModel + @EnvironmentObject var mainViewModel: AppState var body: some View { NavigationStack { VStack { ScrollView(showsIndicators: false) { LazyVStack { - ForEach(recipesFiltered(), id: \.recipe_id) { recipe in + ForEach(viewModel.recipesFiltered(), id: \.recipe_id) { recipe in NavigationLink(value: recipe) { - RecipeCardView(viewModel: viewModel, recipe: recipe) + RecipeCardView(viewModel: mainViewModel, recipe: recipe) .shadow(radius: 2) } .buttonStyle(.plain) @@ -37,22 +28,32 @@ struct RecipeSearchView: View { } } .navigationDestination(for: Recipe.self) { recipe in - RecipeDetailView(viewModel: viewModel, recipe: recipe) + RecipeDetailView(viewModel: mainViewModel, recipe: recipe) } - .searchable(text: $searchText, prompt: "Search recipes/keywords") + .searchable(text: $viewModel.searchText, prompt: "Search recipes/keywords") } .navigationTitle("Search recipe") } .task { - allRecipes = await viewModel.getRecipes() + if viewModel.allRecipes.isEmpty { + viewModel.allRecipes = await mainViewModel.getRecipes() + } + } + .refreshable { + viewModel.allRecipes = await mainViewModel.getRecipes() } } - func recipesFiltered() -> [Recipe] { - guard searchText != "" else { return allRecipes } - return allRecipes.filter { recipe in - recipe.name.lowercased().contains(searchText.lowercased()) || // check name for occurence of search term - (recipe.keywords != nil && recipe.keywords!.lowercased().contains(searchText.lowercased())) // check keywords for search term + class ViewModel: ObservableObject { + @Published var allRecipes: [Recipe] = [] + @Published var searchText: String = "" + + func recipesFiltered() -> [Recipe] { + guard searchText != "" else { return allRecipes } + return allRecipes.filter { recipe in + recipe.name.lowercased().contains(searchText.lowercased()) || // check name for occurence of search term + (recipe.keywords != nil && recipe.keywords!.lowercased().contains(searchText.lowercased())) // check keywords for search term + } } } }