Adopt new timeline item debug info and overhaul the timeline item deb… (#781)

* Adopt new timeline item debug info and overhaul the timeline item debug menu
This commit is contained in:
Stefan Ceriu
2023-04-19 18:07:51 +03:00
committed by GitHub
parent df2784114a
commit 59a4e0ac7c
7 changed files with 117 additions and 46 deletions
@@ -97,7 +97,7 @@ struct RoomScreenViewStateBindings {
/// Information describing the currently displayed alert.
var alertInfo: AlertInfo<RoomScreenErrorType>?
var debugInfo: TimelineItemDebugView.DebugInfo?
var debugInfo: TimelineItemDebugInfo?
}
enum RoomScreenErrorType: Hashable {
@@ -319,9 +319,9 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
state.bindings.composerFocused = true
state.composerMode = .reply(id: item.id, displayName: item.sender.displayName ?? item.sender.id)
case .viewSource:
let debugDescription = timelineController.debugDescription(for: item.id)
MXLog.info(debugDescription)
state.bindings.debugInfo = .init(title: "Timeline item", content: debugDescription)
let debugInfo = timelineController.debugInfo(for: item.id)
MXLog.info(debugInfo)
state.bindings.debugInfo = debugInfo
case .retryDecryption(let sessionID):
Task {
await timelineController.retryDecryption(for: sessionID)
@@ -17,41 +17,84 @@
import SwiftUI
struct TimelineItemDebugView: View {
struct DebugInfo: Identifiable {
let id = UUID()
let title: String
var content: String
}
@Environment(\.dismiss) private var dismiss
let info: DebugInfo
let info: TimelineItemDebugInfo
var body: some View {
NavigationStack {
ScrollView {
Text(info.content)
.padding()
.font(.element.footnote)
.foregroundColor(.element.primaryContent)
.frame(maxWidth: .infinity, alignment: .leading)
VStack {
TimelineItemInfoDisclosureGroup(title: "Model", text: info.model, isInitiallyExpanded: true)
if let originalJSONInfo = info.originalJSON {
TimelineItemInfoDisclosureGroup(title: "Original JSON", text: originalJSONInfo)
}
if let latestEditJSONInfo = info.latestEditJSON {
TimelineItemInfoDisclosureGroup(title: "Latest edit JSON", text: latestEditJSONInfo)
}
}
}
.navigationBarTitleDisplayMode(.inline)
.navigationTitle(info.title)
.navigationTitle("Timeline item")
.toolbarBackground(.visible, for: .navigationBar)
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button(L10n.actionCancel) {
dismiss()
}
}
ToolbarItem(placement: .secondaryAction) {
ToolbarItem(placement: .primaryAction) {
Button(L10n.actionCopy) {
UIPasteboard.general.string = info.content
UIPasteboard.general.string = info.description
}
}
}
}
}
// MARK: - Private
private struct TimelineItemInfoDisclosureGroup: View {
@State private var isExpanded: Bool
let title: String
let text: String
init(title: String, text: String, isInitiallyExpanded: Bool = false) {
self.title = title
self.text = text
isExpanded = isInitiallyExpanded
}
var body: some View {
VStack(spacing: 0.0) {
DisclosureGroup(title, isExpanded: $isExpanded) {
disclosureGroupContent
}
.font(.element.subheadline)
.padding()
Divider()
}
}
@ViewBuilder
var disclosureGroupContent: some View {
VStack(alignment: .leading) {
Spacer()
Divider()
Text(text)
.font(.element.caption1.monospaced())
.foregroundColor(.element.primaryContent)
}
.frame(maxWidth: .infinity)
}
}
}
struct TimelineItemDebugView_Previews: PreviewProvider {
@@ -71,6 +114,8 @@ struct TimelineItemDebugView_Previews: PreviewProvider {
"""
static var previews: some View {
TimelineItemDebugView(info: .init(title: "Timeline item", content: smallContent))
TimelineItemDebugView(info: .init(model: smallContent,
originalJSON: "{\"Hi\": \"Alice\"}",
latestEditJSON: "{\"Hi\": \"Bob\"}"))
}
}