diff --git a/FakeNFT.xcodeproj/project.pbxproj b/FakeNFT.xcodeproj/project.pbxproj index e9ad82fe6f..b8ab3cee98 100644 --- a/FakeNFT.xcodeproj/project.pbxproj +++ b/FakeNFT.xcodeproj/project.pbxproj @@ -9,42 +9,30 @@ /* Begin PBXBuildFile section */ 0C79EE612A76DCD600EE90EA /* NftByIdRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C79EE602A76DCD600EE90EA /* NftByIdRequest.swift */; }; 0C79EE632A76DD1900EE90EA /* RequestConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C79EE622A76DD1900EE90EA /* RequestConstants.swift */; }; - 0C79EE662A76DDFF00EE90EA /* NftDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C79EE652A76DDFF00EE90EA /* NftDetailViewController.swift */; }; - 0C79EE682A76DE0900EE90EA /* NftDetailPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C79EE672A76DE0900EE90EA /* NftDetailPresenter.swift */; }; - 0C79EE6A2A76DE1000EE90EA /* NftDetailAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C79EE692A76DE1000EE90EA /* NftDetailAssembly.swift */; }; 0C79EE6C2A76DE2E00EE90EA /* ServicesAssemly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C79EE6B2A76DE2E00EE90EA /* ServicesAssemly.swift */; }; - 0CF2C2DB2A783C1B00FDC837 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CF2C2DA2A783C1B00FDC837 /* LoadingView.swift */; }; 0CF2C2DD2A783CE600FDC837 /* ErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CF2C2DC2A783CE600FDC837 /* ErrorView.swift */; }; - 0CF2C2E12A784C7000FDC837 /* LinePageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CF2C2E02A784C7000FDC837 /* LinePageControl.swift */; }; 0CFCB7402A78002A0009A829 /* ExamplePutService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFCB73F2A78002A0009A829 /* ExamplePutService.swift */; }; 0CFCB7422A78013E0009A829 /* Nft.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFCB7412A78013E0009A829 /* Nft.swift */; }; - 0CFCB7442A7802440009A829 /* NftDetailInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFCB7432A7802440009A829 /* NftDetailInput.swift */; }; - 0CFCB7462A78064B0009A829 /* NftDetailCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFCB7452A78064B0009A829 /* NftDetailCellModel.swift */; }; - 0CFCB7492A7808900009A829 /* TestCatalogController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFCB7482A7808900009A829 /* TestCatalogController.swift */; }; - 0CFCB74B2A780EA80009A829 /* UIView+Constraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFCB74A2A780EA80009A829 /* UIView+Constraints.swift */; }; 0CFCB74E2A7817DC0009A829 /* NftStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFCB74D2A7817DC0009A829 /* NftStorage.swift */; }; 3F478ECF29DB474E00F6D39E /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F478ECE29DB474E00F6D39E /* Colors.swift */; }; 3F478ED129DB476500F6D39E /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F478ED029DB476500F6D39E /* Fonts.swift */; }; 3F603CCD29DB4A53000C43D7 /* ProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = 3F603CCC29DB4A53000C43D7 /* ProgressHUD */; }; 3F603CD029DB4A74000C43D7 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 3F603CCF29DB4A74000C43D7 /* Kingfisher */; }; - 3F68069729CBBAF100B4F915 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F68069629CBBAF100B4F915 /* AppDelegate.swift */; }; - 3F68069929CBBAF100B4F915 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F68069829CBBAF100B4F915 /* SceneDelegate.swift */; }; - 3F68069B29CBBAF100B4F915 /* ProductDetailsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F68069A29CBBAF100B4F915 /* ProductDetailsTableViewController.swift */; }; - 3F68069E29CBBAF100B4F915 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3F68069C29CBBAF100B4F915 /* Main.storyboard */; }; 3F6806A029CBBAF200B4F915 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3F68069F29CBBAF200B4F915 /* Assets.xcassets */; }; - 3F6806A329CBBAF200B4F915 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3F6806A129CBBAF200B4F915 /* LaunchScreen.storyboard */; }; 3F6806AE29CBBAF200B4F915 /* ExampleUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F6806AD29CBBAF200B4F915 /* ExampleUnitTests.swift */; }; 3F6806B829CBBAF200B4F915 /* FakeNFTUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F6806B729CBBAF200B4F915 /* FakeNFTUITests.swift */; }; 3F6806D129CBBE6B00B4F915 /* NetworkClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F6806D029CBBE6B00B4F915 /* NetworkClient.swift */; }; 3F6806D329CBBE9600B4F915 /* NetworkRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F6806D229CBBE9600B4F915 /* NetworkRequest.swift */; }; 3F6806D529CBBEC700B4F915 /* NetworkTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F6806D429CBBEC700B4F915 /* NetworkTask.swift */; }; - 3F6806D729CBC50A00B4F915 /* CellsReusingUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F6806D629CBC50A00B4F915 /* CellsReusingUtils.swift */; }; - 3FC8C38B29D242E90081F015 /* ProductDetailsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FC8C38A29D242E90081F015 /* ProductDetailsTableViewCell.swift */; }; 3FC8C39129D2453B0081F015 /* ExamplePutRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FC8C39029D2453B0081F015 /* ExamplePutRequest.swift */; }; 3FC8C39329D246BA0081F015 /* DateFormatters+Presets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FC8C39229D246BA0081F015 /* DateFormatters+Presets.swift */; }; + 5019A4CE2DE1E899009A5AF8 /* FakeNftApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5019A4CD2DE1E899009A5AF8 /* FakeNftApp.swift */; }; + 5019A4D02DE1E8E0009A5AF8 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5019A4CF2DE1E8E0009A5AF8 /* ContentView.swift */; }; 558E39E72C68CE0A00FB86AC /* NftService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 558E39E62C68CE0900FB86AC /* NftService.swift */; }; - E19CD5AB2A98B56600CA39A5 /* NftImageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E19CD5AA2A98B56600CA39A5 /* NftImageCollectionViewCell.swift */; }; - E1A1B9DA2AA01CE400C3AFBC /* TabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1A1B9D92AA01CE400C3AFBC /* TabBarController.swift */; }; + 79D0C7532DE396AC00D53241 /* Tab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79D0C7522DE396AC00D53241 /* Tab.swift */; }; + 79D0C7562DE3973200D53241 /* TabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79D0C7552DE3973200D53241 /* TabBarView.swift */; }; + 79D0C7592DE39C3800D53241 /* NavigationBarStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79D0C7582DE39C3800D53241 /* NavigationBarStyle.swift */; }; + 79D0C75D2DE39F5900D53241 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79D0C75C2DE39F5900D53241 /* LoadingView.swift */; }; E1CD40DC2A96BECC00BE7FE8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E1CD40DB2A96BECC00BE7FE8 /* Localizable.strings */; }; /* End PBXBuildFile section */ @@ -68,29 +56,15 @@ /* Begin PBXFileReference section */ 0C79EE602A76DCD600EE90EA /* NftByIdRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NftByIdRequest.swift; sourceTree = ""; }; 0C79EE622A76DD1900EE90EA /* RequestConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestConstants.swift; sourceTree = ""; }; - 0C79EE652A76DDFF00EE90EA /* NftDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NftDetailViewController.swift; sourceTree = ""; }; - 0C79EE672A76DE0900EE90EA /* NftDetailPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NftDetailPresenter.swift; sourceTree = ""; }; - 0C79EE692A76DE1000EE90EA /* NftDetailAssembly.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NftDetailAssembly.swift; sourceTree = ""; }; 0C79EE6B2A76DE2E00EE90EA /* ServicesAssemly.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServicesAssemly.swift; sourceTree = ""; }; - 0CF2C2DA2A783C1B00FDC837 /* LoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = ""; }; 0CF2C2DC2A783CE600FDC837 /* ErrorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorView.swift; sourceTree = ""; }; - 0CF2C2E02A784C7000FDC837 /* LinePageControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinePageControl.swift; sourceTree = ""; }; 0CFCB73F2A78002A0009A829 /* ExamplePutService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExamplePutService.swift; sourceTree = ""; }; 0CFCB7412A78013E0009A829 /* Nft.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Nft.swift; sourceTree = ""; }; - 0CFCB7432A7802440009A829 /* NftDetailInput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NftDetailInput.swift; sourceTree = ""; }; - 0CFCB7452A78064B0009A829 /* NftDetailCellModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NftDetailCellModel.swift; sourceTree = ""; }; - 0CFCB7482A7808900009A829 /* TestCatalogController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestCatalogController.swift; sourceTree = ""; }; - 0CFCB74A2A780EA80009A829 /* UIView+Constraints.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Constraints.swift"; sourceTree = ""; }; 0CFCB74D2A7817DC0009A829 /* NftStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NftStorage.swift; sourceTree = ""; }; 3F478ECE29DB474E00F6D39E /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; 3F478ED029DB476500F6D39E /* Fonts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fonts.swift; sourceTree = ""; }; 3F68069329CBBAF100B4F915 /* FakeNFT.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FakeNFT.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 3F68069629CBBAF100B4F915 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 3F68069829CBBAF100B4F915 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; - 3F68069A29CBBAF100B4F915 /* ProductDetailsTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailsTableViewController.swift; sourceTree = ""; }; - 3F68069D29CBBAF100B4F915 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 3F68069F29CBBAF200B4F915 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 3F6806A229CBBAF200B4F915 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 3F6806A429CBBAF200B4F915 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 3F6806A929CBBAF200B4F915 /* FakeNFTTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FakeNFTTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3F6806AD29CBBAF200B4F915 /* ExampleUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleUnitTests.swift; sourceTree = ""; }; @@ -99,15 +73,15 @@ 3F6806D029CBBE6B00B4F915 /* NetworkClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkClient.swift; sourceTree = ""; }; 3F6806D229CBBE9600B4F915 /* NetworkRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkRequest.swift; sourceTree = ""; }; 3F6806D429CBBEC700B4F915 /* NetworkTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkTask.swift; sourceTree = ""; }; - 3F6806D629CBC50A00B4F915 /* CellsReusingUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CellsReusingUtils.swift; sourceTree = ""; }; - 3FC8C38A29D242E90081F015 /* ProductDetailsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailsTableViewCell.swift; sourceTree = ""; }; 3FC8C39029D2453B0081F015 /* ExamplePutRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExamplePutRequest.swift; sourceTree = ""; }; 3FC8C39229D246BA0081F015 /* DateFormatters+Presets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DateFormatters+Presets.swift"; sourceTree = ""; }; + 5019A4CD2DE1E899009A5AF8 /* FakeNftApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FakeNftApp.swift; sourceTree = ""; }; + 5019A4CF2DE1E8E0009A5AF8 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 558E39E62C68CE0900FB86AC /* NftService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NftService.swift; sourceTree = ""; }; - E19CD5AA2A98B56600CA39A5 /* NftImageCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NftImageCollectionViewCell.swift; sourceTree = ""; }; - E1A1B9D92AA01CE400C3AFBC /* TabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarController.swift; sourceTree = ""; }; - E1CD40D82A96BE7D00BE7FE8 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Main.strings; sourceTree = ""; }; - E1CD40D92A96BE7D00BE7FE8 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/LaunchScreen.strings; sourceTree = ""; }; + 79D0C7522DE396AC00D53241 /* Tab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tab.swift; sourceTree = ""; }; + 79D0C7552DE3973200D53241 /* TabBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarView.swift; sourceTree = ""; }; + 79D0C7582DE39C3800D53241 /* NavigationBarStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarStyle.swift; sourceTree = ""; }; + 79D0C75C2DE39F5900D53241 /* LoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = ""; }; E1CD40DB2A96BECC00BE7FE8 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; /* End PBXFileReference section */ @@ -138,22 +112,10 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0C79EE642A76DDCF00EE90EA /* NftDetails */ = { - isa = PBXGroup; - children = ( - E19CD5A92A98B55900CA39A5 /* Cell */, - 0C79EE652A76DDFF00EE90EA /* NftDetailViewController.swift */, - 0C79EE672A76DE0900EE90EA /* NftDetailPresenter.swift */, - 0C79EE692A76DE1000EE90EA /* NftDetailAssembly.swift */, - 0CFCB7432A7802440009A829 /* NftDetailInput.swift */, - ); - path = NftDetails; - sourceTree = ""; - }; 0CF2C2D92A783C1600FDC837 /* Common */ = { isa = PBXGroup; children = ( - 0CF2C2DF2A784C5600FDC837 /* Views */, + 79D0C75B2DE39F3900D53241 /* LoadingView */, 0CF2C2DE2A784C4C00FDC837 /* Protocols */, ); path = Common; @@ -162,28 +124,11 @@ 0CF2C2DE2A784C4C00FDC837 /* Protocols */ = { isa = PBXGroup; children = ( - 0CF2C2DA2A783C1B00FDC837 /* LoadingView.swift */, 0CF2C2DC2A783CE600FDC837 /* ErrorView.swift */, ); path = Protocols; sourceTree = ""; }; - 0CF2C2DF2A784C5600FDC837 /* Views */ = { - isa = PBXGroup; - children = ( - 0CF2C2E02A784C7000FDC837 /* LinePageControl.swift */, - ); - path = Views; - sourceTree = ""; - }; - 0CFCB7472A7808870009A829 /* Catalog */ = { - isa = PBXGroup; - children = ( - 0CFCB7482A7808900009A829 /* TestCatalogController.swift */, - ); - path = Catalog; - sourceTree = ""; - }; 0CFCB74C2A7817C30009A829 /* MemoryStorage */ = { isa = PBXGroup; children = ( @@ -224,15 +169,17 @@ 3F68069529CBBAF100B4F915 /* FakeNFT */ = { isa = PBXGroup; children = ( - 3F68069629CBBAF100B4F915 /* AppDelegate.swift */, - 3F68069829CBBAF100B4F915 /* SceneDelegate.swift */, E1CD40DA2A96BE9B00BE7FE8 /* Resources */, 3F478ECD29DB473000F6D39E /* DesignSystem */, 3F6806CE29CBBD1B00B4F915 /* Foundation */, 3F6806C929CBBCAF00B4F915 /* Models */, + 79D0C7502DE3940800D53241 /* ViewModels */, 3F6806C729CBBC5B00B4F915 /* Scenes */, 3F6806C629CBBC4E00B4F915 /* Services */, + 79D0C75A2DE39E1100D53241 /* Constants */, + 79D0C74F2DE393F600D53241 /* Docs */, 3F6806A429CBBAF200B4F915 /* Info.plist */, + 5019A4CD2DE1E899009A5AF8 /* FakeNftApp.swift */, ); path = FakeNFT; sourceTree = ""; @@ -267,27 +214,18 @@ 3F6806C729CBBC5B00B4F915 /* Scenes */ = { isa = PBXGroup; children = ( - E1A1B9D82AA01C9700C3AFBC /* TabBarController */, + 5019A4CF2DE1E8E0009A5AF8 /* ContentView.swift */, 0CF2C2D92A783C1600FDC837 /* Common */, - 0CFCB7472A7808870009A829 /* Catalog */, - 0C79EE642A76DDCF00EE90EA /* NftDetails */, - 3F6806C829CBBC8100B4F915 /* ProductDetails */, + 79D0C7572DE39C1100D53241 /* ViewModifier */, + 79D0C7542DE396D400D53241 /* TabBar */, ); path = "Scenes "; sourceTree = ""; }; - 3F6806C829CBBC8100B4F915 /* ProductDetails */ = { - isa = PBXGroup; - children = ( - 3F68069A29CBBAF100B4F915 /* ProductDetailsTableViewController.swift */, - 3FC8C38A29D242E90081F015 /* ProductDetailsTableViewCell.swift */, - ); - path = ProductDetails; - sourceTree = ""; - }; 3F6806C929CBBCAF00B4F915 /* Models */ = { isa = PBXGroup; children = ( + 79D0C7512DE3968600D53241 /* Tab */, 3F6806D829CC979D00B4F915 /* Network */, ); path = Models; @@ -298,9 +236,7 @@ children = ( 0CFCB74C2A7817C30009A829 /* MemoryStorage */, 3F6806CF29CBBDB100B4F915 /* NetworkClient */, - 3F6806D629CBC50A00B4F915 /* CellsReusingUtils.swift */, 3FC8C39229D246BA0081F015 /* DateFormatters+Presets.swift */, - 0CFCB74A2A780EA80009A829 /* UIView+Constraints.swift */, ); path = Foundation; sourceTree = ""; @@ -333,29 +269,63 @@ path = Requests; sourceTree = ""; }; - E19CD5A92A98B55900CA39A5 /* Cell */ = { + 79D0C74F2DE393F600D53241 /* Docs */ = { + isa = PBXGroup; + children = ( + ); + path = Docs; + sourceTree = ""; + }; + 79D0C7502DE3940800D53241 /* ViewModels */ = { + isa = PBXGroup; + children = ( + ); + path = ViewModels; + sourceTree = ""; + }; + 79D0C7512DE3968600D53241 /* Tab */ = { + isa = PBXGroup; + children = ( + 79D0C7522DE396AC00D53241 /* Tab.swift */, + ); + path = Tab; + sourceTree = ""; + }; + 79D0C7542DE396D400D53241 /* TabBar */ = { isa = PBXGroup; children = ( - 0CFCB7452A78064B0009A829 /* NftDetailCellModel.swift */, - E19CD5AA2A98B56600CA39A5 /* NftImageCollectionViewCell.swift */, + 79D0C7552DE3973200D53241 /* TabBarView.swift */, ); - path = Cell; + path = TabBar; sourceTree = ""; }; - E1A1B9D82AA01C9700C3AFBC /* TabBarController */ = { + 79D0C7572DE39C1100D53241 /* ViewModifier */ = { isa = PBXGroup; children = ( - E1A1B9D92AA01CE400C3AFBC /* TabBarController.swift */, + 79D0C7582DE39C3800D53241 /* NavigationBarStyle.swift */, ); - path = TabBarController; + path = ViewModifier; + sourceTree = ""; + }; + 79D0C75A2DE39E1100D53241 /* Constants */ = { + isa = PBXGroup; + children = ( + ); + path = Constants; + sourceTree = ""; + }; + 79D0C75B2DE39F3900D53241 /* LoadingView */ = { + isa = PBXGroup; + children = ( + 79D0C75C2DE39F5900D53241 /* LoadingView.swift */, + ); + path = LoadingView; sourceTree = ""; }; E1CD40DA2A96BE9B00BE7FE8 /* Resources */ = { isa = PBXGroup; children = ( - 3F68069C29CBBAF100B4F915 /* Main.storyboard */, 3F68069F29CBBAF200B4F915 /* Assets.xcassets */, - 3F6806A129CBBAF200B4F915 /* LaunchScreen.storyboard */, E1CD40DB2A96BECC00BE7FE8 /* Localizable.strings */, ); path = Resources; @@ -429,7 +399,7 @@ attributes = { BuildIndependentTargetsInParallel = 1; LastSwiftUpdateCheck = 1420; - LastUpgradeCheck = 1420; + LastUpgradeCheck = 1630; TargetAttributes = { 3F68069229CBBAF100B4F915 = { CreatedOnToolsVersion = 14.2; @@ -474,10 +444,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3F6806A329CBBAF200B4F915 /* LaunchScreen.storyboard in Resources */, E1CD40DC2A96BECC00BE7FE8 /* Localizable.strings in Resources */, 3F6806A029CBBAF200B4F915 /* Assets.xcassets in Resources */, - 3F68069E29CBBAF100B4F915 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -502,36 +470,26 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3FC8C38B29D242E90081F015 /* ProductDetailsTableViewCell.swift in Sources */, 3F478ECF29DB474E00F6D39E /* Colors.swift in Sources */, - 0C79EE662A76DDFF00EE90EA /* NftDetailViewController.swift in Sources */, - E1A1B9DA2AA01CE400C3AFBC /* TabBarController.swift in Sources */, 3F478ED129DB476500F6D39E /* Fonts.swift in Sources */, - 0C79EE6A2A76DE1000EE90EA /* NftDetailAssembly.swift in Sources */, 3FC8C39329D246BA0081F015 /* DateFormatters+Presets.swift in Sources */, 0CFCB7422A78013E0009A829 /* Nft.swift in Sources */, + 79D0C7592DE39C3800D53241 /* NavigationBarStyle.swift in Sources */, + 79D0C75D2DE39F5900D53241 /* LoadingView.swift in Sources */, 0CF2C2DD2A783CE600FDC837 /* ErrorView.swift in Sources */, - 0C79EE682A76DE0900EE90EA /* NftDetailPresenter.swift in Sources */, - 3F68069B29CBBAF100B4F915 /* ProductDetailsTableViewController.swift in Sources */, + 5019A4CE2DE1E899009A5AF8 /* FakeNftApp.swift in Sources */, 0CFCB7402A78002A0009A829 /* ExamplePutService.swift in Sources */, 3F6806D529CBBEC700B4F915 /* NetworkTask.swift in Sources */, - 0CF2C2DB2A783C1B00FDC837 /* LoadingView.swift in Sources */, 558E39E72C68CE0A00FB86AC /* NftService.swift in Sources */, - 3F68069729CBBAF100B4F915 /* AppDelegate.swift in Sources */, - 3F68069929CBBAF100B4F915 /* SceneDelegate.swift in Sources */, 0C79EE6C2A76DE2E00EE90EA /* ServicesAssemly.swift in Sources */, + 79D0C7532DE396AC00D53241 /* Tab.swift in Sources */, 0CFCB74E2A7817DC0009A829 /* NftStorage.swift in Sources */, 3FC8C39129D2453B0081F015 /* ExamplePutRequest.swift in Sources */, - 0CFCB7462A78064B0009A829 /* NftDetailCellModel.swift in Sources */, - 0CFCB74B2A780EA80009A829 /* UIView+Constraints.swift in Sources */, - 3F6806D729CBC50A00B4F915 /* CellsReusingUtils.swift in Sources */, + 5019A4D02DE1E8E0009A5AF8 /* ContentView.swift in Sources */, 0C79EE612A76DCD600EE90EA /* NftByIdRequest.swift in Sources */, - E19CD5AB2A98B56600CA39A5 /* NftImageCollectionViewCell.swift in Sources */, - 0CF2C2E12A784C7000FDC837 /* LinePageControl.swift in Sources */, 3F6806D329CBBE9600B4F915 /* NetworkRequest.swift in Sources */, - 0CFCB7492A7808900009A829 /* TestCatalogController.swift in Sources */, 3F6806D129CBBE6B00B4F915 /* NetworkClient.swift in Sources */, - 0CFCB7442A7802440009A829 /* NftDetailInput.swift in Sources */, + 79D0C7562DE3973200D53241 /* TabBarView.swift in Sources */, 0C79EE632A76DD1900EE90EA /* RequestConstants.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -567,27 +525,6 @@ }; /* End PBXTargetDependency section */ -/* Begin PBXVariantGroup section */ - 3F68069C29CBBAF100B4F915 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 3F68069D29CBBAF100B4F915 /* Base */, - E1CD40D82A96BE7D00BE7FE8 /* ru */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 3F6806A129CBBAF200B4F915 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 3F6806A229CBBAF200B4F915 /* Base */, - E1CD40D92A96BE7D00BE7FE8 /* ru */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - /* Begin XCBuildConfiguration section */ 3F6806BB29CBBAF200B4F915 /* Debug */ = { isa = XCBuildConfiguration; @@ -626,6 +563,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -640,7 +578,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -687,6 +625,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -695,7 +634,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -712,22 +651,24 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 6H2GQX47PU; + DEVELOPMENT_TEAM = A89A5GBX7T; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = FakeNFT/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen.storyboard; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.practicum.FakeNFT; + PRODUCT_BUNDLE_IDENTIFIER = com.practicum.FakeNFTMax; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -741,22 +682,24 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 6H2GQX47PU; + DEVELOPMENT_TEAM = A89A5GBX7T; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = FakeNFT/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen.storyboard; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.practicum.FakeNFT; + PRODUCT_BUNDLE_IDENTIFIER = com.practicum.FakeNFTMax; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -766,7 +709,6 @@ 3F6806C129CBBAF200B4F915 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; @@ -785,7 +727,6 @@ 3F6806C229CBBAF200B4F915 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; @@ -804,7 +745,6 @@ 3F6806C429CBBAF200B4F915 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; @@ -821,7 +761,6 @@ 3F6806C529CBBAF200B4F915 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; diff --git a/FakeNFT.xcodeproj/xcshareddata/xcschemes/FakeNFT.xcscheme b/FakeNFT.xcodeproj/xcshareddata/xcschemes/FakeNFT.xcscheme index d682c47de1..f107b1a687 100644 --- a/FakeNFT.xcodeproj/xcshareddata/xcschemes/FakeNFT.xcscheme +++ b/FakeNFT.xcodeproj/xcshareddata/xcschemes/FakeNFT.xcscheme @@ -1,6 +1,6 @@ Bool { - return true - } - - // MARK: UISceneSession Lifecycle - - func application( - _: UIApplication, - configurationForConnecting connectingSceneSession: UISceneSession, - options _: UIScene.ConnectionOptions - ) -> UISceneConfiguration { - return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) - } -} diff --git a/FakeNFT/DesignSystem/Colors.swift b/FakeNFT/DesignSystem/Colors.swift index 8f95ac024d..7abdc93916 100644 --- a/FakeNFT/DesignSystem/Colors.swift +++ b/FakeNFT/DesignSystem/Colors.swift @@ -1,67 +1,55 @@ -import UIKit - -extension UIColor { - // Creates color from a hex string - convenience init(hexString: String) { - let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) - var int = UInt64() +import SwiftUI + +extension Color { + + // MARK: - Day/Night Theme + static let blackDay = Color("blackDay") + static let whiteDay = Color("whiteDay") + static let lightGrayDay = Color("lightGrayDay") + + // MARK: - Universal Colors + static let yaGrayUniversal = Color(hex: "#625C5C") + static let yaRedUniversal = Color(hex: "#F56B6C") + static let yaBackgroundUniversal = Color(hex: "#1A1B2280") + static let yaGreenUniversal = Color(hex: "#1C9F00") + static let yaBlueUniversal = Color(hex: "#0A84FF") + static let yaBlackUniversal = Color(hex: "#1A1B22") + static let yaWhiteUniversal = Color(hex: "#FFFFFF") + static let yaYellowUniversal = Color(hex: "#FEEF0D") + + // MARK: - Init with HEX + init(hex: String) { + let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) + var int: UInt64 = 0 Scanner(string: hex).scanHexInt64(&int) - let alpha, red, green, blue: UInt64 + + let a, r, g, b: UInt64 switch hex.count { case 3: // RGB (12-bit) - (alpha, red, green, blue) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) + (a, r, g, b) = (255, + (int >> 8) * 17, + (int >> 4 & 0xF) * 17, + (int & 0xF) * 17) case 6: // RGB (24-bit) - (alpha, red, green, blue) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) + (a, r, g, b) = (255, + int >> 16, + int >> 8 & 0xFF, + int & 0xFF) case 8: // ARGB (32-bit) - (alpha, red, green, blue) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) + (a, r, g, b) = (int >> 24, + int >> 16 & 0xFF, + int >> 8 & 0xFF, + int & 0xFF) default: - (alpha, red, green, blue) = (255, 0, 0, 0) + (a, r, g, b) = (255, 0, 0, 0) } + self.init( - red: CGFloat(red) / 255, - green: CGFloat(green) / 255, - blue: CGFloat(blue) / 255, - alpha: CGFloat(alpha) / 255 + .sRGB, + red: Double(r) / 255, + green: Double(g) / 255, + blue: Double(b) / 255, + opacity: Double(a) / 255 ) } - - // Ниже приведены примеры цветов, настоящие цвета надо взять из фигмы - - // Primary Colors - static let primary = UIColor(red: 0 / 255, green: 122 / 255, blue: 255 / 255, alpha: 1.0) - - // Secondary Colors - static let secondary = UIColor(red: 255 / 255, green: 193 / 255, blue: 7 / 255, alpha: 1.0) - - // Background Colors - static let background = UIColor.white - - // Text Colors - static let textPrimary = UIColor.black - static let textSecondary = UIColor.gray - static let textOnPrimary = UIColor.white - static let textOnSecondary = UIColor.black - - private static let yaBlackLight = UIColor(hexString: "1A1B22") - private static let yaBlackDark = UIColor.white - private static let yaLightGrayLight = UIColor(hexString: "#F7F7F8") - private static let yaLightGrayDark = UIColor(hexString: "#2C2C2E") - - static let segmentActive = UIColor { traits in - return traits.userInterfaceStyle == .dark - ? .yaBlackDark - : .yaBlackLight - } - - static let segmentInactive = UIColor { traits in - return traits.userInterfaceStyle == .dark - ? .yaLightGrayDark - : .yaLightGrayLight - } - - static let closeButton = UIColor { traits in - return traits.userInterfaceStyle == .dark - ? .yaBlackDark - : .yaBlackLight - } } diff --git a/FakeNFT/DesignSystem/Fonts.swift b/FakeNFT/DesignSystem/Fonts.swift index d8e1f6657d..1cf327e9c3 100644 --- a/FakeNFT/DesignSystem/Fonts.swift +++ b/FakeNFT/DesignSystem/Fonts.swift @@ -1,19 +1,10 @@ -import UIKit - -extension UIFont { - // Ниже приведены примеры шрифтов, настоящие шрифты надо взять из фигмы - - // Headline Fonts - static var headline1 = UIFont.systemFont(ofSize: 34, weight: .bold) - static var headline2 = UIFont.systemFont(ofSize: 28, weight: .bold) - static var headline3 = UIFont.systemFont(ofSize: 22, weight: .bold) - static var headline4 = UIFont.systemFont(ofSize: 20, weight: .bold) - - // Body Fonts - static var bodyRegular = UIFont.systemFont(ofSize: 17, weight: .regular) - static var bodyBold = UIFont.systemFont(ofSize: 17, weight: .bold) - - // Caption Fonts - static var caption1 = UIFont.systemFont(ofSize: 15, weight: .regular) - static var caption2 = UIFont.systemFont(ofSize: 13, weight: .regular) +import SwiftUI + +extension Font { + static let regular13 = Font.system(size: 13, weight: .regular) + static let regular15 = Font.system(size: 15, weight: .regular) + static let regular17 = Font.system(size: 17, weight: .regular) + static let medium10 = Font.system(size: 10, weight: .medium) + static let bold17 = Font.system(size: 17, weight: .bold) + static let bold22 = Font.system(size: 22, weight: .bold) } diff --git a/FakeNFT/FakeNftApp.swift b/FakeNFT/FakeNftApp.swift new file mode 100644 index 0000000000..911bf63fe0 --- /dev/null +++ b/FakeNFT/FakeNftApp.swift @@ -0,0 +1,18 @@ +// +// FakeNftApp.swift +// FakeNFT +// +// Created by Max on 24.05.2025. +// + +import SwiftUI + +@main +struct FakeNftApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} + diff --git a/FakeNFT/Info.plist b/FakeNFT/Info.plist index dd3c9afdae..99eb6f55c0 100644 --- a/FakeNFT/Info.plist +++ b/FakeNFT/Info.plist @@ -13,10 +13,6 @@ UISceneConfigurationName Default Configuration - UISceneDelegateClassName - $(PRODUCT_MODULE_NAME).SceneDelegate - UISceneStoryboardFile - Main diff --git a/FakeNFT/Models/Tab/Tab.swift b/FakeNFT/Models/Tab/Tab.swift new file mode 100644 index 0000000000..28df738582 --- /dev/null +++ b/FakeNFT/Models/Tab/Tab.swift @@ -0,0 +1,41 @@ +// +// Tab.swift +// FakeNFT +// +// Created by Anastasia on 25.05.2025. +// + +import Foundation + +enum Tab: String, CaseIterable { + case profile + case catalog + case cart + case statistics + + var title: String { + switch self { + case .profile: + return "Профиль" + case .catalog: + return "Каталог" + case .cart: + return "Корзина" + case .statistics: + return "Статистика" + } + } + + var imageName: String { + switch self { + case .profile: + return "profile" + case .catalog: + return "catalog" + case .cart: + return "cart" + case .statistics: + return "statistics" + } + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/FakeNFT/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json index 13613e3ee1..9ef292d7df 100644 --- a/FakeNFT/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/FakeNFT/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,6 +1,7 @@ { "images" : [ { + "filename" : "store.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/FakeNFT/Resources/Assets.xcassets/AppIcon.appiconset/store.png b/FakeNFT/Resources/Assets.xcassets/AppIcon.appiconset/store.png new file mode 100644 index 0000000000..a6f6980e3a Binary files /dev/null and b/FakeNFT/Resources/Assets.xcassets/AppIcon.appiconset/store.png differ diff --git a/FakeNFT/Resources/Assets.xcassets/Colors/Contents.json b/FakeNFT/Resources/Assets.xcassets/Colors/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Colors/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Colors/blackDay.colorset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Colors/blackDay.colorset/Contents.json new file mode 100644 index 0000000000..f72aca9951 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Colors/blackDay.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x22", + "green" : "0x1B", + "red" : "0x1A" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Colors/lightGrayDay.colorset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Colors/lightGrayDay.colorset/Contents.json new file mode 100644 index 0000000000..7f62711051 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Colors/lightGrayDay.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF8", + "green" : "0xF7", + "red" : "0xF7" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x2E", + "green" : "0x2C", + "red" : "0x2C" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Colors/whiteDay.colorset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Colors/whiteDay.colorset/Contents.json new file mode 100644 index 0000000000..dee192ff04 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Colors/whiteDay.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x22", + "green" : "0x1B", + "red" : "0x1A" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/backButton.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/backButton.imageset/Contents.json new file mode 100644 index 0000000000..b462291b3b --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/backButton.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "backButton.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/backButton.imageset/backButton.svg b/FakeNFT/Resources/Assets.xcassets/Icons/backButton.imageset/backButton.svg new file mode 100644 index 0000000000..85965564bf --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/backButton.imageset/backButton.svg @@ -0,0 +1,3 @@ + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/cart.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/cart.imageset/Contents.json new file mode 100644 index 0000000000..0478608aef --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/cart.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "cart.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/cart.imageset/cart.svg b/FakeNFT/Resources/Assets.xcassets/Icons/cart.imageset/cart.svg new file mode 100644 index 0000000000..faf33ca1e5 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/cart.imageset/cart.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/cartAdd.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/cartAdd.imageset/Contents.json new file mode 100644 index 0000000000..7fe1b7a939 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/cartAdd.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "cartAdd.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/cartAdd.imageset/cartAdd.svg b/FakeNFT/Resources/Assets.xcassets/Icons/cartAdd.imageset/cartAdd.svg new file mode 100644 index 0000000000..cf69dcc80b --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/cartAdd.imageset/cartAdd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/cartDelete.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/cartDelete.imageset/Contents.json new file mode 100644 index 0000000000..0bcb2e25b3 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/cartDelete.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "cartDelete.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/cartDelete.imageset/cartDelete.svg b/FakeNFT/Resources/Assets.xcassets/Icons/cartDelete.imageset/cartDelete.svg new file mode 100644 index 0000000000..65af140646 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/cartDelete.imageset/cartDelete.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/catalog.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/catalog.imageset/Contents.json new file mode 100644 index 0000000000..22549f1e3e --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/catalog.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "catalog.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/catalog.imageset/catalog.svg b/FakeNFT/Resources/Assets.xcassets/Icons/catalog.imageset/catalog.svg new file mode 100644 index 0000000000..0168876437 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/catalog.imageset/catalog.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/filterButton.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/filterButton.imageset/Contents.json new file mode 100644 index 0000000000..e7e405ad8b --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/filterButton.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "filterButton.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/filterButton.imageset/filterButton.svg b/FakeNFT/Resources/Assets.xcassets/Icons/filterButton.imageset/filterButton.svg new file mode 100644 index 0000000000..de994be362 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/filterButton.imageset/filterButton.svg @@ -0,0 +1,3 @@ + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/likeActive.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/likeActive.imageset/Contents.json new file mode 100644 index 0000000000..3b79ba0161 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/likeActive.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "likeActive.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/likeActive.imageset/likeActive.svg b/FakeNFT/Resources/Assets.xcassets/Icons/likeActive.imageset/likeActive.svg new file mode 100644 index 0000000000..0df1256881 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/likeActive.imageset/likeActive.svg @@ -0,0 +1,3 @@ + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/likeNoActive.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/likeNoActive.imageset/Contents.json new file mode 100644 index 0000000000..49466f01a2 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/likeNoActive.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "likeNoActive.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/likeNoActive.imageset/likeNoActive.svg b/FakeNFT/Resources/Assets.xcassets/Icons/likeNoActive.imageset/likeNoActive.svg new file mode 100644 index 0000000000..07735df20b --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/likeNoActive.imageset/likeNoActive.svg @@ -0,0 +1,3 @@ + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/profile.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/profile.imageset/Contents.json new file mode 100644 index 0000000000..e52494b52d --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/profile.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "profile.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/profile.imageset/profile.svg b/FakeNFT/Resources/Assets.xcassets/Icons/profile.imageset/profile.svg new file mode 100644 index 0000000000..05db0cadf6 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/profile.imageset/profile.svg @@ -0,0 +1,3 @@ + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/starActive.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/starActive.imageset/Contents.json new file mode 100644 index 0000000000..db3a4ad6d5 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/starActive.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "starActive.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/starActive.imageset/starActive.svg b/FakeNFT/Resources/Assets.xcassets/Icons/starActive.imageset/starActive.svg new file mode 100644 index 0000000000..3f0f70ed74 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/starActive.imageset/starActive.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/starNoActive.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/starNoActive.imageset/Contents.json new file mode 100644 index 0000000000..a0db275696 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/starNoActive.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "starNoActive.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/starNoActive.imageset/starNoActive.svg b/FakeNFT/Resources/Assets.xcassets/Icons/starNoActive.imageset/starNoActive.svg new file mode 100644 index 0000000000..766c252ba1 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/starNoActive.imageset/starNoActive.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/statistics.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/statistics.imageset/Contents.json new file mode 100644 index 0000000000..20b5bdcf51 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/statistics.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "statistics.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/statistics.imageset/statistics.svg b/FakeNFT/Resources/Assets.xcassets/Icons/statistics.imageset/statistics.svg new file mode 100644 index 0000000000..34edbe13d0 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/statistics.imageset/statistics.svg @@ -0,0 +1,3 @@ + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/userpick.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Icons/userpick.imageset/Contents.json new file mode 100644 index 0000000000..98723393bc --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/userpick.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "userpick.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Icons/userpick.imageset/userpick.svg b/FakeNFT/Resources/Assets.xcassets/Icons/userpick.imageset/userpick.svg new file mode 100644 index 0000000000..f23ca4fc32 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Icons/userpick.imageset/userpick.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/FakeNFT/Resources/Assets.xcassets/Images/Contents.json b/FakeNFT/Resources/Assets.xcassets/Images/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Images/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/Contents.json b/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/Contents.json new file mode 100644 index 0000000000..2e123661b9 --- /dev/null +++ b/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "digitalArt@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "digitalArt@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "digitalArt@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/digitalArt@1x.png b/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/digitalArt@1x.png new file mode 100644 index 0000000000..ec17a4791a Binary files /dev/null and b/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/digitalArt@1x.png differ diff --git a/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/digitalArt@2x.png b/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/digitalArt@2x.png new file mode 100644 index 0000000000..c36c6f3375 Binary files /dev/null and b/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/digitalArt@2x.png differ diff --git a/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/digitalArt@3x.png b/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/digitalArt@3x.png new file mode 100644 index 0000000000..59917f2b8d Binary files /dev/null and b/FakeNFT/Resources/Assets.xcassets/Images/digitalArt.imageset/digitalArt@3x.png differ diff --git a/FakeNFT/Resources/Base.lproj/LaunchScreen.storyboard b/FakeNFT/Resources/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 865e9329f3..0000000000 --- a/FakeNFT/Resources/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/FakeNFT/Resources/Base.lproj/Main.storyboard b/FakeNFT/Resources/Base.lproj/Main.storyboard deleted file mode 100644 index 264407c712..0000000000 --- a/FakeNFT/Resources/Base.lproj/Main.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/FakeNFT/Resources/ru.lproj/LaunchScreen.strings b/FakeNFT/Resources/ru.lproj/LaunchScreen.strings deleted file mode 100644 index 8b13789179..0000000000 --- a/FakeNFT/Resources/ru.lproj/LaunchScreen.strings +++ /dev/null @@ -1 +0,0 @@ - diff --git a/FakeNFT/Resources/ru.lproj/Main.strings b/FakeNFT/Resources/ru.lproj/Main.strings deleted file mode 100644 index 6d61671411..0000000000 --- a/FakeNFT/Resources/ru.lproj/Main.strings +++ /dev/null @@ -1,30 +0,0 @@ - -/* Class = "UITabBarItem"; title = "Корзина"; ObjectID = "4N1-bS-JmX"; */ -"4N1-bS-JmX.title" = "Корзина"; - -/* Class = "UITabBarItem"; title = "Профиль"; ObjectID = "Bq6-vk-Wno"; */ -"Bq6-vk-Wno.title" = "Профиль"; - -/* Class = "UITabBarItem"; title = "Каталог"; ObjectID = "X74-Ak-ux8"; */ -"X74-Ak-ux8.title" = "Каталог"; - -/* Class = "UILabel"; text = "Статистика"; ObjectID = "YLD-QU-GF5"; */ -"YLD-QU-GF5.text" = "Статистика"; - -/* Class = "UILabel"; text = "Профиль"; ObjectID = "cJe-qj-ep5"; */ -"cJe-qj-ep5.text" = "Профиль"; - -/* Class = "UIButton"; configuration.title = "Show nft id = 22"; ObjectID = "co5-kx-oQ8"; */ -"co5-kx-oQ8.configuration.title" = "Show nft id = 22"; - -/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "co5-kx-oQ8"; */ -"co5-kx-oQ8.normalTitle" = "Button"; - -/* Class = "UILabel"; text = "Корзина"; ObjectID = "hE3-IK-5YF"; */ -"hE3-IK-5YF.text" = "Корзина"; - -/* Class = "UILabel"; text = "Каталог"; ObjectID = "qWk-zT-AG8"; */ -"qWk-zT-AG8.text" = "Каталог"; - -/* Class = "UITabBarItem"; title = "Корзина"; ObjectID = "xgD-9Y-EGT"; */ -"xgD-9Y-EGT.title" = "Корзина"; diff --git a/FakeNFT/SceneDelegate.swift b/FakeNFT/SceneDelegate.swift deleted file mode 100644 index 5cc4b031b3..0000000000 --- a/FakeNFT/SceneDelegate.swift +++ /dev/null @@ -1,15 +0,0 @@ -import UIKit - -final class SceneDelegate: UIResponder, UIWindowSceneDelegate { - var window: UIWindow? - - let servicesAssembly = ServicesAssembly( - networkClient: DefaultNetworkClient(), - nftStorage: NftStorageImpl() - ) - - func scene(_: UIScene, willConnectTo _: UISceneSession, options _: UIScene.ConnectionOptions) { - let tabBarController = window?.rootViewController as? TabBarController - tabBarController?.servicesAssembly = servicesAssembly - } -} diff --git a/FakeNFT/Scenes /CartView/CartView.swift b/FakeNFT/Scenes /CartView/CartView.swift new file mode 100644 index 0000000000..8242348794 --- /dev/null +++ b/FakeNFT/Scenes /CartView/CartView.swift @@ -0,0 +1,18 @@ +// +// CartView.swift +// FakeNFT +// +// Created by Max on 24.05.2025. +// + +import SwiftUI + +struct CartView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +#Preview { + CartView() +} diff --git a/FakeNFT/Scenes /Catalog/TestCatalogController.swift b/FakeNFT/Scenes /Catalog/TestCatalogController.swift index 201fdc7e73..98d5ab237e 100644 --- a/FakeNFT/Scenes /Catalog/TestCatalogController.swift +++ b/FakeNFT/Scenes /Catalog/TestCatalogController.swift @@ -1,41 +1,41 @@ -import UIKit - -final class TestCatalogViewController: UIViewController { - - let servicesAssembly: ServicesAssembly - let testNftButton = UIButton() - - init(servicesAssembly: ServicesAssembly) { - self.servicesAssembly = servicesAssembly - super.init(nibName: nil, bundle: nil) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = .systemBackground - - view.addSubview(testNftButton) - testNftButton.constraintCenters(to: view) - testNftButton.setTitle(Constants.openNftTitle, for: .normal) - testNftButton.addTarget(self, action: #selector(showNft), for: .touchUpInside) - testNftButton.setTitleColor(.systemBlue, for: .normal) - } - - @objc - func showNft() { - let assembly = NftDetailAssembly(servicesAssembler: servicesAssembly) - let nftInput = NftDetailInput(id: Constants.testNftId) - let nftViewController = assembly.build(with: nftInput) - present(nftViewController, animated: true) - } -} - -private enum Constants { - static let openNftTitle = NSLocalizedString("Catalog.openNft", comment: "") - static let testNftId = "7773e33c-ec15-4230-a102-92426a3a6d5a" -} +//import UIKit +// +//final class TestCatalogViewController: UIViewController { +// +// let servicesAssembly: ServicesAssembly +// let testNftButton = UIButton() +// +// init(servicesAssembly: ServicesAssembly) { +// self.servicesAssembly = servicesAssembly +// super.init(nibName: nil, bundle: nil) +// } +// +// required init?(coder: NSCoder) { +// fatalError("init(coder:) has not been implemented") +// } +// +// override func viewDidLoad() { +// super.viewDidLoad() +// +// view.backgroundColor = .systemBackground +// +// view.addSubview(testNftButton) +// testNftButton.constraintCenters(to: view) +// testNftButton.setTitle(Constants.openNftTitle, for: .normal) +// testNftButton.addTarget(self, action: #selector(showNft), for: .touchUpInside) +// testNftButton.setTitleColor(.systemBlue, for: .normal) +// } +// +// @objc +// func showNft() { +// let assembly = NftDetailAssembly(servicesAssembler: servicesAssembly) +// let nftInput = NftDetailInput(id: Constants.testNftId) +// let nftViewController = assembly.build(with: nftInput) +// present(nftViewController, animated: true) +// } +//} +// +//private enum Constants { +// static let openNftTitle = NSLocalizedString("Catalog.openNft", comment: "") +// static let testNftId = "7773e33c-ec15-4230-a102-92426a3a6d5a" +//} diff --git a/FakeNFT/Scenes /CatalogView/CatalogView.swift b/FakeNFT/Scenes /CatalogView/CatalogView.swift new file mode 100644 index 0000000000..ea8fd0ae6b --- /dev/null +++ b/FakeNFT/Scenes /CatalogView/CatalogView.swift @@ -0,0 +1,18 @@ +// +// CatalogView.swift +// FakeNFT +// +// Created by Max on 24.05.2025. +// + +import SwiftUI + +struct CatalogView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +#Preview { + CatalogView() +} diff --git a/FakeNFT/Scenes /Common/LoadingView/LoadingView.swift b/FakeNFT/Scenes /Common/LoadingView/LoadingView.swift new file mode 100644 index 0000000000..7bcd7b7687 --- /dev/null +++ b/FakeNFT/Scenes /Common/LoadingView/LoadingView.swift @@ -0,0 +1,25 @@ +// +// LoadingView.swift +// FakeNFT +// +// Created by Anastasia on 25.05.2025. +// + +import SwiftUI + +struct LoadingView: View { + var body: some View { + RoundedRectangle(cornerRadius: 8) + .fill(Color.lightGrayDay) + .frame(width: 82, height: 82) + .overlay { + ProgressView() + .tint(.blackDay) + .scaleEffect(1.5) + } + } +} + +#Preview { + LoadingView() +} diff --git a/FakeNFT/Scenes /Common/Protocols/LoadingView.swift b/FakeNFT/Scenes /Common/Protocols/LoadingView.swift deleted file mode 100644 index 4b5b24cc50..0000000000 --- a/FakeNFT/Scenes /Common/Protocols/LoadingView.swift +++ /dev/null @@ -1,18 +0,0 @@ -import ProgressHUD -import UIKit - -protocol LoadingView { - var activityIndicator: UIActivityIndicatorView { get } - func showLoading() - func hideLoading() -} - -extension LoadingView { - func showLoading() { - activityIndicator.startAnimating() - } - - func hideLoading() { - activityIndicator.stopAnimating() - } -} diff --git a/FakeNFT/Scenes /Common/Views/LinePageControl.swift b/FakeNFT/Scenes /Common/Views/LinePageControl.swift index 2a27b4c91a..75e0908023 100644 --- a/FakeNFT/Scenes /Common/Views/LinePageControl.swift +++ b/FakeNFT/Scenes /Common/Views/LinePageControl.swift @@ -4,17 +4,17 @@ final class LinePageControl: UIView { // MARK: - Properties - var numberOfItems: Int = 0 { - didSet { - setupStackView() - } - } - - var selectedItem: Int = 0 { - didSet { - selectedSegmentChanged() - } - } +// var numberOfItems: Int = 0 { +// didSet { +// setupStackView() +// } +// } + +// var selectedItem: Int = 0 { +// didSet { +// selectedSegmentChanged() +// } +// } override var intrinsicContentSize: CGSize { return CGSize(width: UIView.noIntrinsicMetric, height: height) @@ -45,25 +45,25 @@ final class LinePageControl: UIView { // MARK: - Functions - func setupStackView() { - stackView.arrangedSubviews.forEach { stackView.removeArrangedSubview($0) } - - for _ in (0.. UIView? { - imageView - } -} diff --git a/FakeNFT/Scenes /NftDetails/NftDetailAssembly.swift b/FakeNFT/Scenes /NftDetails/NftDetailAssembly.swift index 1a76e6cd50..2a70c89728 100644 --- a/FakeNFT/Scenes /NftDetails/NftDetailAssembly.swift +++ b/FakeNFT/Scenes /NftDetails/NftDetailAssembly.swift @@ -1,20 +1,20 @@ -import UIKit - -public final class NftDetailAssembly { - - private let servicesAssembler: ServicesAssembly - - init(servicesAssembler: ServicesAssembly) { - self.servicesAssembler = servicesAssembler - } - - public func build(with input: NftDetailInput) -> UIViewController { - let presenter = NftDetailPresenterImpl( - input: input, - service: servicesAssembler.nftService - ) - let viewController = NftDetailViewController(presenter: presenter) - presenter.view = viewController - return viewController - } -} +//import UIKit +// +//public final class NftDetailAssembly { +// +// private let servicesAssembler: ServicesAssembly +// +// init(servicesAssembler: ServicesAssembly) { +// self.servicesAssembler = servicesAssembler +// } +// +// public func build(with input: NftDetailInput) -> UIViewController { +// let presenter = NftDetailPresenterImpl( +// input: input, +// service: servicesAssembler.nftService +// ) +// let viewController = NftDetailViewController(presenter: presenter) +// presenter.view = viewController +// return viewController +// } +//} diff --git a/FakeNFT/Scenes /NftDetails/NftDetailPresenter.swift b/FakeNFT/Scenes /NftDetails/NftDetailPresenter.swift index 11d2df4f1d..bab9f4e4d7 100644 --- a/FakeNFT/Scenes /NftDetails/NftDetailPresenter.swift +++ b/FakeNFT/Scenes /NftDetails/NftDetailPresenter.swift @@ -1,84 +1,84 @@ -import Foundation - -// MARK: - Protocol - -protocol NftDetailPresenter { - func viewDidLoad() -} - -// MARK: - State - -enum NftDetailState { - case initial, loading, failed(Error), data(Nft) -} - -final class NftDetailPresenterImpl: NftDetailPresenter { - - // MARK: - Properties - - weak var view: NftDetailView? - private let input: NftDetailInput - private let service: NftService - private var state = NftDetailState.initial { - didSet { - stateDidChanged() - } - } - - // MARK: - Init - - init(input: NftDetailInput, service: NftService) { - self.input = input - self.service = service - } - - // MARK: - Functions - - func viewDidLoad() { - state = .loading - } - - private func stateDidChanged() { - switch state { - case .initial: - assertionFailure("can't move to initial state") - case .loading: - view?.showLoading() - loadNft() - case .data(let nft): - view?.hideLoading() - let cellModels = nft.images.map { NftDetailCellModel(url: $0) } - view?.displayCells(cellModels) - case .failed(let error): - let errorModel = makeErrorModel(error) - view?.hideLoading() - view?.showError(errorModel) - } - } - - private func loadNft() { - service.loadNft(id: input.id) { [weak self] result in - switch result { - case .success(let nft): - self?.state = .data(nft) - case .failure(let error): - self?.state = .failed(error) - } - } - } - - private func makeErrorModel(_ error: Error) -> ErrorModel { - let message: String - switch error { - case is NetworkClientError: - message = NSLocalizedString("Error.network", comment: "") - default: - message = NSLocalizedString("Error.unknown", comment: "") - } - - let actionText = NSLocalizedString("Error.repeat", comment: "") - return ErrorModel(message: message, actionText: actionText) { [weak self] in - self?.state = .loading - } - } -} +//import Foundation +// +//// MARK: - Protocol +// +//protocol NftDetailPresenter { +// func viewDidLoad() +//} +// +//// MARK: - State +// +//enum NftDetailState { +// case initial, loading, failed(Error), data(Nft) +//} +// +//final class NftDetailPresenterImpl: NftDetailPresenter { +// +// // MARK: - Properties +// +// weak var view: NftDetailView? +// private let input: NftDetailInput +// private let service: NftService +// private var state = NftDetailState.initial { +// didSet { +// stateDidChanged() +// } +// } +// +// // MARK: - Init +// +// init(input: NftDetailInput, service: NftService) { +// self.input = input +// self.service = service +// } +// +// // MARK: - Functions +// +// func viewDidLoad() { +// state = .loading +// } +// +// private func stateDidChanged() { +// switch state { +// case .initial: +// assertionFailure("can't move to initial state") +// case .loading: +// view?.showLoading() +// loadNft() +// case .data(let nft): +// view?.hideLoading() +// let cellModels = nft.images.map { NftDetailCellModel(url: $0) } +// view?.displayCells(cellModels) +// case .failed(let error): +// let errorModel = makeErrorModel(error) +// view?.hideLoading() +// view?.showError(errorModel) +// } +// } +// +// private func loadNft() { +// service.loadNft(id: input.id) { [weak self] result in +// switch result { +// case .success(let nft): +// self?.state = .data(nft) +// case .failure(let error): +// self?.state = .failed(error) +// } +// } +// } +// +// private func makeErrorModel(_ error: Error) -> ErrorModel { +// let message: String +// switch error { +// case is NetworkClientError: +// message = NSLocalizedString("Error.network", comment: "") +// default: +// message = NSLocalizedString("Error.unknown", comment: "") +// } +// +// let actionText = NSLocalizedString("Error.repeat", comment: "") +// return ErrorModel(message: message, actionText: actionText) { [weak self] in +// self?.state = .loading +// } +// } +//} diff --git a/FakeNFT/Scenes /NftDetails/NftDetailViewController.swift b/FakeNFT/Scenes /NftDetails/NftDetailViewController.swift deleted file mode 100644 index 6bb84a9b14..0000000000 --- a/FakeNFT/Scenes /NftDetails/NftDetailViewController.swift +++ /dev/null @@ -1,133 +0,0 @@ -import UIKit -import Kingfisher - -protocol NftDetailView: AnyObject, ErrorView, LoadingView { - func displayCells(_ cellModels: [NftDetailCellModel]) -} - -final class NftDetailViewController: UIViewController { - - private let presenter: NftDetailPresenter - - private lazy var collectionView: UICollectionView = { - let layout = UICollectionViewFlowLayout() - layout.scrollDirection = .horizontal - layout.minimumInteritemSpacing = 0 - layout.minimumLineSpacing = 0 - let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) - collectionView.register(NftImageCollectionViewCell.self) - collectionView.dataSource = self - collectionView.delegate = self - - collectionView.showsHorizontalScrollIndicator = false - collectionView.isPagingEnabled = true - return collectionView - }() - - private lazy var closeButton: UIButton = { - let button = UIButton() - button.tintColor = .closeButton - button.setImage(UIImage(named: "close"), for: .normal) - button.addTarget(self, action: #selector(close), for: .touchUpInside) - return button - }() - - private lazy var pageControl = LinePageControl() - internal lazy var activityIndicator = UIActivityIndicatorView() - - private var cellModels: [NftDetailCellModel] = [] - - // MARK: - Init - - init(presenter: NftDetailPresenter) { - self.presenter = presenter - super.init(nibName: nil, bundle: nil) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - Functions - - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = .white - setupLayout() - presenter.viewDidLoad() - } - - // MARK: - private functions - - private func setupLayout() { - collectionView.addSubview(activityIndicator) - activityIndicator.constraintCenters(to: collectionView) - - view.addSubview(collectionView) - collectionView.constraintEdges(to: view) - - view.addSubview(pageControl) - pageControl.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - pageControl.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -32), - pageControl.centerXAnchor.constraint(equalTo: view.centerXAnchor), - pageControl.bottomAnchor.constraint(equalTo: collectionView.safeAreaLayoutGuide.bottomAnchor) - ]) - - view.addSubview(closeButton) - closeButton.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - closeButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 30), - closeButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16) - ]) - } - - @objc - private func close() { - dismiss(animated: true) - } -} - -// MARK: - NftDetailView - -extension NftDetailViewController: NftDetailView { - func displayCells(_ cellModels: [NftDetailCellModel]) { - self.cellModels = cellModels - collectionView.reloadData() - pageControl.numberOfItems = cellModels.count - } -} - -// MARK: - UICollectionViewDataSource - -extension NftDetailViewController: UICollectionViewDataSource { - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - cellModels.count - } - - func collectionView(_ collectionView: UICollectionView, - cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - let cell: NftImageCollectionViewCell = collectionView.dequeueReusableCell(indexPath: indexPath) - - let cellModel = cellModels[indexPath.row] - cell.configure(with: cellModel) - - return cell - } -} - -// MARK: - UICollectionViewDelegateFlowLayout - -extension NftDetailViewController: UICollectionViewDelegateFlowLayout { - func collectionView(_ collectionView: UICollectionView, - layout collectionViewLayout: UICollectionViewLayout, - sizeForItemAt indexPath: IndexPath) -> CGSize { - collectionView.bounds.size - } - - func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - let selectedItem = Int(scrollView.contentOffset.x / scrollView.frame.size.width) - pageControl.selectedItem = selectedItem - } -} diff --git a/FakeNFT/Scenes /ProductDetails/ProductDetailsTableViewController.swift b/FakeNFT/Scenes /ProductDetails/ProductDetailsTableViewController.swift deleted file mode 100644 index baa2a0ffb1..0000000000 --- a/FakeNFT/Scenes /ProductDetails/ProductDetailsTableViewController.swift +++ /dev/null @@ -1,21 +0,0 @@ -import UIKit - -final class ProductDetailsTableViewController: UITableViewController { - override func viewDidLoad() { - super.viewDidLoad() - - tableView.register(ProductDetailsTableViewCell.self) - } - - override func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int { - return 10 - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell: ProductDetailsTableViewCell = tableView.dequeueReusableCell() - - cell.textLabel?.text = "Ячейка номер \(indexPath.row)" - - return cell - } -} diff --git a/FakeNFT/Scenes /ProfileView/ProfileView.swift b/FakeNFT/Scenes /ProfileView/ProfileView.swift new file mode 100644 index 0000000000..f809ff49b9 --- /dev/null +++ b/FakeNFT/Scenes /ProfileView/ProfileView.swift @@ -0,0 +1,20 @@ +// +// ProfileView.swift +// FakeNFT +// +// Created by Max on 24.05.2025. +// + +import SwiftUI + +struct ProfileView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + .font(Font.regular17) + .foregroundStyle(Color.blackDay) + } +} + +#Preview { + ProfileView() +} diff --git a/FakeNFT/Scenes /TabBar/TabBarView.swift b/FakeNFT/Scenes /TabBar/TabBarView.swift new file mode 100644 index 0000000000..a71d6da48f --- /dev/null +++ b/FakeNFT/Scenes /TabBar/TabBarView.swift @@ -0,0 +1,43 @@ +// +// TabBarView.swift +// FakeNFT +// +// Created by Anastasia on 25.05.2025. +// + +import SwiftUI + +struct TabBarView: View { + + @Binding var selectedTab: Tab + + var body: some View { + HStack { + ForEach(Tab.allCases.prefix(4), id: \.self) { tab in + Button { + self.selectedTab = tab + } label: { + tabItemView(for: tab) + } + .tint(selectedTab == tab ? .yaBlueUniversal : .blackDay) + } + } + .padding(.horizontal) + } + + private func tabItemView(for tab: Tab) -> some View { + VStack { + Image("\(tab.imageName)") + .resizable() + .frame(width: 30, height: 30) + Text(tab.title) + .font(.medium10) + } + .frame(maxWidth: .infinity) + } +} + +#Preview { + Spacer() + TabBarView(selectedTab: .constant(.profile)) +} diff --git a/FakeNFT/Scenes /TabBarController/TabBarController.swift b/FakeNFT/Scenes /TabBarController/TabBarController.swift deleted file mode 100644 index 99931a214a..0000000000 --- a/FakeNFT/Scenes /TabBarController/TabBarController.swift +++ /dev/null @@ -1,25 +0,0 @@ -import UIKit - -final class TabBarController: UITabBarController { - - var servicesAssembly: ServicesAssembly! - - private let catalogTabBarItem = UITabBarItem( - title: NSLocalizedString("Tab.catalog", comment: ""), - image: UIImage(systemName: "square.stack.3d.up.fill"), - tag: 0 - ) - - override func viewDidLoad() { - super.viewDidLoad() - - let catalogController = TestCatalogViewController( - servicesAssembly: servicesAssembly - ) - catalogController.tabBarItem = catalogTabBarItem - - viewControllers = [catalogController] - - view.backgroundColor = .systemBackground - } -} diff --git a/FakeNFT/Scenes /TabBarView/TabBarView.swift b/FakeNFT/Scenes /TabBarView/TabBarView.swift new file mode 100644 index 0000000000..0deccf93d8 --- /dev/null +++ b/FakeNFT/Scenes /TabBarView/TabBarView.swift @@ -0,0 +1,18 @@ +// +// TabBarView.swift +// FakeNFT +// +// Created by Max on 24.05.2025. +// + +import SwiftUI + +struct TabBarView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +#Preview { + TabBarView() +} diff --git a/FakeNFT/Scenes /ViewModifier/NavigationBarStyle.swift b/FakeNFT/Scenes /ViewModifier/NavigationBarStyle.swift new file mode 100644 index 0000000000..0270c637be --- /dev/null +++ b/FakeNFT/Scenes /ViewModifier/NavigationBarStyle.swift @@ -0,0 +1,120 @@ +// +// NavigationBarStyle.swift +// FakeNFT +// +// Created by Anastasia on 25.05.2025. +// + +import SwiftUI + +struct NavigationBarStyle: ViewModifier { + + // MARK: - Properties + + @Environment(\.dismiss) var dismiss + + let title: String? + let backButtonHidden: Bool + let filterButtonHidden: Bool + var filterButtonTapHandler: () -> Void? + + // MARK: - Initializers + + init(title: String?, + backButtonHidden: Bool, + filterButtonHidden: Bool, + filterButtonTapHandler: @escaping () -> Void? + ) { + self.title = title + self.backButtonHidden = backButtonHidden + self.filterButtonHidden = filterButtonHidden + self.filterButtonTapHandler = filterButtonTapHandler + setupNavigationBarAppearance() + } + + // MARK: - Content + + func body(content: Content) -> some View { + content + .navigationTitle(title ?? "") + .navigationBarTitleDisplayMode(.inline) + .navigationBarBackButtonHidden(true) + .toolbar { + ToolbarItem(placement: .topBarLeading) { + backButton + .opacity(backButtonHidden ? 0 : 1) + } + ToolbarItem(placement: .topBarTrailing) { + filterButton + .opacity(filterButtonHidden ? 0 : 1) + } + } + } + + // MARK: - View + + private var backButton: some View { + Button { + dismiss() + } label: { + Image("backButton") + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + .tint(.blackDay) + } + } + + private var filterButton: some View { + Button { + filterButtonTapHandler() + } label: { + Image("filterButton") + .resizable() + .scaledToFit() + .frame(width: 42, height: 42) + .tint(.blackDay) + } + } + + // MARK: - Private Methods + + private func setupNavigationBarAppearance() { + let navBarAppearance = UINavigationBarAppearance() + navBarAppearance.configureWithOpaqueBackground() + navBarAppearance.shadowColor = .clear + UINavigationBar.appearance().standardAppearance = navBarAppearance + } +} + +#Preview { + NavigationView { + Text("Пример использования NavigationBarStyle с разными настройками") + .modifier(NavigationBarStyle( + title: "Мои NFT", + backButtonHidden: false, + filterButtonHidden: false, + filterButtonTapHandler: {} + )) + } + + NavigationView { + Text("Пример использования NavigationBarStyle с разными настройками") + .modifier(NavigationBarStyle( + title: "Коллекция NFT", + backButtonHidden: false, + filterButtonHidden: true, + filterButtonTapHandler: {} + )) + } + + NavigationView { + Text("Пример использования NavigationBarStyle с разными настройками") + .modifier(NavigationBarStyle( + title: nil, + backButtonHidden: false, + filterButtonHidden: true, + filterButtonTapHandler: {} + )) + } +}