Add a follow button & follower count on follow notifications (#31433)
parent
622628a199
commit
32a78e56e0
|
@ -1,7 +1,11 @@
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react';
|
import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react';
|
||||||
|
import { FollowersCounter } from 'mastodon/components/counters';
|
||||||
|
import { FollowButton } from 'mastodon/components/follow_button';
|
||||||
|
import { ShortNumber } from 'mastodon/components/short_number';
|
||||||
import type { NotificationGroupFollow } from 'mastodon/models/notification_group';
|
import type { NotificationGroupFollow } from 'mastodon/models/notification_group';
|
||||||
|
import { useAppSelector } from 'mastodon/store';
|
||||||
|
|
||||||
import type { LabelRenderer } from './notification_group_with_status';
|
import type { LabelRenderer } from './notification_group_with_status';
|
||||||
import { NotificationGroupWithStatus } from './notification_group_with_status';
|
import { NotificationGroupWithStatus } from './notification_group_with_status';
|
||||||
|
@ -14,10 +18,34 @@ const labelRenderer: LabelRenderer = (values) => (
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const FollowerCount: React.FC<{ accountId: string }> = ({ accountId }) => {
|
||||||
|
const account = useAppSelector((s) => s.accounts.get(accountId));
|
||||||
|
|
||||||
|
if (!account) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ShortNumber value={account.followers_count} renderer={FollowersCounter} />
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export const NotificationFollow: React.FC<{
|
export const NotificationFollow: React.FC<{
|
||||||
notification: NotificationGroupFollow;
|
notification: NotificationGroupFollow;
|
||||||
unread: boolean;
|
unread: boolean;
|
||||||
}> = ({ notification, unread }) => (
|
}> = ({ notification, unread }) => {
|
||||||
|
let actions: JSX.Element | undefined;
|
||||||
|
let additionalContent: JSX.Element | undefined;
|
||||||
|
|
||||||
|
if (notification.sampleAccountIds.length === 1) {
|
||||||
|
// only display those if the group contains 1 account, otherwise it does not makes sense
|
||||||
|
const account = notification.sampleAccountIds[0];
|
||||||
|
|
||||||
|
if (account) {
|
||||||
|
actions = <FollowButton accountId={notification.sampleAccountIds[0]} />;
|
||||||
|
additionalContent = <FollowerCount accountId={account} />;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
<NotificationGroupWithStatus
|
<NotificationGroupWithStatus
|
||||||
type='follow'
|
type='follow'
|
||||||
icon={PersonAddIcon}
|
icon={PersonAddIcon}
|
||||||
|
@ -27,5 +55,8 @@ export const NotificationFollow: React.FC<{
|
||||||
count={notification.notifications_count}
|
count={notification.notifications_count}
|
||||||
labelRenderer={labelRenderer}
|
labelRenderer={labelRenderer}
|
||||||
unread={unread}
|
unread={unread}
|
||||||
|
actions={actions}
|
||||||
|
additionalContent={additionalContent}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
|
@ -46,7 +46,7 @@ export const NotificationFollowRequest: React.FC<{
|
||||||
}, [dispatch, notification.sampleAccountIds]);
|
}, [dispatch, notification.sampleAccountIds]);
|
||||||
|
|
||||||
const actions = (
|
const actions = (
|
||||||
<div className='notification-group__actions'>
|
<>
|
||||||
<IconButton
|
<IconButton
|
||||||
title={intl.formatMessage(messages.reject)}
|
title={intl.formatMessage(messages.reject)}
|
||||||
icon='times'
|
icon='times'
|
||||||
|
@ -59,7 +59,7 @@ export const NotificationFollowRequest: React.FC<{
|
||||||
iconComponent={CheckIcon}
|
iconComponent={CheckIcon}
|
||||||
onClick={onAuthorize}
|
onClick={onAuthorize}
|
||||||
/>
|
/>
|
||||||
</div>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -31,6 +31,7 @@ export const NotificationGroupWithStatus: React.FC<{
|
||||||
labelSeeMoreHref?: string;
|
labelSeeMoreHref?: string;
|
||||||
type: string;
|
type: string;
|
||||||
unread: boolean;
|
unread: boolean;
|
||||||
|
additionalContent?: JSX.Element;
|
||||||
}> = ({
|
}> = ({
|
||||||
icon,
|
icon,
|
||||||
iconId,
|
iconId,
|
||||||
|
@ -43,6 +44,7 @@ export const NotificationGroupWithStatus: React.FC<{
|
||||||
labelSeeMoreHref,
|
labelSeeMoreHref,
|
||||||
type,
|
type,
|
||||||
unread,
|
unread,
|
||||||
|
additionalContent,
|
||||||
}) => {
|
}) => {
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
|
|
||||||
|
@ -92,7 +94,9 @@ export const NotificationGroupWithStatus: React.FC<{
|
||||||
<div className='notification-group__main__header__wrapper'>
|
<div className='notification-group__main__header__wrapper'>
|
||||||
<AvatarGroup accountIds={accountIds} />
|
<AvatarGroup accountIds={accountIds} />
|
||||||
|
|
||||||
{actions}
|
{actions && (
|
||||||
|
<div className='notification-group__actions'>{actions}</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='notification-group__main__header__label'>
|
<div className='notification-group__main__header__label'>
|
||||||
|
@ -106,6 +110,12 @@ export const NotificationGroupWithStatus: React.FC<{
|
||||||
<EmbeddedStatus statusId={statusId} />
|
<EmbeddedStatus statusId={statusId} />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{additionalContent && (
|
||||||
|
<div className='notification-group__main__additional-content'>
|
||||||
|
{additionalContent}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</HotKeys>
|
</HotKeys>
|
||||||
|
|
|
@ -10486,6 +10486,13 @@ noscript {
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
container-type: inline-size;
|
||||||
|
|
||||||
|
@container (width < 350px) {
|
||||||
|
&__header time {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
&__header {
|
&__header {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -10525,6 +10532,11 @@ noscript {
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&__additional-content {
|
||||||
|
color: $darker-text-color;
|
||||||
|
margin-top: -8px; // to offset the parent's `gap` property
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__avatar-group {
|
&__avatar-group {
|
||||||
|
|
Loading…
Reference in New Issue