131 lines
3.7 KiB
TypeScript
131 lines
3.7 KiB
TypeScript
import { defineMessages } from 'react-intl';
|
|
import type { MessageDescriptor } from 'react-intl';
|
|
|
|
import type { StatusConditions } from '@/mastodon/selectors/statuses';
|
|
import FormatQuote from '@/material-icons/400-24px/format_quote-fill.svg?react';
|
|
import FormatQuoteOff from '@/material-icons/400-24px/format_quote_off-fill.svg?react';
|
|
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
|
|
import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';
|
|
import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';
|
|
import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';
|
|
import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';
|
|
|
|
import type { IconProp } from '../icon';
|
|
|
|
export const messages = defineMessages({
|
|
all_disabled: {
|
|
id: 'status.all_disabled',
|
|
defaultMessage: 'Boosts and quotes are disabled',
|
|
},
|
|
quote: {
|
|
id: 'status.quote',
|
|
defaultMessage: 'Quote',
|
|
description: 'Quote as a verb (e.g. Quote this post)',
|
|
},
|
|
quote_cannot: {
|
|
id: 'status.cannot_quote',
|
|
defaultMessage: 'You are not allowed to quote this post',
|
|
},
|
|
quote_followers_only: {
|
|
id: 'status.quote_followers_only',
|
|
defaultMessage: 'Only followers can quote this post',
|
|
},
|
|
quote_manual_review: {
|
|
id: 'status.quote_manual_review',
|
|
defaultMessage: 'Author will manually review',
|
|
},
|
|
quote_private: {
|
|
id: 'status.quote_private',
|
|
defaultMessage: 'Private posts cannot be quoted',
|
|
},
|
|
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
|
|
reblog_or_quote: {
|
|
id: 'status.reblog_or_quote',
|
|
defaultMessage: 'Boost or quote',
|
|
},
|
|
reblog_cancel: {
|
|
id: 'status.cancel_reblog_private',
|
|
defaultMessage: 'Unboost',
|
|
},
|
|
reblog_private: {
|
|
id: 'status.reblog_private',
|
|
defaultMessage: 'Share again with your followers',
|
|
},
|
|
reblog_cannot: {
|
|
id: 'status.cannot_reblog',
|
|
defaultMessage: 'This post cannot be boosted',
|
|
},
|
|
request_quote: {
|
|
id: 'status.request_quote',
|
|
defaultMessage: 'Request to quote',
|
|
},
|
|
});
|
|
|
|
export interface MenuItemState {
|
|
title: MessageDescriptor;
|
|
meta?: MessageDescriptor;
|
|
iconComponent: IconProp;
|
|
disabled?: boolean;
|
|
}
|
|
|
|
export function boostItemState({
|
|
isPublic,
|
|
isPrivateReblog,
|
|
isBoosted,
|
|
}: StatusConditions): MenuItemState {
|
|
if (isBoosted) {
|
|
return {
|
|
title: messages.reblog_cancel,
|
|
iconComponent: isPublic ? RepeatActiveIcon : RepeatPrivateActiveIcon,
|
|
};
|
|
}
|
|
const iconText: MenuItemState = {
|
|
title: messages.reblog,
|
|
iconComponent: RepeatIcon,
|
|
};
|
|
|
|
if (isPrivateReblog) {
|
|
iconText.meta = messages.reblog_private;
|
|
iconText.iconComponent = RepeatPrivateIcon;
|
|
} else if (!isPublic) {
|
|
iconText.meta = messages.reblog_cannot;
|
|
iconText.iconComponent = RepeatDisabledIcon;
|
|
iconText.disabled = true;
|
|
}
|
|
return iconText;
|
|
}
|
|
|
|
export function quoteItemState({
|
|
isLoggedIn,
|
|
isMine,
|
|
isQuoteAutomaticallyAccepted,
|
|
isQuoteManuallyAccepted,
|
|
isQuoteFollowersOnly,
|
|
isPublic,
|
|
}: StatusConditions): MenuItemState {
|
|
const iconText: MenuItemState = {
|
|
title: messages.quote,
|
|
iconComponent: FormatQuote,
|
|
};
|
|
|
|
if (!isPublic && !isMine) {
|
|
iconText.disabled = true;
|
|
iconText.iconComponent = FormatQuoteOff;
|
|
iconText.meta = messages.quote_private;
|
|
} else if (isQuoteAutomaticallyAccepted) {
|
|
iconText.title = messages.quote;
|
|
} else if (isQuoteManuallyAccepted) {
|
|
iconText.title = messages.request_quote;
|
|
iconText.meta = messages.quote_manual_review;
|
|
// We don't show the disabled state when logged out
|
|
} else if (isLoggedIn) {
|
|
iconText.disabled = true;
|
|
iconText.iconComponent = FormatQuoteOff;
|
|
iconText.meta = isQuoteFollowersOnly
|
|
? messages.quote_followers_only
|
|
: messages.quote_cannot;
|
|
}
|
|
|
|
return iconText;
|
|
}
|