diff --git a/.storybook/main.ts b/.storybook/main.ts index 01e54d80..230a9c0f 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -30,6 +30,8 @@ const config = { use: [{loader: 'markdown-loader'}], }); + storybookBaseConfig.module.rules[0].exclude = [/node_modules/, /\.test.(tsx?|jsx?)$/]; + // to turn fileName in context.parameters into path form number in production bundle storybookBaseConfig.optimization.moduleIds = 'named'; diff --git a/src/blocks/Author/Author.tsx b/src/blocks/Author/Author.tsx index 7aded8e8..ef23e6fa 100644 --- a/src/blocks/Author/Author.tsx +++ b/src/blocks/Author/Author.tsx @@ -53,3 +53,5 @@ export const Author: React.FC = (props) => { ); }; + +export default Author; diff --git a/src/blocks/Author/__stories__/Author.stories.tsx b/src/blocks/Author/__stories__/Author.stories.tsx index b8433793..6a194a76 100644 --- a/src/blocks/Author/__stories__/Author.stories.tsx +++ b/src/blocks/Author/__stories__/Author.stories.tsx @@ -8,7 +8,7 @@ import customBlocks from '../../../constructor/blocksMap'; import {PostPageContext} from '../../../contexts/PostPageContext'; import {BLOCKS} from '../../../demo/constants'; import {AuthorProps} from '../../../models/blocks'; -import {BlockType, PostData} from '../../../models/common'; +import {BlockInColumnsType, PostData} from '../../../models/common'; import {Author} from '../Author'; import post from '../../../../.mocks/post.json'; @@ -22,7 +22,7 @@ export default { } as Meta; type AuthorModel = { - type: BlockType.Author; + type: BlockInColumnsType.Author; } & AuthorProps; const DefaultTemplate: Story = (args) => ( @@ -34,7 +34,7 @@ const DefaultTemplate: Story = (args) => ( export const Default = DefaultTemplate.bind({}); Default.args = { - type: BlockType.Author, + type: BlockInColumnsType.Author, authorId: 290, ...getDefaultStoryArgs(), }; diff --git a/src/blocks/Author/schema.ts b/src/blocks/Author/schema.ts index 8e7cc984..c233fbcf 100644 --- a/src/blocks/Author/schema.ts +++ b/src/blocks/Author/schema.ts @@ -4,11 +4,11 @@ const { common: {BlockBaseProps}, } = validators; -import {BlockType} from '../../models/common'; +import {BlockInColumnsType} from '../../models/common'; import {BlogBlockBase} from '../../schema/common'; export const Author = { - [BlockType.Author]: { + [BlockInColumnsType.Author]: { type: 'object', additionalProperties: false, required: ['authorId'], diff --git a/src/blocks/Banner/Banner.tsx b/src/blocks/Banner/Banner.tsx index 01bc456a..e887ec1b 100644 --- a/src/blocks/Banner/Banner.tsx +++ b/src/blocks/Banner/Banner.tsx @@ -63,3 +63,5 @@ export const Banner: React.FC = ({ ); }; + +export default Banner; diff --git a/src/blocks/Banner/__stories__/Banner.stories.tsx b/src/blocks/Banner/__stories__/Banner.stories.tsx index 6761a9f2..5d19d9da 100644 --- a/src/blocks/Banner/__stories__/Banner.stories.tsx +++ b/src/blocks/Banner/__stories__/Banner.stories.tsx @@ -8,7 +8,7 @@ import customBlocks from '../../../constructor/blocksMap'; import {PostPageContext} from '../../../contexts/PostPageContext'; import {BLOCKS} from '../../../demo/constants'; import {BannerProps} from '../../../models/blocks'; -import {BlockType, PostData} from '../../../models/common'; +import {BlockInColumnsType, PostData} from '../../../models/common'; import {Banner} from '../Banner'; import post from '../../../../.mocks/post.json'; @@ -27,7 +27,7 @@ export default { } as Meta; type BannerModel = { - type: BlockType.Banner; + type: BlockInColumnsType.Banner; } & BannerProps; const DefaultTemplate: Story = (args) => ( @@ -39,7 +39,7 @@ const DefaultTemplate: Story = (args) => ( export const Default = DefaultTemplate.bind({}); Default.args = { - type: BlockType.Banner, + type: BlockInColumnsType.Banner, color: '#7ccea0', ...getDefaultStoryArgs(), title: 'Lorem', diff --git a/src/blocks/Banner/schema.ts b/src/blocks/Banner/schema.ts index 47b8f4c8..280d5d52 100644 --- a/src/blocks/Banner/schema.ts +++ b/src/blocks/Banner/schema.ts @@ -1,6 +1,6 @@ import {validators} from '@gravity-ui/page-constructor'; -import {BlockType} from '../../models/common'; +import {BlockInColumnsType} from '../../models/common'; import {BlogBlockBase} from '../../schema/common'; const { @@ -9,7 +9,7 @@ const { } = validators; export const Banner = { - [BlockType.Banner]: { + [BlockInColumnsType.Banner]: { type: 'object', additionalProperties: false, required: ['title', 'text', 'image'], diff --git a/src/blocks/CTA/CTA.tsx b/src/blocks/CTA/CTA.tsx index 80efd1f7..95251345 100644 --- a/src/blocks/CTA/CTA.tsx +++ b/src/blocks/CTA/CTA.tsx @@ -48,3 +48,5 @@ export const CTA: React.FC = ({items, paddingTop, paddingBottom}) => { ); }; + +export default CTA; diff --git a/src/blocks/CTA/__stories__/CTA.stories.tsx b/src/blocks/CTA/__stories__/CTA.stories.tsx index 6930f77e..7c75c542 100644 --- a/src/blocks/CTA/__stories__/CTA.stories.tsx +++ b/src/blocks/CTA/__stories__/CTA.stories.tsx @@ -8,7 +8,7 @@ import customBlocks from '../../../constructor/blocksMap'; import {PostPageContext} from '../../../contexts/PostPageContext'; import {BLOCKS} from '../../../demo/constants'; import {CTAProps} from '../../../models/blocks'; -import {BlockType, PostData} from '../../../models/common'; +import {BlockInColumnsType, PostData} from '../../../models/common'; import {CTA} from '../CTA'; import contentBlocks from '../../../../.mocks/contentBlocks.json'; @@ -23,7 +23,7 @@ export default { } as Meta; type CTAModel = { - type: BlockType.CTA; + type: BlockInColumnsType.CTA; } & CTAProps; const DefaultTemplate: Story = (args) => ( @@ -40,37 +40,37 @@ export const FiveItems = DefaultTemplate.bind({}); export const SixItems = DefaultTemplate.bind({}); Default.args = { - type: BlockType.CTA, + type: BlockInColumnsType.CTA, ...getDefaultStoryArgs(), items: contentBlocks.slice(0, 3), }; OneItem.args = { - type: BlockType.CTA, + type: BlockInColumnsType.CTA, ...getDefaultStoryArgs(), items: contentBlocks.slice(0, 1), }; TwoItems.args = { - type: BlockType.CTA, + type: BlockInColumnsType.CTA, ...getDefaultStoryArgs(), items: contentBlocks.slice(0, 2), }; FourItems.args = { - type: BlockType.CTA, + type: BlockInColumnsType.CTA, ...getDefaultStoryArgs(), items: contentBlocks.slice(0, 4), }; FiveItems.args = { - type: BlockType.CTA, + type: BlockInColumnsType.CTA, ...getDefaultStoryArgs(), items: contentBlocks.slice(0, 5), }; SixItems.args = { - type: BlockType.CTA, + type: BlockInColumnsType.CTA, ...getDefaultStoryArgs(), items: contentBlocks.slice(0, 6), }; diff --git a/src/blocks/CTA/schema.ts b/src/blocks/CTA/schema.ts index b399ffa0..758ab9f6 100644 --- a/src/blocks/CTA/schema.ts +++ b/src/blocks/CTA/schema.ts @@ -1,6 +1,6 @@ import {validators} from '@gravity-ui/page-constructor'; -import {BlockType} from '../../models/common'; +import {BlockInColumnsType} from '../../models/common'; import {BlogBlockBase} from '../../schema/common'; const { @@ -9,7 +9,7 @@ const { } = validators; export const CTA = { - [BlockType.CTA]: { + [BlockInColumnsType.CTA]: { type: 'object', additionalProperties: false, required: ['items'], diff --git a/src/blocks/ColoredText/ColoredText.tsx b/src/blocks/ColoredText/ColoredText.tsx index d3940110..ef7c4ee8 100644 --- a/src/blocks/ColoredText/ColoredText.tsx +++ b/src/blocks/ColoredText/ColoredText.tsx @@ -48,3 +48,5 @@ export const ColoredText: React.FC = ({ ); }; + +export default ColoredText; diff --git a/src/blocks/ColoredText/__stories__/ColoredText.stories.tsx b/src/blocks/ColoredText/__stories__/ColoredText.stories.tsx index a7ecac31..4b5fdc16 100644 --- a/src/blocks/ColoredText/__stories__/ColoredText.stories.tsx +++ b/src/blocks/ColoredText/__stories__/ColoredText.stories.tsx @@ -7,7 +7,7 @@ import customBlocks from '../../../constructor/blocksMap'; import {PostPageContext} from '../../../contexts/PostPageContext'; import {BLOCKS} from '../../../demo/constants'; import {ColoredTextProps} from '../../../models/blocks'; -import {BlockType, PostData} from '../../../models/common'; +import {BlockInColumnsType, PostData} from '../../../models/common'; import {ColoredText} from '../ColoredText'; import post from '../../../../.mocks/post.json'; @@ -21,7 +21,7 @@ export default { } as Meta; type ColoredTextModel = { - type: BlockType.ColoredText; + type: BlockInColumnsType.ColoredText; } & ColoredTextProps; const DefaultTemplate: Story = (args) => ( @@ -33,7 +33,7 @@ const DefaultTemplate: Story = (args) => ( export const Default = DefaultTemplate.bind({}); Default.args = { - type: BlockType.ColoredText, + type: BlockInColumnsType.ColoredText, background: { color: '#000', image: 'https://storage.yandexcloud.net/cloud-www-assets/constructor/storybook/images/img_8-12_light.png', diff --git a/src/blocks/ColoredText/schema.ts b/src/blocks/ColoredText/schema.ts index 0afc3950..6a76e507 100644 --- a/src/blocks/ColoredText/schema.ts +++ b/src/blocks/ColoredText/schema.ts @@ -1,6 +1,6 @@ import {validators} from '@gravity-ui/page-constructor'; -import {BlockType} from '../../models/common'; +import {BlockInColumnsType} from '../../models/common'; import {BlogBlockBase} from '../../schema/common'; const { @@ -25,7 +25,7 @@ const BackgroundProps = { }; export const ColoredText = { - [BlockType.ColoredText]: { + [BlockInColumnsType.ColoredText]: { type: 'object', additionalProperties: false, required: ['text'], diff --git a/src/blocks/Feed/__stories__/Feed.stories.tsx b/src/blocks/Feed/__stories__/Feed.stories.tsx index 7daf84a0..2678cd0a 100644 --- a/src/blocks/Feed/__stories__/Feed.stories.tsx +++ b/src/blocks/Feed/__stories__/Feed.stories.tsx @@ -10,7 +10,7 @@ import {FeedContext} from '../../../contexts/FeedContext'; import {BLOCKS} from '../../../demo/constants'; import {FeedProps} from '../../../models/blocks'; import { - BlockType, + BlockStandsAloneType, GetPostsRequest, GetPostsType, PostsProps, @@ -32,7 +32,7 @@ export default { } as Meta; type FeedModel = { - type: BlockType.Feed; + type: BlockStandsAloneType.Feed; } & FeedProps; const getPosts: GetPostsType = async (query: GetPostsRequest) => { @@ -84,7 +84,7 @@ const DefaultTemplate: Story = (args) => ( export const Default = DefaultTemplate.bind({}); Default.args = { - type: BlockType.Feed, + type: BlockStandsAloneType.Feed, color: '#000', imageSize: 'm', ...getDefaultStoryArgs(), diff --git a/src/blocks/Feed/schema.ts b/src/blocks/Feed/schema.ts index 1ff3da34..399f9501 100644 --- a/src/blocks/Feed/schema.ts +++ b/src/blocks/Feed/schema.ts @@ -4,10 +4,10 @@ const { common: {TitleProps, BlockBaseProps}, } = validators; -import {BlockType} from '../../models/common'; +import {BlockStandsAloneType} from '../../models/common'; export const Feed = { - [BlockType.Feed]: { + [BlockStandsAloneType.Feed]: { additionalProperties: false, required: [], properties: { diff --git a/src/blocks/Header/__stories__/Header.stories.tsx b/src/blocks/Header/__stories__/Header.stories.tsx index 5895b0b4..257986c8 100644 --- a/src/blocks/Header/__stories__/Header.stories.tsx +++ b/src/blocks/Header/__stories__/Header.stories.tsx @@ -8,7 +8,7 @@ import customBlocks from '../../../constructor/blocksMap'; import {PostPageContext} from '../../../contexts/PostPageContext'; import {BLOCKS} from '../../../demo/constants'; import {HeaderProps} from '../../../models/blocks'; -import {BlockType, PostData} from '../../../models/common'; +import {BlockStandsAloneType, PostData} from '../../../models/common'; import {Header} from '../Header'; import post from '../../../../.mocks/post.json'; @@ -22,7 +22,7 @@ export default { } as Meta; type HeaderModel = { - type: BlockType.Header; + type: BlockStandsAloneType.Header; } & HeaderProps; const DefaultTemplate: Story = (args) => ( @@ -34,6 +34,6 @@ const DefaultTemplate: Story = (args) => ( export const Default = DefaultTemplate.bind({}); Default.args = { - type: BlockType.Header, + type: BlockStandsAloneType.Header, ...getDefaultStoryArgs(), }; diff --git a/src/blocks/Header/schema.ts b/src/blocks/Header/schema.ts index e75354e7..fcba98ed 100644 --- a/src/blocks/Header/schema.ts +++ b/src/blocks/Header/schema.ts @@ -1,6 +1,6 @@ import {validators} from '@gravity-ui/page-constructor'; -import {BlockType} from '../../models/common'; +import {BlockStandsAloneType} from '../../models/common'; import {BlogBlockBase} from '../../schema/common'; const { @@ -9,7 +9,7 @@ const { } = validators; export const Header = { - [BlockType.Header]: { + [BlockStandsAloneType.Header]: { type: 'object', additionalProperties: false, properties: { diff --git a/src/blocks/Layout/Layout.tsx b/src/blocks/Layout/Layout.tsx index 0385b50d..325b3de1 100644 --- a/src/blocks/Layout/Layout.tsx +++ b/src/blocks/Layout/Layout.tsx @@ -1,4 +1,4 @@ -import React, {ReactElement, useMemo} from 'react'; +import React, {useMemo} from 'react'; import { Col, @@ -8,7 +8,9 @@ import { } from '@gravity-ui/page-constructor'; import {Wrapper} from '../../components/Wrapper/Wrapper'; +import {ColumnContext} from '../../contexts/ColumnContext'; import {LayoutProps} from '../../models/blocks'; +import {Column} from '../../models/common'; import {PaddingsDirections} from '../../models/paddings'; import {block} from '../../utils/cn'; @@ -27,11 +29,6 @@ type LayoutType = { rightCol: ColLayouts; }; -type SortedLayoutItems = { - left: ReactElement[]; - right: ReactElement[]; -}; - export const Layout: React.FC = ({ fullWidth, mobileOrder, @@ -68,27 +65,14 @@ export const Layout: React.FC = ({ return layoutConfig; }, [fullWidth, mobileOrder]); - const renderChildren = (blockChildren: React.ReactChild[]) => - React.Children.map(blockChildren, (child, i) => ( -
- {child} -
- )); - - const {left, right} = useMemo( - () => - children?.reduce( - (sortedChildren: SortedLayoutItems, child: ReactElement) => { - if (child?.props?.data?.column === 'left') { - sortedChildren.left.push(child); - } else { - sortedChildren.right.push(child); - } - return sortedChildren; - }, - {left: [], right: []}, - ), - [children], + const renderChildren = (blockChildren: React.ReactChild[], column = 'right' as Column) => ( + + {React.Children.map(blockChildren, (child, i) => ( +
+ {child} +
+ ))} +
); return ( @@ -100,10 +84,10 @@ export const Layout: React.FC = ({ > - {left && renderChildren(left)} + {renderChildren(children, 'left')} - {right && renderChildren(right)} + {renderChildren(children, 'right')} diff --git a/src/blocks/Layout/__stories__/Layout.stories.tsx b/src/blocks/Layout/__stories__/Layout.stories.tsx index 006f3f1a..2d13c95f 100644 --- a/src/blocks/Layout/__stories__/Layout.stories.tsx +++ b/src/blocks/Layout/__stories__/Layout.stories.tsx @@ -8,7 +8,7 @@ import customBlocks from '../../../constructor/blocksMap'; import {PostPageContext} from '../../../contexts/PostPageContext'; import {BLOCKS} from '../../../demo/constants'; import {LayoutProps} from '../../../models/blocks'; -import {BlockType, PostData} from '../../../models/common'; +import {BlockStandsAloneType, PostData} from '../../../models/common'; import {Layout} from '../Layout'; import layoutBlock from '../../../../.mocks/layoutBlock.json'; @@ -23,7 +23,7 @@ export default { } as Meta; type LayoutModel = { - type: BlockType.Layout; + type: BlockStandsAloneType.Layout; } & LayoutProps; const DefaultTemplate: Story = (args) => ( @@ -35,7 +35,7 @@ const DefaultTemplate: Story = (args) => ( export const Default = DefaultTemplate.bind({}); Default.args = { - type: BlockType.Layout, + type: BlockStandsAloneType.Layout, ...getDefaultStoryArgs(), children: layoutBlock.children, }; diff --git a/src/blocks/Layout/schema.ts b/src/blocks/Layout/schema.ts index 6bcb7437..a04dbf57 100644 --- a/src/blocks/Layout/schema.ts +++ b/src/blocks/Layout/schema.ts @@ -4,11 +4,11 @@ const { common: {BlockBaseProps, ChildrenProps}, } = validators; -import {BlockType} from '../../models/common'; +import {BlockStandsAloneType} from '../../models/common'; import {BlogBlockBase} from '../../schema/common'; export const Layout = { - [BlockType.Layout]: { + [BlockStandsAloneType.Layout]: { type: 'object', additionalProperties: false, required: ['children'], diff --git a/src/blocks/Media/Media.tsx b/src/blocks/Media/Media.tsx index 59eb6c28..86ec7beb 100644 --- a/src/blocks/Media/Media.tsx +++ b/src/blocks/Media/Media.tsx @@ -40,3 +40,5 @@ export const Media: React.FC = ({text, paddingTop, paddingBottom, .. )} ); + +export default Media; diff --git a/src/blocks/Media/__stories__/Media.stories.tsx b/src/blocks/Media/__stories__/Media.stories.tsx index d0e57213..e5c6fdbe 100644 --- a/src/blocks/Media/__stories__/Media.stories.tsx +++ b/src/blocks/Media/__stories__/Media.stories.tsx @@ -10,7 +10,7 @@ import { } from '../../../../.mocks/utils'; import {BLOCKS} from '../../../demo/constants'; import {MediaProps} from '../../../models/blocks'; -import {BlockType} from '../../../models/common'; +import {BlockInColumnsType} from '../../../models/common'; import {Media} from '../Media'; export default { @@ -22,7 +22,7 @@ export default { } as Meta; type MediaModel = { - type: BlockType.Media; + type: BlockInColumnsType.Media; } & MediaProps; const DefaultTemplate: Story = (args) => ( @@ -37,6 +37,6 @@ const DefaultTemplate: Story = (args) => ( export const Default = DefaultTemplate.bind({}); Default.args = { - type: BlockType.Media, + type: BlockInColumnsType.Media, ...getDefaultStoryArgs(), }; diff --git a/src/blocks/Media/schema.ts b/src/blocks/Media/schema.ts index 1f1b2f91..9b02d909 100644 --- a/src/blocks/Media/schema.ts +++ b/src/blocks/Media/schema.ts @@ -1,6 +1,6 @@ import {validators} from '@gravity-ui/page-constructor'; -import {BlockType} from '../../models/common'; +import {BlockInColumnsType} from '../../models/common'; import {BlogBlockBase} from '../../schema/common'; const { @@ -8,7 +8,7 @@ const { } = validators; export const Media = { - [BlockType.Media]: { + [BlockInColumnsType.Media]: { type: 'object', additionalProperties: false, properties: { diff --git a/src/blocks/Meta/Meta.tsx b/src/blocks/Meta/Meta.tsx index 9d538177..9966f085 100644 --- a/src/blocks/Meta/Meta.tsx +++ b/src/blocks/Meta/Meta.tsx @@ -79,3 +79,5 @@ export const Meta: React.FC = (props) => { ); }; + +export default Meta; diff --git a/src/blocks/Meta/__stories__/Meta.stories.tsx b/src/blocks/Meta/__stories__/Meta.stories.tsx index 4ec2fd1a..c9d6f768 100644 --- a/src/blocks/Meta/__stories__/Meta.stories.tsx +++ b/src/blocks/Meta/__stories__/Meta.stories.tsx @@ -7,7 +7,7 @@ import customBlocks from '../../../constructor/blocksMap'; import {PostPageContext} from '../../../contexts/PostPageContext'; import {BLOCKS} from '../../../demo/constants'; import {MetaProps} from '../../../models/blocks'; -import {BlockType, PostData} from '../../../models/common'; +import {BlockInColumnsType, PostData} from '../../../models/common'; import {Meta as MetaBlock} from '../Meta'; import post from '../../../../.mocks/post.json'; @@ -21,7 +21,7 @@ export default { } as Meta; type MetaModel = { - type: BlockType.Meta; + type: BlockInColumnsType.Meta; } & MetaProps; const DefaultTemplate: Story = (args) => ( @@ -33,7 +33,7 @@ const DefaultTemplate: Story = (args) => ( export const Default = DefaultTemplate.bind({}); Default.args = { - type: BlockType.Meta, + type: BlockInColumnsType.Meta, paddingBottom: 'l', paddingTop: 'l', }; diff --git a/src/blocks/Meta/schema.ts b/src/blocks/Meta/schema.ts index 860ad999..94bf0c0a 100644 --- a/src/blocks/Meta/schema.ts +++ b/src/blocks/Meta/schema.ts @@ -4,11 +4,11 @@ const { common: {BlockBaseProps}, } = validators; -import {BlockType} from '../../models/common'; +import {BlockInColumnsType} from '../../models/common'; import {BlogBlockBase} from '../../schema/common'; export const Meta = { - [BlockType.Meta]: { + [BlockInColumnsType.Meta]: { type: 'object', additionalProperties: false, properties: { diff --git a/src/blocks/Suggest/__stories__/Suggest.stories.tsx b/src/blocks/Suggest/__stories__/Suggest.stories.tsx index 52b11ddc..19bfded7 100644 --- a/src/blocks/Suggest/__stories__/Suggest.stories.tsx +++ b/src/blocks/Suggest/__stories__/Suggest.stories.tsx @@ -7,7 +7,7 @@ import customBlocks from '../../../constructor/blocksMap'; import {PostPageContext} from '../../../contexts/PostPageContext'; import {BLOCKS} from '../../../demo/constants'; import {SuggestProps} from '../../../models/blocks'; -import {BlockType} from '../../../models/common'; +import {BlockStandsAloneType} from '../../../models/common'; import {Suggest} from '../Suggest'; import post from '../../../../.mocks/post.json'; @@ -22,7 +22,7 @@ export default { } as Meta; type SuggestModel = { - type: BlockType.Suggest; + type: BlockStandsAloneType.Suggest; } & SuggestProps; const DefaultTemplate: Story = (args) => ( @@ -34,7 +34,7 @@ const DefaultTemplate: Story = (args) => ( export const Default = DefaultTemplate.bind({}); Default.args = { - type: BlockType.Suggest, + type: BlockStandsAloneType.Suggest, paddingBottom: 'l', paddingTop: 'l', }; diff --git a/src/blocks/Suggest/schema.ts b/src/blocks/Suggest/schema.ts index 305b8a29..f379141f 100644 --- a/src/blocks/Suggest/schema.ts +++ b/src/blocks/Suggest/schema.ts @@ -4,11 +4,11 @@ const { common: {BlockBaseProps}, } = validators; -import {BlockType} from '../../models/common'; +import {BlockStandsAloneType} from '../../models/common'; import {BlogBlockBase} from '../../schema/common'; export const Suggest = { - [BlockType.Suggest]: { + [BlockStandsAloneType.Suggest]: { type: 'object', additionalProperties: false, properties: { diff --git a/src/blocks/YFM/YFM.tsx b/src/blocks/YFM/YFM.tsx index 1577e7c0..450796bc 100644 --- a/src/blocks/YFM/YFM.tsx +++ b/src/blocks/YFM/YFM.tsx @@ -30,3 +30,5 @@ export const YFM: React.FC = (props) => { ); }; + +export default YFM; diff --git a/src/blocks/YFM/__stories__/YFM.stories.tsx b/src/blocks/YFM/__stories__/YFM.stories.tsx index 20e847ec..be5cf478 100644 --- a/src/blocks/YFM/__stories__/YFM.stories.tsx +++ b/src/blocks/YFM/__stories__/YFM.stories.tsx @@ -8,7 +8,7 @@ import customBlocks from '../../../constructor/blocksMap'; import {PostPageContext} from '../../../contexts/PostPageContext'; import {BLOCKS} from '../../../demo/constants'; import {YFMProps} from '../../../models/blocks'; -import {BlockType, PostData} from '../../../models/common'; +import {BlockInColumnsType, PostData} from '../../../models/common'; import {YFM} from '../YFM'; import post from '../../../../.mocks/post.json'; @@ -22,7 +22,7 @@ export default { } as Meta; type YFMModel = { - type: BlockType.YFM; + type: BlockInColumnsType.YFM; } & YFMProps; const DefaultTemplate: Story = (args) => ( @@ -34,7 +34,7 @@ const DefaultTemplate: Story = (args) => ( export const Default = DefaultTemplate.bind({}); Default.args = { - type: BlockType.YFM, + type: BlockInColumnsType.YFM, ...getDefaultStoryArgs(), text: '

Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

', }; diff --git a/src/blocks/YFM/schema.ts b/src/blocks/YFM/schema.ts index 8ba52dbc..243e45cd 100644 --- a/src/blocks/YFM/schema.ts +++ b/src/blocks/YFM/schema.ts @@ -4,11 +4,11 @@ const { common: {BlockBaseProps}, } = validators; -import {BlockType} from '../../models/common'; +import {BlockInColumnsType} from '../../models/common'; import {BlogBlockBase} from '../../schema/common'; export const YFM = { - [BlockType.YFM]: { + [BlockInColumnsType.YFM]: { type: 'object', additionalProperties: false, required: ['text'], diff --git a/src/constructor/blocksMap.ts b/src/constructor/blocksMap.ts index 91d10e0f..c96a9cfa 100644 --- a/src/constructor/blocksMap.ts +++ b/src/constructor/blocksMap.ts @@ -1,31 +1,29 @@ -import {Author} from '../blocks/Author/Author'; -import {Banner} from '../blocks/Banner/Banner'; -import {CTA} from '../blocks/CTA/CTA'; -import {ColoredText} from '../blocks/ColoredText/ColoredText'; import {Feed} from '../blocks/Feed/Feed'; import {Header} from '../blocks/Header/Header'; import {Layout} from '../blocks/Layout/Layout'; -import {Media} from '../blocks/Media/Media'; -import {Meta} from '../blocks/Meta/Meta'; import {Suggest} from '../blocks/Suggest/Suggest'; -import {YFM} from '../blocks/YFM/YFM'; -import {BlockType} from '../models/common'; +import {withColumnSelection} from '../hocs/withColumnSelection'; +import {BlockInColumnsType, BlockStandsAloneType} from '../models/common'; + +const blocksInColumns = Object.entries(BlockInColumnsType).reduce( + (blocks, [blockName, blockKey]) => { + const block = require(`../blocks/${blockName}/${blockName}.tsx`).default; + blocks[blockKey] = withColumnSelection(block); + + return blocks; + }, + {} as Record, +); const blocks = { - [BlockType.YFM]: YFM, - [BlockType.Layout]: Layout, - [BlockType.Media]: Media, - [BlockType.Banner]: Banner, - [BlockType.CTA]: CTA, - [BlockType.ColoredText]: ColoredText, - [BlockType.Author]: Author, - [BlockType.Suggest]: Suggest, - [BlockType.Meta]: Meta, - [BlockType.Feed]: Feed, + ...blocksInColumns, + [BlockStandsAloneType.Layout]: Layout, + [BlockStandsAloneType.Suggest]: Suggest, + [BlockStandsAloneType.Feed]: Feed, }; const headers = { - [BlockType.Header]: Header, + [BlockStandsAloneType.Header]: Header, }; export default {blocks, headers}; diff --git a/src/contexts/ColumnContext.ts b/src/contexts/ColumnContext.ts new file mode 100644 index 00000000..8c065e49 --- /dev/null +++ b/src/contexts/ColumnContext.ts @@ -0,0 +1,5 @@ +import React from 'react'; + +import {Column} from '../models/common'; + +export const ColumnContext = React.createContext('right'); diff --git a/src/data/config.ts b/src/data/config.ts index 9ed923a0..746183cf 100644 --- a/src/data/config.ts +++ b/src/data/config.ts @@ -1,9 +1,13 @@ import {BlockType as PCBlockType} from '@gravity-ui/page-constructor'; import {yfmTransformer} from '@gravity-ui/page-constructor/server'; -import {BlockType} from '../models/common'; +import {BlockInColumnsType, BlockType} from '../models/common'; -const BLOCKS_FOR_TYPOGRAPHY_TRANSFORM = [BlockType.YFM, BlockType.ColoredText, BlockType.Media]; +const BLOCKS_FOR_TYPOGRAPHY_TRANSFORM = [ + BlockInColumnsType.YFM, + BlockInColumnsType.ColoredText, + BlockInColumnsType.Media, +]; type GetConfigForCreateReadableContent = () => { [x in BlockType | PCBlockType]: { diff --git a/src/data/createReadableContent.ts b/src/data/createReadableContent.ts index 61f96660..a4fea7dc 100644 --- a/src/data/createReadableContent.ts +++ b/src/data/createReadableContent.ts @@ -1,5 +1,5 @@ import {Block} from '../models/blocks'; -import {BlockType} from '../models/common'; +import {BlockInColumnsType} from '../models/common'; import {getConfigForCreateReadableContent} from './config'; @@ -37,7 +37,7 @@ export const createReadableContent = ({ innerContent += '\n'; } - if (block.type === BlockType.Author) { + if (block.type === BlockInColumnsType.Author) { authors.push(block.uid); } diff --git a/src/hocs/withColumnSelection.tsx b/src/hocs/withColumnSelection.tsx new file mode 100644 index 00000000..1a59462e --- /dev/null +++ b/src/hocs/withColumnSelection.tsx @@ -0,0 +1,18 @@ +import React, {useContext} from 'react'; + +import {ColumnContext} from '../contexts/ColumnContext'; +import {ColumnProps} from '../index'; + +export const withColumnSelection = (WrappedComponent: React.ElementType) => { + const Component = ({column, ...props}: T & ColumnProps) => { + const renderingColumn = useContext(ColumnContext); + + if (column && column !== renderingColumn) { + return null; + } + + return ; + }; + + return Component; +}; diff --git a/src/models/blocks.ts b/src/models/blocks.ts index a7121412..aa914b30 100644 --- a/src/models/blocks.ts +++ b/src/models/blocks.ts @@ -7,7 +7,7 @@ import { TextTheme, } from '@gravity-ui/page-constructor'; -import {BlockType, ClassNameProps, PostData} from './common'; +import {BlockInColumnsType, BlockStandsAloneType, ClassNameProps, PostData} from './common'; import {PaddingsYFMProps} from './paddings'; // blocks props @@ -68,47 +68,47 @@ export type FeedProps = { // blocks models export type AuthorBlockModel = { - type: BlockType.Author; + type: BlockInColumnsType.Author; } & AuthorProps; export type BannerBlockModel = { - type: BlockType.Banner; + type: BlockInColumnsType.Banner; } & BannerProps; export type ColoredTextBlockModel = { - type: BlockType.ColoredText; + type: BlockInColumnsType.ColoredText; } & ColoredTextProps; export type CTABlockModel = { - type: BlockType.CTA; + type: BlockInColumnsType.CTA; } & CTAProps; export type HeaderBlockModel = { - type: BlockType.Header; + type: BlockStandsAloneType.Header; } & HeaderProps; export type LayoutBlockModel = { - type: BlockType.Layout; + type: BlockStandsAloneType.Layout; } & LayoutProps; export type MediaBlockModel = { - type: BlockType.Media; + type: BlockInColumnsType.Media; } & MediaProps; export type MetaBlockModel = { - type: BlockType.Meta; + type: BlockInColumnsType.Meta; } & MetaProps; export type SuggestBlockModel = { - type: BlockType.Suggest; + type: BlockStandsAloneType.Suggest; } & SuggestProps; export type YFMBlockModel = { - type: BlockType.YFM; + type: BlockInColumnsType.YFM; } & YFMProps; export type FeedBlockModel = { - type: BlockType.Feed; + type: BlockStandsAloneType.Feed; } & FeedProps; export type BlockModel = diff --git a/src/models/common.ts b/src/models/common.ts index e8b57252..d148a0f6 100644 --- a/src/models/common.ts +++ b/src/models/common.ts @@ -10,10 +10,16 @@ export enum Theme { Dark = 'dark', } +export type Column = 'left' | 'right'; + export interface ClassNameProps { className?: string; } +export interface ColumnProps { + column?: Column; +} + export type Author = { id: number; avatar: string | null; @@ -99,20 +105,25 @@ export interface PostData { noIndex?: boolean; } -export enum BlockType { - Header = 'blog-header-block', +export enum BlockInColumnsType { YFM = 'blog-yfm-block', - Layout = 'blog-layout-block', Media = 'blog-media-block', Banner = 'blog-banner-block', CTA = 'blog-cta-block', ColoredText = 'blog-colored-text-block', Author = 'blog-author-block', - Suggest = 'blog-suggest-block', Meta = 'blog-meta-block', +} + +export enum BlockStandsAloneType { + Header = 'blog-header-block', + Layout = 'blog-layout-block', + Suggest = 'blog-suggest-block', Feed = 'blog-feed-block', } +export type BlockType = BlockInColumnsType | BlockStandsAloneType; + export type MetaProps = { metaComponent: JSX.Element; needHelmetWrapper: boolean; diff --git a/src/schema/index.ts b/src/schema/index.ts index cddaaeeb..92b7488b 100644 --- a/src/schema/index.ts +++ b/src/schema/index.ts @@ -1,4 +1,4 @@ -import {BlockType} from '../models/common'; +import {BlockInColumnsType, BlockStandsAloneType} from '../models/common'; import * as blocks from './blocks'; import * as headers from './headers'; @@ -13,18 +13,19 @@ export const validators = { export const schemasForCustom = { headers: { - [BlockType.Header]: Header, + [BlockStandsAloneType.Header]: Header, }, blocks: { - [BlockType.Author]: Author, - [BlockType.Banner]: Banner, - [BlockType.ColoredText]: ColoredText, - [BlockType.CTA]: CTA, - [BlockType.Feed]: Feed, - [BlockType.Layout]: Layout, - [BlockType.Media]: Media, - [BlockType.Meta]: Meta, - [BlockType.Suggest]: Suggest, - [BlockType.YFM]: YFM, + [BlockInColumnsType.Author]: Author, + [BlockInColumnsType.Banner]: Banner, + [BlockInColumnsType.ColoredText]: ColoredText, + [BlockInColumnsType.CTA]: CTA, + [BlockInColumnsType.Media]: Media, + [BlockInColumnsType.Meta]: Meta, + [BlockInColumnsType.YFM]: YFM, + + [BlockStandsAloneType.Feed]: Feed, + [BlockStandsAloneType.Layout]: Layout, + [BlockStandsAloneType.Suggest]: Suggest, }, };