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/hoc/group-lookup-hoc.tsx b/src/components/hoc/group-lookup-hoc.tsx deleted file mode 100644 index 570ec2e69..000000000 --- a/src/components/hoc/group-lookup-hoc.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import React from 'react'; - -import { useGroupLookup } from 'soapbox/api/hooks'; -import ColumnLoading from 'soapbox/features/ui/components/column-loading'; - -import { Layout } from '../ui'; - -interface IGroupLookup { - params: { - groupSlug: string; - }; -} - -interface IMaybeGroupLookup { - params?: { - groupSlug?: string; - groupId?: string; - }; -} - -function GroupLookupHoc(Component: React.ComponentType<{ params: { groupId: string } }>) { - const GroupLookup: React.FC = (props) => { - const { entity: group } = useGroupLookup(props.params.groupSlug); - - if (!group) return ( - <> - - - - - - - ); - - const newProps = { - ...props, - params: { - ...props.params, - id: group.id, - groupId: group.id, - }, - }; - - return ( - - ); - }; - - const MaybeGroupLookup: React.FC = (props) => { - const { params } = props; - - if (params?.groupId) { - return ; - } else { - return ; - } - }; - - return MaybeGroupLookup; -} - -export default GroupLookupHoc; \ No newline at end of file diff --git a/src/components/hoc/with-hoc.tsx b/src/components/hoc/with-hoc.tsx deleted file mode 100644 index d5752a45f..000000000 --- a/src/components/hoc/with-hoc.tsx +++ /dev/null @@ -1,11 +0,0 @@ -type HOC = (Component: React.ComponentType

) => React.ComponentType -type AsyncComponent

= () => Promise<{ default: React.ComponentType

}> - -const withHoc = (asyncComponent: AsyncComponent

, hoc: HOC) => { - return async () => { - const { default: component } = await asyncComponent(); - return { default: hoc(component) }; - }; -}; - -export default withHoc; \ No newline at end of file diff --git a/src/components/profile-hover-card.tsx b/src/components/profile-hover-card.tsx index f7517430e..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'; @@ -56,7 +55,7 @@ const handleMouseLeave = (dispatch: AppDispatch): React.MouseEventHandler => { }; interface IProfileHoverCard { - visible: boolean; + visible?: boolean; } /** Popup profile preview that appears when hovering avatars and display names. */ @@ -112,15 +111,11 @@ export const ProfileHoverCard: React.FC = ({ visible = true } - - {Component => ( - } - badges={badges} - /> - )} - + } + badges={badges} + /> {isLocal(account) ? ( diff --git a/src/components/status-hover-card.tsx b/src/components/status-hover-card.tsx index 5c31f9b4d..08359c61a 100644 --- a/src/components/status-hover-card.tsx +++ b/src/components/status-hover-card.tsx @@ -15,7 +15,7 @@ import { showStatusHoverCard } from './hover-status-wrapper'; import { Card, CardBody } from './ui'; interface IStatusHoverCard { - visible: boolean; + visible?: boolean; } /** Popup status preview that appears when hovering reply to */ 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/emoji/components/emoji-picker-dropdown.tsx b/src/features/emoji/components/emoji-picker-dropdown.tsx index 379ae9c5b..8917272b3 100644 --- a/src/features/emoji/components/emoji-picker-dropdown.tsx +++ b/src/features/emoji/components/emoji-picker-dropdown.tsx @@ -9,12 +9,10 @@ import { useAppDispatch, useAppSelector, useTheme } from 'soapbox/hooks'; import { RootState } from 'soapbox/store'; import { buildCustomEmojis } from '../../emoji'; -import { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components'; +import { EmojiPicker } from '../../ui/util/async-components'; import type { Emoji, CustomEmoji, NativeEmoji } from 'soapbox/features/emoji'; -let EmojiPicker: any; // load asynchronously - export const messages = defineMessages({ emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' }, emoji_pick: { id: 'emoji_button.pick', defaultMessage: 'Pick an emoji…' }, @@ -136,8 +134,6 @@ const EmojiPickerDropdown: React.FC = ({ const customEmojis = useAppSelector((state) => getCustomEmojis(state)); const frequentlyUsedEmojis = useAppSelector((state) => getFrequentlyUsedEmojis(state)); - const [loading, setLoading] = useState(false); - const handlePick = (emoji: any) => { setVisible(false); @@ -210,18 +206,6 @@ const EmojiPickerDropdown: React.FC = ({ } else { document.body.style.overflow = ''; } - - if (!EmojiPicker) { - setLoading(true); - - EmojiPickerAsync().then(EmojiMart => { - EmojiPicker = EmojiMart.Picker; - - setLoading(false); - }).catch(() => { - setLoading(false); - }); - } }, [visible]); useEffect(() => () => { @@ -231,23 +215,21 @@ const EmojiPickerDropdown: React.FC = ({ return ( visible ? ( - {!loading && ( - - )} + ) : null ); diff --git a/src/features/emoji/components/emoji-picker.tsx b/src/features/emoji/components/emoji-picker.tsx index 695fae2cc..6dd2b8064 100644 --- a/src/features/emoji/components/emoji-picker.tsx +++ b/src/features/emoji/components/emoji-picker.tsx @@ -13,7 +13,7 @@ const getImageURL = (set: string, name: string) => { return joinPublicPath(`/packs/emoji/${name}.svg`); }; -const Picker = (props: any) => { +const Picker: React.FC = (props) => { const ref = useRef(null); useEffect(() => { @@ -25,6 +25,4 @@ const Picker = (props: any) => { return
; }; -export { - Picker, -}; +export default Picker; 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) => ( - - )} - +