diff --git a/app/controllers/api/v1/statuses/emoji_reactions_controller.rb b/app/controllers/api/v1/statuses/emoji_reactions_controller.rb index 1b56033bc4..34bd4c8986 100644 --- a/app/controllers/api/v1/statuses/emoji_reactions_controller.rb +++ b/app/controllers/api/v1/statuses/emoji_reactions_controller.rb @@ -41,11 +41,7 @@ class Api::V1::Statuses::EmojiReactionsController < Api::BaseController def create_private(emoji) count = EmojiReaction.where(account: current_account, status: @status).count - - if count >= EmojiReaction::EMOJI_REACTION_PER_ACCOUNT_LIMIT - bad_request - return - end + raise Mastodon::ValidationError, I18n.t('reactions.errors.limit_reached') if count >= EmojiReaction::EMOJI_REACTION_PER_ACCOUNT_LIMIT EmojiReactService.new.call(current_account, @status, emoji) render json: @status, serializer: REST::StatusSerializer diff --git a/app/javascript/mastodon/actions/emoji_reactions.js b/app/javascript/mastodon/actions/emoji_reactions.js index a58e53d2fe..191d8dda8d 100644 --- a/app/javascript/mastodon/actions/emoji_reactions.js +++ b/app/javascript/mastodon/actions/emoji_reactions.js @@ -18,7 +18,6 @@ export function fetchEmojiReactedStatuses() { dispatch(fetchEmojiReactedStatusesRequest()); api(getState).get('/api/v1/emoji_reactions').then(response => { - console.dir(response.data) const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); dispatch(fetchEmojiReactedStatusesSuccess(response.data, next ? next.uri : null)); diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js index 6e81d4b49a..69d6bf03da 100644 --- a/app/javascript/mastodon/actions/importer/normalizer.js +++ b/app/javascript/mastodon/actions/importer/normalizer.js @@ -66,8 +66,16 @@ export function normalizeStatus(status, normalOldStatus) { normalStatus.filtered = status.filtered.map(normalizeFilterResult); } - if (status.emoji_reactions && normalOldStatus && normalOldStatus.get('emoji_reactions')) { - normalStatus.emoji_reactions = normalizeEmojiReactions(normalOldStatus.get('emoji_reactions').toArray()); + if (status.emoji_reactions) { + normalStatus.emoji_reactions = normalizeEmojiReactions(status.emoji_reactions); + } + + if (status.media_attachments_ex) { + normalStatus.media_attachments = status.media_attachments.concat(status.media_attachments_ex); + } + + if (!status.visibility_ex) { + normalStatus.visibility_ex = status.visibility; } // Only calculate these values when status first encountered and @@ -104,8 +112,8 @@ export function normalizeEmojiReactions(emoji_reactions) { const myAccountId = me; let converted = []; for (let emoji_reaction of emoji_reactions) { - let obj = emoji_reaction.toObject(); - obj.me = obj.account_ids.toArray().some((id) => id === myAccountId); + let obj = emoji_reaction; + obj.me = obj.account_ids.some((id) => id === myAccountId); converted.push(obj); } return converted; diff --git a/app/javascript/mastodon/components/media_gallery.jsx b/app/javascript/mastodon/components/media_gallery.jsx index fb642965bf..f8cbd7910a 100644 --- a/app/javascript/mastodon/components/media_gallery.jsx +++ b/app/javascript/mastodon/components/media_gallery.jsx @@ -357,7 +357,6 @@ class MediaGallery extends React.PureComponent { } const maxSize = displayMediaExpand ? 8 : 4; - console.log(displayMediaExpand); const size = media.take(maxSize).size; const uncached = media.every(attachment => attachment.get('type') === 'unknown'); diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index f16f059a85..b99ad22861 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -518,7 +518,7 @@ class Status extends ImmutablePureComponent { 'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) }, }; - const visibilityIcon = visibilityIconInfo[status.get('visibility_ex')]; + const visibilityIcon = visibilityIconInfo[status.get('visibility_ex')] || visibilityIconInfo[status.get('visibility')]; let emojiReactionsBar = null; if (!this.props.withoutEmojiReactions && status.get('emoji_reactions')) { diff --git a/app/javascript/mastodon/features/compose/containers/warning_container.jsx b/app/javascript/mastodon/features/compose/containers/warning_container.jsx index e99f5dacd9..3f46237563 100644 --- a/app/javascript/mastodon/features/compose/containers/warning_container.jsx +++ b/app/javascript/mastodon/features/compose/containers/warning_container.jsx @@ -8,11 +8,12 @@ import { HASHTAG_PATTERN_REGEX } from 'mastodon/utils/hashtags'; const mapStateToProps = state => ({ needsLockWarning: state.getIn(['compose', 'privacy']) === 'private' && !state.getIn(['accounts', me, 'locked']), - hashtagWarning: state.getIn(['compose', 'privacy']) !== 'public' && HASHTAG_PATTERN_REGEX.test(state.getIn(['compose', 'text'])), + hashtagWarning: ['public', 'public_unlisted'].indexOf(state.getIn(['compose', 'privacy'])) < 0 && HASHTAG_PATTERN_REGEX.test(state.getIn(['compose', 'text'])), directMessageWarning: state.getIn(['compose', 'privacy']) === 'direct', + searchabilityWarning: state.getIn(['compose', 'searchability']) === 'direct', }); -const WarningWrapper = ({ needsLockWarning, hashtagWarning, directMessageWarning }) => { +const WarningWrapper = ({ needsLockWarning, hashtagWarning, directMessageWarning, searchabilityWarning }) => { if (needsLockWarning) { return }} />} />; } @@ -31,6 +32,10 @@ const WarningWrapper = ({ needsLockWarning, hashtagWarning, directMessageWarning return ; } + if (searchabilityWarning) { + return } />; + } + return null; }; @@ -38,6 +43,7 @@ WarningWrapper.propTypes = { needsLockWarning: PropTypes.bool, hashtagWarning: PropTypes.bool, directMessageWarning: PropTypes.bool, + searchabilityWarning: PropTypes.bool, }; export default connect(mapStateToProps)(WarningWrapper); diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 3c29206f6c..4619001507 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -132,6 +132,7 @@ "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", "compose_form.lock_disclaimer.lock": "locked", "compose_form.placeholder": "What's on your mind?", + "compose_form.searchability_warning": "Self only searchability is not available other mastodon servers. Others can search your post.", "compose_form.poll.add_option": "Add a choice", "compose_form.poll.duration": "Poll duration", "compose_form.poll.option_placeholder": "Choice {number}", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 0d6d8e2646..4debed9bdc 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -132,6 +132,7 @@ "compose_form.lock_disclaimer": "あなたのアカウントは{locked}になっていません。誰でもあなたをフォローすることができ、フォロワー限定の投稿を見ることができます。", "compose_form.lock_disclaimer.lock": "承認制", "compose_form.placeholder": "今なにしてる?", + "compose_form.searchability_warning": "検索許可「自分のみ」はkmyblue内の検索でのみ有効です。他のサーバーでは「リアクションした人のみ」と同等に扱われます", "compose_form.poll.add_option": "追加", "compose_form.poll.duration": "アンケート期間", "compose_form.poll.option_placeholder": "項目 {number}", diff --git a/app/models/status.rb b/app/models/status.rb index 969ceb4191..34931ff4fd 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -290,6 +290,14 @@ class Status < ApplicationRecord end end + def ordered_media_attachments_original_mastodon + ordered_media_attachments.take(4) + end + + def ordered_media_attachments_extra + ordered_media_attachments.drop(4).take(4) + end + def replies_count status_stat&.replies_count || 0 end diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index 6496bfe18d..9f6cc0a32e 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -22,7 +22,8 @@ class REST::StatusSerializer < ActiveModel::Serializer belongs_to :application, if: :show_application? belongs_to :account, serializer: REST::AccountSerializer - has_many :ordered_media_attachments, key: :media_attachments, serializer: REST::MediaAttachmentSerializer + has_many :ordered_media_attachments_original_mastodon, key: :media_attachments, serializer: REST::MediaAttachmentSerializer + has_many :ordered_media_attachments_extra, key: :media_attachments_ex, serializer: REST::MediaAttachmentSerializer has_many :ordered_mentions, key: :mentions has_many :tags has_many :emojis, serializer: REST::CustomEmojiSerializer