@@ -16,24 +16,28 @@ namespace Coder.Desktop.App.ViewModels;
1616
1717public partial class FileSyncListViewModel : ObservableObject
1818{
19- public delegate void OnFileSyncListStaleDelegate ( ) ;
20-
21- // Triggered when the window should be closed.
22- public event OnFileSyncListStaleDelegate ? OnFileSyncListStale ;
23-
2419 private DispatcherQueue ? _dispatcherQueue ;
2520
2621 private readonly ISyncSessionController _syncSessionController ;
2722 private readonly IRpcController _rpcController ;
2823 private readonly ICredentialManager _credentialManager ;
2924
3025 [ ObservableProperty ]
26+ [ NotifyPropertyChangedFor ( nameof ( ShowUnavailable ) ) ]
3127 [ NotifyPropertyChangedFor ( nameof ( ShowLoading ) ) ]
3228 [ NotifyPropertyChangedFor ( nameof ( ShowError ) ) ]
3329 [ NotifyPropertyChangedFor ( nameof ( ShowSessions ) ) ]
3430 public partial bool Loading { get ; set ; } = true ;
3531
3632 [ ObservableProperty ]
33+ [ NotifyPropertyChangedFor ( nameof ( ShowUnavailable ) ) ]
34+ [ NotifyPropertyChangedFor ( nameof ( ShowLoading ) ) ]
35+ [ NotifyPropertyChangedFor ( nameof ( ShowError ) ) ]
36+ [ NotifyPropertyChangedFor ( nameof ( ShowSessions ) ) ]
37+ public partial string ? UnavailableMessage { get ; set ; } = null ;
38+
39+ [ ObservableProperty ]
40+ [ NotifyPropertyChangedFor ( nameof ( ShowUnavailable ) ) ]
3741 [ NotifyPropertyChangedFor ( nameof ( ShowLoading ) ) ]
3842 [ NotifyPropertyChangedFor ( nameof ( ShowError ) ) ]
3943 [ NotifyPropertyChangedFor ( nameof ( ShowSessions ) ) ]
@@ -72,9 +76,11 @@ public bool NewSessionCreateEnabled
7276 }
7377 }
7478
75- public bool ShowLoading => Loading && Error == null ;
76- public bool ShowError => Error != null ;
77- public bool ShowSessions => ! Loading && Error == null ;
79+ // TODO: this could definitely be improved
80+ public bool ShowUnavailable => UnavailableMessage != null ;
81+ public bool ShowLoading => Loading && UnavailableMessage == null && Error == null ;
82+ public bool ShowError => UnavailableMessage == null && Error != null ;
83+ public bool ShowSessions => ! Loading && UnavailableMessage == null && Error == null ;
7884
7985 public FileSyncListViewModel ( ISyncSessionController syncSessionController , IRpcController rpcController ,
8086 ICredentialManager credentialManager )
@@ -105,54 +111,56 @@ public void Initialize(DispatcherQueue dispatcherQueue)
105111 {
106112 _dispatcherQueue = dispatcherQueue ;
107113
108- _rpcController . StateChanged += ( _ , rpcModel ) => UpdateFromRpcModel ( rpcModel ) ;
109- _credentialManager . CredentialsChanged += ( _ , credentialModel ) => UpdateFromCredentialsModel ( credentialModel ) ;
114+ _rpcController . StateChanged += RpcControllerStateChanged ;
115+ _credentialManager . CredentialsChanged += CredentialManagerCredentialsChanged ;
110116
111117 var rpcModel = _rpcController . GetState ( ) ;
112118 var credentialModel = _credentialManager . GetCachedCredentials ( ) ;
113- // TODO: fix this
114- //if (MaybeSendStaleEvent(rpcModel, credentialModel)) return;
119+ MaybeSetUnavailableMessage ( rpcModel , credentialModel ) ;
115120
116121 // TODO: Simulate loading until we have real data.
117122 Task . Delay ( TimeSpan . FromSeconds ( 3 ) ) . ContinueWith ( _ => _dispatcherQueue . TryEnqueue ( ( ) => Loading = false ) ) ;
118123 }
119124
120- private void UpdateFromRpcModel ( RpcModel rpcModel )
125+ private void RpcControllerStateChanged ( object ? sender , RpcModel rpcModel )
121126 {
122127 // Ensure we're on the UI thread.
123128 if ( _dispatcherQueue == null ) return ;
124129 if ( ! _dispatcherQueue . HasThreadAccess )
125130 {
126- _dispatcherQueue . TryEnqueue ( ( ) => UpdateFromRpcModel ( rpcModel ) ) ;
131+ _dispatcherQueue . TryEnqueue ( ( ) => RpcControllerStateChanged ( sender , rpcModel ) ) ;
127132 return ;
128133 }
129134
130135 var credentialModel = _credentialManager . GetCachedCredentials ( ) ;
131- MaybeSendStaleEvent ( rpcModel , credentialModel ) ;
136+ MaybeSetUnavailableMessage ( rpcModel , credentialModel ) ;
132137 }
133138
134- private void UpdateFromCredentialsModel ( CredentialModel credentialModel )
139+ private void CredentialManagerCredentialsChanged ( object ? sender , CredentialModel credentialModel )
135140 {
136141 // Ensure we're on the UI thread.
137142 if ( _dispatcherQueue == null ) return ;
138143 if ( ! _dispatcherQueue . HasThreadAccess )
139144 {
140- _dispatcherQueue . TryEnqueue ( ( ) => UpdateFromCredentialsModel ( credentialModel ) ) ;
145+ _dispatcherQueue . TryEnqueue ( ( ) => CredentialManagerCredentialsChanged ( sender , credentialModel ) ) ;
141146 return ;
142147 }
143148
144149 var rpcModel = _rpcController . GetState ( ) ;
145- MaybeSendStaleEvent ( rpcModel , credentialModel ) ;
150+ MaybeSetUnavailableMessage ( rpcModel , credentialModel ) ;
146151 }
147152
148- private bool MaybeSendStaleEvent ( RpcModel rpcModel , CredentialModel credentialModel )
153+ private void MaybeSetUnavailableMessage ( RpcModel rpcModel , CredentialModel credentialModel )
149154 {
150- var ok = rpcModel . RpcLifecycle is RpcLifecycle . Connected
151- && rpcModel . VpnLifecycle is VpnLifecycle . Started
152- && credentialModel . State == CredentialState . Valid ;
153-
154- if ( ! ok ) OnFileSyncListStale ? . Invoke ( ) ;
155- return ! ok ;
155+ if ( rpcModel . RpcLifecycle != RpcLifecycle . Connected )
156+ UnavailableMessage =
157+ "Disconnected from the Windows service. Please see the tray window for more information." ;
158+ else if ( credentialModel . State != CredentialState . Valid )
159+ UnavailableMessage = "Please sign in to access file sync." ;
160+ else if ( rpcModel . VpnLifecycle != VpnLifecycle . Started )
161+ UnavailableMessage = "Please start Coder Connect from the tray window to access file sync." ;
162+ else
163+ UnavailableMessage = null ;
156164 }
157165
158166 private void ClearNewForm ( )
0 commit comments