diff --git a/app/soapbox/components/domain.tsx b/app/soapbox/components/domain.tsx index 191dc3872..117b94120 100644 --- a/app/soapbox/components/domain.tsx +++ b/app/soapbox/components/domain.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { unblockDomain } from 'soapbox/actions/domain-blocks'; +import { useAppDispatch } from 'soapbox/hooks'; import { HStack, IconButton, Text } from './ui'; @@ -16,7 +16,7 @@ interface IDomain { } const Domain: React.FC = ({ domain }) => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); // const onBlockDomain = () => { diff --git a/app/soapbox/components/emoji-button-wrapper.tsx b/app/soapbox/components/emoji-button-wrapper.tsx index cc528b194..f0d287aa6 100644 --- a/app/soapbox/components/emoji-button-wrapper.tsx +++ b/app/soapbox/components/emoji-button-wrapper.tsx @@ -1,12 +1,11 @@ import classNames from 'clsx'; import React, { useState, useEffect, useRef } from 'react'; import { usePopper } from 'react-popper'; -import { useDispatch } from 'react-redux'; import { simpleEmojiReact } from 'soapbox/actions/emoji-reacts'; import { openModal } from 'soapbox/actions/modals'; import { EmojiSelector } from 'soapbox/components/ui'; -import { useAppSelector, useOwnAccount, useSoapboxConfig } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector, useOwnAccount, useSoapboxConfig } from 'soapbox/hooks'; import { isUserTouching } from 'soapbox/is-mobile'; import { getReactForStatus } from 'soapbox/utils/emoji-reacts'; @@ -17,7 +16,7 @@ interface IEmojiButtonWrapper { /** Provides emoji reaction functionality to the underlying button component */ const EmojiButtonWrapper: React.FC = ({ statusId, children }): JSX.Element | null => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const ownAccount = useOwnAccount(); const status = useAppSelector(state => state.statuses.get(statusId)); const soapboxConfig = useSoapboxConfig(); diff --git a/app/soapbox/components/sidebar-menu.tsx b/app/soapbox/components/sidebar-menu.tsx index 34fd62260..766d3dc87 100644 --- a/app/soapbox/components/sidebar-menu.tsx +++ b/app/soapbox/components/sidebar-menu.tsx @@ -2,7 +2,6 @@ import classNames from 'clsx'; import React from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { Link, NavLink } from 'react-router-dom'; import { fetchOwnAccounts, logOut, switchAccount } from 'soapbox/actions/auth'; @@ -11,7 +10,7 @@ import { closeSidebar } from 'soapbox/actions/sidebar'; import Account from 'soapbox/components/account'; import { Stack } from 'soapbox/components/ui'; import ProfileStats from 'soapbox/features/ui/components/profile-stats'; -import { useAppSelector, useFeatures } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector, useFeatures } from 'soapbox/hooks'; import { makeGetAccount, makeGetOtherAccounts } from 'soapbox/selectors'; import { Divider, HStack, Icon, IconButton, Text } from './ui'; @@ -81,7 +80,7 @@ const getOtherAccounts = makeGetOtherAccounts(); const SidebarMenu: React.FC = (): JSX.Element | null => { const intl = useIntl(); - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const features = useFeatures(); const getAccount = makeGetAccount(); diff --git a/app/soapbox/contexts/chat-context.tsx b/app/soapbox/contexts/chat-context.tsx index 5b72207c1..8c972a6d0 100644 --- a/app/soapbox/contexts/chat-context.tsx +++ b/app/soapbox/contexts/chat-context.tsx @@ -1,9 +1,8 @@ import React, { createContext, useContext, useEffect, useMemo, useState } from 'react'; -import { useDispatch } from 'react-redux'; import { useHistory, useParams } from 'react-router-dom'; import { toggleMainWindow } from 'soapbox/actions/chats'; -import { useOwnAccount, useSettings } from 'soapbox/hooks'; +import { useAppDispatch, useOwnAccount, useSettings } from 'soapbox/hooks'; import { IChat, useChat } from 'soapbox/queries/chats'; type WindowState = 'open' | 'minimized'; @@ -22,7 +21,7 @@ enum ChatWidgetScreens { const ChatProvider: React.FC = ({ children }) => { const history = useHistory(); - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const settings = useSettings(); const account = useOwnAccount(); diff --git a/app/soapbox/features/aliases/components/search.tsx b/app/soapbox/features/aliases/components/search.tsx index f64c4a332..4a2ca3c76 100644 --- a/app/soapbox/features/aliases/components/search.tsx +++ b/app/soapbox/features/aliases/components/search.tsx @@ -1,12 +1,11 @@ import classNames from 'clsx'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { fetchAliasesSuggestions, clearAliasesSuggestions, changeAliasesSuggestions } from 'soapbox/actions/aliases'; import Icon from 'soapbox/components/icon'; import { Button } from 'soapbox/components/ui'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; const messages = defineMessages({ search: { id: 'aliases.search', defaultMessage: 'Search your old account' }, @@ -14,7 +13,7 @@ const messages = defineMessages({ }); const Search: React.FC = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const value = useAppSelector(state => state.aliases.suggestions.value); diff --git a/app/soapbox/features/blocks/index.tsx b/app/soapbox/features/blocks/index.tsx index 730ef3643..c9d8a50c5 100644 --- a/app/soapbox/features/blocks/index.tsx +++ b/app/soapbox/features/blocks/index.tsx @@ -1,13 +1,12 @@ import debounce from 'lodash/debounce'; import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { fetchBlocks, expandBlocks } from 'soapbox/actions/blocks'; import ScrollableList from 'soapbox/components/scrollable-list'; import { Column, Spinner } from 'soapbox/components/ui'; import AccountContainer from 'soapbox/containers/account-container'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; const messages = defineMessages({ heading: { id: 'column.blocks', defaultMessage: 'Blocked users' }, @@ -18,7 +17,7 @@ const handleLoadMore = debounce((dispatch) => { }, 300, { leading: true }); const Blocks: React.FC = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const accountIds = useAppSelector((state) => state.user_lists.blocks.items); diff --git a/app/soapbox/features/compose/components/search.tsx b/app/soapbox/features/compose/components/search.tsx index 796100440..5c7db5f05 100644 --- a/app/soapbox/features/compose/components/search.tsx +++ b/app/soapbox/features/compose/components/search.tsx @@ -1,9 +1,7 @@ import classNames from 'clsx'; -import { Map as ImmutableMap } from 'immutable'; import debounce from 'lodash/debounce'; import React, { useCallback } from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { useHistory } from 'react-router-dom'; import { @@ -17,7 +15,8 @@ import { import AutosuggestAccountInput from 'soapbox/components/autosuggest-account-input'; import { Input } from 'soapbox/components/ui'; import SvgIcon from 'soapbox/components/ui/icon/svg-icon'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; +import { AppDispatch, RootState } from 'soapbox/store'; const messages = defineMessages({ placeholder: { id: 'search.placeholder', defaultMessage: 'Search' }, @@ -25,7 +24,7 @@ const messages = defineMessages({ }); function redirectToAccount(accountId: string, routerHistory: any) { - return (_dispatch: any, getState: () => ImmutableMap) => { + return (_dispatch: AppDispatch, getState: () => RootState) => { const acct = getState().getIn(['accounts', accountId, 'acct']); if (acct && routerHistory) { @@ -49,7 +48,7 @@ const Search = (props: ISearch) => { openInRoute = false, } = props; - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const history = useHistory(); const intl = useIntl(); diff --git a/app/soapbox/features/developers/developers-challenge.tsx b/app/soapbox/features/developers/developers-challenge.tsx index e431f3242..ee83ba809 100644 --- a/app/soapbox/features/developers/developers-challenge.tsx +++ b/app/soapbox/features/developers/developers-challenge.tsx @@ -1,9 +1,9 @@ import React, { useState } from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { changeSettingImmediate } from 'soapbox/actions/settings'; import { Column, Button, Form, FormActions, FormGroup, Input, Text } from 'soapbox/components/ui'; +import { useAppDispatch } from 'soapbox/hooks'; import toast from 'soapbox/toast'; const messages = defineMessages({ @@ -15,7 +15,7 @@ const messages = defineMessages({ }); const DevelopersChallenge = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const [answer, setAnswer] = useState(''); diff --git a/app/soapbox/features/developers/developers-menu.tsx b/app/soapbox/features/developers/developers-menu.tsx index 070c0f95e..61e8c1de6 100644 --- a/app/soapbox/features/developers/developers-menu.tsx +++ b/app/soapbox/features/developers/developers-menu.tsx @@ -1,11 +1,11 @@ import React from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { Link, useHistory } from 'react-router-dom'; import { changeSettingImmediate } from 'soapbox/actions/settings'; import { Column, Text } from 'soapbox/components/ui'; import SvgIcon from 'soapbox/components/ui/icon/svg-icon'; +import { useAppDispatch } from 'soapbox/hooks'; import toast from 'soapbox/toast'; import sourceCode from 'soapbox/utils/code'; @@ -31,7 +31,7 @@ const DashWidget: React.FC = ({ to, onClick, children }) => { }; const Developers: React.FC = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const history = useHistory(); const intl = useIntl(); diff --git a/app/soapbox/features/directory/index.tsx b/app/soapbox/features/directory/index.tsx index 70d227868..13ad6b816 100644 --- a/app/soapbox/features/directory/index.tsx +++ b/app/soapbox/features/directory/index.tsx @@ -1,13 +1,12 @@ import classNames from 'clsx'; import React, { useEffect, useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { useLocation } from 'react-router-dom'; import { fetchDirectory, expandDirectory } from 'soapbox/actions/directory'; import LoadMore from 'soapbox/components/load-more'; import { Column, RadioButton, Stack, Text } from 'soapbox/components/ui'; -import { useAppSelector, useFeatures, useInstance } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector, useFeatures, useInstance } from 'soapbox/hooks'; import AccountCard from './components/account-card'; @@ -21,7 +20,7 @@ const messages = defineMessages({ const Directory = () => { const intl = useIntl(); - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const { search } = useLocation(); const params = new URLSearchParams(search); const instance = useInstance(); diff --git a/app/soapbox/features/domain-blocks/index.tsx b/app/soapbox/features/domain-blocks/index.tsx index ee96f2c56..17d6f4757 100644 --- a/app/soapbox/features/domain-blocks/index.tsx +++ b/app/soapbox/features/domain-blocks/index.tsx @@ -1,13 +1,12 @@ import debounce from 'lodash/debounce'; import React from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { fetchDomainBlocks, expandDomainBlocks } from 'soapbox/actions/domain-blocks'; import Domain from 'soapbox/components/domain'; import ScrollableList from 'soapbox/components/scrollable-list'; import { Column, Spinner } from 'soapbox/components/ui'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; const messages = defineMessages({ heading: { id: 'column.domain_blocks', defaultMessage: 'Hidden domains' }, @@ -19,7 +18,7 @@ const handleLoadMore = debounce((dispatch) => { }, 300, { leading: true }); const DomainBlocks: React.FC = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const domains = useAppSelector((state) => state.domain_lists.blocks.items); diff --git a/app/soapbox/features/follow-requests/components/account-authorize.tsx b/app/soapbox/features/follow-requests/components/account-authorize.tsx index b73d0a719..b99f4c0fc 100644 --- a/app/soapbox/features/follow-requests/components/account-authorize.tsx +++ b/app/soapbox/features/follow-requests/components/account-authorize.tsx @@ -1,11 +1,10 @@ import React, { useCallback } from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { authorizeFollowRequest, rejectFollowRequest } from 'soapbox/actions/accounts'; import Account from 'soapbox/components/account'; import { Button, HStack } from 'soapbox/components/ui'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; import { makeGetAccount } from 'soapbox/selectors'; const messages = defineMessages({ @@ -19,7 +18,7 @@ interface IAccountAuthorize { const AccountAuthorize: React.FC = ({ id }) => { const intl = useIntl(); - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const getAccount = useCallback(makeGetAccount(), []); diff --git a/app/soapbox/features/follow-requests/index.tsx b/app/soapbox/features/follow-requests/index.tsx index 3d8700900..f89681a01 100644 --- a/app/soapbox/features/follow-requests/index.tsx +++ b/app/soapbox/features/follow-requests/index.tsx @@ -1,12 +1,11 @@ import debounce from 'lodash/debounce'; import React from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { fetchFollowRequests, expandFollowRequests } from 'soapbox/actions/accounts'; import ScrollableList from 'soapbox/components/scrollable-list'; import { Column, Spinner } from 'soapbox/components/ui'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; import AccountAuthorize from './components/account-authorize'; @@ -19,7 +18,7 @@ const handleLoadMore = debounce((dispatch) => { }, 300, { leading: true }); const FollowRequests: React.FC = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const accountIds = useAppSelector((state) => state.user_lists.follow_requests.items); diff --git a/app/soapbox/features/lists/components/new-list-form.tsx b/app/soapbox/features/lists/components/new-list-form.tsx index 645d6199c..2f3ef50ba 100644 --- a/app/soapbox/features/lists/components/new-list-form.tsx +++ b/app/soapbox/features/lists/components/new-list-form.tsx @@ -1,10 +1,9 @@ import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { changeListEditorTitle, submitListEditor } from 'soapbox/actions/lists'; import { Button, Form, HStack, Input } from 'soapbox/components/ui'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; const messages = defineMessages({ label: { id: 'lists.new.title_placeholder', defaultMessage: 'New list title' }, @@ -13,7 +12,7 @@ const messages = defineMessages({ }); const NewListForm: React.FC = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const value = useAppSelector((state) => state.listEditor.get('title')); diff --git a/app/soapbox/features/lists/index.tsx b/app/soapbox/features/lists/index.tsx index 082da7c5d..3e748c238 100644 --- a/app/soapbox/features/lists/index.tsx +++ b/app/soapbox/features/lists/index.tsx @@ -1,6 +1,5 @@ import React, { useEffect } from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { Link } from 'react-router-dom'; import { createSelector } from 'reselect'; @@ -9,7 +8,7 @@ import { openModal } from 'soapbox/actions/modals'; import Icon from 'soapbox/components/icon'; import ScrollableList from 'soapbox/components/scrollable-list'; import { Column, IconButton, Spinner } from 'soapbox/components/ui'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; import NewListForm from './components/new-list-form'; @@ -35,7 +34,7 @@ const getOrderedLists = createSelector([(state: RootState) => state.lists], list }); const Lists: React.FC = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const lists = useAppSelector((state) => getOrderedLists(state)); diff --git a/app/soapbox/features/mutes/index.tsx b/app/soapbox/features/mutes/index.tsx index e7e8365aa..818fdec57 100644 --- a/app/soapbox/features/mutes/index.tsx +++ b/app/soapbox/features/mutes/index.tsx @@ -1,13 +1,12 @@ import debounce from 'lodash/debounce'; import React from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { fetchMutes, expandMutes } from 'soapbox/actions/mutes'; import ScrollableList from 'soapbox/components/scrollable-list'; import { Column, Spinner } from 'soapbox/components/ui'; import AccountContainer from 'soapbox/containers/account-container'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; const messages = defineMessages({ heading: { id: 'column.mutes', defaultMessage: 'Muted users' }, @@ -18,7 +17,7 @@ const handleLoadMore = debounce((dispatch) => { }, 300, { leading: true }); const Mutes: React.FC = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const accountIds = useAppSelector((state) => state.user_lists.mutes.items); diff --git a/app/soapbox/features/onboarding/onboarding-wizard.tsx b/app/soapbox/features/onboarding/onboarding-wizard.tsx index f89204885..25e4ad128 100644 --- a/app/soapbox/features/onboarding/onboarding-wizard.tsx +++ b/app/soapbox/features/onboarding/onboarding-wizard.tsx @@ -1,12 +1,11 @@ import classNames from 'clsx'; import React from 'react'; -import { useDispatch } from 'react-redux'; import ReactSwipeableViews from 'react-swipeable-views'; import { endOnboarding } from 'soapbox/actions/onboarding'; import LandingGradient from 'soapbox/components/landing-gradient'; import { HStack } from 'soapbox/components/ui'; -import { useFeatures } from 'soapbox/hooks'; +import { useAppDispatch, useFeatures } from 'soapbox/hooks'; import AvatarSelectionStep from './steps/avatar-selection-step'; import BioStep from './steps/bio-step'; @@ -17,7 +16,7 @@ import FediverseStep from './steps/fediverse-step'; import SuggestedAccountsStep from './steps/suggested-accounts-step'; const OnboardingWizard = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const features = useFeatures(); const [currentStep, setCurrentStep] = React.useState(0); diff --git a/app/soapbox/features/onboarding/steps/avatar-selection-step.tsx b/app/soapbox/features/onboarding/steps/avatar-selection-step.tsx index b2c17fe64..ab9956dac 100644 --- a/app/soapbox/features/onboarding/steps/avatar-selection-step.tsx +++ b/app/soapbox/features/onboarding/steps/avatar-selection-step.tsx @@ -1,11 +1,10 @@ import classNames from 'clsx'; import React from 'react'; import { defineMessages, FormattedMessage } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { patchMe } from 'soapbox/actions/me'; import { Avatar, Button, Card, CardBody, Icon, Spinner, Stack, Text } from 'soapbox/components/ui'; -import { useOwnAccount } from 'soapbox/hooks'; +import { useAppDispatch, useOwnAccount } from 'soapbox/hooks'; import toast from 'soapbox/toast'; import { isDefaultAvatar } from 'soapbox/utils/accounts'; import resizeImage from 'soapbox/utils/resize-image'; @@ -17,7 +16,7 @@ const messages = defineMessages({ }); const AvatarSelectionStep = ({ onNext }: { onNext: () => void }) => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const account = useOwnAccount(); const fileInput = React.useRef(null); diff --git a/app/soapbox/features/onboarding/steps/bio-step.tsx b/app/soapbox/features/onboarding/steps/bio-step.tsx index cf090a45f..d0a5e37a9 100644 --- a/app/soapbox/features/onboarding/steps/bio-step.tsx +++ b/app/soapbox/features/onboarding/steps/bio-step.tsx @@ -1,10 +1,9 @@ import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { patchMe } from 'soapbox/actions/me'; import { Button, Card, CardBody, FormGroup, Stack, Text, Textarea } from 'soapbox/components/ui'; -import { useOwnAccount } from 'soapbox/hooks'; +import { useAppDispatch, useOwnAccount } from 'soapbox/hooks'; import toast from 'soapbox/toast'; import type { AxiosError } from 'axios'; @@ -16,7 +15,7 @@ const messages = defineMessages({ const BioStep = ({ onNext }: { onNext: () => void }) => { const intl = useIntl(); - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const account = useOwnAccount(); const [value, setValue] = React.useState(account?.source.get('note') || ''); diff --git a/app/soapbox/features/onboarding/steps/cover-photo-selection-step.tsx b/app/soapbox/features/onboarding/steps/cover-photo-selection-step.tsx index 4cf2493ad..d7b213247 100644 --- a/app/soapbox/features/onboarding/steps/cover-photo-selection-step.tsx +++ b/app/soapbox/features/onboarding/steps/cover-photo-selection-step.tsx @@ -1,12 +1,11 @@ import classNames from 'clsx'; import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { patchMe } from 'soapbox/actions/me'; import StillImage from 'soapbox/components/still-image'; import { Avatar, Button, Card, CardBody, Icon, Spinner, Stack, Text } from 'soapbox/components/ui'; -import { useOwnAccount } from 'soapbox/hooks'; +import { useAppDispatch, useOwnAccount } from 'soapbox/hooks'; import toast from 'soapbox/toast'; import { isDefaultHeader } from 'soapbox/utils/accounts'; import resizeImage from 'soapbox/utils/resize-image'; @@ -20,7 +19,7 @@ const messages = defineMessages({ const CoverPhotoSelectionStep = ({ onNext }: { onNext: () => void }) => { const intl = useIntl(); - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const account = useOwnAccount(); const fileInput = React.useRef(null); diff --git a/app/soapbox/features/onboarding/steps/display-name-step.tsx b/app/soapbox/features/onboarding/steps/display-name-step.tsx index 7d2b13925..246ed3b93 100644 --- a/app/soapbox/features/onboarding/steps/display-name-step.tsx +++ b/app/soapbox/features/onboarding/steps/display-name-step.tsx @@ -1,10 +1,9 @@ import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { patchMe } from 'soapbox/actions/me'; import { Button, Card, CardBody, FormGroup, Input, Stack, Text } from 'soapbox/components/ui'; -import { useOwnAccount } from 'soapbox/hooks'; +import { useAppDispatch, useOwnAccount } from 'soapbox/hooks'; import toast from 'soapbox/toast'; import type { AxiosError } from 'axios'; @@ -16,7 +15,7 @@ const messages = defineMessages({ const DisplayNameStep = ({ onNext }: { onNext: () => void }) => { const intl = useIntl(); - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const account = useOwnAccount(); const [value, setValue] = React.useState(account?.display_name || ''); diff --git a/app/soapbox/features/preferences/index.tsx b/app/soapbox/features/preferences/index.tsx index ebfd02547..09ea08eea 100644 --- a/app/soapbox/features/preferences/index.tsx +++ b/app/soapbox/features/preferences/index.tsx @@ -1,13 +1,12 @@ import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { changeSetting } from 'soapbox/actions/settings'; import List, { ListItem } from 'soapbox/components/list'; import { Form } from 'soapbox/components/ui'; import { SelectDropdown } from 'soapbox/features/forms'; import SettingToggle from 'soapbox/features/notifications/components/setting-toggle'; -import { useFeatures, useSettings } from 'soapbox/hooks'; +import { useAppDispatch, useFeatures, useSettings } from 'soapbox/hooks'; import ThemeToggle from '../ui/components/theme-toggle'; @@ -89,7 +88,7 @@ const messages = defineMessages({ const Preferences = () => { const intl = useIntl(); - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const features = useFeatures(); const settings = useSettings(); diff --git a/app/soapbox/features/public-layout/components/header.tsx b/app/soapbox/features/public-layout/components/header.tsx index 4fef3df36..49f801d84 100644 --- a/app/soapbox/features/public-layout/components/header.tsx +++ b/app/soapbox/features/public-layout/components/header.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { Link, Redirect } from 'react-router-dom'; import { logIn, verifyCredentials } from 'soapbox/actions/auth'; @@ -8,7 +7,7 @@ import { fetchInstance } from 'soapbox/actions/instance'; import { openModal } from 'soapbox/actions/modals'; import SiteLogo from 'soapbox/components/site-logo'; import { Button, Form, HStack, IconButton, Input, Tooltip } from 'soapbox/components/ui'; -import { useAppSelector, useFeatures, useSoapboxConfig, useOwnAccount, useInstance } from 'soapbox/hooks'; +import { useAppSelector, useFeatures, useSoapboxConfig, useOwnAccount, useInstance, useAppDispatch } from 'soapbox/hooks'; import Sonar from './sonar'; @@ -25,7 +24,7 @@ const messages = defineMessages({ }); const Header = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const account = useOwnAccount(); diff --git a/app/soapbox/features/quotes/index.tsx b/app/soapbox/features/quotes/index.tsx index a93fc8317..6ba38fe10 100644 --- a/app/soapbox/features/quotes/index.tsx +++ b/app/soapbox/features/quotes/index.tsx @@ -2,13 +2,12 @@ import { OrderedSet as ImmutableOrderedSet } from 'immutable'; import { debounce } from 'lodash'; import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { useParams } from 'react-router-dom'; import { expandStatusQuotes, fetchStatusQuotes } from 'soapbox/actions/status-quotes'; import StatusList from 'soapbox/components/status-list'; import { Column } from 'soapbox/components/ui'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; const messages = defineMessages({ heading: { id: 'column.quotes', defaultMessage: 'Post quotes' }, @@ -18,7 +17,7 @@ const handleLoadMore = debounce((statusId: string, dispatch: React.Dispatch dispatch(expandStatusQuotes(statusId)), 300, { leading: true }); const Quotes: React.FC = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const { statusId } = useParams<{ statusId: string }>(); diff --git a/app/soapbox/features/settings/index.tsx b/app/soapbox/features/settings/index.tsx index 06b8bf8a2..a0842984a 100644 --- a/app/soapbox/features/settings/index.tsx +++ b/app/soapbox/features/settings/index.tsx @@ -1,12 +1,11 @@ import React, { useEffect } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { useHistory } from 'react-router-dom'; import { fetchMfa } from 'soapbox/actions/mfa'; import List, { ListItem } from 'soapbox/components/list'; import { Card, CardBody, CardHeader, CardTitle, Column } from 'soapbox/components/ui'; -import { useAppSelector, useFeatures, useOwnAccount } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector, useFeatures, useOwnAccount } from 'soapbox/hooks'; import Preferences from '../preferences'; @@ -32,7 +31,7 @@ const messages = defineMessages({ /** User settings page. */ const Settings = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const history = useHistory(); const intl = useIntl(); diff --git a/app/soapbox/features/test-timeline/index.tsx b/app/soapbox/features/test-timeline/index.tsx index 1c64ecad5..51ab1491e 100644 --- a/app/soapbox/features/test-timeline/index.tsx +++ b/app/soapbox/features/test-timeline/index.tsx @@ -1,9 +1,9 @@ import React from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { importFetchedStatuses } from 'soapbox/actions/importer'; import { expandTimelineSuccess } from 'soapbox/actions/timelines'; +import { useAppDispatch } from 'soapbox/hooks'; import { Column } from '../../components/ui'; import Timeline from '../ui/components/timeline'; @@ -31,7 +31,7 @@ const onlyMedia = false; const TestTimeline: React.FC = () => { const intl = useIntl(); - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); React.useEffect(() => { dispatch(importFetchedStatuses(MOCK_STATUSES)); diff --git a/app/soapbox/features/ui/components/action-button.tsx b/app/soapbox/features/ui/components/action-button.tsx index 299702d94..b3fd2a38b 100644 --- a/app/soapbox/features/ui/components/action-button.tsx +++ b/app/soapbox/features/ui/components/action-button.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { followAccount, @@ -14,7 +13,7 @@ import { } from 'soapbox/actions/accounts'; import { openModal } from 'soapbox/actions/modals'; import { Button, HStack } from 'soapbox/components/ui'; -import { useAppSelector, useFeatures } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector, useFeatures } from 'soapbox/hooks'; import type { Account as AccountEntity } from 'soapbox/types/entities'; @@ -49,7 +48,7 @@ interface IActionButton { * `actionType` prop. */ const ActionButton: React.FC = ({ account, actionType, small }) => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const features = useFeatures(); const intl = useIntl(); diff --git a/app/soapbox/features/ui/components/link-footer.tsx b/app/soapbox/features/ui/components/link-footer.tsx index bc1c67fd3..20c04f1e6 100644 --- a/app/soapbox/features/ui/components/link-footer.tsx +++ b/app/soapbox/features/ui/components/link-footer.tsx @@ -1,13 +1,12 @@ import classNames from 'clsx'; import React from 'react'; import { FormattedMessage } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { Link } from 'react-router-dom'; import { logOut } from 'soapbox/actions/auth'; import { Text } from 'soapbox/components/ui'; import emojify from 'soapbox/features/emoji/emoji'; -import { useSoapboxConfig, useOwnAccount, useFeatures } from 'soapbox/hooks'; +import { useSoapboxConfig, useOwnAccount, useFeatures, useAppDispatch } from 'soapbox/hooks'; import sourceCode from 'soapbox/utils/code'; interface IFooterLink { @@ -29,7 +28,7 @@ const LinkFooter: React.FC = (): JSX.Element => { const features = useFeatures(); const soapboxConfig = useSoapboxConfig(); - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const onClickLogOut: React.EventHandler = (e) => { dispatch(logOut()); diff --git a/app/soapbox/features/ui/components/modals/report-modal/steps/other-actions-step.tsx b/app/soapbox/features/ui/components/modals/report-modal/steps/other-actions-step.tsx index 964fbd1ca..8c4def968 100644 --- a/app/soapbox/features/ui/components/modals/report-modal/steps/other-actions-step.tsx +++ b/app/soapbox/features/ui/components/modals/report-modal/steps/other-actions-step.tsx @@ -1,14 +1,13 @@ import { OrderedSet } from 'immutable'; import React, { useEffect, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import Toggle from 'react-toggle'; import { changeReportBlock, changeReportForward } from 'soapbox/actions/reports'; import { fetchRules } from 'soapbox/actions/rules'; import { Button, FormGroup, HStack, Stack, Text } from 'soapbox/components/ui'; import StatusCheckBox from 'soapbox/features/report/components/status-check-box'; -import { useAppSelector, useFeatures } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector, useFeatures } from 'soapbox/hooks'; import { isRemote, getDomain } from 'soapbox/utils/accounts'; import type { ReducerAccount } from 'soapbox/reducers/accounts'; @@ -26,7 +25,7 @@ interface IOtherActionsStep { } const OtherActionsStep = ({ account }: IOtherActionsStep) => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const features = useFeatures(); const intl = useIntl(); diff --git a/app/soapbox/features/ui/components/modals/report-modal/steps/reason-step.tsx b/app/soapbox/features/ui/components/modals/report-modal/steps/reason-step.tsx index 871ade6c4..6cf653c6b 100644 --- a/app/soapbox/features/ui/components/modals/report-modal/steps/reason-step.tsx +++ b/app/soapbox/features/ui/components/modals/report-modal/steps/reason-step.tsx @@ -1,12 +1,11 @@ import classNames from 'clsx'; import React, { useEffect, useMemo, useRef, useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { changeReportComment, changeReportRule } from 'soapbox/actions/reports'; import { fetchRules } from 'soapbox/actions/rules'; import { FormGroup, Stack, Text, Textarea } from 'soapbox/components/ui'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; import type { ReducerAccount } from 'soapbox/reducers/accounts'; @@ -22,7 +21,7 @@ interface IReasonStep { const RULES_HEIGHT = 385; const ReasonStep = (_props: IReasonStep) => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const rulesListRef = useRef(null); diff --git a/app/soapbox/features/ui/components/navbar.tsx b/app/soapbox/features/ui/components/navbar.tsx index 72ba8c792..d9829afca 100644 --- a/app/soapbox/features/ui/components/navbar.tsx +++ b/app/soapbox/features/ui/components/navbar.tsx @@ -1,7 +1,6 @@ import classNames from 'clsx'; import React, { useRef, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { Link, Redirect } from 'react-router-dom'; import { logIn, verifyCredentials } from 'soapbox/actions/auth'; @@ -10,7 +9,7 @@ import { openSidebar } from 'soapbox/actions/sidebar'; import SiteLogo from 'soapbox/components/site-logo'; import { Avatar, Button, Form, HStack, IconButton, Input, Tooltip } from 'soapbox/components/ui'; import Search from 'soapbox/features/compose/components/search'; -import { useOwnAccount, useSoapboxConfig } from 'soapbox/hooks'; +import { useAppDispatch, useOwnAccount, useSoapboxConfig } from 'soapbox/hooks'; import ProfileDropdown from './profile-dropdown'; @@ -24,7 +23,7 @@ const messages = defineMessages({ }); const Navbar = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const intl = useIntl(); const node = useRef(null); diff --git a/app/soapbox/features/ui/components/profile-dropdown.tsx b/app/soapbox/features/ui/components/profile-dropdown.tsx index e14c139e3..346784b63 100644 --- a/app/soapbox/features/ui/components/profile-dropdown.tsx +++ b/app/soapbox/features/ui/components/profile-dropdown.tsx @@ -1,13 +1,12 @@ import throttle from 'lodash/throttle'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { Link } from 'react-router-dom'; import { fetchOwnAccounts, logOut, switchAccount } from 'soapbox/actions/auth'; import Account from 'soapbox/components/account'; import { Menu, MenuButton, MenuDivider, MenuItem, MenuLink, MenuList } from 'soapbox/components/ui'; -import { useAppSelector, useFeatures } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector, useFeatures } from 'soapbox/hooks'; import { makeGetAccount } from 'soapbox/selectors'; import ThemeToggle from './theme-toggle'; @@ -35,7 +34,7 @@ type IMenuItem = { const getAccount = makeGetAccount(); const ProfileDropdown: React.FC = ({ account, children }) => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const features = useFeatures(); const intl = useIntl(); diff --git a/app/soapbox/features/ui/components/profile-familiar-followers.tsx b/app/soapbox/features/ui/components/profile-familiar-followers.tsx index 5a9d9ede9..48edb4716 100644 --- a/app/soapbox/features/ui/components/profile-familiar-followers.tsx +++ b/app/soapbox/features/ui/components/profile-familiar-followers.tsx @@ -1,7 +1,6 @@ import { OrderedSet as ImmutableOrderedSet } from 'immutable'; import React, { useEffect } from 'react'; import { FormattedList, FormattedMessage } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { Link } from 'react-router-dom'; import { fetchAccountFamiliarFollowers } from 'soapbox/actions/familiar-followers'; @@ -9,7 +8,7 @@ import { openModal } from 'soapbox/actions/modals'; import HoverRefWrapper from 'soapbox/components/hover-ref-wrapper'; import { Text } from 'soapbox/components/ui'; import VerificationBadge from 'soapbox/components/verification-badge'; -import { useAppSelector, useFeatures } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector, useFeatures } from 'soapbox/hooks'; import { makeGetAccount } from 'soapbox/selectors'; import type { Account } from 'soapbox/types/entities'; @@ -21,7 +20,7 @@ interface IProfileFamiliarFollowers { } const ProfileFamiliarFollowers: React.FC = ({ account }) => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const me = useAppSelector((state) => state.me); const features = useFeatures(); const familiarFollowerIds = useAppSelector(state => state.user_lists.familiar_followers.get(account.id)?.items || ImmutableOrderedSet()); diff --git a/app/soapbox/features/ui/components/profile-media-panel.tsx b/app/soapbox/features/ui/components/profile-media-panel.tsx index cb71d777c..47234dd06 100644 --- a/app/soapbox/features/ui/components/profile-media-panel.tsx +++ b/app/soapbox/features/ui/components/profile-media-panel.tsx @@ -1,12 +1,11 @@ import { List as ImmutableList } from 'immutable'; import React, { useState, useEffect } from 'react'; import { FormattedMessage } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { openModal } from 'soapbox/actions/modals'; import { expandAccountMediaTimeline } from 'soapbox/actions/timelines'; import { Spinner, Text, Widget } from 'soapbox/components/ui'; -import { useAppSelector } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; import { getAccountGallery } from 'soapbox/selectors'; import MediaItem from '../../account-gallery/components/media-item'; @@ -18,7 +17,7 @@ interface IProfileMediaPanel { } const ProfileMediaPanel: React.FC = ({ account }) => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const [loading, setLoading] = useState(true); diff --git a/app/soapbox/features/ui/components/theme-toggle.tsx b/app/soapbox/features/ui/components/theme-toggle.tsx index 3465190b9..5cfd09d4d 100644 --- a/app/soapbox/features/ui/components/theme-toggle.tsx +++ b/app/soapbox/features/ui/components/theme-toggle.tsx @@ -1,14 +1,13 @@ import React from 'react'; -import { useDispatch } from 'react-redux'; import { changeSetting } from 'soapbox/actions/settings'; -import { useSettings } from 'soapbox/hooks'; +import { useAppDispatch, useSettings } from 'soapbox/hooks'; import ThemeSelector from './theme-selector'; /** Stateful theme selector. */ const ThemeToggle: React.FC = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const themeMode = useSettings().get('themeMode'); const handleChange = (themeMode: string) => { diff --git a/app/soapbox/features/verification/waitlist-page.tsx b/app/soapbox/features/verification/waitlist-page.tsx index 0525bcef0..67de7ac75 100644 --- a/app/soapbox/features/verification/waitlist-page.tsx +++ b/app/soapbox/features/verification/waitlist-page.tsx @@ -1,6 +1,5 @@ import React, { useEffect } from 'react'; import { FormattedMessage } from 'react-intl'; -import { useDispatch } from 'react-redux'; import { Link } from 'react-router-dom'; import { logOut } from 'soapbox/actions/auth'; @@ -8,10 +7,10 @@ import { openModal } from 'soapbox/actions/modals'; import LandingGradient from 'soapbox/components/landing-gradient'; import SiteLogo from 'soapbox/components/site-logo'; import { Button, Stack, Text } from 'soapbox/components/ui'; -import { useInstance, useOwnAccount } from 'soapbox/hooks'; +import { useAppDispatch, useInstance, useOwnAccount } from 'soapbox/hooks'; const WaitlistPage = () => { - const dispatch = useDispatch(); + const dispatch = useAppDispatch(); const instance = useInstance(); const me = useOwnAccount();