2024-08-02 14:59:37 +00:00
|
|
|
import { useCallback, useEffect } from 'react';
|
2024-06-18 13:23:30 +00:00
|
|
|
|
2024-08-02 14:59:37 +00:00
|
|
|
import { FormattedMessage, useIntl, defineMessages } from 'react-intl';
|
2024-06-18 13:23:30 +00:00
|
|
|
|
2024-08-02 14:59:37 +00:00
|
|
|
import { Link, useHistory } from 'react-router-dom';
|
2024-06-18 13:23:30 +00:00
|
|
|
|
|
|
|
import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react';
|
|
|
|
import { fetchNotificationPolicy } from 'mastodon/actions/notification_policies';
|
|
|
|
import { Icon } from 'mastodon/components/icon';
|
2024-08-02 14:59:37 +00:00
|
|
|
import { selectSettingsNotificationsMinimizeFilteredBanner } from 'mastodon/selectors/settings';
|
2024-06-18 13:23:30 +00:00
|
|
|
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
2024-08-02 14:59:37 +00:00
|
|
|
|
|
|
|
const messages = defineMessages({
|
|
|
|
filteredNotifications: {
|
|
|
|
id: 'notification_requests.title',
|
|
|
|
defaultMessage: 'Filtered notifications',
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
export const FilteredNotificationsIconButton: React.FC<{
|
|
|
|
className?: string;
|
|
|
|
}> = ({ className }) => {
|
|
|
|
const intl = useIntl();
|
|
|
|
const history = useHistory();
|
|
|
|
const policy = useAppSelector((state) => state.notificationPolicy);
|
|
|
|
const minimizeSetting = useAppSelector(
|
|
|
|
selectSettingsNotificationsMinimizeFilteredBanner,
|
|
|
|
);
|
|
|
|
|
|
|
|
const handleClick = useCallback(() => {
|
|
|
|
history.push('/notifications/requests');
|
|
|
|
}, [history]);
|
|
|
|
|
|
|
|
if (policy === null || policy.summary.pending_notifications_count === 0) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!minimizeSetting) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<button
|
|
|
|
aria-label={intl.formatMessage(messages.filteredNotifications)}
|
|
|
|
title={intl.formatMessage(messages.filteredNotifications)}
|
|
|
|
onClick={handleClick}
|
|
|
|
className={className}
|
|
|
|
>
|
|
|
|
<Icon id='filtered-notifications' icon={InventoryIcon} />
|
|
|
|
</button>
|
|
|
|
);
|
|
|
|
};
|
2024-06-18 13:23:30 +00:00
|
|
|
|
|
|
|
export const FilteredNotificationsBanner: React.FC = () => {
|
|
|
|
const dispatch = useAppDispatch();
|
|
|
|
const policy = useAppSelector((state) => state.notificationPolicy);
|
2024-08-02 14:59:37 +00:00
|
|
|
const minimizeSetting = useAppSelector(
|
|
|
|
selectSettingsNotificationsMinimizeFilteredBanner,
|
|
|
|
);
|
2024-06-18 13:23:30 +00:00
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
void dispatch(fetchNotificationPolicy());
|
|
|
|
|
|
|
|
const interval = setInterval(() => {
|
|
|
|
void dispatch(fetchNotificationPolicy());
|
|
|
|
}, 120000);
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
clearInterval(interval);
|
|
|
|
};
|
|
|
|
}, [dispatch]);
|
|
|
|
|
|
|
|
if (policy === null || policy.summary.pending_notifications_count === 0) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2024-08-02 14:59:37 +00:00
|
|
|
if (minimizeSetting) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2024-06-18 13:23:30 +00:00
|
|
|
return (
|
|
|
|
<Link
|
|
|
|
className='filtered-notifications-banner'
|
|
|
|
to='/notifications/requests'
|
|
|
|
>
|
2024-07-18 14:36:09 +00:00
|
|
|
<div className='notification-group__icon'>
|
|
|
|
<Icon icon={InventoryIcon} id='filtered-notifications' />
|
|
|
|
</div>
|
2024-06-18 13:23:30 +00:00
|
|
|
|
|
|
|
<div className='filtered-notifications-banner__text'>
|
|
|
|
<strong>
|
|
|
|
<FormattedMessage
|
|
|
|
id='filtered_notifications_banner.title'
|
|
|
|
defaultMessage='Filtered notifications'
|
|
|
|
/>
|
|
|
|
</strong>
|
|
|
|
<span>
|
|
|
|
<FormattedMessage
|
|
|
|
id='filtered_notifications_banner.pending_requests'
|
2024-07-31 12:36:08 +00:00
|
|
|
defaultMessage='From {count, plural, =0 {no one} one {one person} other {# people}} you may know'
|
2024-06-18 13:23:30 +00:00
|
|
|
values={{ count: policy.summary.pending_requests_count }}
|
|
|
|
/>
|
|
|
|
</span>
|
|
|
|
</div>
|
|
|
|
</Link>
|
|
|
|
);
|
|
|
|
};
|