SHA256
GuestLog - User message improvements
- Added UserMessageService to have common methods for showing messages and errors to the user. - Added Result record so services can return status on operation error (so it can be shown in the UI messages). - Updated services to use the new Result record. - Updated pages to use the new IUserMessageService.
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
using Microsoft.Extensions.Localization;
|
||||
using MudBlazor;
|
||||
using Somnia.GuestLog.Models;
|
||||
using Somnia.GuestLog.Models.DTOs;
|
||||
using Somnia.GuestLog.Resources;
|
||||
using MessageKind = Somnia.GuestLog.Services.IUserMessageService.MessageKind;
|
||||
|
||||
namespace Somnia.GuestLog.Services;
|
||||
|
||||
public class UserMessageService(
|
||||
IServiceProvider serviceProvider,
|
||||
ISnackbar snackbar
|
||||
) : IUserMessageService
|
||||
{
|
||||
private IStringLocalizer<LanguageLocale> _localizer
|
||||
{
|
||||
get
|
||||
{
|
||||
return serviceProvider.GetRequiredService<IStringLocalizer<LanguageLocale>>();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void ShowMessage(string text, MessageKind kind, params object[] parameters)
|
||||
{
|
||||
string formatedMsg = GetFormatedMessage(text, parameters);
|
||||
ShowSnackbar(formatedMsg, kind);
|
||||
}
|
||||
|
||||
|
||||
public void ShowResult(Result resultDto)
|
||||
{
|
||||
ShowResultWithMessage(resultDto, message: null);
|
||||
}
|
||||
|
||||
public void ShowResultWithMessage(Result resultDto, string? message)
|
||||
{
|
||||
string resultMsg = GetMsgForResultCode(resultDto.ResultCode);
|
||||
resultMsg = GetFormatedMessage(resultMsg, resultDto.Context);
|
||||
|
||||
string finalMsg = message is not null ? $"{message.Trim().TrimEnd(':')}: {resultMsg}" : resultMsg;
|
||||
|
||||
//Show success when OK, error for UnknownErrors and warning otherwise.
|
||||
MessageKind kind = resultDto switch
|
||||
{
|
||||
{ IsSuccess: true } => MessageKind.Success,
|
||||
{ ResultCode: ResultCode.UnknownError } => MessageKind.Error,
|
||||
_ => MessageKind.Warning
|
||||
};
|
||||
|
||||
ShowSnackbar(finalMsg, kind);
|
||||
}
|
||||
|
||||
|
||||
#region Internal Methods
|
||||
|
||||
private void ShowSnackbar(string msg, MessageKind kind)
|
||||
{
|
||||
snackbar.Add(message: msg, severity: GetSnackbarSeveryForMessageKind(kind));
|
||||
}
|
||||
|
||||
private string GetMsgForResultCode(string resultCode)
|
||||
{
|
||||
return _localizer[$"resultCode.{resultCode}"];
|
||||
}
|
||||
|
||||
private static string GetFormatedMessage(string template, params object[]? parameters)
|
||||
{
|
||||
if (parameters is null || parameters.Length == 0)
|
||||
{
|
||||
return template;
|
||||
}
|
||||
|
||||
return string.Format(template, parameters);
|
||||
}
|
||||
|
||||
private static MudBlazor.Severity GetSnackbarSeveryForMessageKind(MessageKind kind) => kind switch
|
||||
{
|
||||
MessageKind.Info => MudBlazor.Severity.Info,
|
||||
MessageKind.Warning => MudBlazor.Severity.Warning,
|
||||
MessageKind.Error => MudBlazor.Severity.Error,
|
||||
MessageKind.Success => MudBlazor.Severity.Success,
|
||||
MessageKind.Normal => MudBlazor.Severity.Normal,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(kind), $"Not expected MessageKind value: {kind}")
|
||||
};
|
||||
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user