From a06da90d0b88218ad5dbadc8a5dd8fe3fdbd6f2b Mon Sep 17 00:00:00 2001 From: booster Date: Fri, 9 Feb 2024 00:25:46 +0300 Subject: [PATCH] Extension handler support in DivState --- client/ios/DivKit/DivExtensionHandler.swift | 17 ++++++++++++++++- .../Extensions/DivBase/DivBaseExtensions.swift | 8 +++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/client/ios/DivKit/DivExtensionHandler.swift b/client/ios/DivKit/DivExtensionHandler.swift index c9fefa11f..55605cd94 100644 --- a/client/ios/DivKit/DivExtensionHandler.swift +++ b/client/ios/DivKit/DivExtensionHandler.swift @@ -18,7 +18,17 @@ import LayoutKit public protocol DivExtensionHandler: AccessibilityContaining { /// A unique identifier for the extension. var id: String { get } - + + /// Notifies extension handler that div will be processed by DivKit. + /// + /// - Parameters: + /// - div: The `DivBase` to which extension handler is attached. + /// - context: The context in which the block is being modeled. + func accept( + div: DivBase, + context: DivBlockModelingContext + ) + /// Applies additional properties to the block before the base properties. /// /// - Parameters: @@ -49,6 +59,11 @@ public protocol DivExtensionHandler: AccessibilityContaining { } extension DivExtensionHandler { + public func accept( + div: DivBase, + context: DivBlockModelingContext + ) {} + public func applyBeforeBaseProperties( to block: Block, div _: DivBase, diff --git a/client/ios/DivKit/Extensions/DivBase/DivBaseExtensions.swift b/client/ios/DivKit/Extensions/DivBase/DivBaseExtensions.swift index 1dd510888..647975073 100644 --- a/client/ios/DivKit/Extensions/DivBase/DivBaseExtensions.swift +++ b/client/ios/DivKit/Extensions/DivBase/DivBaseExtensions.swift @@ -14,6 +14,12 @@ extension DivBase { customAccessibilityParams: CustomAccessibilityParams = .default, clipToBounds: Bool = true ) throws -> Block { + let extensionHandlers = context.getExtensionHandlers(for: self) + + extensionHandlers.forEach { + $0.accept(div: self, context: context) + } + let expressionResolver = context.expressionResolver let statePath = context.parentDivStatePath ?? DivData.rootPath @@ -26,7 +32,7 @@ extension DivBase { var block = try block() - let extensionHandlers = context.getExtensionHandlers(for: self) + extensionHandlers.forEach { block = $0.applyBeforeBaseProperties(to: block, div: self, context: context) }