Portal Community

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),
  });
});