You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.8 KiB
68 lines
1.8 KiB
using System; |
|
using System.Threading.Tasks; |
|
using Avalonia; |
|
using Avalonia.Controls; |
|
using Avalonia.Controls.Notifications; |
|
using StabilityMatrix.Core.Models; |
|
|
|
namespace StabilityMatrix.Avalonia.Services; |
|
|
|
public class NotificationService : INotificationService |
|
{ |
|
private WindowNotificationManager? notificationManager; |
|
|
|
public void Initialize( |
|
Visual? visual, |
|
NotificationPosition position = NotificationPosition.BottomRight, |
|
int maxItems = 3) |
|
{ |
|
if (notificationManager is not null) return; |
|
notificationManager = new WindowNotificationManager(TopLevel.GetTopLevel(visual)) |
|
{ |
|
Position = position, |
|
MaxItems = maxItems |
|
}; |
|
} |
|
|
|
public void Show(INotification notification) |
|
{ |
|
notificationManager?.Show(notification); |
|
} |
|
|
|
/// <inheritdoc /> |
|
public async Task<TaskResult<T>> TryAsync<T>( |
|
Task<T> task, |
|
string title = "Error", |
|
string? message = null, |
|
NotificationType appearance = NotificationType.Error) |
|
{ |
|
try |
|
{ |
|
return new TaskResult<T>(await task); |
|
} |
|
catch (Exception e) |
|
{ |
|
Show(new Notification(title, message ?? e.Message, appearance)); |
|
return TaskResult<T>.FromException(e); |
|
} |
|
} |
|
|
|
/// <inheritdoc /> |
|
public async Task<TaskResult<bool>> TryAsync( |
|
Task task, |
|
string title = "Error", |
|
string? message = null, |
|
NotificationType appearance = NotificationType.Error) |
|
{ |
|
try |
|
{ |
|
await task; |
|
return new TaskResult<bool>(true); |
|
} |
|
catch (Exception e) |
|
{ |
|
Show(new Notification(title, message ?? e.Message, appearance)); |
|
return new TaskResult<bool>(false, e); |
|
} |
|
} |
|
}
|
|
|