Skip to content

Commit 7b7f9f5

Browse files
committed
Extract ChatScrollView
1 parent 438f29a commit 7b7f9f5

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import SwiftUI
2+
3+
struct ChatScrollView<Content: View>: View {
4+
typealias MessageBuilder = (ReceivedMessage) -> Content
5+
6+
@EnvironmentObject private var session: AgentSession
7+
let messageBuilder: MessageBuilder
8+
9+
var body: some View {
10+
ScrollViewReader { scrollView in
11+
ScrollView {
12+
LazyVStack {
13+
ForEach(session.messages.values.reversed(), content: { message in
14+
messageBuilder(message)
15+
.upsideDown()
16+
.id(message.id)
17+
})
18+
}
19+
}
20+
.onChange(of: session.messages.count) {
21+
scrollView.scrollTo(session.messages.keys.last)
22+
}
23+
.upsideDown()
24+
.padding(.horizontal)
25+
.scrollIndicators(.never)
26+
.animation(.default, value: session.messages)
27+
}
28+
}
29+
}

VoiceAgent/Chat/View/ChatView.swift

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,10 @@
11
import SwiftUI
22

3-
/// A multiplatform view that shows the message feed.
43
struct ChatView: View {
54
@EnvironmentObject private var session: AgentSession
65

76
var body: some View {
8-
ScrollViewReader { scrollView in
9-
ScrollView {
10-
LazyVStack {
11-
ForEach(session.messages.values.reversed(), content: message)
12-
}
13-
}
14-
.onChange(of: session.messages.count) {
15-
scrollView.scrollTo(session.messages.keys.last)
16-
}
17-
.upsideDown()
18-
.padding(.horizontal)
19-
.scrollIndicators(.never)
20-
.animation(.default, value: session.messages)
21-
}
7+
ChatScrollView(messageBuilder: message)
228
}
239

2410
@ViewBuilder
@@ -31,8 +17,6 @@ struct ChatView: View {
3117
agentTranscript(text)
3218
}
3319
}
34-
.upsideDown()
35-
.id(message.id) // for the ScrollViewReader to work
3620
}
3721

3822
@ViewBuilder

0 commit comments

Comments
 (0)