EdgeStream
@edge-stream/ui-actions
The UI actions package provides types and hooks for server-driven UI interactions — form rendering, dialogs, navigation commands, and user interaction events. Integrates with Atlas Forms for HIL form delivery.
Installation
pnpm add @edge-stream/ui-actions
Key Exports
import {
UiActionPlugin, // IMessagePlugin implementation
UiTopics, // topic constants
FormRendererHook, // renders received forms via Atlas Forms
NavigationHandlerHook, // handles navigation commands
// TypeScript interfaces
type UiRenderFormMessage,
type UiRenderDialogMessage,
type UiRenderNotificationMessage,
type UiNavigateMessage,
type UiRefreshMessage,
type UiFormSubmitMessage,
} from '@edge-stream/ui-actions';
Topic Constants
import { UiTopics } from '@edge-stream/ui-actions';
UiTopics.RENDER_FORM // 'ui.render.form'
UiTopics.RENDER_DIALOG // 'ui.render.dialog'
UiTopics.RENDER_NOTIFICATION // 'ui.render.notification'
UiTopics.NAVIGATE // 'ui.action.navigate'
UiTopics.REFRESH // 'ui.action.refresh'
UiTopics.FORM_SUBMIT // 'ui.interaction.formSubmit'
UiTopics.NAMESPACE_PATTERN // 'ui.*'
FormRendererHook
When a ui.render.form message arrives, the FormRendererHook sends it to the Atlas Forms renderer and pauses the pipeline until the user submits:
import { FormRendererHook } from '@edge-stream/ui-actions';
import { atlasFormsRenderer } from '@bizfirstgo/atlas-forms';
server.incomingPipeline.addHook(new FormRendererHook({
renderer: atlasFormsRenderer,
onSubmit: async (formId, data, submissionTopic) => {
await stream.send('bas', submissionTopic, data);
},
}));
Setup
import { UiActionPlugin, UiTopics, type UiRenderFormMessage } from '@edge-stream/ui-actions';
const plugin = new UiActionPlugin();
plugin.createDefaultHooks().forEach(hook =>
server.incomingPipeline.addHook(hook)
);
// Handle form rendering manually (alternative to FormRendererHook)
stream.subscribe<UiRenderFormMessage>('bas', UiTopics.RENDER_FORM, (envelope) => {
modalStore.openForm({
formId: envelope.body.formId,
data: envelope.body.contextData,
onSubmit: (data) => stream.send('bas', envelope.body.submissionTopic, data),
});
});