import { storyPage } from './story-page';
import { SectionType } from '../../typings/story-section';
import { IncludedComponent } from '../../typings/story';
import React from 'react';
const _structure = `
`;
export const createStoryBuilder = (content?: any, config?: any) => {
const defaultContent = {
description: 'This is description',
do: ['this', 'that'],
dont: ['one', 'two'],
featureExamples: [
{
title: 'Structure',
description:
'Radio button consists of a radio itself and a label on the side.',
example: '_structure',
},
],
includedComponents: [],
commonUseCaseExamples: [],
accessibilityExmples: [],
examples: { _structure },
demo: ,
};
const defaultConfig = {
config: {
repoBaseURL: '',
story: {
testkit: true,
source: true,
},
},
story: defaultContent,
exampleImport: 'import',
storyName: 'Story',
};
const outputContent = content || defaultContent;
const outputConfig = config || defaultConfig;
return {
input: JSON.stringify(storyPage(buildInput(outputContent), outputConfig)),
output: JSON.stringify(buildOutput(outputContent)),
addExamples: (examples: any) => {
if (!content) {
defaultContent.examples = { ...examples, _structure };
return createStoryBuilder(defaultContent);
}
content.examples = { ...examples, _structure };
console.log(content);
return createStoryBuilder(content);
},
addFeatureExample: (example: any) => {
if (!content) {
defaultContent.featureExamples = [example];
return createStoryBuilder(defaultContent);
}
content.featureExamples.push(example);
return createStoryBuilder(content);
},
addCommonUseCasesExample: (example: any) => {
if (!content) {
defaultContent.commonUseCaseExamples = [example];
return createStoryBuilder(defaultContent);
}
content.commonUseCaseExamples.push(example);
return createStoryBuilder(content);
},
addAccessibilityExample: (example: any) => {
if (!content) {
defaultContent.accessibilityExmples = [example];
return createStoryBuilder(defaultContent);
}
content.accessibilityExmples.push(example);
return createStoryBuilder(content);
},
addDescription: (description: string) => {
if (!content) {
defaultContent.description = description;
return createStoryBuilder(defaultContent);
}
content.description = description;
return createStoryBuilder(content);
},
addDoDont: (doDont: { do: string[]; dont: string[] }) => {
if (!content) {
defaultContent.do = doDont.do;
defaultContent.dont = doDont.dont;
return createStoryBuilder(defaultContent);
}
content.do = doDont.do;
content.dont = doDont.dont;
return createStoryBuilder(content);
},
addIncludedComponents: (includedComponents: IncludedComponent[]) => {
if (!content) {
defaultContent.includedComponents = includedComponents;
return createStoryBuilder(defaultContent);
}
content.includedComponents = includedComponents;
return createStoryBuilder(content);
},
addDemo: (demo: React.ReactElement | string) => {
if (!content) {
//@ts-expect-error
defaultContent.demo = demo;
return createStoryBuilder(defaultContent);
}
content.demo = demo;
return createStoryBuilder(content);
},
};
};
const buildInput = (content: any) => ({
type: SectionType.StoryPage,
content: {
description: content.description,
do: content.do,
dont: content.dont,
featureExamples: content.featureExamples,
includedComponents: content.includedComponents,
accessibilityExmples: content.accessibilityExmples,
commonUseCaseExamples: content.commonUseCaseExamples,
},
examples: content.examples,
demo: content.demo,
});
const buildOutput = (content: any) => {
const featureExamples = content.featureExamples
.map((example, index) => ({
type: 'example',
key: index,
title: example.title,
text: example.description,
source: content.examples[example.example],
compact: true,
wide: example.wide,
}))
.filter(example => example.source);
const commonUseCaseExamples = content.commonUseCaseExamples
.map((example, index) => ({
type: 'example',
key: index,
title: example.title,
text: example.description,
source: content.examples[example.example],
compact: true,
wide: example.wide,
}))
.filter(example => example.source);
const accessibilityExmples = content.accessibilityExmples
.map((example, index) => ({
type: 'example',
key: index,
title: example.title,
text: example.description,
source: content.examples[example.example],
compact: true,
wide: example.wide,
}))
.filter(example => example.source);
const doDontModule = () => {
if (!content.do.length && !content.dont.length) {
return null;
}
return {
type: 'doDont',
do: { list: content.do },
dont: { list: content.dont },
};
};
const demoModule = () => {
if (!content.demo) {
return null;
}
if (typeof content.demo === 'string') {
return {
type: 'example',
title: 'Demo',
source: content.demo,
compact: true,
hideCodeEditor: true,
wide: true,
};
}
return {
title: 'Demo',
type: 'demo',
component: content.demo,
};
};
const includedComponentsModule = () => {
if (!content.includedComponents) {
return null;
}
return {
title: 'Included Components',
type: 'includedComponents',
component: content.includedComponents,
};
};
const showCommonUseCaseExamples = content.commonUseCaseExamples.length;
const showAccessibilityExmples = content.accessibilityExmples.length;
const showIncludedComponents = content.includedComponents.length;
return [
{ type: 'header', sourceUrl: '/Story', source: true },
{
type: 'tabs',
tabs: [
{
title: 'Design',
type: 'tab',
sections: [
demoModule(),
{
type: 'description',
text: content.description || 'This is description',
title: 'Usage',
},
doDontModule(),
{ title: 'Import', type: 'importExample', source: 'import' },
showIncludedComponents && includedComponentsModule(),
{ type: 'divider' },
{ type: 'title', title: 'Variations' },
...featureExamples,
showCommonUseCaseExamples && { type: 'divider' },
showCommonUseCaseExamples && {
type: 'title',
title: 'Common use cases',
},
...commonUseCaseExamples,
showAccessibilityExmples && { type: 'divider' },
showAccessibilityExmples && {
type: 'title',
title: 'Accessibility Considerations',
},
...accessibilityExmples,
{ type: 'divider' },
{ type: 'title', title: 'Feedback' },
{ type: 'description' },
].filter(item => !!item),
},
{ title: 'API', type: 'tab', sections: [{ type: 'api' }] },
{ title: 'Testkit', type: 'tab', sections: [{ type: 'testkit' }] },
],
},
];
};