From b02c39da2d5a642763083b257c35f23ad20a233e Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 7 Oct 2023 17:14:45 -0500 Subject: [PATCH] Delete Bundle component, use Suspense and React.lazy --- src/actions/bundles.ts | 28 ------- src/components/attachment-thumbs.tsx | 27 +++---- src/components/birthday-input.tsx | 25 +++--- src/components/profile-hover-card.tsx | 15 ++-- src/components/status-media.tsx | 78 +++++++++---------- src/containers/soapbox.tsx | 14 ++-- .../chats/components/chat-message.tsx | 24 +++--- .../compose/components/compose-form.tsx | 36 ++++----- .../compose/components/schedule-form.tsx | 31 ++++---- .../containers/schedule-form-container.tsx | 14 ---- .../report/components/status-check-box.tsx | 51 +++++------- src/features/ui/components/bundle.tsx | 23 ------ src/features/ui/components/modal-loading.tsx | 2 - src/features/ui/components/modal-root.tsx | 16 ++-- .../compose-event-modal.tsx | 71 ++++++++--------- .../modals/edit-announcement-modal.tsx | 45 +++++------ .../ui/components/pinned-accounts-panel.tsx | 5 +- src/features/ui/components/profile-field.tsx | 13 +--- .../ui/containers/bundle-container.tsx | 3 - src/features/ui/index.tsx | 26 ++----- src/features/ui/util/react-router-helpers.tsx | 41 ++++------ src/pages/admin-page.tsx | 6 +- src/pages/default-page.tsx | 17 +--- src/pages/event-page.tsx | 21 ++--- src/pages/events-page.tsx | 13 +--- src/pages/group-page.tsx | 19 ++--- src/pages/groups-page.tsx | 23 +----- src/pages/groups-pending-page.tsx | 13 +--- src/pages/home-page.tsx | 39 +++------- src/pages/landing-page.tsx | 13 +--- src/pages/manage-groups-page.tsx | 10 +-- src/pages/profile-page.tsx | 34 ++------ src/pages/remote-instance-page.tsx | 15 +--- src/pages/search-page.tsx | 23 ++---- src/pages/status-page.tsx | 19 ++--- 35 files changed, 275 insertions(+), 578 deletions(-) delete mode 100644 src/actions/bundles.ts delete mode 100644 src/features/compose/containers/schedule-form-container.tsx delete mode 100644 src/features/ui/components/bundle.tsx delete mode 100644 src/features/ui/containers/bundle-container.tsx diff --git a/src/actions/bundles.ts b/src/actions/bundles.ts deleted file mode 100644 index fc5ef9321..000000000 --- a/src/actions/bundles.ts +++ /dev/null @@ -1,28 +0,0 @@ -const BUNDLE_FETCH_REQUEST = 'BUNDLE_FETCH_REQUEST'; -const BUNDLE_FETCH_SUCCESS = 'BUNDLE_FETCH_SUCCESS'; -const BUNDLE_FETCH_FAIL = 'BUNDLE_FETCH_FAIL'; - -const fetchBundleRequest = (skipLoading?: boolean) => ({ - type: BUNDLE_FETCH_REQUEST, - skipLoading, -}); - -const fetchBundleSuccess = (skipLoading?: boolean) => ({ - type: BUNDLE_FETCH_SUCCESS, - skipLoading, -}); - -const fetchBundleFail = (error: any, skipLoading?: boolean) => ({ - type: BUNDLE_FETCH_FAIL, - error, - skipLoading, -}); - -export { - BUNDLE_FETCH_REQUEST, - BUNDLE_FETCH_SUCCESS, - BUNDLE_FETCH_FAIL, - fetchBundleRequest, - fetchBundleSuccess, - fetchBundleFail, -}; diff --git a/src/components/attachment-thumbs.tsx b/src/components/attachment-thumbs.tsx index 1ec694667..c5a017408 100644 --- a/src/components/attachment-thumbs.tsx +++ b/src/components/attachment-thumbs.tsx @@ -1,7 +1,6 @@ -import React from 'react'; +import React, { Suspense } from 'react'; import { openModal } from 'soapbox/actions/modals'; -import Bundle from 'soapbox/features/ui/components/bundle'; import { MediaGallery } from 'soapbox/features/ui/util/async-components'; import { useAppDispatch } from 'soapbox/hooks'; @@ -18,23 +17,21 @@ const AttachmentThumbs = (props: IAttachmentThumbs) => { const { media, onClick, sensitive } = props; const dispatch = useAppDispatch(); - const renderLoading = () =>
; + const fallback =
; const onOpenMedia = (media: ImmutableList, index: number) => dispatch(openModal('MEDIA', { media, index })); return (
- - {(Component: any) => ( - - )} - + + + {onClick && (
diff --git a/src/components/birthday-input.tsx b/src/components/birthday-input.tsx index a35e85055..62043bd51 100644 --- a/src/components/birthday-input.tsx +++ b/src/components/birthday-input.tsx @@ -2,7 +2,6 @@ import React, { useMemo } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import IconButton from 'soapbox/components/icon-button'; -import BundleContainer from 'soapbox/features/ui/containers/bundle-container'; import { DatePicker } from 'soapbox/features/ui/util/async-components'; import { useInstance, useFeatures } from 'soapbox/hooks'; @@ -114,19 +113,17 @@ const BirthdayInput: React.FC = ({ value, onChange, required }) return (
- - {Component => ()} - +
); }; diff --git a/src/components/profile-hover-card.tsx b/src/components/profile-hover-card.tsx index ddb89e11e..9c06dd92c 100644 --- a/src/components/profile-hover-card.tsx +++ b/src/components/profile-hover-card.tsx @@ -12,7 +12,6 @@ import { import { useAccount, usePatronUser } from 'soapbox/api/hooks'; import Badge from 'soapbox/components/badge'; import ActionButton from 'soapbox/features/ui/components/action-button'; -import BundleContainer from 'soapbox/features/ui/containers/bundle-container'; import { UserPanel } from 'soapbox/features/ui/util/async-components'; import { useAppSelector, useAppDispatch } from 'soapbox/hooks'; import { isLocal } from 'soapbox/utils/accounts'; @@ -112,15 +111,11 @@ export const ProfileHoverCard: React.FC = ({ visible = true } - - {Component => ( - } - badges={badges} - /> - )} - + } + badges={badges} + /> {isLocal(account) ? ( diff --git a/src/components/status-media.tsx b/src/components/status-media.tsx index 00975e224..7147e3a54 100644 --- a/src/components/status-media.tsx +++ b/src/components/status-media.tsx @@ -1,16 +1,14 @@ -import React from 'react'; +import React, { Suspense } from 'react'; import { openModal } from 'soapbox/actions/modals'; import AttachmentThumbs from 'soapbox/components/attachment-thumbs'; import { GroupLinkPreview } from 'soapbox/features/groups/components/group-link-preview'; import PlaceholderCard from 'soapbox/features/placeholder/components/placeholder-card'; import Card from 'soapbox/features/status/components/card'; -import Bundle from 'soapbox/features/ui/components/bundle'; import { MediaGallery, Video, Audio } from 'soapbox/features/ui/util/async-components'; import { useAppDispatch } from 'soapbox/hooks'; import type { List as ImmutableList } from 'immutable'; -import type VideoType from 'soapbox/features/video'; import type { Status, Attachment } from 'soapbox/types/entities'; interface IStatusMedia { @@ -70,54 +68,48 @@ const StatusMedia: React.FC = ({ const video = firstAttachment; media = ( - - {(Component: typeof VideoType) => ( - - )} - + + ); } else if (size === 1 && firstAttachment.type === 'audio') { const attachment = firstAttachment; media = ( - - {(Component: any) => ( - - )} - + + ); } else { media = ( - - {(Component: any) => ( - - )} - + + + ); } } else if (status.spoiler_text.length === 0 && !status.quote && status.card?.group) { diff --git a/src/containers/soapbox.tsx b/src/containers/soapbox.tsx index 9df5b7a19..d60f8eec0 100644 --- a/src/containers/soapbox.tsx +++ b/src/containers/soapbox.tsx @@ -1,6 +1,6 @@ import { QueryClientProvider } from '@tanstack/react-query'; import clsx from 'clsx'; -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, Suspense } from 'react'; import { Toaster } from 'react-hot-toast'; import { IntlProvider } from 'react-intl'; import { Provider } from 'react-redux'; @@ -18,7 +18,6 @@ import Helmet from 'soapbox/components/helmet'; import LoadingScreen from 'soapbox/components/loading-screen'; import { StatProvider } from 'soapbox/contexts/stat-context'; import EmbeddedStatus from 'soapbox/features/embedded-status'; -import BundleContainer from 'soapbox/features/ui/containers/bundle-container'; import { ModalContainer, OnboardingWizard, @@ -87,9 +86,9 @@ const SoapboxMount = () => { /** Render the onboarding flow. */ const renderOnboarding = () => ( - - {(Component) => } - + }> + + ); /** Render the auth layout or UI. */ @@ -127,10 +126,7 @@ const SoapboxMount = () => { {renderBody()} - - {Component => } - - +
diff --git a/src/features/chats/components/chat-message.tsx b/src/features/chats/components/chat-message.tsx index 373be7f12..9b65eabf9 100644 --- a/src/features/chats/components/chat-message.tsx +++ b/src/features/chats/components/chat-message.tsx @@ -10,7 +10,6 @@ import { initReport, ReportableEntities } from 'soapbox/actions/reports'; import DropdownMenu from 'soapbox/components/dropdown-menu'; import { HStack, Icon, Stack, Text } from 'soapbox/components/ui'; import emojify from 'soapbox/features/emoji'; -import Bundle from 'soapbox/features/ui/components/bundle'; import { MediaGallery } from 'soapbox/features/ui/util/async-components'; import { useAppDispatch, useAppSelector, useFeatures } from 'soapbox/hooks'; import { ChatKeys, IChat, useChatActions } from 'soapbox/queries/chats'; @@ -22,7 +21,6 @@ import ChatMessageReaction from './chat-message-reaction'; import ChatMessageReactionWrapper from './chat-message-reaction-wrapper/chat-message-reaction-wrapper'; import type { Menu as IMenu } from 'soapbox/components/dropdown-menu'; -import type { IMediaGallery } from 'soapbox/components/media-gallery'; import type { ChatMessage as ChatMessageEntity } from 'soapbox/types/entities'; const messages = defineMessages({ @@ -111,19 +109,15 @@ const ChatMessage = (props: IChatMessage) => { if (!chatMessage.media_attachments.size) return null; return ( - - {(Component: React.FC) => ( - - )} - + ); }; diff --git a/src/features/compose/components/compose-form.tsx b/src/features/compose/components/compose-form.tsx index 849f6cf80..97bb5d958 100644 --- a/src/features/compose/components/compose-form.tsx +++ b/src/features/compose/components/compose-form.tsx @@ -17,14 +17,12 @@ import AutosuggestInput, { AutoSuggestion } from 'soapbox/components/autosuggest import AutosuggestTextarea from 'soapbox/components/autosuggest-textarea'; import { Button, HStack, Stack } from 'soapbox/components/ui'; import EmojiPickerDropdown from 'soapbox/features/emoji/containers/emoji-picker-dropdown-container'; -import Bundle from 'soapbox/features/ui/components/bundle'; -import { ComposeEditor } from 'soapbox/features/ui/util/async-components'; +import { ComposeEditor, ScheduleForm } from 'soapbox/features/ui/util/async-components'; import { useAppDispatch, useAppSelector, useCompose, useDraggedFiles, useFeatures, useInstance, usePrevious } from 'soapbox/hooks'; import { isMobile } from 'soapbox/is-mobile'; import QuotedStatusContainer from '../containers/quoted-status-container'; import ReplyIndicatorContainer from '../containers/reply-indicator-container'; -import ScheduleFormContainer from '../containers/schedule-form-container'; import UploadButtonContainer from '../containers/upload-button-container'; import WarningContainer from '../containers/warning-container'; import { $createEmojiNode } from '../editor/nodes/emoji-node'; @@ -260,7 +258,7 @@ const ComposeForm = ({ id, shouldCondense, autoFocus, clickab ref={spoilerTextRef} /> - + ); @@ -313,23 +311,19 @@ const ComposeForm = ({ id, shouldCondense, autoFocus, clickab {!shouldCondense && !event && !group && }
- - {(Component: any) => ( - - )} - + {composeModifiers}
diff --git a/src/features/compose/components/schedule-form.tsx b/src/features/compose/components/schedule-form.tsx index 074d1b234..aab6b8864 100644 --- a/src/features/compose/components/schedule-form.tsx +++ b/src/features/compose/components/schedule-form.tsx @@ -5,7 +5,6 @@ import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { setSchedule, removeSchedule } from 'soapbox/actions/compose'; import IconButton from 'soapbox/components/icon-button'; import { HStack, Stack, Text } from 'soapbox/components/ui'; -import BundleContainer from 'soapbox/features/ui/containers/bundle-container'; import { DatePicker } from 'soapbox/features/ui/util/async-components'; import { useAppDispatch, useCompose } from 'soapbox/hooks'; @@ -55,22 +54,20 @@ const ScheduleForm: React.FC = ({ composeId }) => { - - {Component => ()} - + = (props) => ( - - {Component => } - -); - -export default ScheduleFormContainer; diff --git a/src/features/report/components/status-check-box.tsx b/src/features/report/components/status-check-box.tsx index d8d9c0eb4..b8cb48015 100644 --- a/src/features/report/components/status-check-box.tsx +++ b/src/features/report/components/status-check-box.tsx @@ -6,7 +6,6 @@ import StatusContent from 'soapbox/components/status-content'; import { Toggle } from 'soapbox/components/ui'; import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; -import Bundle from '../../ui/components/bundle'; import { MediaGallery, Video, Audio } from '../../ui/util/async-components'; interface IStatusCheckBox { @@ -35,22 +34,16 @@ const StatusCheckBox: React.FC = ({ id, disabled }) => { if (video) { media = ( - - {(Component: any) => ( - - )} - +