diff --git a/app/javascript/flavours/glitch/features/community_timeline/index.jsx b/app/javascript/flavours/glitch/features/community_timeline/index.jsx index 9f306923e3..3ea869b8f7 100644 --- a/app/javascript/flavours/glitch/features/community_timeline/index.jsx +++ b/app/javascript/flavours/glitch/features/community_timeline/index.jsx @@ -10,7 +10,8 @@ import { connect } from 'react-redux'; import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; import { DismissableBanner } from 'flavours/glitch/components/dismissable_banner'; import { identityContextPropShape, withIdentity } from 'flavours/glitch/identity_context'; -import { domain } from 'flavours/glitch/initial_state'; +import { domain, localLiveFeedAccess } from 'flavours/glitch/initial_state'; +import { canViewFeed } from 'flavours/glitch/permissions'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import { connectCommunityStream } from '../../actions/streaming'; @@ -123,8 +124,21 @@ class CommunityTimeline extends PureComponent { render () { const { intl, hasUnread, columnId, multiColumn, onlyMedia } = this.props; + const { signedIn, permissions } = this.props.identity; const pinned = !!columnId; + const emptyMessage = canViewFeed(signedIn, permissions, localLiveFeedAccess) ? ( + + ) : ( + + ); + return ( } + emptyMessage={emptyMessage} bindToDocument={!multiColumn} regex={this.props.regex} /> diff --git a/app/javascript/flavours/glitch/features/firehose/index.jsx b/app/javascript/flavours/glitch/features/firehose/index.jsx index c724cc1c08..3a782c2aad 100644 --- a/app/javascript/flavours/glitch/features/firehose/index.jsx +++ b/app/javascript/flavours/glitch/features/firehose/index.jsx @@ -14,7 +14,8 @@ import { connectPublicStream, connectCommunityStream } from 'flavours/glitch/act import { expandPublicTimeline, expandCommunityTimeline } from 'flavours/glitch/actions/timelines'; import { DismissableBanner } from 'flavours/glitch/components/dismissable_banner'; import SettingText from 'flavours/glitch/components/setting_text'; -import { localLiveFeedAccess, remoteLiveFeedAccess, me, domain } from 'flavours/glitch/initial_state'; +import { localLiveFeedAccess, remoteLiveFeedAccess, domain } from 'flavours/glitch/initial_state'; +import { canViewFeed } from 'flavours/glitch/permissions'; import { useAppDispatch, useAppSelector } from 'flavours/glitch/store'; import Column from '../../components/column'; @@ -75,7 +76,7 @@ const ColumnSettings = () => { const Firehose = ({ feedType, multiColumn }) => { const dispatch = useAppDispatch(); const intl = useIntl(); - const { signedIn } = useIdentity(); + const { signedIn, permissions } = useIdentity(); const columnRef = useRef(null); const allowLocalOnly = useAppSelector((state) => state.getIn(['settings', 'firehose', 'allowLocalOnly'])); @@ -177,6 +178,15 @@ const Firehose = ({ feedType, multiColumn }) => { /> ); + const canViewSelectedFeed = canViewFeed(signedIn, permissions, feedType === 'community' ? localLiveFeedAccess : remoteLiveFeedAccess); + + const disabledTimelineMessage = ( + + ); + return ( { - {(signedIn || (localLiveFeedAccess === 'public' && remoteLiveFeedAccess === 'public')) && ( + {(canViewFeed(signedIn, permissions, localLiveFeedAccess) && canViewFeed(signedIn, permissions, remoteLiveFeedAccess)) && (
@@ -213,7 +223,7 @@ const Firehose = ({ feedType, multiColumn }) => { onLoadMore={handleLoadMore} trackScroll scrollKey='firehose' - emptyMessage={emptyMessage} + emptyMessage={canViewSelectedFeed ? emptyMessage : disabledTimelineMessage} bindToDocument={!multiColumn} regex={regex} /> diff --git a/app/javascript/flavours/glitch/features/navigation_panel/index.tsx b/app/javascript/flavours/glitch/features/navigation_panel/index.tsx index 65f021d82c..17f95bd628 100644 --- a/app/javascript/flavours/glitch/features/navigation_panel/index.tsx +++ b/app/javascript/flavours/glitch/features/navigation_panel/index.tsx @@ -47,6 +47,7 @@ import { me, } from 'flavours/glitch/initial_state'; import { transientSingleColumn } from 'flavours/glitch/is_mobile'; +import { canViewFeed } from 'flavours/glitch/permissions'; import { selectUnreadNotificationGroupsCount } from 'flavours/glitch/selectors/notifications'; import { useAppSelector, useAppDispatch } from 'flavours/glitch/store'; @@ -208,7 +209,7 @@ export const NavigationPanel: React.FC<{ multiColumn?: boolean }> = ({ multiColumn = false, }) => { const intl = useIntl(); - const { signedIn, disabledAccountId } = useIdentity(); + const { signedIn, permissions, disabledAccountId } = useIdentity(); const location = useLocation(); const showSearch = useBreakpoint('full') && !multiColumn; const dispatch = useAppDispatch(); @@ -286,13 +287,12 @@ export const NavigationPanel: React.FC<{ multiColumn?: boolean }> = ({ /> )} - {(signedIn || - localLiveFeedAccess === 'public' || - remoteLiveFeedAccess === 'public') && ( + {(canViewFeed(signedIn, permissions, localLiveFeedAccess) || + canViewFeed(signedIn, permissions, remoteLiveFeedAccess)) && ( + ) : ( + + ); + return ( } + emptyMessage={emptyMessage} bindToDocument={!multiColumn} regex={this.props.regex} /> diff --git a/app/javascript/flavours/glitch/initial_state.ts b/app/javascript/flavours/glitch/initial_state.ts index 359f0f6c01..bf9926c543 100644 --- a/app/javascript/flavours/glitch/initial_state.ts +++ b/app/javascript/flavours/glitch/initial_state.ts @@ -35,10 +35,10 @@ interface InitialStateMeta { single_user_mode: boolean; source_url: string; streaming_api_base_url: string; - local_live_feed_access: 'public' | 'authenticated'; - remote_live_feed_access: 'public' | 'authenticated'; - local_topic_feed_access: 'public' | 'authenticated'; - remote_topic_feed_access: 'public' | 'authenticated'; + local_live_feed_access: 'public' | 'authenticated' | 'disabled'; + remote_live_feed_access: 'public' | 'authenticated' | 'disabled'; + local_topic_feed_access: 'public' | 'authenticated' | 'disabled'; + remote_topic_feed_access: 'public' | 'authenticated' | 'disabled'; title: string; show_trends: boolean; trends_as_landing_page: boolean; diff --git a/app/javascript/flavours/glitch/permissions.ts b/app/javascript/flavours/glitch/permissions.ts index d7695d2f5c..a83e1d77a7 100644 --- a/app/javascript/flavours/glitch/permissions.ts +++ b/app/javascript/flavours/glitch/permissions.ts @@ -1,3 +1,4 @@ +export const PEMRISSION_VIEW_FEEDS = 0x0000000000100000; export const PERMISSION_INVITE_USERS = 0x0000000000010000; export const PERMISSION_MANAGE_USERS = 0x0000000000000400; export const PERMISSION_MANAGE_TAXONOMIES = 0x0000000000000100; @@ -22,3 +23,19 @@ export function canManageReports(permissions: number) { (permissions & PERMISSION_MANAGE_REPORTS) === PERMISSION_MANAGE_REPORTS ); } + +export const canViewFeed = ( + signedIn: boolean, + permissions: number, + setting: 'public' | 'authenticated' | 'disabled' | undefined, +) => { + switch (setting) { + case 'public': + return true; + case 'authenticated': + return signedIn; + case 'disabled': + default: + return (permissions & PEMRISSION_VIEW_FEEDS) === PEMRISSION_VIEW_FEEDS; + } +};