diff --git a/.mapping.json b/.mapping.json index afa9133e..ff8b615c 100644 --- a/.mapping.json +++ b/.mapping.json @@ -22,6 +22,7 @@ "DivKit/DivExtensionHandler.swift":"divkit/public-ios/DivKit/DivExtensionHandler.swift", "DivKit/DivFlagsInfo.swift":"divkit/public-ios/DivKit/DivFlagsInfo.swift", "DivKit/DivFontProvider.swift":"divkit/public-ios/DivKit/DivFontProvider.swift", + "DivKit/DivImageHolderFactory.swift":"divkit/public-ios/DivKit/DivImageHolderFactory.swift", "DivKit/DivKitComponents.swift":"divkit/public-ios/DivKit/DivKitComponents.swift", "DivKit/DivKitInfo.swift":"divkit/public-ios/DivKit/DivKitInfo.swift", "DivKit/DivKitLogger.swift":"divkit/public-ios/DivKit/DivKitLogger.swift", @@ -818,6 +819,7 @@ "Specs/DivKit/28.5.1/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.5.1/DivKit.podspec", "Specs/DivKit/28.6.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.6.0/DivKit.podspec", "Specs/DivKit/28.7.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.7.0/DivKit.podspec", + "Specs/DivKit/28.8.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.8.0/DivKit.podspec", "Specs/DivKitExtensions/24.3.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/24.3.0/DivKitExtensions.podspec", "Specs/DivKitExtensions/25.0.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/25.0.0/DivKitExtensions.podspec", "Specs/DivKitExtensions/25.1.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/25.1.0/DivKitExtensions.podspec", @@ -844,6 +846,7 @@ "Specs/DivKitExtensions/28.5.1/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.5.1/DivKitExtensions.podspec", "Specs/DivKitExtensions/28.6.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.6.0/DivKitExtensions.podspec", "Specs/DivKitExtensions/28.7.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.7.0/DivKitExtensions.podspec", + "Specs/DivKitExtensions/28.8.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.8.0/DivKitExtensions.podspec", "Specs/DivKit_LayoutKit/28.0.1/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.0.1/DivKit_LayoutKit.podspec", "Specs/DivKit_LayoutKit/28.1.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.1.0/DivKit_LayoutKit.podspec", "Specs/DivKit_LayoutKit/28.2.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.2.0/DivKit_LayoutKit.podspec", @@ -852,6 +855,7 @@ "Specs/DivKit_LayoutKit/28.5.1/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.5.1/DivKit_LayoutKit.podspec", "Specs/DivKit_LayoutKit/28.6.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.6.0/DivKit_LayoutKit.podspec", "Specs/DivKit_LayoutKit/28.7.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.7.0/DivKit_LayoutKit.podspec", + "Specs/DivKit_LayoutKit/28.8.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.8.0/DivKit_LayoutKit.podspec", "Specs/DivKit_LayoutKitInterface/28.0.1/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.0.1/DivKit_LayoutKitInterface.podspec", "Specs/DivKit_LayoutKitInterface/28.1.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.1.0/DivKit_LayoutKitInterface.podspec", "Specs/DivKit_LayoutKitInterface/28.2.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.2.0/DivKit_LayoutKitInterface.podspec", @@ -860,6 +864,7 @@ "Specs/DivKit_LayoutKitInterface/28.5.1/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.5.1/DivKit_LayoutKitInterface.podspec", "Specs/DivKit_LayoutKitInterface/28.6.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.6.0/DivKit_LayoutKitInterface.podspec", "Specs/DivKit_LayoutKitInterface/28.7.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.7.0/DivKit_LayoutKitInterface.podspec", + "Specs/DivKit_LayoutKitInterface/28.8.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.8.0/DivKit_LayoutKitInterface.podspec", "Specs/DivKit_Serialization/28.0.1/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.0.1/DivKit_Serialization.podspec", "Specs/DivKit_Serialization/28.1.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.1.0/DivKit_Serialization.podspec", "Specs/DivKit_Serialization/28.2.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.2.0/DivKit_Serialization.podspec", @@ -868,6 +873,7 @@ "Specs/DivKit_Serialization/28.5.1/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.5.1/DivKit_Serialization.podspec", "Specs/DivKit_Serialization/28.6.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.6.0/DivKit_Serialization.podspec", "Specs/DivKit_Serialization/28.7.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.7.0/DivKit_Serialization.podspec", + "Specs/DivKit_Serialization/28.8.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.8.0/DivKit_Serialization.podspec", "Specs/LayoutKit/24.3.0/LayoutKit.podspec":"divkit/public-ios/Specs/LayoutKit/24.3.0/LayoutKit.podspec", "Specs/LayoutKit/25.0.0/LayoutKit.podspec":"divkit/public-ios/Specs/LayoutKit/25.0.0/LayoutKit.podspec", "Specs/LayoutKit/25.1.0/LayoutKit.podspec":"divkit/public-ios/Specs/LayoutKit/25.1.0/LayoutKit.podspec", diff --git a/DivKit/DivBlockModelingContext.swift b/DivKit/DivBlockModelingContext.swift index 8a75ee92..278e4e79 100644 --- a/DivKit/DivBlockModelingContext.swift +++ b/DivKit/DivBlockModelingContext.swift @@ -19,8 +19,8 @@ public struct DivBlockModelingContext { public let blockStateStorage: DivBlockStateStorage let visibilityCounter: DivVisibilityCounting let lastVisibleBoundsCache: DivLastVisibleBoundsCache - public let imageHolderFactory: ImageHolderFactory - let highPriorityImageHolderFactory: ImageHolderFactory? + public let imageHolderFactory: DivImageHolderFactory + let highPriorityImageHolderFactory: DivImageHolderFactory? let divCustomBlockFactory: DivCustomBlockFactory let fontProvider: DivFontProvider let flagsInfo: DivFlagsInfo @@ -64,8 +64,8 @@ public struct DivBlockModelingContext { blockStateStorage: DivBlockStateStorage = DivBlockStateStorage(), visibilityCounter: DivVisibilityCounting? = nil, lastVisibleBoundsCache: DivLastVisibleBoundsCache? = nil, - imageHolderFactory: ImageHolderFactory, - highPriorityImageHolderFactory: ImageHolderFactory? = nil, + imageHolderFactory: DivImageHolderFactory, + highPriorityImageHolderFactory: DivImageHolderFactory? = nil, divCustomBlockFactory: DivCustomBlockFactory? = nil, fontProvider: DivFontProvider? = nil, flagsInfo: DivFlagsInfo = .default, diff --git a/DivKit/DivImageHolderFactory.swift b/DivKit/DivImageHolderFactory.swift new file mode 100644 index 00000000..9936e86f --- /dev/null +++ b/DivKit/DivImageHolderFactory.swift @@ -0,0 +1,79 @@ +import Foundation + +import BasePublic +import NetworkingPublic + +/// Loads images for `DivKit` views. +public protocol DivImageHolderFactory { + /// Provides `ImageHolder` for an image with given `URL`. + func make(_ url: URL?, _ placeholder: ImagePlaceholder?) -> ImageHolder +} + +extension DivImageHolderFactory { + public func make(_ url: URL?) -> ImageHolder { + make(url, nil) + } + + public func withCache(_ cachedImageHolders: [ImageHolder]) -> DivImageHolderFactory { + if cachedImageHolders.isEmpty { + return self + } + return CachedImageHolderFactory( + imageHolderFactory: self, + cachedImageHolders: cachedImageHolders + ) + } +} + +extension ImageHolderFactory: DivImageHolderFactory {} + +final class DefaultImageHolderFactory: DivImageHolderFactory { + private let requester: URLResourceRequesting + private let imageLoadingOptimizationEnabled: Bool + + private let imageProcessingQueue = OperationQueue( + name: "tech.divkit.image-processing", + qos: .userInitiated + ) + + init( + requestPerformer: URLRequestPerforming, + imageLoadingOptimizationEnabled: Bool + ) { + self.requester = NetworkURLResourceRequester(performer: requestPerformer) + self.imageLoadingOptimizationEnabled = imageLoadingOptimizationEnabled + } + + func make(_ url: URL?, _ placeholder: ImagePlaceholder?) -> ImageHolder { + guard let url = url else { + return placeholder?.toImageHolder() ?? NilImageHolder() + } + return RemoteImageHolder( + url: url, + placeholder: placeholder, + requester: requester, + imageProcessingQueue: imageProcessingQueue, + imageLoadingOptimizationEnabled: imageLoadingOptimizationEnabled + ) + } +} + +private final class CachedImageHolderFactory: DivImageHolderFactory { + private let imageHolderFactory: DivImageHolderFactory + private let cachedImageHolders: [ImageHolder] + + init( + imageHolderFactory: DivImageHolderFactory, + cachedImageHolders: [ImageHolder] + ) { + self.imageHolderFactory = imageHolderFactory + self.cachedImageHolders = cachedImageHolders + } + + func make(_ url: URL?, _ placeholder: ImagePlaceholder?) -> ImageHolder { + let cachedImageHolder = cachedImageHolders.first { + $0.reused(with: placeholder, remoteImageURL: url) != nil + } + return cachedImageHolder ?? imageHolderFactory.make(url, placeholder) + } +} diff --git a/DivKit/DivKitComponents.swift b/DivKit/DivKitComponents.swift index ed199811..1f433754 100644 --- a/DivKit/DivKitComponents.swift +++ b/DivKit/DivKitComponents.swift @@ -21,7 +21,7 @@ public final class DivKitComponents { public var extensionHandlers: [DivExtensionHandler] public let flagsInfo: DivFlagsInfo public let fontProvider: DivFontProvider - public let imageHolderFactory: ImageHolderFactory + public let imageHolderFactory: DivImageHolderFactory public let layoutDirection: UserInterfaceLayoutDirection public let patchProvider: DivPatchProvider public let playerFactory: PlayerFactory? @@ -94,7 +94,7 @@ public final class DivKitComponents { extensionHandlers: [DivExtensionHandler] = [], flagsInfo: DivFlagsInfo = .default, fontProvider: DivFontProvider? = nil, - imageHolderFactory: ImageHolderFactory? = nil, + imageHolderFactory: DivImageHolderFactory? = nil, layoutDirection: UserInterfaceLayoutDirection = .leftToRight, patchProvider: DivPatchProvider? = nil, requestPerformer: URLRequestPerforming? = nil, @@ -140,7 +140,7 @@ public final class DivKitComponents { let requestPerformer = requestPerformer ?? URLRequestPerformer(urlTransform: nil) self.imageHolderFactory = imageHolderFactory - ?? makeImageHolderFactory( + ?? DefaultImageHolderFactory( requestPerformer: requestPerformer, imageLoadingOptimizationEnabled: flagsInfo.imageLoadingOptimizationEnabled ) @@ -211,6 +211,7 @@ public final class DivKitComponents { patchProvider.cancelRequests() blockStateStorage.reset() + lastVisibleBoundsCache.reset() stateManagement.reset() variablesStorage.reset() visibilityCounter.reset() @@ -219,6 +220,7 @@ public final class DivKitComponents { public func reset(cardId: DivCardID) { blockStateStorage.reset(cardId: cardId) + lastVisibleBoundsCache.dropVisibleBounds(forMatchingPrefix: UIElementPath(cardId.rawValue)) stateManagement.reset(cardId: cardId) variablesStorage.reset(cardId: cardId) visibilityCounter.reset(cardId: cardId) @@ -285,8 +287,7 @@ public final class DivKitComponents { blockStateStorage: blockStateStorage, visibilityCounter: visibilityCounter, lastVisibleBoundsCache: lastVisibleBoundsCache, - imageHolderFactory: imageHolderFactory - .withInMemoryCache(cachedImageHolders: cachedImageHolders), + imageHolderFactory: imageHolderFactory.withCache(cachedImageHolders), divCustomBlockFactory: divCustomBlockFactory, fontProvider: fontProvider, flagsInfo: flagsInfo, @@ -335,22 +336,6 @@ public final class DivKitComponents { } } -func makeImageHolderFactory( - requestPerformer: URLRequestPerforming, - imageLoadingOptimizationEnabled: Bool = false -) -> ImageHolderFactory { - ImageHolderFactory( - requester: NetworkURLResourceRequester( - performer: requestPerformer - ), - imageProcessingQueue: OperationQueue( - name: "tech.divkit.image-processing", - qos: .userInitiated - ), - imageLoadingOptimizationEnabled: imageLoadingOptimizationEnabled - ) -} - #if os(iOS) let defaultPlayerFactory: PlayerFactory? = DefaultPlayerFactory() #else diff --git a/DivKit/DivKitInfo.swift b/DivKit/DivKitInfo.swift index b0feadd6..3361a355 100644 --- a/DivKit/DivKitInfo.swift +++ b/DivKit/DivKitInfo.swift @@ -1,3 +1,3 @@ public enum DivKitInfo { - public static let version = "28.7.0" + public static let version = "28.8.0" } diff --git a/DivKit/Extensions/DivBackgroundExtensions.swift b/DivKit/Extensions/DivBackgroundExtensions.swift index 68ea5c49..5dd4be07 100644 --- a/DivKit/Extensions/DivBackgroundExtensions.swift +++ b/DivKit/Extensions/DivBackgroundExtensions.swift @@ -8,7 +8,6 @@ import NetworkingPublic extension DivBackground { func makeBlockBackground( - with imageHolderFactory: ImageHolderFactory, context: DivBlockModelingContext ) -> LayoutKit.Background? { let expressionResolver = context.expressionResolver @@ -27,7 +26,7 @@ extension DivBackground { ).map { .gradient(.radial($0)) } case let .divImageBackground(imageBackground): let image = BackgroundImage( - imageHolder: imageHolderFactory.make( + imageHolder: context.imageHolderFactory.make( imageBackground.resolveImageUrl(expressionResolver) ), contentMode: imageBackground.contentMode(context: context), @@ -39,7 +38,7 @@ extension DivBackground { return solidBackground.resolveColor(expressionResolver).map { .solidColor($0) } case let .divNinePatchBackground(ninePatchBackground): let image = NinePatchImage( - imageHolder: imageHolderFactory.make( + imageHolder: context.imageHolderFactory.make( ninePatchBackground.resolveImageUrl(expressionResolver) ), insets: ninePatchBackground.insets.makeEdgeInsets(with: expressionResolver) diff --git a/DivKit/Extensions/DivBase/DivBaseExtensions.swift b/DivKit/Extensions/DivBase/DivBaseExtensions.swift index bf3586b4..65f2c937 100644 --- a/DivKit/Extensions/DivBase/DivBaseExtensions.swift +++ b/DivKit/Extensions/DivBase/DivBaseExtensions.swift @@ -66,7 +66,6 @@ extension DivBase { block = applyBackground( background, to: block, - imageHolderFactory: context.imageHolderFactory, context: context ) .addingDecorations( @@ -237,7 +236,6 @@ extension DivBase { private func applyBackground( _ backgrounds: [DivBackground]?, to block: Block, - imageHolderFactory: ImageHolderFactory, context: DivBlockModelingContext ) -> Block { guard let backgrounds = backgrounds else { @@ -246,10 +244,7 @@ extension DivBase { // optimization for the most common case: saves Array alloc/dealloc if backgrounds.count == 1 { - guard let background = backgrounds[0].makeBlockBackground( - with: imageHolderFactory, - context: context - ) else { + guard let background = backgrounds[0].makeBlockBackground(context: context) else { return block } if case let .solidColor(color) = background { @@ -259,10 +254,7 @@ extension DivBase { } let blockBackgrounds = backgrounds.compactMap { - $0.makeBlockBackground( - with: imageHolderFactory, - context: context - ) + $0.makeBlockBackground(context: context) } guard let background = blockBackgrounds.composite() else { return block diff --git a/DivKit/Extensions/DivImage/DivImageExtensions.swift b/DivKit/Extensions/DivImage/DivImageExtensions.swift index 4ce552df..ff23afbb 100644 --- a/DivKit/Extensions/DivImage/DivImageExtensions.swift +++ b/DivKit/Extensions/DivImage/DivImageExtensions.swift @@ -22,19 +22,18 @@ extension DivImage: DivBlockModeling, DivImageProtocol { let expressionResolver = context.expressionResolver let highPriority = resolveHighPriorityPreviewShow(expressionResolver) - let imageHolderFactory: ImageHolderFactory + let imageHolderFactory: DivImageHolderFactory if highPriority, let highPriorityImageHolderFactory = context.highPriorityImageHolderFactory { imageHolderFactory = highPriorityImageHolderFactory } else { imageHolderFactory = context.imageHolderFactory } - let imageHolder = imageHolderFactory.make( - resolveImageUrl(expressionResolver), - resolvePlaceholder(expressionResolver, highPriority: highPriority) - ) return ImageBlock( - imageHolder: imageHolder, + imageHolder: imageHolderFactory.make( + resolveImageUrl(expressionResolver), + resolvePlaceholder(expressionResolver, highPriority: highPriority) + ), widthTrait: makeContentWidthTrait(with: context), height: resolveHeight(context), contentMode: contentMode(context: context), diff --git a/DivKit/Extensions/DivTextExtensions.swift b/DivKit/Extensions/DivTextExtensions.swift index b5050f32..41c4a7a8 100644 --- a/DivKit/Extensions/DivTextExtensions.swift +++ b/DivKit/Extensions/DivTextExtensions.swift @@ -148,10 +148,7 @@ extension DivText: DivBlockModeling { let start = $0.resolveStart(context.expressionResolver) ?? 0 return start <= CFAttributedStringGetLength(text) } - .map { $0.makeImage( - withFactory: context.imageHolderFactory, - expressionResolver: context.expressionResolver - ) } + .map { $0.makeImage(context: context) } } private func apply( @@ -290,15 +287,15 @@ extension URLQueryItem { extension DivText.Image { fileprivate func makeImage( - withFactory factory: ImageHolderFactory, - expressionResolver: ExpressionResolver + context: DivBlockModelingContext ) -> TextBlock.InlineImage { - TextBlock.InlineImage( + let expressionResolver = context.expressionResolver + return TextBlock.InlineImage( size: CGSize( width: CGFloat(width.resolveValue(expressionResolver) ?? 0), height: CGFloat(height.resolveValue(expressionResolver) ?? 0) ), - holder: factory.make(resolveUrl(expressionResolver)), + holder: context.imageHolderFactory.make(resolveUrl(expressionResolver)), location: resolveStart(expressionResolver) ?? 0, tintColor: resolveTintColor(expressionResolver) ) diff --git a/DivKit/Variables/DivVariableStorage.swift b/DivKit/Variables/DivVariableStorage.swift index 29a353a1..77b11d1e 100644 --- a/DivKit/Variables/DivVariableStorage.swift +++ b/DivKit/Variables/DivVariableStorage.swift @@ -16,7 +16,8 @@ public final class DivVariableStorage { private var values = DivVariables() private let lock = RWLock() - var allValues: DivVariables { + /// Gets all available variables including variables from outer storage. + public var allValues: DivVariables { (outerStorage?.allValues ?? [:]) + values } @@ -150,6 +151,10 @@ public final class DivVariableStorage { } } + public func addObserver(_ action: @escaping (ChangeEvent) -> Void) -> Disposable { + changeEvents.addObserver(action) + } + private func notify(_ event: ChangeEvent) { onMainThread { [weak self] in self?.changeEventsPipe.send(event) diff --git a/DivKit/Variables/DivVariablesStorage.swift b/DivKit/Variables/DivVariablesStorage.swift index acdcd309..9efaf4b4 100644 --- a/DivKit/Variables/DivVariablesStorage.swift +++ b/DivKit/Variables/DivVariablesStorage.swift @@ -106,7 +106,7 @@ public final class DivVariablesStorage { public func append( variables newVariables: DivVariables, for cardId: DivCardID, - replaceExisting: Bool + replaceExisting: Bool = true ) { let oldVariables = lock.read { cardVariables[cardId] ?? [:] diff --git a/DivKitExtensions/ExtensionHandlers/CustomImagePreviewExtensionHandler.swift b/DivKitExtensions/ExtensionHandlers/CustomImagePreviewExtensionHandler.swift index 0ac4a4c5..b00e6316 100644 --- a/DivKitExtensions/ExtensionHandlers/CustomImagePreviewExtensionHandler.swift +++ b/DivKitExtensions/ExtensionHandlers/CustomImagePreviewExtensionHandler.swift @@ -25,10 +25,10 @@ public final class CustomImagePreviewExtensionHandler: DivExtensionHandler { return block } - let imageURL = div.resolveImageUrl(context.expressionResolver) ?? defaultImageURL - let placeholder: ImagePlaceholder = .view(viewFactory()) - - let imageHolder = context.imageHolderFactory.make(imageURL, placeholder) + let imageHolder = context.imageHolderFactory.make( + div.resolveImageUrl(context.expressionResolver) ?? defaultImageURL, + .view(viewFactory()) + ) return block.makeCopy(with: imageHolder) } } diff --git a/DivKitExtensions/Shimmer/ShimmerImagePreviewExtensions.swift b/DivKitExtensions/Shimmer/ShimmerImagePreviewExtensions.swift index cb4f4ad1..f7f3c897 100644 --- a/DivKitExtensions/Shimmer/ShimmerImagePreviewExtensions.swift +++ b/DivKitExtensions/Shimmer/ShimmerImagePreviewExtensions.swift @@ -26,11 +26,11 @@ public final class ShimmerImagePreviewExtension: DivExtensionHandler { } let expressionResolver = context.expressionResolver - let imageURL = div.resolveImageUrl(expressionResolver) - let view = viewFactory(div.getShimmerStyle(expressionResolver: expressionResolver) ?? .default) - let placeholder: ImagePlaceholder = .view(view) - - let imageHolder = context.imageHolderFactory.make(imageURL, placeholder) + let placeholderView = viewFactory(div.getShimmerStyle(expressionResolver: expressionResolver) ?? .default) + let imageHolder = context.imageHolderFactory.make( + div.resolveImageUrl(expressionResolver), + .view(placeholderView) + ) return block.makeCopy(with: imageHolder) } } diff --git a/LayoutKit/LayoutKit/UI/Blocks/DecoratingBlock+UIViewRenderableBlock.swift b/LayoutKit/LayoutKit/UI/Blocks/DecoratingBlock+UIViewRenderableBlock.swift index ddc31bea..558395b5 100644 --- a/LayoutKit/LayoutKit/UI/Blocks/DecoratingBlock+UIViewRenderableBlock.swift +++ b/LayoutKit/LayoutKit/UI/Blocks/DecoratingBlock+UIViewRenderableBlock.swift @@ -416,7 +416,7 @@ private final class DecoratingView: UIControl, BlockViewProtocol, VisibleBoundsT passVisibleBoundsChanged(from: from, to: to) if !model.visibilityActions.isEmpty { - visibilityActionPerformers?.onVisibleBoundsChanged(from: from, to: to, bounds: bounds) + visibilityActionPerformers?.onVisibleBoundsChanged(to: to, bounds: bounds) } } diff --git a/LayoutKit/LayoutKit/ViewModels/VisibilityActionPerformer/VisibilityActionPerformers.swift b/LayoutKit/LayoutKit/ViewModels/VisibilityActionPerformer/VisibilityActionPerformers.swift index 2492a6f8..1b1f827c 100644 --- a/LayoutKit/LayoutKit/ViewModels/VisibilityActionPerformer/VisibilityActionPerformers.swift +++ b/LayoutKit/LayoutKit/ViewModels/VisibilityActionPerformer/VisibilityActionPerformers.swift @@ -18,7 +18,7 @@ public final class VisibilityActionPerformers { } } - func onVisibleBoundsChanged(from _: CGRect, to: CGRect, bounds: CGRect) { + func onVisibleBoundsChanged(to: CGRect, bounds: CGRect) { let beforeVisibleBounds = lastVisibleBounds.value lastVisibleBounds.value = to diff --git a/Specs/DivKit/28.8.0/DivKit.podspec b/Specs/DivKit/28.8.0/DivKit.podspec new file mode 100644 index 00000000..3985fe39 --- /dev/null +++ b/Specs/DivKit/28.8.0/DivKit.podspec @@ -0,0 +1,25 @@ +Pod::Spec.new do |s| + s.name = 'DivKit' + s.version = '28.8.0' + s.summary = 'DivKit framework' + s.description = 'DivKit is a backend-driven UI framework' + s.homepage = 'https://divkit.tech' + + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'divkit' => 'divkit@yandex-team.ru' } + s.source = { :git => 'https://github.com/divkit/divkit-ios.git', :tag => s.version.to_s } + + s.swift_version = '5.7' + s.requires_arc = true + s.prefix_header_file = false + s.platforms = { :ios => '11.0' } + + s.dependency 'DivKit_LayoutKit', s.version.to_s + s.dependency 'DivKit_Serialization', s.version.to_s + s.dependency 'VGSLCommonCore', '~> 2.3' + s.dependency 'VGSLNetworking', '~> 2.3' + + s.source_files = [ + 'DivKit/**/*' + ] +end diff --git a/Specs/DivKitExtensions/28.8.0/DivKitExtensions.podspec b/Specs/DivKitExtensions/28.8.0/DivKitExtensions.podspec new file mode 100644 index 00000000..4fe9b183 --- /dev/null +++ b/Specs/DivKitExtensions/28.8.0/DivKitExtensions.podspec @@ -0,0 +1,22 @@ +Pod::Spec.new do |s| + s.name = 'DivKitExtensions' + s.version = '28.8.0' + s.summary = 'DivKit framework extensions' + s.description = 'Part of DivKit framework' + s.homepage = 'https://divkit.tech' + + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'divkit' => 'divkit@yandex-team.ru' } + s.source = { :git => 'https://github.com/divkit/divkit-ios.git', :tag => s.version.to_s } + + s.swift_version = '5.7' + s.requires_arc = true + s.prefix_header_file = false + s.platforms = { :ios => '11.0' } + + s.dependency 'DivKit', s.version.to_s + + s.source_files = [ + 'DivKitExtensions/**/*' + ] +end diff --git a/Specs/DivKit_LayoutKit/28.8.0/DivKit_LayoutKit.podspec b/Specs/DivKit_LayoutKit/28.8.0/DivKit_LayoutKit.podspec new file mode 100644 index 00000000..c11d4b74 --- /dev/null +++ b/Specs/DivKit_LayoutKit/28.8.0/DivKit_LayoutKit.podspec @@ -0,0 +1,24 @@ +Pod::Spec.new do |s| + s.name = 'DivKit_LayoutKit' + s.module_name = 'LayoutKit' + s.version = '28.8.0' + s.summary = 'Part of DivKit framework' + s.description = 'Part of DivKit framework' + s.homepage = 'https://divkit.tech' + + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'divkit' => 'divkit@yandex-team.ru' } + s.source = { :git => 'https://github.com/divkit/divkit-ios.git', :tag => s.version.to_s } + + s.swift_version = '5.7' + s.requires_arc = true + s.prefix_header_file = false + s.platforms = { :ios => '11.0' } + + s.dependency 'DivKit_LayoutKitInterface', s.version.to_s + s.dependency 'VGSLCommonCore', '~> 2.3' + + s.source_files = [ + 'LayoutKit/LayoutKit/**/*' + ] +end diff --git a/Specs/DivKit_LayoutKitInterface/28.8.0/DivKit_LayoutKitInterface.podspec b/Specs/DivKit_LayoutKitInterface/28.8.0/DivKit_LayoutKitInterface.podspec new file mode 100644 index 00000000..0ab19a3a --- /dev/null +++ b/Specs/DivKit_LayoutKitInterface/28.8.0/DivKit_LayoutKitInterface.podspec @@ -0,0 +1,25 @@ +Pod::Spec.new do |s| + s.name = 'DivKit_LayoutKitInterface' + s.module_name = 'LayoutKitInterface' + s.version = '28.8.0' + s.summary = 'Part of DivKit framework' + s.description = 'Part of DivKit framework' + s.homepage = 'https://divkit.tech' + + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'divkit' => 'divkit@yandex-team.ru' } + s.source = { :git => 'https://github.com/divkit/divkit-ios.git', :tag => s.version.to_s } + + s.swift_version = '5.7' + s.requires_arc = true + s.prefix_header_file = false + s.platforms = { :ios => '11.0' } + + s.dependency 'VGSLBase', '~> 2.3' + s.dependency 'VGSLBaseTiny', '~> 2.3' + s.dependency 'VGSLBaseUI', '~> 2.3' + + s.source_files = [ + 'LayoutKit/Interface/**/*' + ] +end diff --git a/Specs/DivKit_Serialization/28.8.0/DivKit_Serialization.podspec b/Specs/DivKit_Serialization/28.8.0/DivKit_Serialization.podspec new file mode 100644 index 00000000..3fb36eef --- /dev/null +++ b/Specs/DivKit_Serialization/28.8.0/DivKit_Serialization.podspec @@ -0,0 +1,24 @@ +Pod::Spec.new do |s| + s.name = 'DivKit_Serialization' + s.module_name = 'Serialization' + s.version = '28.8.0' + s.summary = 'Serialization' + s.summary = 'Part of DivKit framework' + s.description = 'Part of DivKit framework' + s.homepage = 'https://divkit.tech' + + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'divkit' => 'divkit@yandex-team.ru' } + s.source = { :git => 'https://github.com/divkit/divkit-ios.git', :tag => s.version.to_s } + + s.swift_version = '5.7' + s.requires_arc = true + s.prefix_header_file = false + s.platforms = { :ios => '11.0' } + + s.dependency 'VGSLCommonCore', '~> 2.3' + + s.source_files = [ + 'Serialization/**/*' + ] +end