From 43c2ff318cbb7bc133ce00a1f340df14e39ad306 Mon Sep 17 00:00:00 2001 From: morevsavva Date: Wed, 9 Aug 2023 20:20:35 +0300 Subject: [PATCH] using DivView in Sample App. --- .../DivKitSample.xcodeproj/project.pbxproj | 26 ++++-- .../xcshareddata/swiftpm/Package.resolved | 4 +- .../ios/Sample/DivKitSample/DivHostView.swift | 84 ++++++------------- .../DivKitSample/DivHostViewController.swift | 21 +---- client/ios/Sample/DivKitSample/DivJson.swift | 1 - 5 files changed, 45 insertions(+), 91 deletions(-) diff --git a/client/ios/Sample/DivKitSample.xcodeproj/project.pbxproj b/client/ios/Sample/DivKitSample.xcodeproj/project.pbxproj index 74a676687..952d319d8 100644 --- a/client/ios/Sample/DivKitSample.xcodeproj/project.pbxproj +++ b/client/ios/Sample/DivKitSample.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 43E33AE32A83DD7F00CEFAD5 /* DivKit in Frameworks */ = {isa = PBXBuildFile; productRef = 43E33AE22A83DD7F00CEFAD5 /* DivKit */; }; + 43E33AE52A83DD7F00CEFAD5 /* DivKitExtensions in Frameworks */ = {isa = PBXBuildFile; productRef = 43E33AE42A83DD7F00CEFAD5 /* DivKitExtensions */; }; 895BED8428BD0FF400F572B6 /* DivHostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 895BED8328BD0FF400F572B6 /* DivHostView.swift */; }; 8C705EF8258A3FDE00468EB6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C705EF7258A3FDE00468EB6 /* AppDelegate.swift */; }; 8C705EFC258A3FDE00468EB6 /* DivHostViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C705EFB258A3FDE00468EB6 /* DivHostViewController.swift */; }; @@ -15,7 +17,6 @@ 8C705F04258A3FE000468EB6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8C705F02258A3FE000468EB6 /* LaunchScreen.storyboard */; }; 8C705F1E258A48CC00468EB6 /* div_json.json in Resources */ = {isa = PBXBuildFile; fileRef = 8C705F1D258A48CC00468EB6 /* div_json.json */; }; 8C705F23258A4F1000468EB6 /* DivJson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C705F22258A4F1000468EB6 /* DivJson.swift */; }; - 8C896C8D28E1C6C500D864DB /* DivKit in Frameworks */ = {isa = PBXBuildFile; productRef = 8C896C8C28E1C6C500D864DB /* DivKit */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -36,7 +37,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8C896C8D28E1C6C500D864DB /* DivKit in Frameworks */, + 43E33AE32A83DD7F00CEFAD5 /* DivKit in Frameworks */, + 43E33AE52A83DD7F00CEFAD5 /* DivKitExtensions in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -92,7 +94,8 @@ ); name = DivKitSample; packageProductDependencies = ( - 8C896C8C28E1C6C500D864DB /* DivKit */, + 43E33AE22A83DD7F00CEFAD5 /* DivKit */, + 43E33AE42A83DD7F00CEFAD5 /* DivKitExtensions */, ); productName = DivKitSample; productReference = 8C705EF4258A3FDE00468EB6 /* DivKitSample.app */; @@ -122,7 +125,7 @@ ); mainGroup = 8C705EEB258A3FDE00468EB6; packageReferences = ( - 8C896C8B28E1C6C500D864DB /* XCRemoteSwiftPackageReference "divkit-ios" */, + 43E33AE12A83DD7F00CEFAD5 /* XCRemoteSwiftPackageReference "divkit-ios" */, ); productRefGroup = 8C705EF5258A3FDE00468EB6 /* Products */; projectDirPath = ""; @@ -368,22 +371,27 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 8C896C8B28E1C6C500D864DB /* XCRemoteSwiftPackageReference "divkit-ios" */ = { + 43E33AE12A83DD7F00CEFAD5 /* XCRemoteSwiftPackageReference "divkit-ios" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/divkit/divkit-ios"; requirement = { - branch = main; - kind = branch; + kind = upToNextMajorVersion; + minimumVersion = 27.0.0; }; }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 8C896C8C28E1C6C500D864DB /* DivKit */ = { + 43E33AE22A83DD7F00CEFAD5 /* DivKit */ = { isa = XCSwiftPackageProductDependency; - package = 8C896C8B28E1C6C500D864DB /* XCRemoteSwiftPackageReference "divkit-ios" */; + package = 43E33AE12A83DD7F00CEFAD5 /* XCRemoteSwiftPackageReference "divkit-ios" */; productName = DivKit; }; + 43E33AE42A83DD7F00CEFAD5 /* DivKitExtensions */ = { + isa = XCSwiftPackageProductDependency; + package = 43E33AE12A83DD7F00CEFAD5 /* XCRemoteSwiftPackageReference "divkit-ios" */; + productName = DivKitExtensions; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 8C705EEC258A3FDE00468EB6 /* Project object */; diff --git a/client/ios/Sample/DivKitSample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/client/ios/Sample/DivKitSample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 1a1f5b9c8..18af1bc8e 100644 --- a/client/ios/Sample/DivKitSample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/client/ios/Sample/DivKitSample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/divkit/divkit-ios", "state" : { - "branch" : "main", - "revision" : "fbc52037c5a5be8b3640e36c10cf6771e0aea158" + "revision" : "9c6581956b4798b7a3f828d63529883f37286082", + "version" : "27.1.0" } } ], diff --git a/client/ios/Sample/DivKitSample/DivHostView.swift b/client/ios/Sample/DivKitSample/DivHostView.swift index ca8c0d295..7326fba89 100644 --- a/client/ios/Sample/DivKitSample/DivHostView.swift +++ b/client/ios/Sample/DivKitSample/DivHostView.swift @@ -1,12 +1,13 @@ import UIKit -import CommonCore +import BasePublic +import CommonCorePublic import DivKit import LayoutKit final class DivHostView: UICollectionView { private let components: DivKitComponents - private var items: [Item] = [] + var items: [DivData] = [] init(components: DivKitComponents) { self.components = components @@ -25,68 +26,29 @@ final class DivHostView: UICollectionView { fatalError("init(coder:) has not been implemented") } - func setData(_ items: [DivData]) { - self.items = items.compactMap { makeItem(data: $0) } - } - - func reloadItem(cardId: String) { - guard let index = items.firstIndex(where: { $0.data.logId == cardId }) else { - return - } - - let item = items[index] - items[index] = makeItem( - data: item.data, - cachedImageHolders: item.block.getImageHolders() - ) - - reloadItems(at: [IndexPath(item: index, section: 0)]) - } - - private func makeItem( - data: DivData, - cachedImageHolders: [ImageHolder] = [] - ) -> Item { - let context = components.makeContext( - cardId: DivCardID(rawValue: data.logId), - cachedImageHolders: cachedImageHolders - ) - return Item(data: data, block: try! data.makeBlock(context: context)) - } - - private struct Item { - let data: DivData - let block: Block - } - private class Cell: UICollectionViewCell { static let reuseIdentifier = "cell" - struct State { - let block: Block - let view: BlockView + var divView: DivView? { + didSet { + guard let divView else { return } + addSubview(divView) + } } - var state: State? - - func setBlock(_ block: Block) { - let view = block.reuse( - state?.view, - observer: nil, - overscrollDelegate: nil, - renderingDelegate: nil, - superview: self - ) - state = State(block: block, view: view) + func configureCell(divKitComponents: DivKitComponents, divData: DivData) { + if divView == nil { + self.divView = DivView(divKitComponents: divKitComponents) + } + divView?.setSource(.init(kind: .divData(divData), cardId: DivCardID(rawValue: divData.logId))) } override func layoutSubviews() { super.layoutSubviews() - - if let state = state { - let blockSize = state.block.size(forResizableBlockSize: bounds.size) - state.view.frame = CGRect(origin: .zero, size: blockSize) - } + divView?.frame = CGRect( + origin: .zero, + size: divView?.intrinsicContentSize(for: bounds.size) ?? .zero + ) } } } @@ -107,8 +69,7 @@ extension DivHostView: UICollectionViewDataSource { withReuseIdentifier: Cell.reuseIdentifier, for: indexPath ) as! Cell - let block = items[indexPath.row].block - cell.setBlock(block) + cell.configureCell(divKitComponents: components, divData: items[indexPath.row]) return cell } } @@ -119,8 +80,11 @@ extension DivHostView: UICollectionViewDelegateFlowLayout { layout _: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath ) -> CGSize { - let block = items[indexPath.row].block - let height = block.heightOfVerticallyNonResizableBlock(forWidth: bounds.width) - return CGSize(width: bounds.width, height: height) + let view = DivView(divKitComponents: components) + view.setSource(.init( + kind: .divData(items[indexPath.row]), + cardId: DivCardID(rawValue: items[indexPath.row].logId) + )) + return view.intrinsicContentSize(for: bounds.size) } } diff --git a/client/ios/Sample/DivKitSample/DivHostViewController.swift b/client/ios/Sample/DivKitSample/DivHostViewController.swift index aee55f713..e72da8809 100644 --- a/client/ios/Sample/DivKitSample/DivHostViewController.swift +++ b/client/ios/Sample/DivKitSample/DivHostViewController.swift @@ -10,14 +10,13 @@ final class DivHostViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() components = DivKitComponents( - updateCardAction: nil, - urlOpener: { UIApplication.shared.open($0) } + urlHandler: DivUrlHandlerDelegate { UIApplication.shared.open($0) } ) divHostView = DivHostView(components: components) if let cards = try? DivJson.loadCards() { view.addSubview(divHostView) - divHostView.setData(cards) + divHostView.items = cards } } @@ -26,19 +25,3 @@ final class DivHostViewController: UIViewController { divHostView.frame = view.bounds.inset(by: view.safeAreaInsets) } } - -extension DivHostViewController: UIActionEventPerforming { - func perform(uiActionEvent event: UIActionEvent, from _: AnyObject) { - switch event.payload { - case let .divAction(params): - components.handleActions(params: params) - divHostView.reloadItem(cardId: params.cardId) - case .empty, - .url, - .menu, - .json, - .composite: - break - } - } -} diff --git a/client/ios/Sample/DivKitSample/DivJson.swift b/client/ios/Sample/DivKitSample/DivJson.swift index 74bbcc07a..8f1e25f55 100644 --- a/client/ios/Sample/DivKitSample/DivJson.swift +++ b/client/ios/Sample/DivKitSample/DivJson.swift @@ -2,7 +2,6 @@ import Foundation import DivKit import Serialization -import TemplatesSupport public struct DivJson: Deserializable { public let templates: [String: Any]