Files
divkit/client/ios/DivKitPlayground/WebPreview/UI/WebPreviewView.swift
T
2023-02-09 16:02:08 +03:00

78 lines
1.9 KiB
Swift

import DivKit
import SwiftUI
struct WebPreviewView: View {
@Environment(\.presentationMode)
var presentationMode: Binding<PresentationMode>
let url: URL
private let model = WebPreviewModel()
var body: some View {
ViewWithHeader(
"Web Preview",
background: ThemeColor.divKit,
presentationMode: presentationMode
) {
WebPreviewViewRepresentable(
blockProvider: model.blockProvider,
divKitComponents: model.divKitComponents,
onScreenshotTaken: model.sendScreenshot(_:)
)
.onAppear { [model, url] in
model.connect(httpUrl: url)
}
.onDisappear { [model] in
model.endConnection()
}
}
}
}
private struct WebPreviewModel {
private let socket = WebPreviewSocket()
private(set) var divKitComponents: DivKitComponents!
private(set) var blockProvider: DivBlockProvider!
private(set) var payloadFactory: UIStatePayloadFactory!
private var renderingTime: UIStatePayload.RenderingTime {
blockProvider.renderingTime
}
init() {
weak var weakBlockProvider: DivBlockProvider?
divKitComponents = AppComponents.makeDivKitComponents(
updateCardAction: { reasons in
weakBlockProvider?.update(reasons: reasons.asArray())
}
)
blockProvider = DivBlockProvider(
json: socket.response,
divKitComponents: divKitComponents,
shouldResetOnDataChange: false
)
weakBlockProvider = blockProvider
payloadFactory = UIStatePayloadFactory(
deviceInfo: DeviceInfo(),
errors: blockProvider.$errors
)
}
func connect(httpUrl: URL) {
socket.connect(httpUrl: httpUrl)
}
func endConnection() {
socket.endConnection()
}
func sendScreenshot(_ screenshotInfo: ScreenshotInfo) {
socket.send(
state: payloadFactory.makePayload(
screenshotInfo: screenshotInfo,
renderingTime: renderingTime
)
)
}
}