Session Cache Implementation
Nucleic-Session: B2346642-3353-4BD5-9DE2-A8B77BD66C98 Co-authored-by: Nucleic <[email protected]>
This commit is contained in:
@@ -222,8 +222,40 @@ struct SessionDetailView: View {
|
|||||||
/// The floating action layer: one Liquid Glass bar carrying the queued pills, the working
|
/// The floating action layer: one Liquid Glass bar carrying the queued pills, the working
|
||||||
/// indicator, the session controls, and the composer — or the approval card when a gate is
|
/// indicator, the session controls, and the composer — or the approval card when a gate is
|
||||||
/// pending. Content scrolls beneath it; nothing renders when there's nothing to act on.
|
/// pending. Content scrolls beneath it; nothing renders when there's nothing to act on.
|
||||||
@ViewBuilder
|
|
||||||
private var actionArea: some View {
|
private var actionArea: some View {
|
||||||
|
VStack(spacing: 8) {
|
||||||
|
// Interacting with a chat while the owning Mac is unreachable surfaces this first, so a
|
||||||
|
// disabled composer reads as "offline / read-only history" rather than broken.
|
||||||
|
if !store.connectivity.isLive { disconnectedBanner }
|
||||||
|
actionContent
|
||||||
|
}
|
||||||
|
.padding(.horizontal, 12)
|
||||||
|
.padding(.bottom, 8)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The offline notice over the transcript: the chat's history is cached and readable, but the
|
||||||
|
/// composer + controls below stay disabled until the Mac that owns it is reachable again.
|
||||||
|
private var disconnectedBanner: some View {
|
||||||
|
HStack(spacing: 10) {
|
||||||
|
Image(systemName: "wifi.slash").foregroundStyle(.secondary)
|
||||||
|
VStack(alignment: .leading, spacing: 1) {
|
||||||
|
Text("Disconnected").font(.footnote.weight(.semibold))
|
||||||
|
Text("Showing saved history · reconnect to send")
|
||||||
|
.font(.caption2).foregroundStyle(.secondary)
|
||||||
|
}
|
||||||
|
Spacer(minLength: 8)
|
||||||
|
Button("Reconnect") { store.reconnect() }
|
||||||
|
.font(.caption.weight(.semibold))
|
||||||
|
.buttonStyle(.borderless)
|
||||||
|
.disabled(!store.isPaired)
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
|
.padding(.horizontal, 14).padding(.vertical, 10)
|
||||||
|
.glassSurface(cornerRadius: 20)
|
||||||
|
}
|
||||||
|
|
||||||
|
@ViewBuilder
|
||||||
|
private var actionContent: some View {
|
||||||
Group {
|
Group {
|
||||||
if let approval = store.openApprovals.first {
|
if let approval = store.openApprovals.first {
|
||||||
// AskUserQuestion isn't a permission gate — it collects the user's answers and
|
// AskUserQuestion isn't a permission gate — it collects the user's answers and
|
||||||
|
|||||||
Reference in New Issue
Block a user