diff --git a/Dev14/ExtensionUtils/StatusbarControl.cs b/Dev14/ExtensionUtils/StatusbarControl.cs index 32ec74c..fe03e79 100644 --- a/Dev14/ExtensionUtils/StatusbarControl.cs +++ b/Dev14/ExtensionUtils/StatusbarControl.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.Shell; +using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -9,12 +10,15 @@ namespace WakaTime.ExtensionUtils internal class StatusbarControl : TextBlock { private const string Icon = "🕑"; + private const string DefaultDashboardUrl = "https://wakatime.com/"; private readonly Brush _normalBackground = new SolidColorBrush(Colors.Transparent); private readonly Brush _hoverBackground = new SolidColorBrush(Colors.White) { Opacity = 0.2 }; + private readonly string _dashboardUrl; - public StatusbarControl() + public StatusbarControl(string apiUrl) { + _dashboardUrl = GetDashboardUrl(apiUrl); Text = Icon; Foreground = new SolidColorBrush(Colors.White); Background = _normalBackground; @@ -38,10 +42,30 @@ public StatusbarControl() MouseLeftButtonUp += (s, e) => { // Open WakaTime in browser - System.Diagnostics.Process.Start("https://wakatime.com/"); + System.Diagnostics.Process.Start(_dashboardUrl); }; } + private static string GetDashboardUrl(string apiUrl) + { + if (string.IsNullOrWhiteSpace(apiUrl)) + return DefaultDashboardUrl; + + if (!Uri.TryCreate(apiUrl, UriKind.Absolute, out var apiUri)) + return DefaultDashboardUrl; + + var host = apiUri.Host.StartsWith("api.", StringComparison.OrdinalIgnoreCase) + ? apiUri.Host.Substring(4) + : apiUri.Host; + + var dashboardUriBuilder = new UriBuilder(apiUri.Scheme, host, apiUri.IsDefaultPort ? -1 : apiUri.Port) + { + Path = "/" + }; + + return dashboardUriBuilder.Uri.AbsoluteUri; + } + public void SetText(string text) { ThreadHelper.ThrowIfNotOnUIThread(); diff --git a/Dev14/WakaTimePackage.cs b/Dev14/WakaTimePackage.cs index ec297f2..0b1ae9e 100644 --- a/Dev14/WakaTimePackage.cs +++ b/Dev14/WakaTimePackage.cs @@ -107,7 +107,7 @@ private async Task InitializeAsync(CancellationToken cancellationToken) if (_wakatime.Config.GetSettingAsBoolean("status_bar_enabled", true)) { // Inject control to status bar - _statusbarControl = new StatusbarControl(); + _statusbarControl = new StatusbarControl(_wakatime.Config.GetSetting("api_url")); _statusbarControl.SetText("Initializing..."); _statusbarControl.SetToolTip("WakaTime: Initializing..."); await StatusbarInjector.InjectControlAsync(_statusbarControl); diff --git a/Dev16/ExtensionUtils/StatusbarControl.cs b/Dev16/ExtensionUtils/StatusbarControl.cs index 32ec74c..fe03e79 100644 --- a/Dev16/ExtensionUtils/StatusbarControl.cs +++ b/Dev16/ExtensionUtils/StatusbarControl.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.Shell; +using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -9,12 +10,15 @@ namespace WakaTime.ExtensionUtils internal class StatusbarControl : TextBlock { private const string Icon = "🕑"; + private const string DefaultDashboardUrl = "https://wakatime.com/"; private readonly Brush _normalBackground = new SolidColorBrush(Colors.Transparent); private readonly Brush _hoverBackground = new SolidColorBrush(Colors.White) { Opacity = 0.2 }; + private readonly string _dashboardUrl; - public StatusbarControl() + public StatusbarControl(string apiUrl) { + _dashboardUrl = GetDashboardUrl(apiUrl); Text = Icon; Foreground = new SolidColorBrush(Colors.White); Background = _normalBackground; @@ -38,10 +42,30 @@ public StatusbarControl() MouseLeftButtonUp += (s, e) => { // Open WakaTime in browser - System.Diagnostics.Process.Start("https://wakatime.com/"); + System.Diagnostics.Process.Start(_dashboardUrl); }; } + private static string GetDashboardUrl(string apiUrl) + { + if (string.IsNullOrWhiteSpace(apiUrl)) + return DefaultDashboardUrl; + + if (!Uri.TryCreate(apiUrl, UriKind.Absolute, out var apiUri)) + return DefaultDashboardUrl; + + var host = apiUri.Host.StartsWith("api.", StringComparison.OrdinalIgnoreCase) + ? apiUri.Host.Substring(4) + : apiUri.Host; + + var dashboardUriBuilder = new UriBuilder(apiUri.Scheme, host, apiUri.IsDefaultPort ? -1 : apiUri.Port) + { + Path = "/" + }; + + return dashboardUriBuilder.Uri.AbsoluteUri; + } + public void SetText(string text) { ThreadHelper.ThrowIfNotOnUIThread(); diff --git a/Dev16/WakaTimePackage.cs b/Dev16/WakaTimePackage.cs index f0bdada..f96f054 100644 --- a/Dev16/WakaTimePackage.cs +++ b/Dev16/WakaTimePackage.cs @@ -108,7 +108,7 @@ private async Task InitializeAsync(CancellationToken cancellationToken) if (_wakatime.Config.GetSettingAsBoolean("status_bar_enabled", true)) { // Inject control to status bar - _statusbarControl = new StatusbarControl(); + _statusbarControl = new StatusbarControl(_wakatime.Config.GetSetting("api_url")); _statusbarControl.SetText("Initializing..."); _statusbarControl.SetToolTip("WakaTime: Initializing..."); await StatusbarInjector.InjectControlAsync(_statusbarControl); diff --git a/Dev17/ExtensionUtils/StatusbarControl.cs b/Dev17/ExtensionUtils/StatusbarControl.cs index 32ec74c..fe03e79 100644 --- a/Dev17/ExtensionUtils/StatusbarControl.cs +++ b/Dev17/ExtensionUtils/StatusbarControl.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.Shell; +using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -9,12 +10,15 @@ namespace WakaTime.ExtensionUtils internal class StatusbarControl : TextBlock { private const string Icon = "🕑"; + private const string DefaultDashboardUrl = "https://wakatime.com/"; private readonly Brush _normalBackground = new SolidColorBrush(Colors.Transparent); private readonly Brush _hoverBackground = new SolidColorBrush(Colors.White) { Opacity = 0.2 }; + private readonly string _dashboardUrl; - public StatusbarControl() + public StatusbarControl(string apiUrl) { + _dashboardUrl = GetDashboardUrl(apiUrl); Text = Icon; Foreground = new SolidColorBrush(Colors.White); Background = _normalBackground; @@ -38,10 +42,30 @@ public StatusbarControl() MouseLeftButtonUp += (s, e) => { // Open WakaTime in browser - System.Diagnostics.Process.Start("https://wakatime.com/"); + System.Diagnostics.Process.Start(_dashboardUrl); }; } + private static string GetDashboardUrl(string apiUrl) + { + if (string.IsNullOrWhiteSpace(apiUrl)) + return DefaultDashboardUrl; + + if (!Uri.TryCreate(apiUrl, UriKind.Absolute, out var apiUri)) + return DefaultDashboardUrl; + + var host = apiUri.Host.StartsWith("api.", StringComparison.OrdinalIgnoreCase) + ? apiUri.Host.Substring(4) + : apiUri.Host; + + var dashboardUriBuilder = new UriBuilder(apiUri.Scheme, host, apiUri.IsDefaultPort ? -1 : apiUri.Port) + { + Path = "/" + }; + + return dashboardUriBuilder.Uri.AbsoluteUri; + } + public void SetText(string text) { ThreadHelper.ThrowIfNotOnUIThread(); diff --git a/Dev17/WakaTimePackage.cs b/Dev17/WakaTimePackage.cs index f5f23ad..2e745c0 100644 --- a/Dev17/WakaTimePackage.cs +++ b/Dev17/WakaTimePackage.cs @@ -108,7 +108,7 @@ private async Task InitializeAsync(CancellationToken cancellationToken) if (_wakatime.Config.GetSettingAsBoolean("status_bar_enabled", true)) { // Inject control to status bar - _statusbarControl = new StatusbarControl(); + _statusbarControl = new StatusbarControl(_wakatime.Config.GetSetting("api_url")); _statusbarControl.SetText("Initializing..."); _statusbarControl.SetToolTip("WakaTime: Initializing..."); await StatusbarInjector.InjectControlAsync(_statusbarControl);