Fixed size change notifications in DivView

This commit is contained in:
pkurchatov
2024-01-22 13:44:01 +03:00
parent cbee11d3a2
commit 26e9d201c3
2 changed files with 27 additions and 11 deletions
+27 -10
View File
@@ -18,10 +18,12 @@ final class DivBlockProvider {
}
private(set) var cardId: DivCardID!
private(set) var cardSize: DivViewSize? {
didSet {
guard let cardSize else { return }
onCardSizeChanged(cardId, cardSize)
if let cardSize, let cardId {
onCardSizeChanged(cardId, cardSize)
}
}
}
@@ -35,7 +37,12 @@ final class DivBlockProvider {
)
@ObservableProperty
private(set) var block: Block = noDataBlock
private(set) var block: Block = noDataBlock {
didSet {
cardSize = DivViewSize(block: block)
}
}
weak var parentScrollView: ScrollView? {
didSet {
guard oldValue !== parentScrollView else { return }
@@ -112,7 +119,7 @@ final class DivBlockProvider {
private func update(reasons: [DivActionURLHandler.UpdateReason]) {
guard var divData else {
guard debugParams.isDebugInfoEnabled else { return }
block = makeErrorsBlock(dataErrors.map(\.prettyMessage))
block = makeErrorsBlock(dataErrors)
return
}
@@ -147,7 +154,6 @@ final class DivBlockProvider {
)
block = handleError(error: error, context: context)
}
cardSize = DivViewSize(block: block)
}
private func needUpdateBlock(reasons: [DivActionURLHandler.UpdateReason]) -> Bool {
@@ -214,15 +220,15 @@ final class DivBlockProvider {
}
if debugParams.isDebugInfoEnabled {
return makeErrorsBlock(errors.map(\.prettyMessage))
return makeErrorsBlock(errors)
} else {
return noDataBlock
}
}
private func makeErrorsBlock(_ errors: [String]) -> Block {
guard !errors.isEmpty else {
return EmptyBlock.zeroSized
private func makeErrorsBlock(_ errors: [DivError]) -> Block {
guard !errors.isEmpty, !errors.isNoDataError else {
return noDataBlock
}
let headerTypo = Typo(size: 18, weight: .bold)
let errorsHeader = TextBlock(
@@ -234,7 +240,7 @@ final class DivBlockProvider {
let errorBlocks = errors.map {
TextBlock(
widthTrait: .resizable,
text: $0.with(typo: errorBlockTypo)
text: $0.prettyMessage.with(typo: errorBlockTypo)
)
}
return try! GalleryBlock(
@@ -261,3 +267,14 @@ extension DivActionURLHandler.UpdateReason {
}
}
}
extension [DivError] {
fileprivate var isNoDataError: Bool {
if count == 1,
let deserializationError = first as? DeserializationError,
case .noData = deserializationError {
return true
}
return false
}
}
@@ -26,7 +26,6 @@ final class VisibilityTrackingScrollView: UIScrollView {
let divViewFrame = CGRect(origin: .zero, size: divViewSize)
divView?.frame = divViewFrame
divView?.layoutIfNeeded()
divView?.onVisibleBoundsChanged(to: bounds.intersection(divViewFrame))
contentSize = divViewSize
}