@@ -135,14 +135,16 @@ public class LiveSessionCoordinator<R: RootRegistry>: ObservableObject {
135
135
return
136
136
}
137
137
138
- logger. debug ( " Connecting to \( self . url. absoluteString) " )
138
+ let url = self . navigationPath. last!. url
139
+
140
+ logger. debug ( " Connecting to \( url. absoluteString) " )
139
141
140
142
state = . connecting
141
143
142
144
do {
143
- let html = try await fetchDOM ( url: self . url)
145
+ let html = try await fetchDOM ( url: url)
144
146
145
- let doc = try SwiftSoup . parse ( html, self . url. absoluteString, SwiftSoup . Parser. xmlParser ( ) . settings ( . init( true , true ) ) )
147
+ let doc = try SwiftSoup . parse ( html, url. absoluteString, SwiftSoup . Parser. xmlParser ( ) . settings ( . init( true , true ) ) )
146
148
let domValues = try self . extractDOMValues ( doc)
147
149
// extract the root layout, removing anything within the `<div data-phx-main>`.
148
150
let mainDiv = try doc. select ( " div[data-phx-main] " ) [ 0 ]
@@ -158,20 +160,24 @@ public class LiveSessionCoordinator<R: RootRegistry>: ObservableObject {
158
160
try await self . connectSocket ( domValues)
159
161
}
160
162
161
- try await navigationPath. first !. coordinator. connect ( domValues: domValues, redirect: false )
163
+ try await navigationPath. last !. coordinator. connect ( domValues: domValues, redirect: false )
162
164
} catch {
163
165
self . state = . connectionFailed( error)
164
166
logger. log ( level: . error, " \( error. localizedDescription) " )
165
167
return
166
168
}
167
169
}
168
170
169
- private func disconnect( ) async {
171
+ private func disconnect( preserveNavigationPath : Bool = false ) async {
170
172
for entry in self . navigationPath {
171
173
await entry. coordinator. disconnect ( )
172
- entry. coordinator. document = nil
174
+ if !preserveNavigationPath {
175
+ entry. coordinator. document = nil
176
+ }
177
+ }
178
+ if !preserveNavigationPath {
179
+ self . navigationPath = [ self . navigationPath. first!]
173
180
}
174
- self . navigationPath = [ self . navigationPath. first!]
175
181
self . socket? . disconnect ( )
176
182
self . socket = nil
177
183
self . state = . notConnected
@@ -183,7 +189,7 @@ public class LiveSessionCoordinator<R: RootRegistry>: ObservableObject {
183
189
///
184
190
/// This can be used to force the LiveView to reset, for example after an unrecoverable error occurs.
185
191
public func reconnect( ) async {
186
- await self . disconnect ( )
192
+ await self . disconnect ( preserveNavigationPath : true )
187
193
await self . connect ( )
188
194
}
189
195
0 commit comments