2024-03-11 16:02:21 +01:00
import PropTypes from 'prop-types' ;
import { useRef , useCallback , useEffect } from 'react' ;
import { defineMessages , useIntl , FormattedMessage } from 'react-intl' ;
import { Helmet } from 'react-helmet' ;
import { useSelector , useDispatch } from 'react-redux' ;
2024-03-19 16:39:26 +01:00
import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react' ;
2024-03-11 16:02:21 +01:00
import { fetchNotificationRequests , expandNotificationRequests } from 'mastodon/actions/notifications' ;
import Column from 'mastodon/components/column' ;
import ColumnHeader from 'mastodon/components/column_header' ;
import ScrollableList from 'mastodon/components/scrollable_list' ;
import { NotificationRequest } from './components/notification_request' ;
const messages = defineMessages ( {
title : { id : 'notification_requests.title' , defaultMessage : 'Filtered notifications' } ,
} ) ;
export const NotificationRequests = ( { multiColumn } ) => {
const columnRef = useRef ( ) ;
const intl = useIntl ( ) ;
const dispatch = useDispatch ( ) ;
const isLoading = useSelector ( state => state . getIn ( [ 'notificationRequests' , 'isLoading' ] ) ) ;
const notificationRequests = useSelector ( state => state . getIn ( [ 'notificationRequests' , 'items' ] ) ) ;
const hasMore = useSelector ( state => ! ! state . getIn ( [ 'notificationRequests' , 'next' ] ) ) ;
const handleHeaderClick = useCallback ( ( ) => {
columnRef . current ? . scrollTop ( ) ;
} , [ columnRef ] ) ;
const handleLoadMore = useCallback ( ( ) => {
dispatch ( expandNotificationRequests ( ) ) ;
} , [ dispatch ] ) ;
useEffect ( ( ) => {
dispatch ( fetchNotificationRequests ( ) ) ;
} , [ dispatch ] ) ;
return (
< Column bindToDocument = { ! multiColumn } ref = { columnRef } label = { intl . formatMessage ( messages . title ) } >
< ColumnHeader
icon = 'archive'
2024-03-19 16:39:26 +01:00
iconComponent = { InventoryIcon }
2024-03-11 16:02:21 +01:00
title = { intl . formatMessage ( messages . title ) }
onClick = { handleHeaderClick }
multiColumn = { multiColumn }
showBackButton
/ >
< ScrollableList
scrollKey = 'notification_requests'
trackScroll = { ! multiColumn }
bindToDocument = { ! multiColumn }
isLoading = { isLoading }
showLoading = { isLoading && notificationRequests . size === 0 }
hasMore = { hasMore }
onLoadMore = { handleLoadMore }
emptyMessage = { < FormattedMessage id = 'empty_column.notification_requests' defaultMessage = 'All clear! There is nothing here. When you receive new notifications, they will appear here according to your settings.' / > }
>
{ notificationRequests . map ( request => (
< NotificationRequest
key = { request . get ( 'id' ) }
id = { request . get ( 'id' ) }
accountId = { request . get ( 'account' ) }
notificationsCount = { request . get ( 'notifications_count' ) }
/ >
) ) }
< / ScrollableList >
< Helmet >
< title > { intl . formatMessage ( messages . title ) } < / title >
< meta name = 'robots' content = 'noindex' / >
< / Helmet >
< / Column >
) ;
} ;
NotificationRequests . propTypes = {
multiColumn : PropTypes . bool ,
} ;
export default NotificationRequests ;