Merge branch 'instance-hook-obj' into 'main'

Make useInstance return an object containing the instance

See merge request soapbox-pub/soapbox!3147
This commit is contained in:
Alex Gleason 2024-10-11 06:42:43 +00:00
commit 008dbb35d1
52 changed files with 62 additions and 57 deletions

View File

@ -22,7 +22,7 @@ function getRandomNumber(min: number, max: number): number {
const useCaptcha = () => { const useCaptcha = () => {
const api = useApi(); const api = useApi();
const instance = useInstance(); const { instance } = useInstance();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const intl = useIntl(); const intl = useIntl();
const [captcha, setCaptcha] = useState<CaptchaData>(); const [captcha, setCaptcha] = useState<CaptchaData>();

View File

@ -10,7 +10,7 @@ function useTimelineStream(...args: Parameters<typeof connectTimelineStream>) {
const { enabled = true } = args[4] ?? {}; const { enabled = true } = args[4] ?? {};
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const instance = useInstance(); const { instance } = useInstance();
const stream = useRef<(() => void) | null>(null); const stream = useRef<(() => void) | null>(null);
const accessToken = useAppSelector(getAccessToken); const accessToken = useAppSelector(getAccessToken);

View File

@ -22,7 +22,7 @@ interface IBirthdayInput {
const BirthdayInput: React.FC<IBirthdayInput> = ({ value, onChange, required }) => { const BirthdayInput: React.FC<IBirthdayInput> = ({ value, onChange, required }) => {
const intl = useIntl(); const intl = useIntl();
const features = useFeatures(); const features = useFeatures();
const instance = useInstance(); const { instance } = useInstance();
const supportsBirthdays = features.birthdays; const supportsBirthdays = features.birthdays;
const minAge = instance.pleroma.metadata.birthday_min_age; const minAge = instance.pleroma.metadata.birthday_min_age;

View File

@ -13,7 +13,7 @@ const GdprBanner: React.FC = () => {
const [shown, setShown] = useState<boolean>(acceptedGdpr); const [shown, setShown] = useState<boolean>(acceptedGdpr);
const [slideout, setSlideout] = useState(false); const [slideout, setSlideout] = useState(false);
const instance = useInstance(); const { instance } = useInstance();
const { gdprUrl } = useSoapboxConfig(); const { gdprUrl } = useSoapboxConfig();
const handleAccept = () => { const handleAccept = () => {

View File

@ -20,7 +20,7 @@ interface IHelmet {
} }
const Helmet: React.FC<IHelmet> = ({ children }) => { const Helmet: React.FC<IHelmet> = ({ children }) => {
const instance = useInstance(); const { instance } = useInstance();
const { unreadChatsCount } = useStatContext(); const { unreadChatsCount } = useStatContext();
const unreadCount = useAppSelector((state) => getNotifTotals(state) + unreadChatsCount); const unreadCount = useAppSelector((state) => getNotifTotals(state) + unreadChatsCount);
const { demetricator } = useSettings(); const { demetricator } = useSettings();

View File

@ -90,7 +90,7 @@ const SidebarMenu: React.FC = (): JSX.Element | null => {
const sidebarOpen = useAppSelector((state) => state.sidebar.sidebarOpen); const sidebarOpen = useAppSelector((state) => state.sidebar.sidebarOpen);
const settings = useAppSelector((state) => getSettings(state)); const settings = useAppSelector((state) => getSettings(state));
const followRequestsCount = useAppSelector((state) => state.user_lists.follow_requests.items.count()); const followRequestsCount = useAppSelector((state) => state.user_lists.follow_requests.items.count());
const instance = useInstance(); const { instance } = useInstance();
const settingsNotifications = useSettingsNotifications(); const settingsNotifications = useSettingsNotifications();
const closeButtonRef = React.useRef(null); const closeButtonRef = React.useRef(null);

View File

@ -23,7 +23,7 @@ const SidebarNavigation = () => {
const intl = useIntl(); const intl = useIntl();
const { unreadChatsCount } = useStatContext(); const { unreadChatsCount } = useStatContext();
const instance = useInstance(); const { instance } = useInstance();
const features = useFeatures(); const features = useFeatures();
const { isDeveloper } = useSettings(); const { isDeveloper } = useSettings();
const { account } = useOwnAccount(); const { account } = useOwnAccount();

View File

@ -16,7 +16,7 @@ const TranslateButton: React.FC<ITranslateButton> = ({ status }) => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const intl = useIntl(); const intl = useIntl();
const features = useFeatures(); const features = useFeatures();
const instance = useInstance(); const { instance } = useInstance();
const me = useAppSelector((state) => state.me); const me = useAppSelector((state) => state.me);

View File

@ -19,7 +19,7 @@ interface NostrProviderProps {
} }
export const NostrProvider: React.FC<NostrProviderProps> = ({ children }) => { export const NostrProvider: React.FC<NostrProviderProps> = ({ children }) => {
const instance = useInstance(); const { instance } = useInstance();
const hasNostr = !!instance.nostr; const hasNostr = !!instance.nostr;
const [relay, setRelay] = useState<NRelay1>(); const [relay, setRelay] = useState<NRelay1>();

View File

@ -36,7 +36,7 @@ const modeFromInstance = ({ registrations }: Instance): RegistrationMode => {
const RegistrationModePicker: React.FC = () => { const RegistrationModePicker: React.FC = () => {
const intl = useIntl(); const intl = useIntl();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const instance = useInstance(); const { instance } = useInstance();
const mode = modeFromInstance(instance); const mode = modeFromInstance(instance);

View File

@ -14,7 +14,7 @@ import RegistrationModePicker from '../components/registration-mode-picker';
const Dashboard: React.FC = () => { const Dashboard: React.FC = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const instance = useInstance(); const { instance } = useInstance();
const features = useFeatures(); const features = useFeatures();
const { account } = useOwnAccount(); const { account } = useOwnAccount();

View File

@ -11,7 +11,7 @@ interface IConsumersList {
/** Displays OAuth consumers to log in with. */ /** Displays OAuth consumers to log in with. */
const ConsumersList: React.FC<IConsumersList> = () => { const ConsumersList: React.FC<IConsumersList> = () => {
const instance = useInstance(); const { instance } = useInstance();
const providers = instance.pleroma.oauth_consumer_strategies; const providers = instance.pleroma.oauth_consumer_strategies;
if (providers.length > 0) { if (providers.length > 0) {

View File

@ -42,7 +42,7 @@ const RegistrationForm: React.FC<IRegistrationForm> = ({ inviteToken }) => {
const { locale } = useSettings(); const { locale } = useSettings();
const features = useFeatures(); const features = useFeatures();
const instance = useInstance(); const { instance } = useInstance();
const needsConfirmation = instance.pleroma.metadata.account_activation_required; const needsConfirmation = instance.pleroma.metadata.account_activation_required;
const needsApproval = instance.registrations.approval_required; const needsApproval = instance.registrations.approval_required;

View File

@ -10,7 +10,7 @@ import { useAppDispatch, useFeatures, useInstance, useRegistrationStatus } from
import RegistrationForm from './registration-form'; import RegistrationForm from './registration-form';
const RegistrationPage: React.FC = () => { const RegistrationPage: React.FC = () => {
const instance = useInstance(); const { instance } = useInstance();
const { isOpen } = useRegistrationStatus(); const { isOpen } = useRegistrationStatus();
const { nostrSignup } = useFeatures(); const { nostrSignup } = useFeatures();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();

View File

@ -13,7 +13,7 @@ import Timeline from '../ui/components/timeline';
const CommunityTimeline = () => { const CommunityTimeline = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const theme = useTheme(); const theme = useTheme();
const instance = useInstance(); const { instance } = useInstance();
const settings = useSettings(); const settings = useSettings();
const onlyMedia = settings.community.other.onlyMedia; const onlyMedia = settings.community.other.onlyMedia;

View File

@ -68,11 +68,11 @@ const ComposeForm = <ID extends string>({ id, shouldCondense, autoFocus, clickab
const history = useHistory(); const history = useHistory();
const intl = useIntl(); const intl = useIntl();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const { configuration } = useInstance(); const { instance } = useInstance();
const compose = useCompose(id); const compose = useCompose(id);
const showSearch = useAppSelector((state) => state.search.submitted && !state.search.hidden); 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 scheduledStatusCount = useAppSelector((state) => state.scheduled_statuses.size);
const features = useFeatures(); const features = useFeatures();

View File

@ -110,7 +110,7 @@ interface IPollForm {
const PollForm: React.FC<IPollForm> = ({ composeId }) => { const PollForm: React.FC<IPollForm> = ({ composeId }) => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const intl = useIntl(); const intl = useIntl();
const { configuration } = useInstance(); const { instance } = useInstance();
const compose = useCompose(composeId); const compose = useCompose(composeId);
@ -121,7 +121,7 @@ const PollForm: React.FC<IPollForm> = ({ composeId }) => {
const { const {
max_options: maxOptions, max_options: maxOptions,
max_characters_per_option: maxOptionChars, max_characters_per_option: maxOptionChars,
} = configuration.polls; } = instance.configuration.polls;
const onRemoveOption = (index: number) => dispatch(removePollOption(composeId, index)); const onRemoveOption = (index: number) => dispatch(removePollOption(composeId, index));
const onChangeOption = (index: number, title: string) => dispatch(changePollOption(composeId, index, title)); const onChangeOption = (index: number, title: string) => dispatch(changePollOption(composeId, index, title));

View File

@ -33,10 +33,10 @@ const UploadButton: React.FC<IUploadButton> = ({
icon, icon,
}) => { }) => {
const intl = useIntl(); const intl = useIntl();
const { configuration } = useInstance(); const { instance } = useInstance();
const fileElement = useRef<HTMLInputElement>(null); const fileElement = useRef<HTMLInputElement>(null);
const attachmentTypes = configuration.media_attachments.supported_mime_types; const attachmentTypes = instance.configuration.media_attachments.supported_mime_types;
const handleChange: React.ChangeEventHandler<HTMLInputElement> = (e) => { const handleChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {
if (e.target.files?.length) { if (e.target.files?.length) {

View File

@ -15,7 +15,8 @@ interface IUploadCompose {
const UploadCompose: React.FC<IUploadCompose> = ({ composeId, id, onSubmit, onDragStart, onDragEnter, onDragEnd }) => { const UploadCompose: React.FC<IUploadCompose> = ({ composeId, id, onSubmit, onDragStart, onDragEnter, onDragEnd }) => {
const dispatch = useAppDispatch(); 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)!; const media = useCompose(composeId).media_attachments.find(item => item.id === id)!;

View File

@ -18,7 +18,7 @@ interface ICryptoDonatePanel {
const CryptoDonatePanel: React.FC<ICryptoDonatePanel> = ({ limit = 3 }): JSX.Element | null => { const CryptoDonatePanel: React.FC<ICryptoDonatePanel> = ({ limit = 3 }): JSX.Element | null => {
const intl = useIntl(); const intl = useIntl();
const history = useHistory(); const history = useHistory();
const instance = useInstance(); const { instance } = useInstance();
const addresses = useSoapboxConfig().get('cryptoAddresses'); const addresses = useSoapboxConfig().get('cryptoAddresses');

View File

@ -12,7 +12,7 @@ const messages = defineMessages({
const CryptoDonate: React.FC = (): JSX.Element => { const CryptoDonate: React.FC = (): JSX.Element => {
const intl = useIntl(); const intl = useIntl();
const instance = useInstance(); const { instance } = useInstance();
const [explanationBoxExpanded, toggleExplanationBox] = useState(true); const [explanationBoxExpanded, toggleExplanationBox] = useState(true);

View File

@ -23,7 +23,7 @@ const Directory = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const { search } = useLocation(); const { search } = useLocation();
const params = new URLSearchParams(search); const params = new URLSearchParams(search);
const instance = useInstance(); const { instance } = useInstance();
const features = useFeatures(); const features = useFeatures();
const accountIds = useAppSelector((state) => state.user_lists.directory.items); const accountIds = useAppSelector((state) => state.user_lists.directory.items);

View File

@ -27,7 +27,7 @@ const messages = defineMessages({
/** EditIdentity component. */ /** EditIdentity component. */
const EditIdentity: React.FC<IEditIdentity> = () => { const EditIdentity: React.FC<IEditIdentity> = () => {
const intl = useIntl(); const intl = useIntl();
const instance = useInstance(); const { instance } = useInstance();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const { account } = useOwnAccount(); const { account } = useOwnAccount();
const { mutate, isPending } = useRequestName(); const { mutate, isPending } = useRequestName();
@ -162,7 +162,7 @@ const EditIdentity: React.FC<IEditIdentity> = () => {
const UsernameInput: React.FC<React.ComponentProps<typeof Input>> = (props) => { const UsernameInput: React.FC<React.ComponentProps<typeof Input>> = (props) => {
const intl = useIntl(); const intl = useIntl();
const instance = useInstance(); const { instance } = useInstance();
return ( return (
<Input <Input

View File

@ -194,7 +194,7 @@ const ProfileField: StreamfieldComponent<AccountCredentialsField> = ({ value, on
const EditProfile: React.FC = () => { const EditProfile: React.FC = () => {
const intl = useIntl(); const intl = useIntl();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const instance = useInstance(); const { instance } = useInstance();
const { account } = useOwnAccount(); const { account } = useOwnAccount();
const features = useFeatures(); const features = useFeatures();

View File

@ -34,7 +34,7 @@ interface IInstanceRestrictions {
} }
const InstanceRestrictions: React.FC<IInstanceRestrictions> = ({ remoteInstance }) => { const InstanceRestrictions: React.FC<IInstanceRestrictions> = ({ remoteInstance }) => {
const instance = useInstance(); const { instance } = useInstance();
const renderRestrictions = () => { const renderRestrictions = () => {
const items = []; const items = [];

View File

@ -21,7 +21,7 @@ const messages = defineMessages({
const FederationRestrictions = () => { const FederationRestrictions = () => {
const intl = useIntl(); const intl = useIntl();
const instance = useInstance(); const { instance } = useInstance();
const getHosts = useCallback(makeGetHosts(), []); const getHosts = useCallback(makeGetHosts(), []);

View File

@ -31,7 +31,7 @@ interface IEditGroup {
const EditGroup: React.FC<IEditGroup> = ({ params: { groupId } }) => { const EditGroup: React.FC<IEditGroup> = ({ params: { groupId } }) => {
const intl = useIntl(); const intl = useIntl();
const instance = useInstance(); const { instance } = useInstance();
const { group, isLoading } = useGroup(groupId); const { group, isLoading } = useGroup(groupId);
const { updateGroup } = useUpdateGroup(groupId); const { updateGroup } = useUpdateGroup(groupId);

View File

@ -17,7 +17,7 @@ const HomeTimeline: React.FC = () => {
const intl = useIntl(); const intl = useIntl();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const features = useFeatures(); const features = useFeatures();
const instance = useInstance(); const { instance } = useInstance();
const theme = useTheme(); const theme = useTheme();
const polling = useRef<NodeJS.Timeout | null>(null); const polling = useRef<NodeJS.Timeout | null>(null);

View File

@ -9,7 +9,7 @@ import { getTextDirection } from 'soapbox/utils/rtl';
import { LogoText } from './logo-text'; import { LogoText } from './logo-text';
const SiteBanner: React.FC = () => { const SiteBanner: React.FC = () => {
const instance = useInstance(); const { instance } = useInstance();
const description = DOMPurify.sanitize(instance.description); const description = DOMPurify.sanitize(instance.description);
return ( return (

View File

@ -15,7 +15,7 @@ import { SiteBanner } from './components/site-banner';
const LandingTimeline = () => { const LandingTimeline = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const instance = useInstance(); const { instance } = useInstance();
const theme = useTheme(); const theme = useTheme();
const isMobile = useIsMobile(); const isMobile = useIsMobile();

View File

@ -21,7 +21,7 @@ const messages = defineMessages({
const Migration = () => { const Migration = () => {
const intl = useIntl(); const intl = useIntl();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const instance = useInstance(); const { instance } = useInstance();
const cooldownPeriod = instance.pleroma.metadata.migration_cooldown_period; const cooldownPeriod = instance.pleroma.metadata.migration_cooldown_period;

View File

@ -38,7 +38,7 @@ interface RelayData {
} }
const RelayField: StreamfieldComponent<RelayData> = ({ value, onChange }) => { const RelayField: StreamfieldComponent<RelayData> = ({ value, onChange }) => {
const instance = useInstance(); const { instance } = useInstance();
const handleChange = (key: string): React.ChangeEventHandler<HTMLInputElement> => { const handleChange = (key: string): React.ChangeEventHandler<HTMLInputElement> => {
return e => { return e => {

View File

@ -198,7 +198,7 @@ const Notification: React.FC<INotification> = (props) => {
const history = useHistory(); const history = useHistory();
const intl = useIntl(); const intl = useIntl();
const instance = useInstance(); const { instance } = useInstance();
const type = notification.type; const type = notification.type;
const { account, status } = notification; const { account, status } = notification;

View File

@ -27,7 +27,7 @@ const PublicTimeline = () => {
const [language, setLanguage] = useState<string>(localStorage.getItem('soapbox:global:language') || ''); const [language, setLanguage] = useState<string>(localStorage.getItem('soapbox:global:language') || '');
const instance = useInstance(); const { instance } = useInstance();
const settings = useSettings(); const settings = useSettings();
const onlyMedia = settings.public.other.onlyMedia; const onlyMedia = settings.public.other.onlyMedia;
const next = useAppSelector(state => state.timelines.get('public')?.next); const next = useAppSelector(state => state.timelines.get('public')?.next);

View File

@ -12,7 +12,7 @@ interface RegisterInviteParams {
/** Page to register with an invitation. */ /** Page to register with an invitation. */
const RegisterInvite: React.FC = () => { const RegisterInvite: React.FC = () => {
const instance = useInstance(); const { instance } = useInstance();
const { token } = useParams<RegisterInviteParams>(); const { token } = useParams<RegisterInviteParams>();
const title = ( const title = (

View File

@ -13,7 +13,7 @@ const messages = defineMessages({
const ServerInfo = () => { const ServerInfo = () => {
const intl = useIntl(); const intl = useIntl();
const instance = useInstance(); const { instance } = useInstance();
return ( return (
<Column label={intl.formatMessage(messages.heading)}> <Column label={intl.formatMessage(messages.heading)}>

View File

@ -46,7 +46,7 @@ const Settings = () => {
const mfa = useAppSelector((state) => state.security.get('mfa')); const mfa = useAppSelector((state) => state.security.get('mfa'));
const features = useFeatures(); const features = useFeatures();
const { account } = useOwnAccount(); const { account } = useOwnAccount();
const instance = useInstance(); const { instance } = useInstance();
const settingsNotifications = useSettingsNotifications(); const settingsNotifications = useSettingsNotifications();
const isMfaEnabled = mfa.getIn(['settings', 'totp']); const isMfaEnabled = mfa.getIn(['settings', 'totp']);

View File

@ -6,7 +6,7 @@ import { useInstance, useSoapboxConfig } from 'soapbox/hooks';
/** Prompts logged-out users to log in when viewing a thread. */ /** Prompts logged-out users to log in when viewing a thread. */
const ThreadLoginCta: React.FC = () => { const ThreadLoginCta: React.FC = () => {
const instance = useInstance(); const { instance } = useInstance();
const { displayCta } = useSoapboxConfig(); const { displayCta } = useSoapboxConfig();
if (!displayCta) return null; if (!displayCta) return null;

View File

@ -5,7 +5,7 @@ import { Banner, Button, HStack, Stack, Text } from 'soapbox/components/ui';
import { useAppSelector, useInstance, useRegistrationStatus, useSoapboxConfig } from 'soapbox/hooks'; import { useAppSelector, useInstance, useRegistrationStatus, useSoapboxConfig } from 'soapbox/hooks';
const CtaBanner = () => { const CtaBanner = () => {
const instance = useInstance(); const { instance } = useInstance();
const { isOpen } = useRegistrationStatus(); const { isOpen } = useRegistrationStatus();
const { displayCta } = useSoapboxConfig(); const { displayCta } = useSoapboxConfig();
const me = useAppSelector((state) => state.me); const me = useAppSelector((state) => state.me);

View File

@ -24,7 +24,7 @@ interface IDetailsStep {
const DetailsStep: React.FC<IDetailsStep> = ({ params, onChange }) => { const DetailsStep: React.FC<IDetailsStep> = ({ params, onChange }) => {
const intl = useIntl(); const intl = useIntl();
const debounce = useDebounce; const debounce = useDebounce;
const instance = useInstance(); const { instance } = useInstance();
const { const {
display_name: displayName = '', display_name: displayName = '',

View File

@ -16,7 +16,7 @@ interface IExtensionStep {
const ExtensionStep: React.FC<IExtensionStep> = ({ isLogin, onClickAlt, onClose }) => { const ExtensionStep: React.FC<IExtensionStep> = ({ isLogin, onClickAlt, onClose }) => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const instance = useInstance(); const { instance } = useInstance();
const { logo } = useSoapboxConfig(); const { logo } = useSoapboxConfig();
const handleClose = () => { const handleClose = () => {

View File

@ -20,7 +20,7 @@ interface IKeygenStep {
} }
const KeygenStep: React.FC<IKeygenStep> = ({ onClose }) => { const KeygenStep: React.FC<IKeygenStep> = ({ onClose }) => {
const instance = useInstance(); const { instance } = useInstance();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const isMobile = useIsMobile(); const isMobile = useIsMobile();
const { relay } = useNostr(); const { relay } = useNostr();

View File

@ -104,13 +104,13 @@ const ReportModal = ({ onClose }: IReportModal) => {
const entityType = useAppSelector((state) => state.reports.new.entityType); const entityType = useAppSelector((state) => state.reports.new.entityType);
const isBlocked = useAppSelector((state) => state.reports.new.block); const isBlocked = useAppSelector((state) => state.reports.new.block);
const isSubmitting = useAppSelector((state) => state.reports.new.isSubmitting); const isSubmitting = useAppSelector((state) => state.reports.new.isSubmitting);
const { rules } = useInstance(); const { instance } = useInstance();
const ruleIds = useAppSelector((state) => state.reports.new.rule_ids); const ruleIds = useAppSelector((state) => state.reports.new.rule_ids);
const selectedStatusIds = useAppSelector((state) => state.reports.new.status_ids); const selectedStatusIds = useAppSelector((state) => state.reports.new.status_ids);
const selectedChatMessage = useAppSelector((state) => state.reports.new.chat_message); const selectedChatMessage = useAppSelector((state) => state.reports.new.chat_message);
const selectedGroup = useAppSelector((state) => state.reports.new.group); 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 isReportingAccount = entityType === ReportableEntities.ACCOUNT;
const isReportingStatus = entityType === ReportableEntities.STATUS; const isReportingStatus = entityType === ReportableEntities.STATUS;

View File

@ -31,8 +31,11 @@ const ReasonStep: React.FC<IReasonStep> = () => {
const entityType = useAppSelector((state) => state.reports.new.entityType); const entityType = useAppSelector((state) => state.reports.new.entityType);
const comment = useAppSelector((state) => state.reports.new.comment); const comment = useAppSelector((state) => state.reports.new.comment);
const { rules } = useInstance();
const ruleIds = useAppSelector((state) => state.reports.new.rule_ids); const ruleIds = useAppSelector((state) => state.reports.new.rule_ids);
const { instance } = useInstance();
const { rules } = instance;
const shouldRequireRule = rules.length > 0; const shouldRequireRule = rules.length > 0;
const handleCommentChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => { const handleCommentChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {

View File

@ -29,7 +29,7 @@ const UnauthorizedModal: React.FC<IUnauthorizedModal> = ({ action, onClose, acco
const intl = useIntl(); const intl = useIntl();
const history = useHistory(); const history = useHistory();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const instance = useInstance(); const { instance } = useInstance();
const { isOpen } = useRegistrationStatus(); const { isOpen } = useRegistrationStatus();
const username = useAppSelector(state => selectAccount(state, accountId!)?.display_name); const username = useAppSelector(state => selectAccount(state, accountId!)?.display_name);

View File

@ -6,7 +6,7 @@ import { Button, Stack, Text } from 'soapbox/components/ui';
import { useAppDispatch, useAppSelector, useFeatures, useInstance, useRegistrationStatus } from 'soapbox/hooks'; import { useAppDispatch, useAppSelector, useFeatures, useInstance, useRegistrationStatus } from 'soapbox/hooks';
const SignUpPanel = () => { const SignUpPanel = () => {
const instance = useInstance(); const { instance } = useInstance();
const { nostrSignup } = useFeatures(); const { nostrSignup } = useFeatures();
const { isOpen } = useRegistrationStatus(); const { isOpen } = useRegistrationStatus();
const me = useAppSelector((state) => state.me); const me = useAppSelector((state) => state.me);

View File

@ -5,7 +5,7 @@ import { Widget, Stack, Text } from 'soapbox/components/ui';
import { useInstance, useSettings, useSoapboxConfig } from 'soapbox/hooks'; import { useInstance, useSettings, useSoapboxConfig } from 'soapbox/hooks';
const PromoPanel: React.FC = () => { const PromoPanel: React.FC = () => {
const instance = useInstance(); const { instance } = useInstance();
const { promoPanel } = useSoapboxConfig(); const { promoPanel } = useSoapboxConfig();
const { locale } = useSettings(); const { locale } = useSettings();

View File

@ -157,7 +157,7 @@ interface ISwitchingColumnsArea {
} }
const SwitchingColumnsArea: React.FC<ISwitchingColumnsArea> = ({ children }) => { const SwitchingColumnsArea: React.FC<ISwitchingColumnsArea> = ({ children }) => {
const instance = useInstance(); const { instance } = useInstance();
const features = useFeatures(); const features = useFeatures();
const { search } = useLocation(); const { search } = useLocation();
const { isLoggedIn } = useLoggedIn(); const { isLoggedIn } = useLoggedIn();

View File

@ -8,7 +8,7 @@ import { useInstance } from './useInstance';
* @returns Backend * @returns Backend
*/ */
const useBackend = () => { const useBackend = () => {
const instance = useInstance(); const { instance } = useInstance();
return parseVersion(instance.version); return parseVersion(instance.version);
}; };

View File

@ -4,6 +4,6 @@ import { useInstance } from './useInstance';
/** Get features for the current instance. */ /** Get features for the current instance. */
export const useFeatures = (): Features => { export const useFeatures = (): Features => {
const instance = useInstance(); const { instance } = useInstance();
return getFeatures(instance); return getFeatures(instance);
}; };

View File

@ -2,5 +2,6 @@ import { useAppSelector } from './useAppSelector';
/** Get the Instance for the current backend. */ /** Get the Instance for the current backend. */
export const useInstance = () => { export const useInstance = () => {
return useAppSelector((state) => state.instance); const instance = useAppSelector((state) => state.instance);
return { instance };
}; };

View File

@ -2,7 +2,7 @@ import { useFeatures } from './useFeatures';
import { useInstance } from './useInstance'; import { useInstance } from './useInstance';
export const useRegistrationStatus = () => { export const useRegistrationStatus = () => {
const instance = useInstance(); const { instance } = useInstance();
const features = useFeatures(); const features = useFeatures();
return { return {