Skip to content

Commit 7dcc415

Browse files
committed
code and configs
1 parent 18eb4d5 commit 7dcc415

30 files changed

+407
-14
lines changed

app/controllers/accounts_controller.rb

+11-3
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ def show
2828
return
2929
end
3030

31-
@pinned_statuses = cache_collection(@account.pinned_statuses, Status) if show_pinned_statuses?
31+
if current_user.nil?
32+
@pinned_statuses = cache_collection(@account.pinned_statuses.without_local_only, Status) if show_pinned_statuses?
33+
else
34+
@pinned_statuses = cache_collection(@account.pinned_statuses, Status) if show_pinned_statuses?
35+
end
3236
@statuses = cached_filtered_status_page
3337
@rss_url = rss_url
3438

@@ -42,7 +46,7 @@ def show
4246
expires_in 1.minute, public: true
4347

4448
limit = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
45-
@statuses = filtered_statuses.without_reblogs.limit(limit)
49+
@statuses = filtered_statuses.without_reblogs.without_local_only.limit(limit)
4650
@statuses = cache_collection(@statuses, Status)
4751
render xml: RSS::AccountSerializer.render(@account, @statuses, params[:tag])
4852
end
@@ -73,7 +77,11 @@ def filtered_statuses
7377
end
7478

7579
def default_statuses
76-
@account.statuses.where(visibility: [:public, :unlisted])
80+
if current_user.nil?
81+
@account.statuses.without_local_only.where(visibility: [:public, :unlisted])
82+
else
83+
@account.statuses.where(visibility: [:public, :unlisted])
84+
end
7785
end
7886

7987
def only_media_scope

app/controllers/api/v1/accounts/credentials_controller.rb

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def user_settings_params
3333
'setting_default_privacy' => source_params.fetch(:privacy, @account.user.setting_default_privacy),
3434
'setting_default_sensitive' => source_params.fetch(:sensitive, @account.user.setting_default_sensitive),
3535
'setting_default_language' => source_params.fetch(:language, @account.user.setting_default_language),
36+
'setting_default_federation' => source_params.fetch(:federation, @account.user.setting_default_federation),
3637
}
3738
end
3839
end

app/controllers/api/v1/statuses_controller.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ def create
4646
application: doorkeeper_token.application,
4747
poll: status_params[:poll],
4848
idempotency: request.headers['Idempotency-Key'],
49-
with_rate_limit: true)
49+
with_rate_limit: true,
50+
local_only: status_params[:local_only])
5051

5152
render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer
5253
end
@@ -85,6 +86,7 @@ def status_params
8586
:spoiler_text,
8687
:visibility,
8788
:scheduled_at,
89+
:local_only,
8890
media_ids: [],
8991
poll: [
9092
:multiple,

app/controllers/settings/preferences_controller.rb

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def user_settings_params
3636
:setting_default_privacy,
3737
:setting_default_sensitive,
3838
:setting_default_language,
39+
:setting_default_federation,
3940
:setting_unfollow_modal,
4041
:setting_boost_modal,
4142
:setting_delete_modal,

app/javascript/mastodon/actions/compose.js

+9
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE';
4949
export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
5050
export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
5151
export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE';
52+
export const COMPOSE_FEDERATION_CHANGE = 'COMPOSE_FEDERATION_CHANGE';
5253
export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
5354
export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE';
5455

@@ -154,6 +155,7 @@ export function submitCompose(routerHistory) {
154155
spoiler_text: getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '',
155156
visibility: getState().getIn(['compose', 'privacy']),
156157
poll: getState().getIn(['compose', 'poll'], null),
158+
local_only: !getState().getIn(['compose', 'federation']),
157159
}, {
158160
headers: {
159161
'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
@@ -637,6 +639,13 @@ export function changeComposeVisibility(value) {
637639
};
638640
};
639641

642+
export function changeComposeFederation(value) {
643+
return {
644+
type: COMPOSE_FEDERATION_CHANGE,
645+
value,
646+
};
647+
};
648+
640649
export function insertEmojiCompose(position, emoji, needsSpace) {
641650
return {
642651
type: COMPOSE_EMOJI_INSERT,

app/javascript/mastodon/components/status_action_bar.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const messages = defineMessages({
2424
reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },
2525
cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
2626
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
27+
local_only: { id: 'status.local_only', defaultMessage: 'This post is only visible by other users of your instance' },
2728
favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },
2829
bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
2930
removeBookmark: { id: 'status.remove_bookmark', defaultMessage: 'Remove bookmark' },
@@ -227,6 +228,7 @@ class StatusActionBar extends ImmutablePureComponent {
227228
const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
228229
const mutingConversation = status.get('muted');
229230
const account = status.get('account');
231+
const federated = !status.get('local_only');
230232
const writtenByMe = status.getIn(['account', 'id']) === me;
231233

232234
let menu = [];
@@ -317,7 +319,7 @@ class StatusActionBar extends ImmutablePureComponent {
317319
reblogTitle = intl.formatMessage(messages.cannot_reblog);
318320
}
319321

320-
const shareButton = ('share' in navigator) && publicStatus && (
322+
const shareButton = ('share' in navigator) && publicStatus && federated && (
321323
<IconButton className='status__action-bar-button' title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShareClick} />
322324
);
323325

@@ -341,6 +343,9 @@ class StatusActionBar extends ImmutablePureComponent {
341343
title={intl.formatMessage(messages.more)}
342344
/>
343345
</div>
346+
{ !federated &&
347+
<IconButton className='status__action-bar-button' disabled title={intl.formatMessage(messages.local_only)} icon='chain-broken' />
348+
}
344349
</div>
345350
);
346351
}

app/javascript/mastodon/features/compose/components/compose_form.js

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import UploadButtonContainer from '../containers/upload_button_container';
1111
import { defineMessages, injectIntl } from 'react-intl';
1212
import SpoilerButtonContainer from '../containers/spoiler_button_container';
1313
import PrivacyDropdownContainer from '../containers/privacy_dropdown_container';
14+
import FederationDropdownContainer from '../containers/federation_dropdown_container';
1415
import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container';
1516
import PollFormContainer from '../containers/poll_form_container';
1617
import UploadFormContainer from '../containers/upload_form_container';
@@ -257,6 +258,7 @@ class ComposeForm extends ImmutablePureComponent {
257258
<PollButtonContainer />
258259
<PrivacyDropdownContainer />
259260
<SpoilerButtonContainer />
261+
<FederationDropdownContainer />
260262
</div>
261263
<div className='character-counter__wrapper'><CharacterCounter max={maxChars} text={this.getFulltextForCharacterCounting()} /></div>
262264
</div>

0 commit comments

Comments
 (0)