import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { useInstance } from 'pl-fe/api/hooks/instance/use-instance'; import { useInteractionRequestsCount } from 'pl-fe/api/hooks/statuses/use-interaction-requests'; import Icon from 'pl-fe/components/ui/icon'; import Stack from 'pl-fe/components/ui/stack'; import { useStatContext } from 'pl-fe/contexts/stat-context'; import ComposeButton from 'pl-fe/features/ui/components/compose-button'; import ProfileDropdown from 'pl-fe/features/ui/components/profile-dropdown'; import { useAppSelector } from 'pl-fe/hooks/use-app-selector'; import { useFeatures } from 'pl-fe/hooks/use-features'; import { useLogo } from 'pl-fe/hooks/use-logo'; import { useOwnAccount } from 'pl-fe/hooks/use-own-account'; import { useRegistrationStatus } from 'pl-fe/hooks/use-registration-status'; import { useSettings } from 'pl-fe/hooks/use-settings'; import Account from './account'; import DropdownMenu, { Menu } from './dropdown-menu'; import SearchInput from './search-input'; import SidebarNavigationLink from './sidebar-navigation-link'; import SiteLogo from './site-logo'; const messages = defineMessages({ followRequests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, bookmarks: { id: 'column.bookmarks', defaultMessage: 'Bookmarks' }, lists: { id: 'column.lists', defaultMessage: 'Lists' }, events: { id: 'column.events', defaultMessage: 'Events' }, profileDirectory: { id: 'navigation_bar.profile_directory', defaultMessage: 'Profile directory' }, followedTags: { id: 'navigation_bar.followed_tags', defaultMessage: 'Followed hashtags' }, developers: { id: 'navigation.developers', defaultMessage: 'Developers' }, scheduledStatuses: { id: 'column.scheduled_statuses', defaultMessage: 'Scheduled posts' }, drafts: { id: 'navigation.drafts', defaultMessage: 'Drafts' }, conversations: { id: 'navigation.direct_messages', defaultMessage: 'Direct messages' }, interactionRequests: { id: 'navigation.interaction_requests', defaultMessage: 'Interaction requests' }, }); /** Desktop sidebar with links to different views in the app. */ const SidebarNavigation = () => { const intl = useIntl(); const { unreadChatsCount } = useStatContext(); const { data: instance } = useInstance(); const features = useFeatures(); const { isDeveloper } = useSettings(); const { account } = useOwnAccount(); const { isOpen } = useRegistrationStatus(); const logoSrc = useLogo(); const notificationCount = useAppSelector((state) => state.notifications.unread); const followRequestsCount = useAppSelector((state) => state.user_lists.follow_requests.items.length); const interactionRequestsCount = useInteractionRequestsCount().data || 0; const dashboardCount = useAppSelector((state) => state.admin.openReports.length + state.admin.awaitingApproval.length); const scheduledStatusCount = useAppSelector((state) => Object.keys(state.scheduled_statuses).length); const draftCount = useAppSelector((state) => Object.keys(state.draft_statuses).length); const restrictUnauth = instance.pleroma.metadata.restrict_unauthenticated; const makeMenu = (): Menu => { const menu: Menu = []; if (account) { if (features.chats && features.conversations) { menu.push({ to: '/conversations', text: intl.formatMessage(messages.conversations), icon: require('@tabler/icons/outline/mail.svg'), }); } if (account.locked || followRequestsCount > 0) { menu.push({ to: '/follow_requests', text: intl.formatMessage(messages.followRequests), icon: require('@tabler/icons/outline/user-plus.svg'), count: followRequestsCount, }); } if (interactionRequestsCount > 0) { menu.push({ to: '/interaction_requests', text: intl.formatMessage(messages.interactionRequests), icon: require('@tabler/icons/outline/flag-question.svg'), count: interactionRequestsCount, }); } if (features.bookmarks) { menu.push({ to: '/bookmarks', text: intl.formatMessage(messages.bookmarks), icon: require('@tabler/icons/outline/bookmark.svg'), }); } if (features.lists) { menu.push({ to: '/lists', text: intl.formatMessage(messages.lists), icon: require('@tabler/icons/outline/list.svg'), }); } if (features.events) { menu.push({ to: '/events', text: intl.formatMessage(messages.events), icon: require('@tabler/icons/outline/calendar-event.svg'), }); } if (features.profileDirectory) { menu.push({ to: '/directory', text: intl.formatMessage(messages.profileDirectory), icon: require('@tabler/icons/outline/address-book.svg'), }); } if (features.followedHashtagsList) { menu.push({ to: '/followed_tags', text: intl.formatMessage(messages.followedTags), icon: require('@tabler/icons/outline/hash.svg'), }); } if (isDeveloper) { menu.push({ to: '/developers', icon: require('@tabler/icons/outline/code.svg'), text: intl.formatMessage(messages.developers), }); } if (scheduledStatusCount > 0) { menu.push({ to: '/scheduled_statuses', icon: require('@tabler/icons/outline/calendar-stats.svg'), text: intl.formatMessage(messages.scheduledStatuses), count: scheduledStatusCount, }); } if (draftCount > 0) { menu.push({ to: '/draft_statuses', icon: require('@tabler/icons/outline/notes.svg'), text: intl.formatMessage(messages.drafts), count: draftCount, }); } } return menu; }; const menu = makeMenu(); return ( {logoSrc && ( )} {account && (
} disabled />
)} } /> } /> {account && ( <> } /> {features.chats && ( } /> )} {!features.chats && features.conversations && ( } /> )} {features.groups && ( } /> )} } /> } /> {(account.is_admin || account.is_moderator) && ( } /> )} )} {(features.publicTimeline) && ( <> {(account || !restrictUnauth.timelines.local) && ( : } /> )} {(features.bubbleTimeline && (account || !restrictUnauth.timelines.bubble)) && ( } /> )} {(features.federating && (account || !restrictUnauth.timelines.federated)) && ( } /> )} )} {menu.length > 0 && ( } /> )} {!account && ( } /> {isOpen && } />} )} {account && ( )}
); }; export { SidebarNavigation as default };