sforkowany z mirror/soapbox
Allow displaying RSS button to unauthenticated users
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>toast-story
rodzic
84ff4d928d
commit
5d10324127
|
@ -21,6 +21,7 @@ import { HStack, IconButton, Menu, MenuButton, MenuItem, MenuList, MenuLink, Men
|
|||
import SvgIcon from 'soapbox/components/ui/icon/svg-icon';
|
||||
import MovedNote from 'soapbox/features/account_timeline/components/moved_note';
|
||||
import ActionButton from 'soapbox/features/ui/components/action-button';
|
||||
import FeedButton from 'soapbox/features/ui/components/feed-button';
|
||||
import SubscriptionButton from 'soapbox/features/ui/components/subscription-button';
|
||||
import { useAppDispatch, useFeatures, useOwnAccount } from 'soapbox/hooks';
|
||||
import { normalizeAttachment } from 'soapbox/normalizers';
|
||||
|
@ -573,7 +574,7 @@ const Header: React.FC<IHeader> = ({ account }) => {
|
|||
<div className='mt-10 flex flex-row space-y-0 space-x-2'>
|
||||
<SubscriptionButton account={account} />
|
||||
|
||||
{ownAccount && (
|
||||
{ownAccount ? (
|
||||
<Menu>
|
||||
<MenuButton
|
||||
as={IconButton}
|
||||
|
@ -607,6 +608,8 @@ const Header: React.FC<IHeader> = ({ account }) => {
|
|||
})}
|
||||
</MenuList>
|
||||
</Menu>
|
||||
) : (
|
||||
<FeedButton account={account} />
|
||||
)}
|
||||
|
||||
{renderShareButton()}
|
||||
|
|
|
@ -49,6 +49,7 @@ const messages = defineMessages({
|
|||
authenticatedProfileLabel: { id: 'soapbox_config.authenticated_profile_label', defaultMessage: 'Profiles require authentication' },
|
||||
authenticatedProfileHint: { id: 'soapbox_config.authenticated_profile_hint', defaultMessage: 'Users must be logged-in to view replies and media on user profiles.' },
|
||||
displayCtaLabel: { id: 'soapbox_config.cta_label', defaultMessage: 'Display call to action panels if not authenticated' },
|
||||
featureFeedsLabel: { id: 'soapbox_config.feature_feeds_label', defaultMessage: 'Feature RSS feeds to unauthenticated users' },
|
||||
singleUserModeLabel: { id: 'soapbox_config.single_user_mode_label', defaultMessage: 'Single user mode' },
|
||||
singleUserModeHint: { id: 'soapbox_config.single_user_mode_hint', defaultMessage: 'Front page will redirect to a given user profile.' },
|
||||
singleUserModeProfileLabel: { id: 'soapbox_config.single_user_mode_profile_label', defaultMessage: 'Main user handle' },
|
||||
|
@ -269,6 +270,13 @@ const SoapboxConfig: React.FC = () => {
|
|||
/>
|
||||
</ListItem>
|
||||
|
||||
<ListItem label={intl.formatMessage(messages.featureFeedsLabel)}>
|
||||
<Toggle
|
||||
checked={soapbox.featureFeeds === true}
|
||||
onChange={handleChange(['featureFeeds'], (e) => e.target.checked)}
|
||||
/>
|
||||
</ListItem>
|
||||
|
||||
<ListItem
|
||||
label={intl.formatMessage(messages.authenticatedProfileLabel)}
|
||||
hint={intl.formatMessage(messages.authenticatedProfileHint)}
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
import React from 'react';
|
||||
import { defineMessages, useIntl } from 'react-intl';
|
||||
|
||||
import { IconButton } from 'soapbox/components/ui';
|
||||
import { useAppSelector, useSoapboxConfig } from 'soapbox/hooks';
|
||||
import { isLocal } from 'soapbox/utils/accounts';
|
||||
import { parseVersion, MASTODON, PLEROMA } from 'soapbox/utils/features';
|
||||
|
||||
import type { Account as AccountEntity } from 'soapbox/types/entities';
|
||||
|
||||
const messages = defineMessages({
|
||||
subscribeFeed: { id: 'account.rss_feed', defaultMessage: 'Subscribe to RSS feed' },
|
||||
});
|
||||
|
||||
interface IFeedButton {
|
||||
account: AccountEntity
|
||||
}
|
||||
|
||||
const FeedButton = ({ account }: IFeedButton) => {
|
||||
const intl = useIntl();
|
||||
const { featureFeeds } = useSoapboxConfig();
|
||||
|
||||
const { software } = useAppSelector((state) => parseVersion(state.instance.version));
|
||||
|
||||
let feedUrl: string | undefined;
|
||||
|
||||
switch (software) {
|
||||
case MASTODON:
|
||||
feedUrl = `${account.url}.rss`;
|
||||
break;
|
||||
case PLEROMA:
|
||||
feedUrl = `${account.url}/feed.rss`;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!featureFeeds || !feedUrl || !isLocal(account)) return null;
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
src={require('@tabler/icons/rss.svg')}
|
||||
onClick={() => window.open(feedUrl, '_blank')}
|
||||
title={intl.formatMessage(messages.subscribeFeed)}
|
||||
theme='outlined'
|
||||
className='px-[10px]'
|
||||
iconClassName='w-4 h-4'
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default FeedButton;
|
|
@ -32,12 +32,12 @@ const SubscriptionButton = ({ account }: ISubscriptionButton) => {
|
|||
|
||||
const isFollowing = account.relationship?.following;
|
||||
const isRequested = account.relationship?.requested;
|
||||
const isSubscribed = features.accountNotifies ?
|
||||
account.relationship?.notifying :
|
||||
account.relationship?.subscribing;
|
||||
const title = isSubscribed ?
|
||||
intl.formatMessage(messages.unsubscribe, { name: account.get('username') }) :
|
||||
intl.formatMessage(messages.subscribe, { name: account.get('username') });
|
||||
const isSubscribed = features.accountNotifies
|
||||
? account.relationship?.notifying
|
||||
: account.relationship?.subscribing;
|
||||
const title = isSubscribed
|
||||
? intl.formatMessage(messages.unsubscribe, { name: account.get('username') })
|
||||
: intl.formatMessage(messages.subscribe, { name: account.get('username') });
|
||||
|
||||
const onSubscribeSuccess = () =>
|
||||
dispatch(snackbar.success(intl.formatMessage(messages.subscribeSuccess)));
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
"account.report": "Zgłoś @{name}",
|
||||
"account.requested": "Oczekująca prośba, kliknij aby anulować",
|
||||
"account.requested_small": "Oczekująca prośba",
|
||||
"account.rss_feed": "Subskrybuj kanał RSS",
|
||||
"account.search": "Szukaj wpisów @{name}",
|
||||
"account.search_self": "Szukaj własnych wpisów",
|
||||
"account.share": "Udostępnij profil @{name}",
|
||||
|
|
|
@ -112,6 +112,7 @@ export const SoapboxConfigRecord = ImmutableRecord({
|
|||
linkFooterMessage: '',
|
||||
links: ImmutableMap<string, string>(),
|
||||
displayCta: true,
|
||||
featureFeeds: false,
|
||||
}, 'SoapboxConfig');
|
||||
|
||||
type SoapboxConfigMap = ImmutableMap<string, any>;
|
||||
|
|
|
@ -133,7 +133,7 @@ const configuration: Configuration = {
|
|||
'/unsubscribe',
|
||||
];
|
||||
|
||||
if (backendRoutes.some(path => pathname.startsWith(path)) || pathname.endsWith('/embed')) {
|
||||
if (backendRoutes.some(path => pathname.startsWith(path)) || pathname.endsWith('/embed') || pathname.endsWith('.rss')) {
|
||||
return url;
|
||||
}
|
||||
},
|
||||
|
|
Ładowanie…
Reference in New Issue