RocketChat/Rocket.Chat

View on GitHub
packages/ui-kit/src/rendering/renderBlockElement.ts

Summary

Maintainability
A
3 hrs
Test Coverage
import type { BlockElement } from '../blocks/BlockElement';
import type { BlockContext } from './BlockContext';
import type { BlockElementRenderer } from './BlockElementRenderer';
import type { BlockRenderers } from './BlockRenderers';

const getBlockElementRenderer = <T>(renderers: BlockRenderers<T>, type: BlockElement['type']): BlockElementRenderer<T> | undefined => {
    const renderer = renderers[type] as BlockElementRenderer<T> | undefined;

    if (renderer) {
        return renderer;
    }

    switch (type) {
        case 'datepicker':
            return renderers.datePicker as BlockElementRenderer<T> | undefined;

        case 'static_select':
            return renderers.staticSelect as BlockElementRenderer<T> | undefined;

        case 'multi_static_select':
            return renderers.multiStaticSelect as BlockElementRenderer<T> | undefined;

        case 'plain_text_input':
            return renderers.plainInput as BlockElementRenderer<T> | undefined;

        case 'linear_scale':
            return renderers.linearScale as BlockElementRenderer<T> | undefined;
    }
};

export const renderBlockElement =
    <T>(renderers: BlockRenderers<T>, context: BlockContext) =>
    (blockElement: BlockElement, index: number): T | null => {
        const renderer = getBlockElementRenderer(renderers, blockElement.type);

        if (!renderer) {
            return null;
        }

        return renderer.call(renderers, blockElement, context, index);
    };