From 445649ec1c940c2e615591fece8650f67235fbd6 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 11 Oct 2024 01:28:57 -0500 Subject: [PATCH] Make useInstance return an object containing the instance --- src/api/hooks/captcha/useCaptcha.ts | 2 +- src/api/hooks/streaming/useTimelineStream.ts | 2 +- src/components/birthday-input.tsx | 2 +- src/components/gdpr-banner.tsx | 2 +- src/components/helmet.tsx | 2 +- src/components/sidebar-menu.tsx | 2 +- src/components/sidebar-navigation.tsx | 2 +- src/components/translate-button.tsx | 2 +- src/contexts/nostr-context.tsx | 2 +- src/features/admin/components/registration-mode-picker.tsx | 2 +- src/features/admin/tabs/dashboard.tsx | 2 +- src/features/auth-login/components/consumers-list.tsx | 2 +- src/features/auth-login/components/registration-form.tsx | 2 +- src/features/auth-login/components/registration-page.tsx | 2 +- src/features/community-timeline/index.tsx | 2 +- src/features/compose/components/compose-form.tsx | 4 ++-- src/features/compose/components/polls/poll-form.tsx | 4 ++-- src/features/compose/components/upload-button.tsx | 4 ++-- src/features/compose/components/upload.tsx | 3 ++- .../crypto-donate/components/crypto-donate-panel.tsx | 2 +- src/features/crypto-donate/index.tsx | 2 +- src/features/directory/index.tsx | 2 +- src/features/edit-identity/index.tsx | 4 ++-- src/features/edit-profile/index.tsx | 2 +- .../components/instance-restrictions.tsx | 2 +- src/features/federation-restrictions/index.tsx | 2 +- src/features/group/edit-group.tsx | 2 +- src/features/home-timeline/index.tsx | 2 +- src/features/landing-timeline/components/site-banner.tsx | 2 +- src/features/landing-timeline/index.tsx | 2 +- src/features/migration/index.tsx | 2 +- src/features/nostr-relays/components/relay-editor.tsx | 2 +- src/features/notifications/components/notification.tsx | 2 +- src/features/public-timeline/index.tsx | 2 +- src/features/register-invite/index.tsx | 2 +- src/features/server-info/index.tsx | 2 +- src/features/settings/index.tsx | 2 +- src/features/status/components/thread-login-cta.tsx | 2 +- src/features/ui/components/cta-banner.tsx | 2 +- .../modals/manage-group-modal/steps/details-step.tsx | 2 +- .../modals/nostr-login-modal/steps/extension-step.tsx | 2 +- .../modals/nostr-signup-modal/steps/keygen-step.tsx | 2 +- .../ui/components/modals/report-modal/report-modal.tsx | 4 ++-- .../ui/components/modals/report-modal/steps/reason-step.tsx | 5 ++++- src/features/ui/components/modals/unauthorized-modal.tsx | 2 +- src/features/ui/components/panels/sign-up-panel.tsx | 2 +- src/features/ui/components/promo-panel.tsx | 2 +- src/features/ui/index.tsx | 2 +- src/hooks/useBackend.ts | 2 +- src/hooks/useFeatures.ts | 2 +- src/hooks/useInstance.ts | 3 ++- src/hooks/useRegistrationStatus.ts | 2 +- 52 files changed, 62 insertions(+), 57 deletions(-) diff --git a/src/api/hooks/captcha/useCaptcha.ts b/src/api/hooks/captcha/useCaptcha.ts index 92f3115f7..a79da8fa9 100644 --- a/src/api/hooks/captcha/useCaptcha.ts +++ b/src/api/hooks/captcha/useCaptcha.ts @@ -22,7 +22,7 @@ function getRandomNumber(min: number, max: number): number { const useCaptcha = () => { const api = useApi(); - const instance = useInstance(); + const { instance } = useInstance(); const dispatch = useAppDispatch(); const intl = useIntl(); const [captcha, setCaptcha] = useState(); diff --git a/src/api/hooks/streaming/useTimelineStream.ts b/src/api/hooks/streaming/useTimelineStream.ts index 22e9d0cf4..97328f7ae 100644 --- a/src/api/hooks/streaming/useTimelineStream.ts +++ b/src/api/hooks/streaming/useTimelineStream.ts @@ -10,7 +10,7 @@ function useTimelineStream(...args: Parameters) { const { enabled = true } = args[4] ?? {}; const dispatch = useAppDispatch(); - const instance = useInstance(); + const { instance } = useInstance(); const stream = useRef<(() => void) | null>(null); const accessToken = useAppSelector(getAccessToken); diff --git a/src/components/birthday-input.tsx b/src/components/birthday-input.tsx index 53fbed409..209739278 100644 --- a/src/components/birthday-input.tsx +++ b/src/components/birthday-input.tsx @@ -22,7 +22,7 @@ interface IBirthdayInput { const BirthdayInput: React.FC = ({ value, onChange, required }) => { const intl = useIntl(); const features = useFeatures(); - const instance = useInstance(); + const { instance } = useInstance(); const supportsBirthdays = features.birthdays; const minAge = instance.pleroma.metadata.birthday_min_age; diff --git a/src/components/gdpr-banner.tsx b/src/components/gdpr-banner.tsx index 75bc16bad..98cf3ac53 100644 --- a/src/components/gdpr-banner.tsx +++ b/src/components/gdpr-banner.tsx @@ -13,7 +13,7 @@ const GdprBanner: React.FC = () => { const [shown, setShown] = useState(acceptedGdpr); const [slideout, setSlideout] = useState(false); - const instance = useInstance(); + const { instance } = useInstance(); const { gdprUrl } = useSoapboxConfig(); const handleAccept = () => { diff --git a/src/components/helmet.tsx b/src/components/helmet.tsx index 131e4c470..64b5c3fcf 100644 --- a/src/components/helmet.tsx +++ b/src/components/helmet.tsx @@ -20,7 +20,7 @@ interface IHelmet { } const Helmet: React.FC = ({ children }) => { - const instance = useInstance(); + const { instance } = useInstance(); const { unreadChatsCount } = useStatContext(); const unreadCount = useAppSelector((state) => getNotifTotals(state) + unreadChatsCount); const { demetricator } = useSettings(); diff --git a/src/components/sidebar-menu.tsx b/src/components/sidebar-menu.tsx index 8ddb7df9e..20431476d 100644 --- a/src/components/sidebar-menu.tsx +++ b/src/components/sidebar-menu.tsx @@ -90,7 +90,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => { const sidebarOpen = useAppSelector((state) => state.sidebar.sidebarOpen); const settings = useAppSelector((state) => getSettings(state)); const followRequestsCount = useAppSelector((state) => state.user_lists.follow_requests.items.count()); - const instance = useInstance(); + const { instance } = useInstance(); const settingsNotifications = useSettingsNotifications(); const closeButtonRef = React.useRef(null); diff --git a/src/components/sidebar-navigation.tsx b/src/components/sidebar-navigation.tsx index b771c1eb8..adab520b4 100644 --- a/src/components/sidebar-navigation.tsx +++ b/src/components/sidebar-navigation.tsx @@ -23,7 +23,7 @@ const SidebarNavigation = () => { const intl = useIntl(); const { unreadChatsCount } = useStatContext(); - const instance = useInstance(); + const { instance } = useInstance(); const features = useFeatures(); const { isDeveloper } = useSettings(); const { account } = useOwnAccount(); diff --git a/src/components/translate-button.tsx b/src/components/translate-button.tsx index 57752ec28..bfe0fe4e6 100644 --- a/src/components/translate-button.tsx +++ b/src/components/translate-button.tsx @@ -16,7 +16,7 @@ const TranslateButton: React.FC = ({ status }) => { const dispatch = useAppDispatch(); const intl = useIntl(); const features = useFeatures(); - const instance = useInstance(); + const { instance } = useInstance(); const me = useAppSelector((state) => state.me); diff --git a/src/contexts/nostr-context.tsx b/src/contexts/nostr-context.tsx index 92bc9095b..6dcca2241 100644 --- a/src/contexts/nostr-context.tsx +++ b/src/contexts/nostr-context.tsx @@ -19,7 +19,7 @@ interface NostrProviderProps { } export const NostrProvider: React.FC = ({ children }) => { - const instance = useInstance(); + const { instance } = useInstance(); const hasNostr = !!instance.nostr; const [relay, setRelay] = useState(); diff --git a/src/features/admin/components/registration-mode-picker.tsx b/src/features/admin/components/registration-mode-picker.tsx index 744809a32..d7762dfe4 100644 --- a/src/features/admin/components/registration-mode-picker.tsx +++ b/src/features/admin/components/registration-mode-picker.tsx @@ -36,7 +36,7 @@ const modeFromInstance = ({ registrations }: Instance): RegistrationMode => { const RegistrationModePicker: React.FC = () => { const intl = useIntl(); const dispatch = useAppDispatch(); - const instance = useInstance(); + const { instance } = useInstance(); const mode = modeFromInstance(instance); diff --git a/src/features/admin/tabs/dashboard.tsx b/src/features/admin/tabs/dashboard.tsx index d690b5cef..bfba473ad 100644 --- a/src/features/admin/tabs/dashboard.tsx +++ b/src/features/admin/tabs/dashboard.tsx @@ -14,7 +14,7 @@ import RegistrationModePicker from '../components/registration-mode-picker'; const Dashboard: React.FC = () => { const dispatch = useAppDispatch(); - const instance = useInstance(); + const { instance } = useInstance(); const features = useFeatures(); const { account } = useOwnAccount(); diff --git a/src/features/auth-login/components/consumers-list.tsx b/src/features/auth-login/components/consumers-list.tsx index e236ff101..0b5dcdf5b 100644 --- a/src/features/auth-login/components/consumers-list.tsx +++ b/src/features/auth-login/components/consumers-list.tsx @@ -11,7 +11,7 @@ interface IConsumersList { /** Displays OAuth consumers to log in with. */ const ConsumersList: React.FC = () => { - const instance = useInstance(); + const { instance } = useInstance(); const providers = instance.pleroma.oauth_consumer_strategies; if (providers.length > 0) { diff --git a/src/features/auth-login/components/registration-form.tsx b/src/features/auth-login/components/registration-form.tsx index ea9b56a60..19259ff52 100644 --- a/src/features/auth-login/components/registration-form.tsx +++ b/src/features/auth-login/components/registration-form.tsx @@ -42,7 +42,7 @@ const RegistrationForm: React.FC = ({ inviteToken }) => { const { locale } = useSettings(); const features = useFeatures(); - const instance = useInstance(); + const { instance } = useInstance(); const needsConfirmation = instance.pleroma.metadata.account_activation_required; const needsApproval = instance.registrations.approval_required; diff --git a/src/features/auth-login/components/registration-page.tsx b/src/features/auth-login/components/registration-page.tsx index 589fbeed2..6cedc1159 100644 --- a/src/features/auth-login/components/registration-page.tsx +++ b/src/features/auth-login/components/registration-page.tsx @@ -10,7 +10,7 @@ import { useAppDispatch, useFeatures, useInstance, useRegistrationStatus } from import RegistrationForm from './registration-form'; const RegistrationPage: React.FC = () => { - const instance = useInstance(); + const { instance } = useInstance(); const { isOpen } = useRegistrationStatus(); const { nostrSignup } = useFeatures(); const dispatch = useAppDispatch(); diff --git a/src/features/community-timeline/index.tsx b/src/features/community-timeline/index.tsx index 137bb2805..69dab59ac 100644 --- a/src/features/community-timeline/index.tsx +++ b/src/features/community-timeline/index.tsx @@ -13,7 +13,7 @@ import Timeline from '../ui/components/timeline'; const CommunityTimeline = () => { const dispatch = useAppDispatch(); const theme = useTheme(); - const instance = useInstance(); + const { instance } = useInstance(); const settings = useSettings(); const onlyMedia = settings.community.other.onlyMedia; diff --git a/src/features/compose/components/compose-form.tsx b/src/features/compose/components/compose-form.tsx index 79946dcf6..d4d61e834 100644 --- a/src/features/compose/components/compose-form.tsx +++ b/src/features/compose/components/compose-form.tsx @@ -68,11 +68,11 @@ const ComposeForm = ({ id, shouldCondense, autoFocus, clickab const history = useHistory(); const intl = useIntl(); const dispatch = useAppDispatch(); - const { configuration } = useInstance(); + const { instance } = useInstance(); const compose = useCompose(id); const showSearch = useAppSelector((state) => state.search.submitted && !state.search.hidden); - const maxTootChars = configuration.statuses.max_characters; + const maxTootChars = instance.configuration.statuses.max_characters; const scheduledStatusCount = useAppSelector((state) => state.scheduled_statuses.size); const features = useFeatures(); diff --git a/src/features/compose/components/polls/poll-form.tsx b/src/features/compose/components/polls/poll-form.tsx index ed45cbbad..fce9cae8f 100644 --- a/src/features/compose/components/polls/poll-form.tsx +++ b/src/features/compose/components/polls/poll-form.tsx @@ -110,7 +110,7 @@ interface IPollForm { const PollForm: React.FC = ({ composeId }) => { const dispatch = useAppDispatch(); const intl = useIntl(); - const { configuration } = useInstance(); + const { instance } = useInstance(); const compose = useCompose(composeId); @@ -121,7 +121,7 @@ const PollForm: React.FC = ({ composeId }) => { const { max_options: maxOptions, max_characters_per_option: maxOptionChars, - } = configuration.polls; + } = instance.configuration.polls; const onRemoveOption = (index: number) => dispatch(removePollOption(composeId, index)); const onChangeOption = (index: number, title: string) => dispatch(changePollOption(composeId, index, title)); diff --git a/src/features/compose/components/upload-button.tsx b/src/features/compose/components/upload-button.tsx index 62c1068a8..4779a6a44 100644 --- a/src/features/compose/components/upload-button.tsx +++ b/src/features/compose/components/upload-button.tsx @@ -33,10 +33,10 @@ const UploadButton: React.FC = ({ icon, }) => { const intl = useIntl(); - const { configuration } = useInstance(); + const { instance } = useInstance(); const fileElement = useRef(null); - const attachmentTypes = configuration.media_attachments.supported_mime_types; + const attachmentTypes = instance.configuration.media_attachments.supported_mime_types; const handleChange: React.ChangeEventHandler = (e) => { if (e.target.files?.length) { diff --git a/src/features/compose/components/upload.tsx b/src/features/compose/components/upload.tsx index 5ba440996..9d3a588e2 100644 --- a/src/features/compose/components/upload.tsx +++ b/src/features/compose/components/upload.tsx @@ -15,7 +15,8 @@ interface IUploadCompose { const UploadCompose: React.FC = ({ composeId, id, onSubmit, onDragStart, onDragEnter, onDragEnd }) => { const dispatch = useAppDispatch(); - const { pleroma: { metadata: { description_limit: descriptionLimit } } } = useInstance(); + const { instance } = useInstance(); + const { pleroma: { metadata: { description_limit: descriptionLimit } } } = instance; const media = useCompose(composeId).media_attachments.find(item => item.id === id)!; diff --git a/src/features/crypto-donate/components/crypto-donate-panel.tsx b/src/features/crypto-donate/components/crypto-donate-panel.tsx index a31d6feeb..b61a7bad1 100644 --- a/src/features/crypto-donate/components/crypto-donate-panel.tsx +++ b/src/features/crypto-donate/components/crypto-donate-panel.tsx @@ -18,7 +18,7 @@ interface ICryptoDonatePanel { const CryptoDonatePanel: React.FC = ({ limit = 3 }): JSX.Element | null => { const intl = useIntl(); const history = useHistory(); - const instance = useInstance(); + const { instance } = useInstance(); const addresses = useSoapboxConfig().get('cryptoAddresses'); diff --git a/src/features/crypto-donate/index.tsx b/src/features/crypto-donate/index.tsx index f2affe4bd..cb3fa1f7e 100644 --- a/src/features/crypto-donate/index.tsx +++ b/src/features/crypto-donate/index.tsx @@ -12,7 +12,7 @@ const messages = defineMessages({ const CryptoDonate: React.FC = (): JSX.Element => { const intl = useIntl(); - const instance = useInstance(); + const { instance } = useInstance(); const [explanationBoxExpanded, toggleExplanationBox] = useState(true); diff --git a/src/features/directory/index.tsx b/src/features/directory/index.tsx index 45cdfdc65..1af516140 100644 --- a/src/features/directory/index.tsx +++ b/src/features/directory/index.tsx @@ -23,7 +23,7 @@ const Directory = () => { const dispatch = useAppDispatch(); const { search } = useLocation(); const params = new URLSearchParams(search); - const instance = useInstance(); + const { instance } = useInstance(); const features = useFeatures(); const accountIds = useAppSelector((state) => state.user_lists.directory.items); diff --git a/src/features/edit-identity/index.tsx b/src/features/edit-identity/index.tsx index 4c8b0ff60..c76094077 100644 --- a/src/features/edit-identity/index.tsx +++ b/src/features/edit-identity/index.tsx @@ -27,7 +27,7 @@ const messages = defineMessages({ /** EditIdentity component. */ const EditIdentity: React.FC = () => { const intl = useIntl(); - const instance = useInstance(); + const { instance } = useInstance(); const dispatch = useAppDispatch(); const { account } = useOwnAccount(); const { mutate, isPending } = useRequestName(); @@ -162,7 +162,7 @@ const EditIdentity: React.FC = () => { const UsernameInput: React.FC> = (props) => { const intl = useIntl(); - const instance = useInstance(); + const { instance } = useInstance(); return ( = ({ value, on const EditProfile: React.FC = () => { const intl = useIntl(); const dispatch = useAppDispatch(); - const instance = useInstance(); + const { instance } = useInstance(); const { account } = useOwnAccount(); const features = useFeatures(); diff --git a/src/features/federation-restrictions/components/instance-restrictions.tsx b/src/features/federation-restrictions/components/instance-restrictions.tsx index d33aa5a85..0078f8149 100644 --- a/src/features/federation-restrictions/components/instance-restrictions.tsx +++ b/src/features/federation-restrictions/components/instance-restrictions.tsx @@ -34,7 +34,7 @@ interface IInstanceRestrictions { } const InstanceRestrictions: React.FC = ({ remoteInstance }) => { - const instance = useInstance(); + const { instance } = useInstance(); const renderRestrictions = () => { const items = []; diff --git a/src/features/federation-restrictions/index.tsx b/src/features/federation-restrictions/index.tsx index 47f5a218b..0d980e1cd 100644 --- a/src/features/federation-restrictions/index.tsx +++ b/src/features/federation-restrictions/index.tsx @@ -21,7 +21,7 @@ const messages = defineMessages({ const FederationRestrictions = () => { const intl = useIntl(); - const instance = useInstance(); + const { instance } = useInstance(); const getHosts = useCallback(makeGetHosts(), []); diff --git a/src/features/group/edit-group.tsx b/src/features/group/edit-group.tsx index 13f5e11b9..105164d7a 100644 --- a/src/features/group/edit-group.tsx +++ b/src/features/group/edit-group.tsx @@ -31,7 +31,7 @@ interface IEditGroup { const EditGroup: React.FC = ({ params: { groupId } }) => { const intl = useIntl(); - const instance = useInstance(); + const { instance } = useInstance(); const { group, isLoading } = useGroup(groupId); const { updateGroup } = useUpdateGroup(groupId); diff --git a/src/features/home-timeline/index.tsx b/src/features/home-timeline/index.tsx index 24f58f4f2..607c72b09 100644 --- a/src/features/home-timeline/index.tsx +++ b/src/features/home-timeline/index.tsx @@ -17,7 +17,7 @@ const HomeTimeline: React.FC = () => { const intl = useIntl(); const dispatch = useAppDispatch(); const features = useFeatures(); - const instance = useInstance(); + const { instance } = useInstance(); const theme = useTheme(); const polling = useRef(null); diff --git a/src/features/landing-timeline/components/site-banner.tsx b/src/features/landing-timeline/components/site-banner.tsx index ffbdafe35..11a652158 100644 --- a/src/features/landing-timeline/components/site-banner.tsx +++ b/src/features/landing-timeline/components/site-banner.tsx @@ -9,7 +9,7 @@ import { getTextDirection } from 'soapbox/utils/rtl'; import { LogoText } from './logo-text'; const SiteBanner: React.FC = () => { - const instance = useInstance(); + const { instance } = useInstance(); const description = DOMPurify.sanitize(instance.description); return ( diff --git a/src/features/landing-timeline/index.tsx b/src/features/landing-timeline/index.tsx index 5b6ce33e3..1869568ba 100644 --- a/src/features/landing-timeline/index.tsx +++ b/src/features/landing-timeline/index.tsx @@ -15,7 +15,7 @@ import { SiteBanner } from './components/site-banner'; const LandingTimeline = () => { const dispatch = useAppDispatch(); - const instance = useInstance(); + const { instance } = useInstance(); const theme = useTheme(); const isMobile = useIsMobile(); diff --git a/src/features/migration/index.tsx b/src/features/migration/index.tsx index b563308cf..6d19d172f 100644 --- a/src/features/migration/index.tsx +++ b/src/features/migration/index.tsx @@ -21,7 +21,7 @@ const messages = defineMessages({ const Migration = () => { const intl = useIntl(); const dispatch = useAppDispatch(); - const instance = useInstance(); + const { instance } = useInstance(); const cooldownPeriod = instance.pleroma.metadata.migration_cooldown_period; diff --git a/src/features/nostr-relays/components/relay-editor.tsx b/src/features/nostr-relays/components/relay-editor.tsx index 0806e9300..14618046f 100644 --- a/src/features/nostr-relays/components/relay-editor.tsx +++ b/src/features/nostr-relays/components/relay-editor.tsx @@ -38,7 +38,7 @@ interface RelayData { } const RelayField: StreamfieldComponent = ({ value, onChange }) => { - const instance = useInstance(); + const { instance } = useInstance(); const handleChange = (key: string): React.ChangeEventHandler => { return e => { diff --git a/src/features/notifications/components/notification.tsx b/src/features/notifications/components/notification.tsx index 4e88aafa7..f370474b6 100644 --- a/src/features/notifications/components/notification.tsx +++ b/src/features/notifications/components/notification.tsx @@ -198,7 +198,7 @@ const Notification: React.FC = (props) => { const history = useHistory(); const intl = useIntl(); - const instance = useInstance(); + const { instance } = useInstance(); const type = notification.type; const { account, status } = notification; diff --git a/src/features/public-timeline/index.tsx b/src/features/public-timeline/index.tsx index 253ee1326..0522d3dd5 100644 --- a/src/features/public-timeline/index.tsx +++ b/src/features/public-timeline/index.tsx @@ -27,7 +27,7 @@ const PublicTimeline = () => { const [language, setLanguage] = useState(localStorage.getItem('soapbox:global:language') || ''); - const instance = useInstance(); + const { instance } = useInstance(); const settings = useSettings(); const onlyMedia = settings.public.other.onlyMedia; const next = useAppSelector(state => state.timelines.get('public')?.next); diff --git a/src/features/register-invite/index.tsx b/src/features/register-invite/index.tsx index 9b9d9ccba..00a73dabc 100644 --- a/src/features/register-invite/index.tsx +++ b/src/features/register-invite/index.tsx @@ -12,7 +12,7 @@ interface RegisterInviteParams { /** Page to register with an invitation. */ const RegisterInvite: React.FC = () => { - const instance = useInstance(); + const { instance } = useInstance(); const { token } = useParams(); const title = ( diff --git a/src/features/server-info/index.tsx b/src/features/server-info/index.tsx index bc0b03e9b..f180b77fb 100644 --- a/src/features/server-info/index.tsx +++ b/src/features/server-info/index.tsx @@ -13,7 +13,7 @@ const messages = defineMessages({ const ServerInfo = () => { const intl = useIntl(); - const instance = useInstance(); + const { instance } = useInstance(); return ( diff --git a/src/features/settings/index.tsx b/src/features/settings/index.tsx index bdc0b655f..45f095f7c 100644 --- a/src/features/settings/index.tsx +++ b/src/features/settings/index.tsx @@ -46,7 +46,7 @@ const Settings = () => { const mfa = useAppSelector((state) => state.security.get('mfa')); const features = useFeatures(); const { account } = useOwnAccount(); - const instance = useInstance(); + const { instance } = useInstance(); const settingsNotifications = useSettingsNotifications(); const isMfaEnabled = mfa.getIn(['settings', 'totp']); diff --git a/src/features/status/components/thread-login-cta.tsx b/src/features/status/components/thread-login-cta.tsx index 95a72a137..e8758f72c 100644 --- a/src/features/status/components/thread-login-cta.tsx +++ b/src/features/status/components/thread-login-cta.tsx @@ -6,7 +6,7 @@ import { useInstance, useSoapboxConfig } from 'soapbox/hooks'; /** Prompts logged-out users to log in when viewing a thread. */ const ThreadLoginCta: React.FC = () => { - const instance = useInstance(); + const { instance } = useInstance(); const { displayCta } = useSoapboxConfig(); if (!displayCta) return null; diff --git a/src/features/ui/components/cta-banner.tsx b/src/features/ui/components/cta-banner.tsx index cecd4fbbd..ff321d870 100644 --- a/src/features/ui/components/cta-banner.tsx +++ b/src/features/ui/components/cta-banner.tsx @@ -5,7 +5,7 @@ import { Banner, Button, HStack, Stack, Text } from 'soapbox/components/ui'; import { useAppSelector, useInstance, useRegistrationStatus, useSoapboxConfig } from 'soapbox/hooks'; const CtaBanner = () => { - const instance = useInstance(); + const { instance } = useInstance(); const { isOpen } = useRegistrationStatus(); const { displayCta } = useSoapboxConfig(); const me = useAppSelector((state) => state.me); diff --git a/src/features/ui/components/modals/manage-group-modal/steps/details-step.tsx b/src/features/ui/components/modals/manage-group-modal/steps/details-step.tsx index 2e4dec53a..1f8a2006b 100644 --- a/src/features/ui/components/modals/manage-group-modal/steps/details-step.tsx +++ b/src/features/ui/components/modals/manage-group-modal/steps/details-step.tsx @@ -24,7 +24,7 @@ interface IDetailsStep { const DetailsStep: React.FC = ({ params, onChange }) => { const intl = useIntl(); const debounce = useDebounce; - const instance = useInstance(); + const { instance } = useInstance(); const { display_name: displayName = '', diff --git a/src/features/ui/components/modals/nostr-login-modal/steps/extension-step.tsx b/src/features/ui/components/modals/nostr-login-modal/steps/extension-step.tsx index e43ce2773..975c68c53 100644 --- a/src/features/ui/components/modals/nostr-login-modal/steps/extension-step.tsx +++ b/src/features/ui/components/modals/nostr-login-modal/steps/extension-step.tsx @@ -16,7 +16,7 @@ interface IExtensionStep { const ExtensionStep: React.FC = ({ isLogin, onClickAlt, onClose }) => { const dispatch = useAppDispatch(); - const instance = useInstance(); + const { instance } = useInstance(); const { logo } = useSoapboxConfig(); const handleClose = () => { diff --git a/src/features/ui/components/modals/nostr-signup-modal/steps/keygen-step.tsx b/src/features/ui/components/modals/nostr-signup-modal/steps/keygen-step.tsx index 1d6274ce8..3d47ce95b 100644 --- a/src/features/ui/components/modals/nostr-signup-modal/steps/keygen-step.tsx +++ b/src/features/ui/components/modals/nostr-signup-modal/steps/keygen-step.tsx @@ -20,7 +20,7 @@ interface IKeygenStep { } const KeygenStep: React.FC = ({ onClose }) => { - const instance = useInstance(); + const { instance } = useInstance(); const dispatch = useAppDispatch(); const isMobile = useIsMobile(); const { relay } = useNostr(); diff --git a/src/features/ui/components/modals/report-modal/report-modal.tsx b/src/features/ui/components/modals/report-modal/report-modal.tsx index 77fbb1946..fe4bfeb5d 100644 --- a/src/features/ui/components/modals/report-modal/report-modal.tsx +++ b/src/features/ui/components/modals/report-modal/report-modal.tsx @@ -104,13 +104,13 @@ const ReportModal = ({ onClose }: IReportModal) => { const entityType = useAppSelector((state) => state.reports.new.entityType); const isBlocked = useAppSelector((state) => state.reports.new.block); const isSubmitting = useAppSelector((state) => state.reports.new.isSubmitting); - const { rules } = useInstance(); + const { instance } = useInstance(); const ruleIds = useAppSelector((state) => state.reports.new.rule_ids); const selectedStatusIds = useAppSelector((state) => state.reports.new.status_ids); const selectedChatMessage = useAppSelector((state) => state.reports.new.chat_message); const selectedGroup = useAppSelector((state) => state.reports.new.group); - const shouldRequireRule = rules.length > 0; + const shouldRequireRule = instance.rules.length > 0; const isReportingAccount = entityType === ReportableEntities.ACCOUNT; const isReportingStatus = entityType === ReportableEntities.STATUS; diff --git a/src/features/ui/components/modals/report-modal/steps/reason-step.tsx b/src/features/ui/components/modals/report-modal/steps/reason-step.tsx index 7703ab995..d7045aae5 100644 --- a/src/features/ui/components/modals/report-modal/steps/reason-step.tsx +++ b/src/features/ui/components/modals/report-modal/steps/reason-step.tsx @@ -31,8 +31,11 @@ const ReasonStep: React.FC = () => { const entityType = useAppSelector((state) => state.reports.new.entityType); const comment = useAppSelector((state) => state.reports.new.comment); - const { rules } = useInstance(); const ruleIds = useAppSelector((state) => state.reports.new.rule_ids); + + const { instance } = useInstance(); + const { rules } = instance; + const shouldRequireRule = rules.length > 0; const handleCommentChange = (event: React.ChangeEvent) => { diff --git a/src/features/ui/components/modals/unauthorized-modal.tsx b/src/features/ui/components/modals/unauthorized-modal.tsx index 02c03fb9f..d73c96884 100644 --- a/src/features/ui/components/modals/unauthorized-modal.tsx +++ b/src/features/ui/components/modals/unauthorized-modal.tsx @@ -29,7 +29,7 @@ const UnauthorizedModal: React.FC = ({ action, onClose, acco const intl = useIntl(); const history = useHistory(); const dispatch = useAppDispatch(); - const instance = useInstance(); + const { instance } = useInstance(); const { isOpen } = useRegistrationStatus(); const username = useAppSelector(state => selectAccount(state, accountId!)?.display_name); diff --git a/src/features/ui/components/panels/sign-up-panel.tsx b/src/features/ui/components/panels/sign-up-panel.tsx index eaf30b41c..a37664c3d 100644 --- a/src/features/ui/components/panels/sign-up-panel.tsx +++ b/src/features/ui/components/panels/sign-up-panel.tsx @@ -6,7 +6,7 @@ import { Button, Stack, Text } from 'soapbox/components/ui'; import { useAppDispatch, useAppSelector, useFeatures, useInstance, useRegistrationStatus } from 'soapbox/hooks'; const SignUpPanel = () => { - const instance = useInstance(); + const { instance } = useInstance(); const { nostrSignup } = useFeatures(); const { isOpen } = useRegistrationStatus(); const me = useAppSelector((state) => state.me); diff --git a/src/features/ui/components/promo-panel.tsx b/src/features/ui/components/promo-panel.tsx index 3472067c6..a709d0b16 100644 --- a/src/features/ui/components/promo-panel.tsx +++ b/src/features/ui/components/promo-panel.tsx @@ -5,7 +5,7 @@ import { Widget, Stack, Text } from 'soapbox/components/ui'; import { useInstance, useSettings, useSoapboxConfig } from 'soapbox/hooks'; const PromoPanel: React.FC = () => { - const instance = useInstance(); + const { instance } = useInstance(); const { promoPanel } = useSoapboxConfig(); const { locale } = useSettings(); diff --git a/src/features/ui/index.tsx b/src/features/ui/index.tsx index 8a9830013..2fd5fac92 100644 --- a/src/features/ui/index.tsx +++ b/src/features/ui/index.tsx @@ -157,7 +157,7 @@ interface ISwitchingColumnsArea { } const SwitchingColumnsArea: React.FC = ({ children }) => { - const instance = useInstance(); + const { instance } = useInstance(); const features = useFeatures(); const { search } = useLocation(); const { isLoggedIn } = useLoggedIn(); diff --git a/src/hooks/useBackend.ts b/src/hooks/useBackend.ts index a511abb2a..fbbad827d 100644 --- a/src/hooks/useBackend.ts +++ b/src/hooks/useBackend.ts @@ -8,7 +8,7 @@ import { useInstance } from './useInstance'; * @returns Backend */ const useBackend = () => { - const instance = useInstance(); + const { instance } = useInstance(); return parseVersion(instance.version); }; diff --git a/src/hooks/useFeatures.ts b/src/hooks/useFeatures.ts index bd0929bf5..f68cca14a 100644 --- a/src/hooks/useFeatures.ts +++ b/src/hooks/useFeatures.ts @@ -4,6 +4,6 @@ import { useInstance } from './useInstance'; /** Get features for the current instance. */ export const useFeatures = (): Features => { - const instance = useInstance(); + const { instance } = useInstance(); return getFeatures(instance); }; diff --git a/src/hooks/useInstance.ts b/src/hooks/useInstance.ts index dab7d2bbe..62635553c 100644 --- a/src/hooks/useInstance.ts +++ b/src/hooks/useInstance.ts @@ -2,5 +2,6 @@ import { useAppSelector } from './useAppSelector'; /** Get the Instance for the current backend. */ export const useInstance = () => { - return useAppSelector((state) => state.instance); + const instance = useAppSelector((state) => state.instance); + return { instance }; }; diff --git a/src/hooks/useRegistrationStatus.ts b/src/hooks/useRegistrationStatus.ts index 736c2d8cd..4d1068ce9 100644 --- a/src/hooks/useRegistrationStatus.ts +++ b/src/hooks/useRegistrationStatus.ts @@ -2,7 +2,7 @@ import { useFeatures } from './useFeatures'; import { useInstance } from './useInstance'; export const useRegistrationStatus = () => { - const instance = useInstance(); + const { instance } = useInstance(); const features = useFeatures(); return {