Skip to content

Rozširovanie playera

Tento návod pokrýva rozširovacie body dostupné v @reast/engine pre vývojárov, ktorí chcú prispôsobiť alebo rozšíriť správanie playera.

Architektúra pluginov

Player podporuje jednoduchý systém pluginov. Pluginy sa môžu napojiť na vykresľovanie, spracovanie volieb a lifecycle udalosti.

Definovanie pluginu

ts
import { definePlugin } from '@reast/engine';

const analyticsPlugin = definePlugin({
  name: 'analytics',

  onStoryLoaded(ctx) {
    console.log('Príbeh načítaný:', ctx.src);
  },

  beforeRenderNode(ctx) {
    // Vráťte false pre potlačenie vykresľovania tohto uzla
    if (ctx.node.type === 'command') return false;
  },

  afterRenderNode(ctx) {
    // Sledovanie vykreslených uzlov
    trackEvent('node-rendered', { type: ctx.node.type });
  },

  onChoiceSelected(ctx) {
    trackEvent('choice', { index: ctx.index });
  },

  onStoryComplete(ctx) {
    trackEvent('story-complete', { readingTimeMs: ctx.readingTimeMs });
  },

  onDisconnect(ctx) {
    // Upratanie pri odpojení playera z DOM
    cleanup();
  },
});

Registrácia pluginov

ts
import { registerPlugin, unregisterPlugin, clearPlugins } from '@reast/engine';

registerPlugin(analyticsPlugin);

// Neskôr, pre odstránenie:
unregisterPlugin('analytics');

// Alebo odstránenie všetkých:
clearPlugins();

Hook-y pluginov

HookKontextVetuje?Popis
onStoryLoadedPluginContextNieVolané po načítaní a sparsovaní príbehu
beforeRenderNodeRenderHookContextÁno (return false)Pred vykreslením uzla do DOM
afterRenderNodeRenderHookContextNiePo vykreslení uzla
onChoiceSelectedChoiceHookContextNieKeď čitateľ vyberie voľbu
onStoryCompleteCompleteHookContextNieKeď príbeh dosiahne koniec
onDisconnectPluginContextNieKeď je player odpojený z DOM

Typy kontextu hookov

ts
interface PluginContext {
  readonly host: HTMLElement;
  readonly src?: string;
}

interface RenderHookContext extends PluginContext {
  readonly node: ReaNode;
  readonly element?: HTMLElement | null;
}

interface ChoiceHookContext extends PluginContext {
  readonly index: number;
}

interface CompleteHookContext extends PluginContext {
  readonly readingTimeMs?: number;
}

CSS Custom Properties

Všetky vizuálne aspekty playera sú tématizovateľné cez CSS custom properties. Pozrite si úplnú referenciu v časti Témy.