Files
babaevmm 956c055cd8 update swiftformat, add organize rule
commit_hash:0f7ba811b37db6d2a9fc05efe5f94502feda4856
2025-08-04 16:24:48 +03:00

90 lines
2.1 KiB
Swift

import Combine
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(
jsonPublisher: model.responsePublsiher,
divKitComponents: model.divKitComponents,
debugParams: model.debugParams,
onScreenshotTaken: model.sendScreenshot(_:)
)
.onAppear { [model, url] in
model.connect(httpUrl: url)
}
.onDisappear { [model] in
model.disconnect()
}
}
}
}
private final class WebPreviewModel {
let divKitComponents: DivKitComponents
private(set) var debugParams: DebugParams!
private let socket = WebPreviewSocket()
private let payloadFactory: UIStatePayloadFactory
private var renderingTime: UIStatePayload.RenderingTime?
private var cancellables = Set<AnyCancellable>()
var responsePublsiher: JsonPublisher {
socket.responsePublisher
}
init() {
let payloadFactory = UIStatePayloadFactory(
deviceInfo: DeviceInfo()
)
self.payloadFactory = payloadFactory
divKitComponents = AppComponents.makeDivKitComponents(
reporter: PlaygroundReporter {
payloadFactory.addError($0)
}
)
socket.responsePublisher
.sink { _ in payloadFactory.resetErrors() }
.store(in: &cancellables)
debugParams = DebugParams(
isDebugInfoEnabled: true,
processMeasurements: { [weak self] _, measurement in
self?.renderingTime = measurement.renderingTime
}
)
}
func connect(httpUrl: URL) {
socket.connect(httpUrl: httpUrl)
}
func disconnect() {
socket.disconnect()
}
func sendScreenshot(_ screenshotInfo: ScreenshotInfo) {
guard let renderingTime else { return }
socket.send(
state: payloadFactory.makePayload(
screenshotInfo: screenshotInfo,
renderingTime: renderingTime
)
)
}
}