Skip to content

Commit 171c9e5

Browse files
committed
Unavailable state
1 parent d199026 commit 171c9e5

File tree

3 files changed

+44
-35
lines changed

3 files changed

+44
-35
lines changed

App/ViewModels/FileSyncListViewModel.cs

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,28 @@ namespace Coder.Desktop.App.ViewModels;
1616

1717
public 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()

App/Views/FileSyncListWindow.xaml.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ public sealed partial class FileSyncListWindow : WindowEx
1212
public FileSyncListWindow(FileSyncListViewModel viewModel)
1313
{
1414
ViewModel = viewModel;
15-
ViewModel.OnFileSyncListStale += ViewModel_OnFileSyncListStale;
16-
1715
InitializeComponent();
1816
SystemBackdrop = new DesktopAcrylicBackdrop();
1917

@@ -22,12 +20,4 @@ public FileSyncListWindow(FileSyncListViewModel viewModel)
2220

2321
this.CenterOnScreen();
2422
}
25-
26-
private void ViewModel_OnFileSyncListStale()
27-
{
28-
// TODO: Fix this. I got a weird memory corruption exception when it
29-
// fired immediately on start. Maybe we should schedule it for
30-
// next frame or something.
31-
//Close()
32-
}
3323
}

App/Views/Pages/FileSyncListMainPage.xaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@
1212
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
1313

1414
<Grid>
15+
<Grid
16+
Visibility="{x:Bind ViewModel.ShowUnavailable, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}"
17+
Padding="60,60"
18+
HorizontalAlignment="Center"
19+
VerticalAlignment="Center">
20+
21+
<TextBlock
22+
HorizontalAlignment="Center"
23+
Text="{x:Bind ViewModel.UnavailableMessage, Mode=OneWay}" />
24+
</Grid>
25+
1526
<Grid
1627
Visibility="{x:Bind ViewModel.ShowLoading, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}"
1728
Padding="60,60"

0 commit comments

Comments
 (0)