@onereach/channel-transformer
Version:
Convert data model between different channels (Slack, Microsoft Teams, Generic...)
38 lines (32 loc) • 1.45 kB
text/typescript
import { IGenericSection } from "../../../../generic/types";
import { getMethods } from "../methods";
import { IRWCAnswerComponent, IRWCMessage } from "../../../types";
import { RWCv5Message } from "../../../classes/v5";
export const transformSection = ( { children }: IGenericSection) => {
const groupedTypes = ['card', 'button'];
const components = [] as Array<IRWCAnswerComponent>;
const messages = [] as Array<IRWCMessage>;
const [ buttons, cards, rest ] = children.reduce((acc, item) => {
const [buttons, cards, rest] = acc;
if (groupedTypes.includes(item.type)) {
return item.type === 'card' ? [buttons, [...cards, item], rest] : [[...buttons, item], cards, rest];
}
return [buttons, cards, [...rest, item]];
}, [[], [], []]);
if (cards.length) components.push(getMethods("carousel")({children: cards}));
if (buttons.length) components.push(getMethods("buttonList")({ children: buttons}));
for (const item of rest) {
const res = getMethods(item.type)(item);
let comps, msgs;
if (res instanceof RWCv5Message) {
messages.push(res);
continue;
} else {
comps = res?.components || res;
msgs = res?.messages || [];
}
messages.push(...msgs);
Array.isArray(comps) ? components.push(...comps) : components.push(comps);
}
return {components, messages};
};