Add UI support for displaying quotes of other people's posts (#36301)
This commit is contained in:
@@ -12,6 +12,8 @@ import { ColumnHeader } from 'mastodon/components/column_header';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
|
||||
import StatusList from 'mastodon/components/status_list';
|
||||
import { useIdentity } from 'mastodon/identity_context';
|
||||
import { domain } from 'mastodon/initial_state';
|
||||
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
||||
|
||||
import Column from '../ui/components/column';
|
||||
@@ -31,9 +33,18 @@ export const Quotes: React.FC<{
|
||||
|
||||
const statusId = params?.statusId;
|
||||
|
||||
const { accountId: me } = useIdentity();
|
||||
|
||||
const isCorrectStatusId: boolean = useAppSelector(
|
||||
(state) => state.status_lists.getIn(['quotes', 'statusId']) === statusId,
|
||||
);
|
||||
const quotedAccountId = useAppSelector(
|
||||
(state) =>
|
||||
state.statuses.getIn([statusId, 'account']) as string | undefined,
|
||||
);
|
||||
const quotedAccount = useAppSelector((state) =>
|
||||
quotedAccountId ? state.accounts.get(quotedAccountId) : undefined,
|
||||
);
|
||||
const statusIds = useAppSelector((state) =>
|
||||
state.status_lists.getIn(['quotes', 'items'], emptyList),
|
||||
);
|
||||
@@ -74,6 +85,32 @@ export const Quotes: React.FC<{
|
||||
/>
|
||||
);
|
||||
|
||||
let prependMessage;
|
||||
|
||||
if (me === quotedAccountId) {
|
||||
prependMessage = null;
|
||||
} else if (quotedAccount?.username === quotedAccount?.acct) {
|
||||
// Local account, we know this to be exhaustive
|
||||
prependMessage = (
|
||||
<div className='follow_requests-unlocked_explanation'>
|
||||
<FormattedMessage
|
||||
id='status.quotes.local_other_disclaimer'
|
||||
defaultMessage='Quotes rejected by the author will not be shown.'
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
} else {
|
||||
prependMessage = (
|
||||
<div className='follow_requests-unlocked_explanation'>
|
||||
<FormattedMessage
|
||||
id='status.quotes.remote_other_disclaimer'
|
||||
defaultMessage='Only quotes from {domain} are guaranteed to be shown here. Quotes rejected by the author will not be shown.'
|
||||
values={{ domain: <strong>{domain}</strong> }}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Column bindToDocument={!multiColumn}>
|
||||
<ColumnHeader
|
||||
@@ -100,6 +137,7 @@ export const Quotes: React.FC<{
|
||||
isLoading={isLoading}
|
||||
emptyMessage={emptyMessage}
|
||||
bindToDocument={!multiColumn}
|
||||
prepend={prependMessage}
|
||||
/>
|
||||
|
||||
<Helmet>
|
||||
|
||||
@@ -31,7 +31,7 @@ import { VisibilityIcon } from 'mastodon/components/visibility_icon';
|
||||
import { Audio } from 'mastodon/features/audio';
|
||||
import scheduleIdleTask from 'mastodon/features/ui/util/schedule_idle_task';
|
||||
import { Video } from 'mastodon/features/video';
|
||||
import { me } from 'mastodon/initial_state';
|
||||
import { useIdentity } from 'mastodon/identity_context';
|
||||
|
||||
import Card from './card';
|
||||
|
||||
@@ -75,6 +75,8 @@ export const DetailedStatus: React.FC<{
|
||||
const [showDespiteFilter, setShowDespiteFilter] = useState(false);
|
||||
const nodeRef = useRef<HTMLDivElement>();
|
||||
|
||||
const { signedIn } = useIdentity();
|
||||
|
||||
const handleOpenVideo = useCallback(
|
||||
(options: VideoModalOptions) => {
|
||||
const lang = (status.getIn(['translation', 'language']) ||
|
||||
@@ -283,7 +285,7 @@ export const DetailedStatus: React.FC<{
|
||||
|
||||
if (['private', 'direct'].includes(status.get('visibility') as string)) {
|
||||
quotesLink = '';
|
||||
} else if (status.getIn(['account', 'id']) === me) {
|
||||
} else if (signedIn) {
|
||||
quotesLink = (
|
||||
<Link
|
||||
to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/quotes`}
|
||||
|
||||
@@ -923,6 +923,8 @@
|
||||
"status.quote_private": "Private posts cannot be quoted",
|
||||
"status.quotes": "{count, plural, one {quote} other {quotes}}",
|
||||
"status.quotes.empty": "No one has quoted this post yet. When someone does, it will show up here.",
|
||||
"status.quotes.local_other_disclaimer": "Quotes rejected by the author will not be shown.",
|
||||
"status.quotes.remote_other_disclaimer": "Only quotes from {domain} are guaranteed to be shown here. Quotes rejected by the author will not be shown.",
|
||||
"status.read_more": "Read more",
|
||||
"status.reblog": "Boost",
|
||||
"status.reblog_or_quote": "Boost or quote",
|
||||
|
||||
Reference in New Issue
Block a user