Skip to content

Commit

Permalink
Now also render .razor files
Browse files Browse the repository at this point in the history
  • Loading branch information
ronnygunawan committed Feb 14, 2024
1 parent 9a45b08 commit da6c181
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 4 deletions.
2 changes: 1 addition & 1 deletion RG.RazorMail/RG.RazorMail.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
<Version>1.0.3</Version>
<Version>1.0.4</Version>
<PackageReadmeFile>README.md</PackageReadmeFile>
</PropertyGroup>

Expand Down
15 changes: 15 additions & 0 deletions RG.RazorMail/RazorMailRenderer.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,27 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.Web.HtmlRendering;
using Microsoft.Extensions.Options;
using RazorLight;

namespace RG.RazorMail {
public class RazorMailRenderer {
private readonly IRazorLightEngine _razorLightEngine;
private readonly HtmlRenderer _htmlRenderer;
private readonly RazorMailRendererOptions _options;

public RazorMailRenderer(
IRazorLightEngine razorLightEngine,
HtmlRenderer htmlRenderer,
IOptions<RazorMailRendererOptions> optionsAccessor
) {
_razorLightEngine = razorLightEngine;
_htmlRenderer = htmlRenderer;
_options = optionsAccessor.Value;
}

Expand Down Expand Up @@ -57,6 +64,14 @@ string resourceName
return await _razorLightEngine.CompileRenderStringAsync(viewName, viewTemplate, model);
}

public async Task<string> RenderComponentAsync<TComponent>(IDictionary<string, object?> parameters) where TComponent : IComponent {
return await _htmlRenderer.Dispatcher.InvokeAsync(async () => {
ParameterView parameterView = ParameterView.FromDictionary(parameters);
HtmlRootComponent rootComponent = await _htmlRenderer.RenderComponentAsync<TComponent>(parameterView);
return rootComponent.ToHtmlString();
});
}

public string InlineCss(string html, string? css = null) {
return PreMailer.Net.PreMailer.MoveCssInline(
html: html,
Expand Down
2 changes: 1 addition & 1 deletion RG.RazorMail/RazorMailRendererOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

namespace RG.RazorMail {
public class RazorMailRendererOptions {
public required Assembly ViewsAssembly { get; set; }
public Assembly? ViewsAssembly { get; set; }
}
}
9 changes: 7 additions & 2 deletions RG.RazorMail/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
using System;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.Extensions.DependencyInjection;
using RazorLight;
using RazorLight.Extensions;

namespace RG.RazorMail {
public static class ServiceCollectionExtensions {
public static IServiceCollection AddRazorMail(this IServiceCollection services, Action<RazorMailRendererOptions> setupAction) {
public static IServiceCollection AddRazorMail(this IServiceCollection services, Action<RazorMailRendererOptions>? setupAction = null) {
services.AddLogging();
services.AddOptions<RazorMailRendererOptions>();
services.AddRazorLight(() => new RazorLightEngineBuilder()
.UseEmbeddedResourcesProject(typeof(string))
.UseMemoryCachingProvider()
.Build());
services.Configure(setupAction);
if (setupAction != null) {
services.Configure(setupAction);
}
services.AddSingleton<HtmlRenderer>();
services.AddTransient<RazorMailRenderer>();
return services;
}
Expand Down
4 changes: 4 additions & 0 deletions Tests/Components/HelloWorld.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<p>Hello @Name</p>
@code {
[Parameter] public string? Name { get; set; }
}
15 changes: 15 additions & 0 deletions Tests/MailRendererTests.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using FluentAssertions;
using Microsoft.Extensions.DependencyInjection;
using RG.RazorMail;
using Tests.Components;
using Tests.ViewModels;
using Xunit;

Expand Down Expand Up @@ -32,6 +34,19 @@ public async Task CanRenderToStringAsync() {
html.Should().Be("<p>Hello John</p>");
}

[Fact]
public async Task CanRenderComponentToStringAsync() {
ServiceCollection services = new();
services.AddRazorMail();
using ServiceProvider serviceProvider = services.BuildServiceProvider();
RazorMailRenderer razorMailRenderer = serviceProvider.GetRequiredService<RazorMailRenderer>();
razorMailRenderer.Should().NotBeNull();
string html = await razorMailRenderer.RenderComponentAsync<HelloWorld>(new Dictionary<string, object?> {
{ "Name", "John" }
});
html.Should().Be("<p>Hello John</p>");
}

[Fact]
public async Task CanRenderToStringAndInlineCssAsync() {
ServiceCollection services = new();
Expand Down

0 comments on commit da6c181

Please sign in to comment.