@@ -46,7 +46,6 @@ private enum ViewMode { Notes, Favorites, Tags, TagFilter, Archive }
4646 private const int DefaultFullHeight = 650 ;
4747 private const int CompactHeight = 40 ;
4848 private Microsoft . UI . Xaml . DispatcherTimer ? _animTimer ;
49- private Microsoft . UI . Xaml . DispatcherTimer ? _firebasePeriodicTimer ;
5049 private int _preCompactWidth = 380 ;
5150 private int _preCompactHeight = DefaultFullHeight ;
5251 private int _targetHeight ;
@@ -125,7 +124,7 @@ public MainWindow()
125124 this . Closed += ( _ , _ ) =>
126125 {
127126 SaveMainWindowPosition ( ) ;
128- StopFirebasePeriodicPull ( ) ;
127+ StopFirebaseListener ( ) ;
129128 _attachmentService ? . Dispose ( ) ;
130129 foreach ( var w in _attachedNoteWindows . Values . ToList ( ) )
131130 {
@@ -182,42 +181,50 @@ private async Task InitCloudSync()
182181 await _notes . InitWebDavFromSettings ( ) ;
183182 UpdateSyncButtonVisibility ( ) ;
184183 RefreshCurrentView ( ) ;
185- StartFirebasePeriodicPull ( ) ;
184+ StartFirebaseListener ( ) ;
186185 }
187186
188- /// <summary>Background pull from RTDB (same idea as web <c>onValue</c>), so web deletes propagate without pressing Sync .</summary>
189- private void StartFirebasePeriodicPull ( )
187+ /// <summary>Real-time SSE listener on RTDB notes, replaces periodic polling .</summary>
188+ private void StartFirebaseListener ( )
190189 {
191- StopFirebasePeriodicPull ( ) ;
192- if ( _notes . Firebase is not { IsConnected : true } ) return ;
193- _firebasePeriodicTimer = new Microsoft . UI . Xaml . DispatcherTimer
194- {
195- Interval = TimeSpan . FromSeconds ( 45 ) ,
196- } ;
197- _firebasePeriodicTimer . Tick += ( _ , _ ) =>
190+ StopFirebaseListener ( ) ;
191+ if ( _notes . Firebase is not { IsConnected : true } fb ) return ;
192+ fb . StartListening ( ( ) =>
198193 {
199194 DispatcherQueue . TryEnqueue ( ( ) => _ = PullFirebaseInBackgroundAsync ( ) ) ;
200- } ;
201- _firebasePeriodicTimer . Start ( ) ;
195+ } ) ;
202196 }
203197
204- private void StopFirebasePeriodicPull ( )
198+ private void StopFirebaseListener ( )
205199 {
206- if ( _firebasePeriodicTimer != null )
207- {
208- _firebasePeriodicTimer . Stop ( ) ;
209- _firebasePeriodicTimer = null ;
210- }
200+ _notes . Firebase ? . StopListening ( ) ;
211201 }
212202
213203 private async Task PullFirebaseInBackgroundAsync ( )
214204 {
215205 if ( _notes . IsSyncing ) return ;
216206 if ( _notes . Firebase is not { IsConnected : true } ) return ;
217207 await _notes . SyncFromFirebase ( ) ;
208+ RefreshOpenNoteWindows ( ) ;
218209 RefreshCurrentView ( ) ;
219210 }
220211
212+ private void RefreshOpenNoteWindows ( )
213+ {
214+ foreach ( var w in _openNoteWindows )
215+ {
216+ var updated = _notes . Notes . FirstOrDefault ( n => n . Id == w . NoteId ) ;
217+ if ( updated != null )
218+ w . ReloadAfterSync ( updated ) ;
219+ }
220+ foreach ( var ( id , w ) in _attachedNoteWindows )
221+ {
222+ var updated = _notes . Notes . FirstOrDefault ( n => n . Id == id ) ;
223+ if ( updated != null )
224+ w . ReloadAfterSync ( updated ) ;
225+ }
226+ }
227+
221228 private void UpdateSyncButtonVisibility ( )
222229 {
223230 SyncButton . Visibility = _notes . Firebase is { IsConnected : true }
@@ -232,6 +239,7 @@ private async void SyncButton_Click(object sender, RoutedEventArgs e)
232239 {
233240 await _notes . SyncSettingsFromFirebase ( ) ;
234241 await _notes . SyncFromFirebase ( ) ;
242+ RefreshOpenNoteWindows ( ) ;
235243 RefreshCurrentView ( ) ;
236244 }
237245 finally
@@ -1119,13 +1127,14 @@ private void Settings_Click(object sender, RoutedEventArgs e)
11191127 onConfigureFirebase : async ( ) => await ShowFirebaseConfigDialog ( ) ,
11201128 onDisconnectFirebase : ( ) =>
11211129 {
1122- StopFirebasePeriodicPull ( ) ;
1130+ StopFirebaseListener ( ) ;
11231131 _notes . DisconnectFirebase ( ) ;
11241132 UpdateSyncButtonVisibility ( ) ;
11251133 } ,
11261134 onSyncFirebase : async ( ) =>
11271135 {
11281136 await _notes . SyncFromFirebase ( ) ;
1137+ RefreshOpenNoteWindows ( ) ;
11291138 RefreshCurrentView ( ) ;
11301139 } ,
11311140 onConfigureWebDav : async ( ) => await ShowWebDavConfigDialog ( ) ,
@@ -1560,9 +1569,10 @@ private async Task ShowFirebaseConfigDialog()
15601569 if ( success )
15611570 {
15621571 await _notes . SyncFromFirebase ( ) ;
1572+ RefreshOpenNoteWindows ( ) ;
15631573 UpdateSyncButtonVisibility ( ) ;
15641574 RefreshCurrentView ( ) ;
1565- StartFirebasePeriodicPull ( ) ;
1575+ StartFirebaseListener ( ) ;
15661576 googleSignInDone = true ;
15671577 }
15681578 else
@@ -1596,9 +1606,10 @@ private async Task ShowFirebaseConfigDialog()
15961606 if ( success )
15971607 {
15981608 await _notes . SyncFromFirebase ( ) ;
1609+ RefreshOpenNoteWindows ( ) ;
15991610 UpdateSyncButtonVisibility ( ) ;
16001611 RefreshCurrentView ( ) ;
1601- StartFirebasePeriodicPull ( ) ;
1612+ StartFirebaseListener ( ) ;
16021613 break ;
16031614 }
16041615
0 commit comments