Files
divkit/client/ios/DivKit/Extensions/DivTooltipExtensions.swift
T
pkurchatov 6d4e785be4 Applied Swift 5.9 format
7efc9a489061fda48036f567437a3d692591ff4a
2024-02-27 10:59:51 +03:00

91 lines
2.3 KiB
Swift

import BasePublic
import CommonCorePublic
import Foundation
import LayoutKit
#if os(iOS)
public typealias DivTooltipViewFactory = (Div) -> VisibleBoundsTrackingView
#else
public typealias DivTooltipViewFactory = (Div) -> ViewType
#endif
extension DivTooltip {
fileprivate func makeTooltip(
context: DivBlockModelingContext
) throws -> BlockTooltip? {
let expressionResolver = context.expressionResolver
guard let position = resolvePosition(expressionResolver)?.cast() else {
return nil
}
let block = try div.value.makeBlock(context: context)
let tooltipViewFactory: TooltipViewFactory =
Variable { [tooltipViewFactory = context.tooltipViewFactory, div = self.div] in
guard let tooltipViewFactory else { return nil }
return tooltipViewFactory(div)
}
return BlockTooltip(
id: id,
block: block,
duration: Duration(milliseconds: resolveDuration(expressionResolver)),
offset: offset?.resolve(expressionResolver) ?? .zero,
position: position,
tooltipViewFactory: tooltipViewFactory
)
}
}
extension DivTooltip.Position {
fileprivate func cast() -> BlockTooltip.Position {
switch self {
case .left: .left
case .topLeft: .topLeft
case .top: .top
case .topRight: .topRight
case .right: .right
case .bottomRight: .bottomRight
case .bottom: .bottom
case .bottomLeft: .bottomLeft
case .center: .center
}
}
}
extension [DivTooltip]? {
func makeTooltips(
context: DivBlockModelingContext
) throws -> [BlockTooltip] {
try self?.iterativeFlatMap { div, index in
let tooltipContext = context.modifying(
parentPath: context.parentPath + "tooltip" + index
)
return try div.makeTooltip(context: tooltipContext)
} ?? []
}
}
public func makeTooltipViewFactory(
divKitComponents: DivKitComponents,
cardId: DivCardID
) -> DivTooltipViewFactory? {
#if os(iOS)
return { (div: Div) in
let view = DivView(divKitComponents: divKitComponents)
let divData = DivData(
logId: cardId.rawValue,
states: [.init(div: div, stateId: 0)],
timers: nil,
transitionAnimationSelector: nil,
variableTriggers: nil,
variables: nil
)
view.setSource(.init(kind: .divData(divData), cardId: cardId))
return view
}
#else
return nil
#endif
}