using Infrastructure.Email.Templates.Mail; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; using Microsoft.Extensions.Logging; namespace Infrastructure.Email.Templates.Rendering; /// /// Service for rendering Razor email templates to HTML using HtmlRenderer. /// public class EmailTemplateProvider( IServiceProvider serviceProvider, ILoggerFactory loggerFactory ) : IEmailTemplateProvider { /// /// Renders the UserRegisteredEmail template with the specified parameters. /// public async Task RenderUserRegisteredEmailAsync( string username, string confirmationLink ) { var parameters = new Dictionary { { nameof(UserRegistration.Username), username }, { nameof(UserRegistration.ConfirmationLink), confirmationLink }, }; return await RenderComponentAsync(parameters); } /// /// Renders the ResendConfirmation template with the specified parameters. /// public async Task RenderResendConfirmationEmailAsync( string username, string confirmationLink ) { var parameters = new Dictionary { { nameof(ResendConfirmation.Username), username }, { nameof(ResendConfirmation.ConfirmationLink), confirmationLink }, }; return await RenderComponentAsync(parameters); } /// /// Generic method to render any Razor component to HTML. /// private async Task RenderComponentAsync( Dictionary parameters ) where TComponent : IComponent { await using var htmlRenderer = new HtmlRenderer( serviceProvider, loggerFactory ); var html = await htmlRenderer.Dispatcher.InvokeAsync(async () => { var parameterView = ParameterView.FromDictionary(parameters); var output = await htmlRenderer.RenderComponentAsync( parameterView ); return output.ToHtmlString(); }); return html; } }