Load panels async

merge-requests/772/head
Alex Gleason 3 years ago
parent fe4a8b5728
commit b0e37c773e
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7

@ -4,7 +4,8 @@ import { useSelector, useDispatch } from 'react-redux';
import { makeGetAccount } from 'soapbox/selectors'; import { makeGetAccount } from 'soapbox/selectors';
import { injectIntl, FormattedMessage } from 'react-intl'; import { injectIntl, FormattedMessage } from 'react-intl';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import UserPanel from 'soapbox/features/ui/components/user_panel'; import BundleContainer from 'soapbox/features/ui/containers/bundle_container';
import { UserPanel } from 'soapbox/features/ui/util/async-components';
import ActionButton from 'soapbox/features/ui/components/action_button'; import ActionButton from 'soapbox/features/ui/components/action_button';
import { isAdmin, isModerator } from 'soapbox/utils/accounts'; import { isAdmin, isModerator } from 'soapbox/utils/accounts';
import Badge from 'soapbox/components/badge'; import Badge from 'soapbox/components/badge';
@ -74,7 +75,9 @@ export const ProfileHoverCard = ({ visible }) => {
<FormattedMessage id='account.follows_you' defaultMessage='Follows you' /> <FormattedMessage id='account.follows_you' defaultMessage='Follows you' />
</span>} </span>}
<div className='profile-hover-card__action-button'><ActionButton account={account} small /></div> <div className='profile-hover-card__action-button'><ActionButton account={account} small /></div>
<UserPanel className='profile-hover-card__user' accountId={account.get('id')} /> <BundleContainer fetchComponent={UserPanel}>
{Component => <Component className='profile-hover-card__user' accountId={account.get('id')} />}
</BundleContainer>
{badges.length > 0 && {badges.length > 0 &&
<div className='profile-hover-card__badges'> <div className='profile-hover-card__badges'>
{badges} {badges}

@ -15,8 +15,6 @@ import UI from '../features/ui';
// import Introduction from '../features/introduction'; // import Introduction from '../features/introduction';
import { preload } from '../actions/preload'; import { preload } from '../actions/preload';
import { IntlProvider } from 'react-intl'; import { IntlProvider } from 'react-intl';
import { previewState as previewMediaState } from 'soapbox/features/ui/components/media_modal';
import { previewState as previewVideoState } from 'soapbox/features/ui/components/video_modal';
import ErrorBoundary from '../components/error_boundary'; import ErrorBoundary from '../components/error_boundary';
import { fetchInstance } from 'soapbox/actions/instance'; import { fetchInstance } from 'soapbox/actions/instance';
import { fetchSoapboxConfig } from 'soapbox/actions/soapbox'; import { fetchSoapboxConfig } from 'soapbox/actions/soapbox';
@ -30,6 +28,9 @@ import { FE_SUBDIRECTORY } from 'soapbox/build_config';
const validLocale = locale => Object.keys(messages).includes(locale); const validLocale = locale => Object.keys(messages).includes(locale);
const previewMediaState = 'previewMediaModal';
const previewVideoState = 'previewVideoModal';
export const store = configureStore(); export const store = configureStore();
store.dispatch(preload()); store.dispatch(preload());

@ -290,6 +290,30 @@ export function ModerationLog() {
return import(/* webpackChunkName: "features/admin/moderation_log" */'../../admin/moderation_log'); return import(/* webpackChunkName: "features/admin/moderation_log" */'../../admin/moderation_log');
} }
export function UserPanel() {
return import(/* webpackChunkName: "features/ui" */'../components/user_panel');
}
export function FeaturesPanel() {
return import(/* webpackChunkName: "features/ui" */'../components/features_panel');
}
export function PromoPanel() {
return import(/* webpackChunkName: "features/ui" */'../components/promo_panel');
}
export function SignUpPanel() {
return import(/* webpackChunkName: "features/ui" */'../components/sign_up_panel');
}
export function FundingPanel() {
return import(/* webpackChunkName: "features/ui" */'../components/funding_panel');
}
export function TrendsPanel() {
return import(/* webpackChunkName: "features/trends" */'../components/trends_panel');
}
export function CryptoDonate() { export function CryptoDonate() {
return import(/* webpackChunkName: "features/crypto_donate" */'../../crypto_donate'); return import(/* webpackChunkName: "features/crypto_donate" */'../../crypto_donate');
} }

@ -2,11 +2,13 @@ import React from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
import BundleContainer from 'soapbox/features/ui/containers/bundle_container'; import BundleContainer from 'soapbox/features/ui/containers/bundle_container';
import { WhoToFollowPanel } from 'soapbox/features/ui/util/async-components'; import {
import TrendsPanel from 'soapbox/features/ui/components/trends_panel'; WhoToFollowPanel,
import PromoPanel from 'soapbox/features/ui/components/promo_panel'; TrendsPanel,
import FeaturesPanel from 'soapbox/features/ui/components/features_panel'; PromoPanel,
import SignUpPanel from 'soapbox/features/ui/components/sign_up_panel'; FeaturesPanel,
SignUpPanel,
} from 'soapbox/features/ui/util/async-components';
import LinkFooter from 'soapbox/features/ui/components/link_footer'; import LinkFooter from 'soapbox/features/ui/components/link_footer';
import { getFeatures } from 'soapbox/utils/features'; import { getFeatures } from 'soapbox/utils/features';
@ -44,14 +46,28 @@ class DefaultPage extends ImmutablePureComponent {
<div className='columns-area__panels__pane columns-area__panels__pane--right'> <div className='columns-area__panels__pane columns-area__panels__pane--right'>
<div className='columns-area__panels__pane__inner'> <div className='columns-area__panels__pane__inner'>
{me ? <FeaturesPanel key='features-panel' /> : <SignUpPanel key='sign-up-panel' />} {me ? (
{showTrendsPanel && <TrendsPanel limit={3} key='trends-panel' />} <BundleContainer fetchComponent={FeaturesPanel}>
{Component => <Component key='features-panel' />}
</BundleContainer>
) : (
<BundleContainer fetchComponent={SignUpPanel}>
{Component => <Component key='sign-up-panel' />}
</BundleContainer>
)}
{showTrendsPanel && (
<BundleContainer fetchComponent={TrendsPanel}>
{Component => <Component key='trends-panel' />}
</BundleContainer>
)}
{showWhoToFollowPanel && ( {showWhoToFollowPanel && (
<BundleContainer fetchComponent={WhoToFollowPanel}> <BundleContainer fetchComponent={WhoToFollowPanel}>
{Component => <Component limit={5} key='wtf-panel' />} {Component => <Component limit={5} key='wtf-panel' />}
</BundleContainer> </BundleContainer>
)} )}
<PromoPanel key='promo-panel' /> <BundleContainer fetchComponent={PromoPanel}>
{Component => <Component key='promo-panel' />}
</BundleContainer>
<LinkFooter key='link-footer' /> <LinkFooter key='link-footer' />
</div> </div>
</div> </div>

@ -5,14 +5,17 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
import BundleContainer from '../features/ui/containers/bundle_container'; import BundleContainer from '../features/ui/containers/bundle_container';
import ComposeFormContainer from '../features/compose/containers/compose_form_container'; import ComposeFormContainer from '../features/compose/containers/compose_form_container';
import Avatar from '../components/avatar'; import Avatar from '../components/avatar';
import UserPanel from 'soapbox/features/ui/components/user_panel'; import {
import TrendsPanel from 'soapbox/features/ui/components/trends_panel'; WhoToFollowPanel,
import PromoPanel from 'soapbox/features/ui/components/promo_panel'; CryptoDonatePanel,
import FundingPanel from 'soapbox/features/ui/components/funding_panel'; UserPanel,
import { WhoToFollowPanel, CryptoDonatePanel } from 'soapbox/features/ui/util/async-components'; TrendsPanel,
PromoPanel,
FundingPanel,
FeaturesPanel,
SignUpPanel,
} from 'soapbox/features/ui/util/async-components';
// import GroupSidebarPanel from '../features/groups/sidebar_panel'; // import GroupSidebarPanel from '../features/groups/sidebar_panel';
import FeaturesPanel from 'soapbox/features/ui/components/features_panel';
import SignUpPanel from 'soapbox/features/ui/components/sign_up_panel';
import LinkFooter from 'soapbox/features/ui/components/link_footer'; import LinkFooter from 'soapbox/features/ui/components/link_footer';
import { getSoapboxConfig } from 'soapbox/actions/soapbox'; import { getSoapboxConfig } from 'soapbox/actions/soapbox';
import { getFeatures } from 'soapbox/utils/features'; import { getFeatures } from 'soapbox/utils/features';
@ -56,8 +59,14 @@ class HomePage extends ImmutablePureComponent {
<div className='columns-area__panels__pane columns-area__panels__pane--left'> <div className='columns-area__panels__pane columns-area__panels__pane--left'>
<div className='columns-area__panels__pane__inner'> <div className='columns-area__panels__pane__inner'>
<UserPanel accountId={me} key='user-panel' /> <BundleContainer fetchComponent={UserPanel}>
{showFundingPanel && <FundingPanel key='funding-panel' />} {Component => <Component accountId={me} key='user-panel' />}
</BundleContainer>
{showFundingPanel && (
<BundleContainer fetchComponent={FundingPanel}>
{Component => <Component key='funding-panel' />}
</BundleContainer>
)}
{showCryptoDonatePanel && ( {showCryptoDonatePanel && (
<BundleContainer fetchComponent={CryptoDonatePanel}> <BundleContainer fetchComponent={CryptoDonatePanel}>
{Component => <Component limit={cryptoLimit} key='crypto-panel' />} {Component => <Component limit={cryptoLimit} key='crypto-panel' />}
@ -85,14 +94,28 @@ class HomePage extends ImmutablePureComponent {
<div className='columns-area__panels__pane columns-area__panels__pane--right'> <div className='columns-area__panels__pane columns-area__panels__pane--right'>
<div className='columns-area__panels__pane__inner'> <div className='columns-area__panels__pane__inner'>
{me ? <FeaturesPanel key='features-panel' /> : <SignUpPanel key='sign-up-panel' />} {me ? (
{showTrendsPanel && <TrendsPanel limit={3} key='trends-panel' />} <BundleContainer fetchComponent={FeaturesPanel}>
{Component => <Component key='features-panel' />}
</BundleContainer>
) : (
<BundleContainer fetchComponent={SignUpPanel}>
{Component => <Component key='sign-up-panel' />}
</BundleContainer>
)}
{showTrendsPanel && (
<BundleContainer fetchComponent={TrendsPanel}>
{Component => <Component key='trends-panel' />}
</BundleContainer>
)}
{showWhoToFollowPanel && ( {showWhoToFollowPanel && (
<BundleContainer fetchComponent={WhoToFollowPanel}> <BundleContainer fetchComponent={WhoToFollowPanel}>
{Component => <Component limit={5} key='wtf-panel' />} {Component => <Component limit={5} key='wtf-panel' />}
</BundleContainer> </BundleContainer>
)} )}
<PromoPanel key='promo-panel' /> <BundleContainer fetchComponent={PromoPanel}>
{Component => <Component key='promo-panel' />}
</BundleContainer>
<LinkFooter key='link-footer' /> <LinkFooter key='link-footer' />
</div> </div>
</div> </div>

@ -6,9 +6,11 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
import Helmet from 'soapbox/components/helmet'; import Helmet from 'soapbox/components/helmet';
import HeaderContainer from '../features/account_timeline/containers/header_container'; import HeaderContainer from '../features/account_timeline/containers/header_container';
import BundleContainer from 'soapbox/features/ui/containers/bundle_container'; import BundleContainer from 'soapbox/features/ui/containers/bundle_container';
import { WhoToFollowPanel } from 'soapbox/features/ui/util/async-components'; import {
WhoToFollowPanel,
SignUpPanel,
} from 'soapbox/features/ui/util/async-components';
import LinkFooter from '../features/ui/components/link_footer'; import LinkFooter from '../features/ui/components/link_footer';
import SignUpPanel from '../features/ui/components/sign_up_panel';
import ProfileInfoPanel from '../features/ui/components/profile_info_panel'; import ProfileInfoPanel from '../features/ui/components/profile_info_panel';
import ProfileMediaPanel from '../features/ui/components/profile_media_panel'; import ProfileMediaPanel from '../features/ui/components/profile_media_panel';
import { getAcct } from 'soapbox/utils/accounts'; import { getAcct } from 'soapbox/utils/accounts';
@ -99,7 +101,9 @@ class ProfilePage extends ImmutablePureComponent {
<div className='columns-area__panels__pane columns-area__panels__pane--right'> <div className='columns-area__panels__pane columns-area__panels__pane--right'>
<div className='columns-area__panels__pane__inner'> <div className='columns-area__panels__pane__inner'>
<SignUpPanel /> <BundleContainer fetchComponent={SignUpPanel}>
{Component => <Component />}
</BundleContainer>
{account && <ProfileMediaPanel account={account} />} {account && <ProfileMediaPanel account={account} />}
{features.suggestions && ( {features.suggestions && (
<BundleContainer fetchComponent={WhoToFollowPanel}> <BundleContainer fetchComponent={WhoToFollowPanel}>

@ -1,8 +1,11 @@
import React from 'react'; import React from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
import PromoPanel from 'soapbox/features/ui/components/promo_panel'; import BundleContainer from 'soapbox/features/ui/containers/bundle_container';
import FeaturesPanel from 'soapbox/features/ui/components/features_panel'; import {
PromoPanel,
FeaturesPanel,
} from 'soapbox/features/ui/util/async-components';
import LinkFooter from 'soapbox/features/ui/components/link_footer'; import LinkFooter from 'soapbox/features/ui/components/link_footer';
import InstanceInfoPanel from 'soapbox/features/ui/components/instance_info_panel'; import InstanceInfoPanel from 'soapbox/features/ui/components/instance_info_panel';
import InstanceModerationPanel from 'soapbox/features/ui/components/instance_moderation_panel'; import InstanceModerationPanel from 'soapbox/features/ui/components/instance_moderation_panel';
@ -46,8 +49,14 @@ class RemoteInstancePage extends ImmutablePureComponent {
<div className='columns-area__panels__pane columns-area__panels__pane--right'> <div className='columns-area__panels__pane columns-area__panels__pane--right'>
<div className='columns-area__panels__pane__inner'> <div className='columns-area__panels__pane__inner'>
{me && <FeaturesPanel key='features-panel' />} {me && (
<PromoPanel key='promo-panel' /> <BundleContainer fetchComponent={FeaturesPanel}>
{Component => <Component key='features-panel' />}
</BundleContainer>
)}
<BundleContainer fetchComponent={PromoPanel}>
{Component => <Component key='promo-panel' />}
</BundleContainer>
<LinkFooter key='link-footer' /> <LinkFooter key='link-footer' />
</div> </div>
</div> </div>

Loading…
Cancel
Save