@@ -44,70 +44,69 @@ struct MessageListView: View {
4444 }
4545 Spacer ( )
4646 }
47- } else {
48- ScrollViewReader { proxy in
49- ChatScrollView {
50- VStack ( spacing: 0 ) {
51- if room. hasMoreMessages {
52- Button ( " Load more... " ) {
53- guard
54- let oldestMessage = room. firstMessage?
55- . ts
56- else { return }
57-
58- messagesLoader. loadMore ( from: oldestMessage)
59- }
60- . padding ( . bottom, 8 )
47+ }
48+ ScrollViewReader { proxy in
49+ ChatScrollView {
50+ VStack ( spacing: 0 ) {
51+ if room. hasMoreMessages {
52+ Button ( " Load more... " ) {
53+ guard
54+ let oldestMessage = room. firstMessage?
55+ . ts
56+ else { return }
57+
58+ messagesLoader. loadMore ( from: oldestMessage)
6159 }
60+ . padding ( . bottom, 8 )
61+ }
6262
63- ForEach ( messages. indices, id: \. self) { index in
64- let message = messages [ index]
65- let previousMessage =
66- messages. indices. contains ( index - 1 )
67- ? messages [ index - 1 ] : nil
68-
69- MessageView (
70- viewModel: . init(
63+ ForEach ( messages. indices, id: \. self) { index in
64+ let message = messages [ index]
65+ let previousMessage =
66+ messages. indices. contains ( index - 1 )
67+ ? messages [ index - 1 ] : nil
68+
69+ MessageView (
70+ viewModel: . init(
71+ message: message,
72+ previousMessage: previousMessage,
73+ server: server,
74+ lastOpen: lastOpen
75+ )
76+ ) { action in
77+ switch action {
78+ case . resend( let message) :
79+ messageSender. resendMessage (
7180 message: message,
72- previousMessage: previousMessage,
73- server: server,
74- lastOpen: lastOpen
81+ in: room
7582 )
76- ) { action in
77- switch action {
78- case . resend( let message) :
79- messageSender. resendMessage (
80- message: message,
81- in: room
82- )
83-
84- lastOpen = nil
85- case . delete( let message) :
86- database. remove ( message)
87- }
83+
84+ lastOpen = nil
85+ case . delete( let message) :
86+ database. remove ( message)
8887 }
8988 }
89+ }
9090
91- MessageComposerView (
92- room: room,
93- server: server,
94- anchorID: bottomAnchor
95- ) {
96- messageSender. sendMessage ( $0, in: room)
91+ MessageComposerView (
92+ room: room,
93+ server: server,
94+ anchorID: bottomAnchor
95+ ) {
96+ messageSender. sendMessage ( $0, in: room)
9797
98- lastOpen = nil
99- }
100- . id ( messageComposer)
101- . padding ( . top, 8 )
102- }
103- . onAppear {
104- scrollToBottom ( proxy: proxy)
98+ lastOpen = nil
10599 }
106- . onChange ( of: messages. last? . ts) { _ in
107- // Also scroll to bottom when new messages arrive
108- withAnimation ( . easeOut( duration: 0.3 ) ) {
109- proxy. scrollTo ( bottomAnchor, anchor: . center)
110- }
100+ . id ( messageComposer)
101+ . padding ( . top, 8 )
102+ }
103+ . onAppear {
104+ scrollToBottom ( proxy: proxy)
105+ }
106+ . onChange ( of: messages. last? . ts) { _ in
107+ // Also scroll to bottom when new messages arrive
108+ withAnimation ( . easeOut( duration: 0.3 ) ) {
109+ proxy. scrollTo ( bottomAnchor, anchor: . bottom)
111110 }
112111 }
113112 }
@@ -150,7 +149,7 @@ struct MessageListView: View {
150149 }
151150 }
152151 }
153-
152+
154153 private func scrollToBottom( proxy: ScrollViewProxy ) {
155154 // Small delay ensures layout is complete before scrolling
156155 DispatchQueue . main. asyncAfter ( deadline: . now( ) + 0.1 ) {
0 commit comments