Skip to content

Commit

Permalink
Support dispatching on mount
Browse files Browse the repository at this point in the history
  • Loading branch information
kjeske committed Nov 8, 2024
1 parent 7fd581d commit f96f4a2
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 37 deletions.
22 changes: 16 additions & 6 deletions src/ComponentResult.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Net.Http.Headers;

namespace Hydro;

Expand Down Expand Up @@ -27,17 +28,26 @@ internal ComponentResult(IResult result, ComponentResultType type)
public async Task ExecuteAsync(HttpContext httpContext, HydroComponent component)
{
var response = httpContext.Response;

response.Headers.TryAdd(HydroConsts.ResponseHeaders.SkipOutput, "True");

if (_type == ComponentResultType.File)
{
response.Headers.Append("Content-Disposition", "inline");

response.Headers.Append(HeaderNames.ContentDisposition, "inline");
}

try
{
await _result.ExecuteAsync(httpContext);
}

await _result.ExecuteAsync(httpContext);

if (response.Headers.Remove("Location", out var location))
catch
{
response.Headers.Remove(HeaderNames.ContentDisposition);
throw;
}

if (response.Headers.Remove(HeaderNames.Location, out var location))
{
response.StatusCode = StatusCodes.Status200OK;
component.Redirect(location);
Expand Down
14 changes: 11 additions & 3 deletions src/HydroComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,6 @@ private async Task<string> RenderOnlineNestedComponent(IPersistentState persiste
IsMount = true;
await MountAsync();
await RenderAsync();
PopulateDispatchers();
return await GenerateComponentHtml(componentId, persistentState, includeScripts: true);
}

Expand All @@ -596,7 +595,6 @@ private async Task<string> RenderStaticComponent(IPersistentState persistentStat
IsMount = true;
await MountAsync();
await RenderAsync();
PopulateDispatchers();
return await GenerateComponentHtml(componentId, persistentState, includeScripts: true);
}

Expand Down Expand Up @@ -654,6 +652,11 @@ private async Task<string> GenerateComponentHtml(string componentId, IPersistent

if (includeScripts)
{
if (_dispatchEvents.Any())
{
AddClientScript($"Hydro.dispatchEvents('{GetSerializedEventDispatchers()}', this);");
}

foreach (var script in _clientScripts)
{
rootElement.AppendChild(GetClientScript(componentHtmlDocument, script));
Expand Down Expand Up @@ -823,6 +826,11 @@ private void PopulateDispatchers()
return;
}

HttpContext.Response.Headers.TryAdd(HydroConsts.ResponseHeaders.Trigger, GetSerializedEventDispatchers());
}

private string GetSerializedEventDispatchers()
{
var data = _dispatchEvents
.Select(e => new
{
Expand All @@ -834,7 +842,7 @@ private void PopulateDispatchers()
})
.ToList();

HttpContext.Response.Headers.TryAdd(HydroConsts.ResponseHeaders.Trigger, JsonConvert.SerializeObject(data, JsonSerializerSettings));
return JsonConvert.SerializeObject(data, JsonSerializerSettings);
}

private void PopulateClientScripts()
Expand Down
64 changes: 36 additions & 28 deletions src/Scripts/hydro.js
Original file line number Diff line number Diff line change
Expand Up @@ -524,34 +524,7 @@
}
}

setTimeout(() => { // make sure the event handlers got registered
const triggerHeader = response.headers.get('Hydro-Trigger');
if (triggerHeader) {
const triggers = JSON.parse(triggerHeader);
triggers.forEach(trigger => {
if (trigger.scope === 'parent' && !parentComponent) {
return;
}

const eventScope = trigger.scope === 'parent' ? parentComponent.id : 'global';
const eventName = `${eventScope}:${trigger.name}`;
const eventData = {
detail: {
data: trigger.data,
subject: trigger.subject,
operationId: trigger.operationId
}
};

document.dispatchEvent(new CustomEvent(eventName, eventData));

if (trigger.subject) {
const subjectEventName = `${eventScope}:${trigger.name}:${trigger.subject}`;
document.dispatchEvent(new CustomEvent(subjectEventName, eventData));
}
});
}
});
dispatchEvents(response.headers.get('Hydro-Trigger'), component);
}
} catch (error) {
document.dispatchEvent(new CustomEvent(`unhandled-hydro-error`, { detail: { name: error.name, message: error.message } }));
Expand All @@ -577,6 +550,40 @@
});
}

function dispatchEvents(serializedEvents, componentElement) {
if (!serializedEvents) {
return;
}

const parentComponent = componentElement ? findComponent(componentElement.parentElement) : null;

const events = JSON.parse(serializedEvents);
events.forEach(trigger => {
if (trigger.scope === 'parent' && !parentComponent) {
return;
}

const eventScope = trigger.scope === 'parent' ? parentComponent.id : 'global';
const eventName = `${eventScope}:${trigger.name}`;
const eventData = {
detail: {
data: trigger.data,
subject: trigger.subject,
operationId: trigger.operationId
}
};

setTimeout(() => {
document.dispatchEvent(new CustomEvent(eventName, eventData));

if (trigger.subject) {
const subjectEventName = `${eventScope}:${trigger.name}:${trigger.subject}`;
document.dispatchEvent(new CustomEvent(subjectEventName, eventData));
}
});
});
}

function isElementDirty(element) {
const type = element.type;
if (['checkbox', 'radio'].includes(type)) {
Expand Down Expand Up @@ -669,6 +676,7 @@
generateGuid,
waitFor,
executeComponentJs,
dispatchEvents,
config
};
}
Expand Down

0 comments on commit f96f4a2

Please sign in to comment.