@onereach/channel-transformer
Version:
Convert data model between different channels (Slack, Microsoft Teams, Generic...)
66 lines (56 loc) • 2.02 kB
text/typescript
import { IGenericWrapper } from '../../../generic/types/wrapper';
import { RWCv4Message } from '../../classes/v4';
import { IRWCMessage } from '../../types';
import { getMethods } from './methods';
function mapBlocks(
blocks: Array<any>, mergeTextSections = true, prefix?: string, suffix?: string
): Array<IRWCMessage> {
const result = [];
for (let i = 0; i < blocks.length; i++) {
const block = blocks[i];
result.push(getMethods(block.type)(block));
}
const sections = result.length > 0
? result.reduce(
(acc, item) => Array.isArray(item)
? acc.concat(...item)
: acc.concat(item),
[])
: [];
if (mergeTextSections) {
prefix = prefix === undefined ? '<div style="margin: 8px 0;">' : prefix;
suffix = suffix === undefined ? '</div>' : suffix;
return sections.reduce((acc, item) => {
if (acc.length === 0 || item.answerComponent?.component) {
return acc.concat(new RWCv4Message(item));
}
const previous = acc[acc.length-1];
if (previous.answerComponent?.component || previous.medias?.length) {
return acc.concat(new RWCv4Message(item));
}
if (item.message) {
if (!previous.message) {
previous.message = `${prefix}${item.message}${suffix}`.trim();
} else {
if (!previous.message.startsWith(prefix) || !previous.message.endsWith(suffix)) {
previous.message = `${prefix}${previous.message}${suffix}`.trim();
}
previous.message = `${previous.message}${prefix}${item.message}${suffix}`.trim();
}
previous.messageText = previous.message;
return acc;
}
}, []);
}
return sections.map(item => new RWCv4Message(item));
}
export function transformGenericToRWCv4(
{ children, props }: IGenericWrapper,
mergeTextSections=props?.rwc?.mergeTextSections,
prefix?: string,
suffix?: string
) {
return {
messages: mapBlocks(children, mergeTextSections, prefix, suffix)
};
}