Skip to content

Commit ec115f7

Browse files
authored
perf(content-answers): lazy load content answers in preview (#3720)
* perf(content-answers): lazy load content answers in preview * fix: flow ignore for TS component
1 parent cccb0b0 commit ec115f7

5 files changed

Lines changed: 24 additions & 12 deletions

File tree

‎src/elements/common/content-answers/ContentAnswers.tsx‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,20 @@ import getProp from 'lodash/get';
44
import ContentAnswersModal, { ExternalProps as ContentAnswersModalExternalProps } from './ContentAnswersModal';
55
import ContentAnswersOpenButton from './ContentAnswersOpenButton';
66
// @ts-ignore: no ts definition
7-
// eslint-disable-next-line import/named
87
import { BoxItem } from '../../common/types/core';
98

109
interface ExternalProps extends ContentAnswersModalExternalProps {
1110
show?: boolean;
1211
}
1312

1413
interface Props {
14+
className?: string;
1515
file: BoxItem;
1616
}
1717

18-
const ContentAnswers = ({ file, onAsk, onRequestClose, ...rest }: ContentAnswersModalExternalProps & Props) => {
18+
const ContentAnswers = (props: ContentAnswersModalExternalProps & Props) => {
19+
const { className = '', file, onAsk, onRequestClose, ...rest } = props;
20+
1921
const [isModalOpen, setIsModalOpen] = useState(false);
2022
const [hasQuestions, setHasQuestions] = useState(false);
2123
const [isHighlighted, setIsHighlighted] = useState(false);
@@ -44,7 +46,7 @@ const ContentAnswers = ({ file, onAsk, onRequestClose, ...rest }: ContentAnswers
4446

4547
const currentExtension = getProp(file, 'extension');
4648
return (
47-
<div className="be-ContentAnswers">
49+
<div className={`be-ContentAnswers ${className}`}>
4850
<ContentAnswersOpenButton
4951
fileExtension={currentExtension}
5052
isHighlighted={isHighlighted}

‎src/elements/common/content-answers/ContentAnswersModal.tsx‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@ import { DOCUMENT_SUGGESTED_QUESTIONS, SPREADSHEET_FILE_EXTENSIONS } from './con
1515
import withCurrentUser from '../current-user';
1616

1717
// @ts-ignore: no ts definition
18-
// eslint-disable-next-line import/named
1918
import { BoxItem, User } from '../../../common/types/core';
2019
// @ts-ignore: no ts definition
2120
import APIFactory from '../../../api';
2221
// @ts-ignore: no ts definition
23-
// eslint-disable-next-line import/named
2422
import { ElementsXhrError } from '../../common/types/api';
2523

2624
import messages from './messages';

‎src/elements/content-preview/preview-header/PreviewHeader.js‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import type { IntlShape } from 'react-intl';
1010
import classNames from 'classnames';
1111
import getProp from 'lodash/get';
1212
import AsyncLoad from '../../common/async-load';
13-
// $FlowFixMe typescript component
14-
import ContentAnswers from '../../common/content-answers';
1513
import FileInfo from './FileInfo';
1614
import IconClose from '../../../icons/general/IconClose';
1715
import IconDownload from '../../../icons/general/IconDownloadSolid';
@@ -42,6 +40,10 @@ type Props = {
4240
token: ?string,
4341
};
4442

43+
const LoadableContentAnswers = AsyncLoad({
44+
// $FlowFixMe TypeScript component
45+
loader: () => import(/* webpackMode: "lazy", webpackChunkName: "content-answers" */ '../../common/content-answers'),
46+
});
4547
const LoadableContentOpenWith = AsyncLoad({
4648
loader: () => import(/* webpackMode: "lazy", webpackChunkName: "content-open-with" */ '../../content-open-with'),
4749
});
@@ -101,7 +103,13 @@ const PreviewHeader = ({
101103
{...contentOpenWithProps}
102104
/>
103105
)}
104-
{shouldRenderAnswers && <ContentAnswers file={file} {...contentAnswersProps} />}
106+
{shouldRenderAnswers && (
107+
<LoadableContentAnswers
108+
className="bcpr-PreviewHeader-contentAnswers"
109+
file={file}
110+
{...contentAnswersProps}
111+
/>
112+
)}
105113
{canAnnotate && (
106114
<>
107115
<PlainButton

‎src/elements/content-preview/preview-header/PreviewHeader.scss‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@
8989
.bcpr-PreviewHeader-controls {
9090
display: flex;
9191

92+
.bcpr-PreviewHeader-contentAnswers {
93+
display: flex;
94+
align-items: center;
95+
padding: 0 5px;
96+
}
97+
9298
.be & .bcpr-bcow-btn {
9399
margin: 0 10px 0 0;
94100
padding: 0 5px;

‎src/elements/content-preview/preview-header/__tests__/PreviewHeader.test.js‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import * as React from 'react';
22
import { shallow } from 'enzyme';
3-
4-
import ContentAnswers from '../../../common/content-answers';
53
import PreviewHeader from '..';
64

75
describe('elements/content-preview/preview-header/PreviewHeader', () => {
@@ -31,7 +29,7 @@ describe('elements/content-preview/preview-header/PreviewHeader', () => {
3129
const contentAnswersProps = { show };
3230
const wrapper = getWrapper({ contentAnswersProps, file });
3331

34-
expect(wrapper.exists(ContentAnswers)).toBe(expected);
32+
expect(wrapper.exists('.bcpr-PreviewHeader-contentAnswers')).toBe(expected);
3533
});
3634

3735
it('should render ContentAnswers correctly and provided the correct props', () => {
@@ -41,7 +39,7 @@ describe('elements/content-preview/preview-header/PreviewHeader', () => {
4139
contentAnswersProps,
4240
file,
4341
});
44-
expect(wrapper.find(ContentAnswers).prop('file')).toBe(file);
42+
expect(wrapper.find('.bcpr-PreviewHeader-contentAnswers').prop('file')).toBe(file);
4543
});
4644

4745
test.each([

0 commit comments

Comments
 (0)