Skip to content

Commit af055fc

Browse files
persovt2Ilya Mitin
andauthored
fix: dynamic imports in vite prod build (#1023)
Co-authored-by: Ilya Mitin <[email protected]>
1 parent 64c08d4 commit af055fc

File tree

2 files changed

+60
-32
lines changed

2 files changed

+60
-32
lines changed

src/editor/components/AddBlock/AddBlock.tsx

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
/* eslint-disable jsx-a11y/click-events-have-key-events */
33
// TODO fix in https://github.com/gravity-ui/page-constructor/issues/965
44

5-
import React, {PropsWithChildren, useMemo, useRef, useState} from 'react';
5+
import React, {PropsWithChildren, useEffect, useMemo, useRef, useState} from 'react';
66

77
import {Plus} from '@gravity-ui/icons';
88
import {Popup, TextInput} from '@gravity-ui/uikit';
99

1010
import {blockMap} from '../../../constructor-items';
1111
import {Block, BlockType, ClassNameProps} from '../../../models';
1212
import {block} from '../../../utils';
13-
import EditorBlocksData from '../../data';
13+
import {EditorBlocksData, getEditorBlocksData} from '../../data';
1414

1515
import './AddBlock.scss';
1616

@@ -25,16 +25,29 @@ const sortedBlockNames = Object.keys(blockMap).sort();
2525
const AddBlock = ({onAdd, className}: PropsWithChildren<AddBlockProps>) => {
2626
const [isOpened, setIsOpened] = useState(false);
2727
const [search, setSearch] = useState('');
28+
const [editorBlocksData, setEditorBlocksData] = useState<EditorBlocksData | null>(null);
29+
2830
const ref = useRef(null);
29-
const blocks = useMemo(
30-
() =>
31-
sortedBlockNames.filter((blockName) =>
32-
EditorBlocksData[blockName as BlockType].meta.title
33-
.toLocaleLowerCase()
34-
.startsWith(search.toLocaleLowerCase()),
35-
),
36-
[search],
37-
);
31+
const blocks = useMemo(() => {
32+
if (!editorBlocksData) {
33+
return [];
34+
}
35+
36+
return sortedBlockNames.filter((blockName) =>
37+
editorBlocksData[blockName as BlockType]?.meta.title
38+
.toLocaleLowerCase()
39+
.startsWith(search.toLocaleLowerCase()),
40+
);
41+
}, [editorBlocksData, search]);
42+
43+
useEffect(() => {
44+
const loadEditorBlocksData = async () => {
45+
const data = await getEditorBlocksData();
46+
setEditorBlocksData(data);
47+
};
48+
49+
loadEditorBlocksData();
50+
}, []);
3851

3952
return (
4053
<div className={b(null, className)} ref={ref}>
@@ -68,10 +81,14 @@ const AddBlock = ({onAdd, className}: PropsWithChildren<AddBlockProps>) => {
6881
</div>
6982
<div className={b('blocks')}>
7083
{blocks.map((blockName) => {
71-
const blockData = EditorBlocksData[blockName as BlockType];
72-
const Preview = blockData?.preview as React.FC<
73-
React.SVGProps<SVGSVGElement>
74-
>;
84+
const blockData = editorBlocksData?.[blockName as BlockType];
85+
86+
if (!blockData) {
87+
return null;
88+
}
89+
90+
const Preview: React.FC<React.SVGProps<SVGSVGElement>> =
91+
blockData.preview;
7592

7693
return (
7794
<div

src/editor/data/index.ts

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {Block, BlockType} from '../../models';
22
import {formatBlockName} from '../utils';
33

44
import DefaultPreview from './previews/default-preview';
5+
import HeaderBlock from './previews/header-block';
56

67
export type PreviewComponent = React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
78

@@ -14,33 +15,43 @@ export interface EdiorBlockData {
1415
};
1516
}
1617

17-
const getBlockTemplate = (blockType: BlockType) =>
18-
require(`./templates/${blockType}.json`) as Omit<EdiorBlockData, 'preview'>;
18+
const getBlockTemplate = (blockType: BlockType): Promise<Omit<EdiorBlockData, 'preview'>> =>
19+
import(`./templates/${blockType}.json`).then((data) => data.default);
1920

20-
const getBlockPreview = (blockType: BlockType) => {
21+
const getBlockPreview = (blockType: BlockType): PreviewComponent => {
2122
try {
22-
return require(`./previews/${blockType}.tsx`).default as PreviewComponent;
23+
if (blockType === BlockType.HeaderBlock) {
24+
return HeaderBlock;
25+
}
26+
27+
return DefaultPreview;
2328
} catch (err) {
2429
/*eslint-disable no-console */
2530
console.warn(`Preview image for ${blockType} not found`);
2631
return DefaultPreview;
2732
}
2833
};
2934

30-
const EditorBlocksData = Object.values(BlockType).reduce((previewData, blockType) => {
31-
const template = getBlockTemplate(blockType);
32-
const preview = getBlockPreview(blockType);
35+
type EditorBlocksData = Partial<Record<BlockType, EdiorBlockData>>;
36+
37+
async function getEditorBlocksData(): Promise<EditorBlocksData> {
38+
const EdiorBlockData: EditorBlocksData = {};
39+
40+
for (const blockType of Object.values(BlockType)) {
41+
const template = await getBlockTemplate(blockType as BlockType);
3342

34-
template.meta = template.meta || {};
35-
template.meta.title = template.meta.title || formatBlockName(blockType);
43+
const preview = getBlockPreview(blockType);
3644

37-
/* eslint-disable no-param-reassign */
38-
previewData[blockType] = {
39-
...template,
40-
preview,
41-
} as EdiorBlockData;
45+
template.meta = template.meta || {};
46+
template.meta.title = template.meta.title || formatBlockName(blockType);
4247

43-
return previewData;
44-
}, {} as Record<BlockType, EdiorBlockData>);
48+
EdiorBlockData[blockType] = {
49+
...template,
50+
preview,
51+
};
52+
}
53+
54+
return EdiorBlockData;
55+
}
4556

46-
export default EditorBlocksData;
57+
export {EditorBlocksData, getEditorBlocksData};

0 commit comments

Comments
 (0)