Skip to content

Commit cdf72d2

Browse files
committed
chore(SwiftUIRootView): split props away
1 parent 19292ad commit cdf72d2

File tree

2 files changed

+76
-77
lines changed

2 files changed

+76
-77
lines changed

ios/SwiftUIRootProps.swift

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import SwiftUI
2+
3+
final class SwiftUIRootProps: ObservableObject {
4+
@Published private(set) var viewTree: (any SwiftUINode)?
5+
@Published var pickerSelections: [String: String] = [:]
6+
@Published var dateSelections: [String: Date] = [:]
7+
@Published var textFieldValues: [String: String] = [:]
8+
public var onEvent: ((String, String, String, String?) -> Void)?
9+
10+
func update(with newDictionary: [String: Any]) {
11+
if let jsonString = newDictionary["viewTree"] as? String {
12+
do {
13+
viewTree = try decodeSwiftUINode(from: jsonString)
14+
bindEventHandlers(from: viewTree)
15+
} catch {
16+
print("Failed to decode view tree: \(error)")
17+
viewTree = nil
18+
}
19+
}
20+
}
21+
22+
private func bindEventHandlers(from node: (any SwiftUINode)?) {
23+
guard let node = node else { return }
24+
if let picker = node as? GenericNode<PickerProps> {
25+
picker.props.onChange = { [weak self] value in
26+
self?.onEvent?("change", "Picker", picker.id, value)
27+
}
28+
} else if let stepper = node as? GenericNode<StepperProps> {
29+
stepper.props.onChange = { [weak self] value in
30+
self?.onEvent?("change", "Stepper", stepper.id, value)
31+
}
32+
} else if let datePicker = node as? GenericNode<DatePickerProps> {
33+
datePicker.props.onChange = { [weak self] rawValue in
34+
let value = ISO8601DateFormatter().string(from: rawValue)
35+
self?.onEvent?("change", "DatePicker", datePicker.id, value)
36+
}
37+
} else if let textField = node as? GenericNode<TextFieldProps> {
38+
textField.props.onChange = { [weak self] value in
39+
self?.onEvent?("change", "TextField", textField.id, value)
40+
}
41+
textField.props.onFocus = { [weak self] in
42+
self?.onEvent?("focus", "TextField", textField.id, nil)
43+
}
44+
textField.props.onBlur = { [weak self] in
45+
self?.onEvent?("blur", "TextField", textField.id, nil)
46+
}
47+
} else if let button = node as? GenericNode<ButtonProps> {
48+
button.props.onPress = { [weak self] in
49+
self?.onEvent?("press", "Button", button.id, nil)
50+
}
51+
} else if let toggle = node as? GenericNode<ToggleProps> {
52+
toggle.props.onChange = { [weak self] value in
53+
self?.onEvent?("change", "Toggle", toggle.id, String(value))
54+
}
55+
} else if let slider = node as? GenericNode<SliderProps> {
56+
slider.props.onChange = { [weak self] value in
57+
self?.onEvent?("change", "Slider", slider.id, String(value))
58+
}
59+
slider.props.onFocus = { [weak self] in
60+
self?.onEvent?("focus", "Slider", slider.id, nil)
61+
}
62+
slider.props.onBlur = { [weak self] in
63+
self?.onEvent?("blur", "Slider", slider.id, nil)
64+
}
65+
} else if let sheet = node as? GenericNode<SheetProps> {
66+
sheet.props.onDismiss = { [weak self] in
67+
self?.onEvent?("dismiss", "Sheet", sheet.id, nil)
68+
}
69+
}
70+
if let children = node.children {
71+
children.forEach { bindEventHandlers(from: $0) }
72+
}
73+
}
74+
}

ios/SwiftUIRootView.swift

Lines changed: 2 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,14 @@
1-
// ios/SwiftUIRootView.swift
21
import Combine
32
import SwiftUI
4-
import UIKit
5-
6-
final class ContainerProps: ObservableObject {
7-
@Published private(set) var viewTree: (any SwiftUINode)?
8-
@Published var pickerSelections: [String: String] = [:]
9-
@Published var dateSelections: [String: Date] = [:]
10-
@Published var textFieldValues: [String: String] = [:]
11-
public var onEvent: ((String, String, String, String?) -> Void)?
12-
13-
func update(with newDictionary: [String: Any]) {
14-
if let jsonString = newDictionary["viewTree"] as? String {
15-
do {
16-
viewTree = try decodeSwiftUINode(from: jsonString)
17-
bindEventHandlers(from: viewTree)
18-
} catch {
19-
print("Failed to decode view tree: \(error)")
20-
viewTree = nil
21-
}
22-
}
23-
}
24-
25-
private func bindEventHandlers(from node: (any SwiftUINode)?) {
26-
guard let node = node else { return }
27-
if let picker = node as? GenericNode<PickerProps> {
28-
picker.props.onChange = { [weak self] value in
29-
self?.onEvent?("change", "Picker", picker.id, value)
30-
}
31-
} else if let stepper = node as? GenericNode<StepperProps> {
32-
stepper.props.onChange = { [weak self] value in
33-
self?.onEvent?("change", "Stepper", stepper.id, value)
34-
}
35-
} else if let datePicker = node as? GenericNode<DatePickerProps> {
36-
datePicker.props.onChange = { [weak self] rawValue in
37-
let value = ISO8601DateFormatter().string(from: rawValue)
38-
self?.onEvent?("change", "DatePicker", datePicker.id, value)
39-
}
40-
} else if let textField = node as? GenericNode<TextFieldProps> {
41-
textField.props.onChange = { [weak self] value in
42-
self?.onEvent?("change", "TextField", textField.id, value)
43-
}
44-
textField.props.onFocus = { [weak self] in
45-
self?.onEvent?("focus", "TextField", textField.id, nil)
46-
}
47-
textField.props.onBlur = { [weak self] in
48-
self?.onEvent?("blur", "TextField", textField.id, nil)
49-
}
50-
} else if let button = node as? GenericNode<ButtonProps> {
51-
button.props.onPress = { [weak self] in
52-
self?.onEvent?("press", "Button", button.id, nil)
53-
}
54-
} else if let toggle = node as? GenericNode<ToggleProps> {
55-
toggle.props.onChange = { [weak self] value in
56-
self?.onEvent?("change", "Toggle", toggle.id, String(value))
57-
}
58-
} else if let slider = node as? GenericNode<SliderProps> {
59-
slider.props.onChange = { [weak self] value in
60-
self?.onEvent?("change", "Slider", slider.id, String(value))
61-
}
62-
slider.props.onFocus = { [weak self] in
63-
self?.onEvent?("focus", "Slider", slider.id, nil)
64-
}
65-
slider.props.onBlur = { [weak self] in
66-
self?.onEvent?("blur", "Slider", slider.id, nil)
67-
}
68-
} else if let sheet = node as? GenericNode<SheetProps> {
69-
sheet.props.onDismiss = { [weak self] in
70-
self?.onEvent?("dismiss", "Sheet", sheet.id, nil)
71-
}
72-
}
73-
if let children = node.children {
74-
children.forEach { bindEventHandlers(from: $0) }
75-
}
76-
}
77-
}
783

794
@objc(SwiftUIRootView)
805
public class SwiftUIRootView: SwiftUIContainerView {
81-
@ObservedObject private var props: ContainerProps
6+
@ObservedObject private var props: SwiftUIRootProps
827
private var cancellables: Set<AnyCancellable> = []
838
@objc public var onEvent: ((NSString, NSString, NSString, NSString?) -> Void)?
849

8510
@objc public init(frame _: CGRect) {
86-
props = ContainerProps()
11+
props = SwiftUIRootProps()
8712
super.init(rootView: AnyView(EmptyView()))
8813

8914
props.onEvent = { [weak self] name, type, id, value in

0 commit comments

Comments
 (0)