EngineRegistry caches one Engine per working-project URL. MainWindowView.init does a pure lookup, so SwiftUI's view-tree re-evaluations cannot open extra ProjectStores that race the live one's BEGIN IMMEDIATE and crash via try!. UI-state persistence (collapse flag, sidebar selection, session detail section, etc.) lives on Engine for GTK to adopt. SQLite has a 5s busy timeout. Engine open failures surface as an error view. TargetPicker is host @State injected via environment. Global instrument-UI defaults register at app startup; per-engine instrument and local-notifier hookups live in Engine extensions.
59 lines
1.7 KiB
Swift
59 lines
1.7 KiB
Swift
import SwiftUI
|
|
import LumaCore
|
|
|
|
struct CodeShareUI: InstrumentUI {
|
|
func makeConfigEditor(
|
|
configJSON: Binding<Data>,
|
|
engine: Engine,
|
|
selection: Binding<SidebarItemID?>
|
|
) -> AnyView {
|
|
let cfgBinding = Binding<CodeShareConfig>(
|
|
get: {
|
|
(try? JSONDecoder().decode(CodeShareConfig.self, from: configJSON.wrappedValue))
|
|
?? CodeShareConfig(
|
|
name: "",
|
|
description: "",
|
|
source: "",
|
|
exports: [],
|
|
project: nil,
|
|
lastSyncedHash: nil,
|
|
lastReviewedHash: nil,
|
|
fridaVersion: "",
|
|
allowRemoteUpdates: false
|
|
)
|
|
},
|
|
set: { newValue in
|
|
if let data = try? JSONEncoder().encode(newValue) {
|
|
configJSON.wrappedValue = data
|
|
}
|
|
}
|
|
)
|
|
|
|
return AnyView(
|
|
CodeShareConfigView(
|
|
config: cfgBinding,
|
|
engine: engine
|
|
)
|
|
)
|
|
}
|
|
|
|
func renderEvent(
|
|
_ event: RuntimeEvent,
|
|
engine: Engine,
|
|
selection: Binding<SidebarItemID?>
|
|
) -> AnyView {
|
|
if case .jsValue(let v) = event.payload {
|
|
return AnyView(
|
|
JSInspectValueView(
|
|
value: v,
|
|
sessionID: event.sessionID ?? UUID(),
|
|
engine: engine,
|
|
selection: selection
|
|
)
|
|
.font(.system(.footnote, design: .monospaced))
|
|
)
|
|
}
|
|
return AnyView(Text(String(describing: event.payload)))
|
|
}
|
|
}
|