OF-DL/OF DL.Gui/Helpers/WebLinkHelper.cs

93 lines
2.4 KiB
C#

using System.Diagnostics;
using Avalonia.Controls;
using OF_DL.Helpers;
using Serilog;
namespace OF_DL.Gui.Helpers;
public static class WebLinkHelper
{
private const string CopiedToClipboardMessage = "Copied to clipboard";
public static async Task OpenOrCopyAsync(
Window owner,
string url,
Control? toolTipTarget = null,
Func<string, Task>? dockerFeedbackAsync = null)
{
try
{
if (EnvironmentHelper.IsRunningInDocker())
{
TopLevel? topLevel = TopLevel.GetTopLevel(owner);
if (topLevel?.Clipboard != null)
{
try
{
await topLevel.Clipboard.SetTextAsync(url);
}
catch
{
return;
}
}
if (dockerFeedbackAsync != null)
{
await dockerFeedbackAsync(CopiedToClipboardMessage);
return;
}
if (toolTipTarget != null)
{
await ShowTemporaryTooltipAsync(toolTipTarget, CopiedToClipboardMessage);
}
return;
}
}
catch (Exception e)
{
Log.Error("Failed to copy URL to clipboard. {ErrorMessage}", e.Message);
}
try
{
OpenExternalUrl(url);
}
catch (Exception e)
{
Log.Error(e, "Failed to open external URL. {ErrorMessage}", e.Message);
}
}
private static async Task ShowTemporaryTooltipAsync(
Control target,
string message,
int durationMilliseconds = 1500)
{
object? originalTip = ToolTip.GetTip(target);
ToolTip.SetTip(target, message);
ToolTip.SetIsOpen(target, true);
await Task.Delay(durationMilliseconds);
ToolTip.SetIsOpen(target, false);
ToolTip.SetTip(target, originalTip);
}
private static void OpenExternalUrl(string url)
{
try
{
ProcessStartInfo processStartInfo = new(url) { UseShellExecute = true };
Process.Start(processStartInfo);
}
catch
{
// Ignore browser launch failures to preserve prior behavior.
}
}
}