mirror of
https://github.com/moltbot/moltbot.git
synced 2026-03-08 06:54:24 +00:00
65 lines
2.1 KiB
Swift
65 lines
2.1 KiB
Swift
import SwiftUI
|
|
|
|
struct WatchInboxView: View {
|
|
@Bindable var store: WatchInboxStore
|
|
var onAction: ((WatchPromptAction) -> Void)?
|
|
|
|
private func role(for action: WatchPromptAction) -> ButtonRole? {
|
|
switch action.style?.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() {
|
|
case "destructive":
|
|
return .destructive
|
|
case "cancel":
|
|
return .cancel
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
|
|
var body: some View {
|
|
ScrollView {
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
Text(store.title)
|
|
.font(.headline)
|
|
.lineLimit(2)
|
|
|
|
Text(store.body)
|
|
.font(.body)
|
|
.fixedSize(horizontal: false, vertical: true)
|
|
|
|
if let details = store.details, !details.isEmpty {
|
|
Text(details)
|
|
.font(.footnote)
|
|
.foregroundStyle(.secondary)
|
|
.fixedSize(horizontal: false, vertical: true)
|
|
}
|
|
|
|
if !store.actions.isEmpty {
|
|
ForEach(store.actions) { action in
|
|
Button(role: self.role(for: action)) {
|
|
self.onAction?(action)
|
|
} label: {
|
|
Text(action.label)
|
|
.frame(maxWidth: .infinity)
|
|
}
|
|
.disabled(store.isReplySending)
|
|
}
|
|
}
|
|
|
|
if let replyStatusText = store.replyStatusText, !replyStatusText.isEmpty {
|
|
Text(replyStatusText)
|
|
.font(.footnote)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
|
|
if let updatedAt = store.updatedAt {
|
|
Text("Updated \(updatedAt.formatted(date: .omitted, time: .shortened))")
|
|
.font(.footnote)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
.padding()
|
|
}
|
|
}
|
|
}
|