Add: #699 引用・参照対応サーバーをAPIで取得 (#711)

* Add: #699 引用・参照対応サーバーをAPIで取得

* Complete

* ごめん
This commit is contained in:
KMY(雪あすか) 2024-04-16 12:58:54 +09:00 committed by GitHub
parent 78b2707c08
commit 1c054ed3a3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
22 changed files with 129 additions and 29 deletions

View file

@ -31,6 +31,13 @@ export interface ApiAccountOtherSettingsJSON {
subscription_policy: 'allow' | 'followers_only' | 'block';
}
export interface ApiServerFeaturesJSON {
circle: boolean;
emoji_reaction: boolean;
quote: boolean;
status_reference: boolean;
}
// See app/serializers/rest/account_serializer.rb
export interface ApiAccountJSON {
acct: string;
@ -56,6 +63,7 @@ export interface ApiAccountJSON {
note: string;
other_settings: ApiAccountOtherSettingsJSON;
roles?: ApiAccountJSON[];
server_features: ApiServerFeaturesJSON;
subscribable: boolean;
statuses_count: number;
uri: string;

View file

@ -606,7 +606,7 @@ class Status extends ImmutablePureComponent {
let emojiReactionsBar = null;
if (!this.props.withoutEmojiReactions && status.get('emoji_reactions')) {
const emojiReactions = status.get('emoji_reactions');
const emojiReactionAvailableServer = !isHideItem('emoji_reaction_unavailable_server') || status.getIn(['account', 'emoji_reaction_available_server']);
const emojiReactionAvailableServer = !isHideItem('emoji_reaction_unavailable_server') || status.getIn(['account', 'server_features', 'emoji_reaction']);
if (emojiReactions.size > 0 && enableEmojiReaction && emojiReactionAvailableServer) {
emojiReactionsBar = <StatusEmojiReactionsBar emojiReactions={emojiReactions} myReactionOnly={!isShowItem('emoji_reaction_on_timeline')} status={status} onEmojiReact={this.props.onEmojiReact} onUnEmojiReact={this.props.onUnEmojiReact} />;
}

View file

@ -350,11 +350,13 @@ class StatusActionBar extends ImmutablePureComponent {
menu.push({ text: intl.formatMessage(status.get('reblogged') ? messages.cancelReblog : messages.reblog), action: this.handleReblogForceModalClick, tag: 'reblog' });
if (publicStatus) {
if (allowQuote) {
if (allowQuote && (account.getIn(['server_features', 'quote']) || !isHideItem('quote_unavailable_server'))) {
menu.push({ text: intl.formatMessage(messages.quote), action: this.handleQuote, tag: 'reblog' });
}
menu.push({ text: intl.formatMessage(messages.reference), action: this.handleReference, tag: 'reblog' });
if (account.getIn(['server_features', 'status_reference']) || !isHideItem('status_reference_unavailable_server')) {
menu.push({ text: intl.formatMessage(messages.reference), action: this.handleReference, tag: 'reblog' });
}
}
}
@ -439,11 +441,13 @@ class StatusActionBar extends ImmutablePureComponent {
}
if (publicStatus) {
if (allowQuote) {
if (allowQuote && (account.getIn(['server_features', 'quote']) || !isHideItem('quote_unavailable_server'))) {
reblogMenu.push({ text: intl.formatMessage(messages.quote), action: this.handleQuote });
}
reblogMenu.push({ text: intl.formatMessage(messages.reference), action: this.handleReference });
if (account.getIn(['server_features', 'status_reference']) || !isHideItem('status_reference_unavailable_server')) {
reblogMenu.push({ text: intl.formatMessage(messages.reference), action: this.handleReference });
}
}
}
@ -485,7 +489,7 @@ class StatusActionBar extends ImmutablePureComponent {
<IconButton className='status__action-bar__button' title={intl.formatMessage(messages.hide)} icon='eye' iconComponent={VisibilityIcon} onClick={this.handleHideClick} />
);
const emojiReactionAvailableServer = !isHideItem('emoji_reaction_unavailable_server') || account.get('emoji_reaction_available_server');
const emojiReactionAvailableServer = !isHideItem('emoji_reaction_unavailable_server') || account.getIn(['server_features', 'emoji_reaction']);
const emojiReactionPolicy = account.getIn(['other_settings', 'emoji_reaction_policy']) || 'allow';
const following = emojiReactionPolicy !== 'following_only' || (relationship && relationship.get('following'));
const followed = emojiReactionPolicy !== 'followers_only' || (relationship && relationship.get('followed_by'));

View file

@ -277,11 +277,13 @@ class ActionBar extends PureComponent {
menu.push({ text: intl.formatMessage(status.get('reblogged') ? messages.cancel_reblog : messages.reblog), action: this.handleReblogForceModalClick, tag: 'reblog' });
if (publicStatus) {
if (allowQuote) {
if (allowQuote && (account.getIn(['server_features', 'quote']) || !isHideItem('quote_unavailable_server'))) {
menu.push({ text: intl.formatMessage(messages.quote), action: this.handleQuote, tag: 'reblog' });
}
menu.push({ text: intl.formatMessage(messages.reference), action: this.handleReference, tag: 'reblog' });
if (account.getIn(['server_features', 'status_reference']) || !isHideItem('status_reference_unavailable_server')) {
menu.push({ text: intl.formatMessage(messages.reference), action: this.handleReference, tag: 'reblog' });
}
}
}
@ -356,11 +358,13 @@ class ActionBar extends PureComponent {
}
if (publicStatus) {
if (allowQuote) {
if (allowQuote && (account.getIn(['server_features', 'quote']) || !isHideItem('quote_unavailable_server'))) {
reblogMenu.push({ text: intl.formatMessage(messages.quote), action: this.handleQuote });
}
reblogMenu.push({ text: intl.formatMessage(messages.reference), action: this.handleReference });
if (account.getIn(['server_features', 'status_reference']) || !isHideItem('status_reference_unavailable_server')) {
reblogMenu.push({ text: intl.formatMessage(messages.reference), action: this.handleReference });
}
}
}
@ -395,7 +399,7 @@ class ActionBar extends PureComponent {
reblogMenu = [];
}
const emojiReactionAvailableServer = !isHideItem('emoji_reaction_unavailable_server') || account.get('emoji_reaction_available_server');
const emojiReactionAvailableServer = !isHideItem('emoji_reaction_unavailable_server') || account.getIn(['server_features', 'emoji_reaction']);
const emojiReactionPolicy = account.getIn(['other_settings', 'emoji_reaction_policy']) || 'allow';
const following = emojiReactionPolicy !== 'following_only' || (relationship && relationship.get('following'));
const followed = emojiReactionPolicy !== 'followers_only' || (relationship && relationship.get('followed_by'));

View file

@ -222,7 +222,7 @@ class DetailedStatus extends ImmutablePureComponent {
}
let emojiReactionsBar = null;
const emojiReactionAvailableServer = !isHideItem('emoji_reaction_unavailable_server') || status.getIn(['account', 'emoji_reaction_available_server']);
const emojiReactionAvailableServer = !isHideItem('emoji_reaction_unavailable_server') || status.getIn(['account', 'server_features', 'emoji_reaction']);
if (status.get('emoji_reactions')) {
const emojiReactions = status.get('emoji_reactions');
if (emojiReactions.size > 0 && enableEmojiReaction && emojiReactionAvailableServer) {

View file

@ -9,8 +9,10 @@
* | 'favourite_menu'
* | 'quote_in_home'
* | 'quote_in_public'
* | 'quote_unavailable_server'
* | 'recent_emojis'
* | 'relationships'
* | 'status_reference_unavailable_server'
* } HideItemsDefinition
*/

View file

@ -8,6 +8,7 @@ import type {
ApiAccountRoleJSON,
ApiAccountOtherSettingsJSON,
ApiAccountJSON,
ApiServerFeaturesJSON,
} from 'mastodon/api_types/accounts';
import type { ApiCustomEmojiJSON } from 'mastodon/api_types/custom_emoji';
import emojify from 'mastodon/features/emoji/emoji';
@ -61,6 +62,18 @@ const AccountOtherSettingsFactory = ImmutableRecord<AccountOtherSettingsShape>({
subscription_policy: 'allow',
});
// ServerFeatures
export type AccountServerFeaturesShape = ApiServerFeaturesJSON;
export type AccountServerFeatures = RecordOf<AccountServerFeaturesShape>;
const AccountServerFeaturesFactory =
ImmutableRecord<AccountServerFeaturesShape>({
circle: false,
emoji_reaction: false,
quote: false,
status_reference: false,
});
// Account
export interface AccountShape
extends Required<
@ -88,6 +101,7 @@ export const accountDefaultValues: AccountShape = {
indexable: false,
display_name: '',
display_name_html: '',
server_features: AccountServerFeaturesFactory(),
emoji_reaction_available_server: false,
emojis: List<CustomEmoji>(),
fields: List<AccountField>(),