|
|
@ -33,11 +33,13 @@ import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
|
|
|
|
import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';
|
|
|
|
import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';
|
|
|
|
import uuid from 'flavours/glitch/util/uuid';
|
|
|
|
import uuid from 'flavours/glitch/util/uuid';
|
|
|
|
import { me } from 'flavours/glitch/util/initial_state';
|
|
|
|
import { me } from 'flavours/glitch/util/initial_state';
|
|
|
|
|
|
|
|
import { overwrite } from 'flavours/glitch/util/js_helpers';
|
|
|
|
|
|
|
|
|
|
|
|
const initialState = ImmutableMap({
|
|
|
|
const initialState = ImmutableMap({
|
|
|
|
mounted: false,
|
|
|
|
mounted: false,
|
|
|
|
advanced_options: ImmutableMap({
|
|
|
|
advanced_options: ImmutableMap({
|
|
|
|
do_not_federate: false,
|
|
|
|
do_not_federate: false,
|
|
|
|
|
|
|
|
threaded_mode: false,
|
|
|
|
}),
|
|
|
|
}),
|
|
|
|
sensitive: false,
|
|
|
|
sensitive: false,
|
|
|
|
spoiler: false,
|
|
|
|
spoiler: false,
|
|
|
@ -55,6 +57,7 @@ const initialState = ImmutableMap({
|
|
|
|
suggestions: ImmutableList(),
|
|
|
|
suggestions: ImmutableList(),
|
|
|
|
default_advanced_options: ImmutableMap({
|
|
|
|
default_advanced_options: ImmutableMap({
|
|
|
|
do_not_federate: false,
|
|
|
|
do_not_federate: false,
|
|
|
|
|
|
|
|
threaded_mode: null, // Do not reset
|
|
|
|
}),
|
|
|
|
}),
|
|
|
|
default_privacy: 'public',
|
|
|
|
default_privacy: 'public',
|
|
|
|
default_sensitive: false,
|
|
|
|
default_sensitive: false,
|
|
|
@ -83,6 +86,20 @@ function statusToTextMentions(state, status) {
|
|
|
|
return set.union(status.get('mentions').filterNot(mention => mention.get('id') === me).map(mention => `@${mention.get('acct')} `)).join('');
|
|
|
|
return set.union(status.get('mentions').filterNot(mention => mention.get('id') === me).map(mention => `@${mention.get('acct')} `)).join('');
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function apiStatusToTextMentions (state, status) {
|
|
|
|
|
|
|
|
let set = ImmutableOrderedSet([]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (status.account.id !== me) {
|
|
|
|
|
|
|
|
set = set.add(`@${status.account.acct} `);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return set.union(status.mentions.filter(
|
|
|
|
|
|
|
|
mention => mention.id !== me
|
|
|
|
|
|
|
|
).map(
|
|
|
|
|
|
|
|
mention => `@${mention.acct} `
|
|
|
|
|
|
|
|
)).join('');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function clearAll(state) {
|
|
|
|
function clearAll(state) {
|
|
|
|
return state.withMutations(map => {
|
|
|
|
return state.withMutations(map => {
|
|
|
|
map.set('text', '');
|
|
|
|
map.set('text', '');
|
|
|
@ -90,7 +107,10 @@ function clearAll(state) {
|
|
|
|
map.set('spoiler_text', '');
|
|
|
|
map.set('spoiler_text', '');
|
|
|
|
map.set('is_submitting', false);
|
|
|
|
map.set('is_submitting', false);
|
|
|
|
map.set('in_reply_to', null);
|
|
|
|
map.set('in_reply_to', null);
|
|
|
|
map.set('advanced_options', state.get('default_advanced_options'));
|
|
|
|
map.update(
|
|
|
|
|
|
|
|
'advanced_options',
|
|
|
|
|
|
|
|
map => map.mergeWith(overwrite, state.get('default_advanced_options'))
|
|
|
|
|
|
|
|
);
|
|
|
|
map.set('privacy', state.get('default_privacy'));
|
|
|
|
map.set('privacy', state.get('default_privacy'));
|
|
|
|
map.set('sensitive', false);
|
|
|
|
map.set('sensitive', false);
|
|
|
|
map.update('media_attachments', list => list.clear());
|
|
|
|
map.update('media_attachments', list => list.clear());
|
|
|
@ -98,6 +118,31 @@ function clearAll(state) {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function continueThread (state, status) {
|
|
|
|
|
|
|
|
return state.withMutations(function (map) {
|
|
|
|
|
|
|
|
map.set('text', apiStatusToTextMentions(state, status));
|
|
|
|
|
|
|
|
if (status.spoiler_text) {
|
|
|
|
|
|
|
|
map.set('spoiler', true);
|
|
|
|
|
|
|
|
map.set('spoiler_text', status.spoiler_text);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
map.set('spoiler', false);
|
|
|
|
|
|
|
|
map.set('spoiler_text', '');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
map.set('is_submitting', false);
|
|
|
|
|
|
|
|
map.set('in_reply_to', status.id);
|
|
|
|
|
|
|
|
map.update(
|
|
|
|
|
|
|
|
'advanced_options',
|
|
|
|
|
|
|
|
map => map.merge(new ImmutableMap({ do_not_federate: /👁\ufe0f?\u200b?(?:<\/p>)?$/.test(status.content) }))
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
map.set('privacy', privacyPreference(status.visibility, state.get('default_privacy')));
|
|
|
|
|
|
|
|
map.set('sensitive', false);
|
|
|
|
|
|
|
|
map.update('media_attachments', list => list.clear());
|
|
|
|
|
|
|
|
map.set('idempotencyKey', uuid());
|
|
|
|
|
|
|
|
map.set('focusDate', new Date());
|
|
|
|
|
|
|
|
map.set('preselectDate', new Date());
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function appendMedia(state, media) {
|
|
|
|
function appendMedia(state, media) {
|
|
|
|
const prevSize = state.get('media_attachments').size;
|
|
|
|
const prevSize = state.get('media_attachments').size;
|
|
|
|
|
|
|
|
|
|
|
@ -182,8 +227,7 @@ export default function compose(state = initialState, action) {
|
|
|
|
return state.set('mounted', false);
|
|
|
|
return state.set('mounted', false);
|
|
|
|
case COMPOSE_ADVANCED_OPTIONS_CHANGE:
|
|
|
|
case COMPOSE_ADVANCED_OPTIONS_CHANGE:
|
|
|
|
return state
|
|
|
|
return state
|
|
|
|
.set('advanced_options',
|
|
|
|
.set('advanced_options', state.get('advanced_options').set(action.option, !!overwrite(!state.getIn(['advanced_options', action.option]), action.value)))
|
|
|
|
state.get('advanced_options').set(action.option, !state.getIn(['advanced_options', action.option])))
|
|
|
|
|
|
|
|
.set('idempotencyKey', uuid());
|
|
|
|
.set('idempotencyKey', uuid());
|
|
|
|
case COMPOSE_SENSITIVITY_CHANGE:
|
|
|
|
case COMPOSE_SENSITIVITY_CHANGE:
|
|
|
|
return state.withMutations(map => {
|
|
|
|
return state.withMutations(map => {
|
|
|
@ -220,9 +264,10 @@ export default function compose(state = initialState, action) {
|
|
|
|
map.set('in_reply_to', action.status.get('id'));
|
|
|
|
map.set('in_reply_to', action.status.get('id'));
|
|
|
|
map.set('text', statusToTextMentions(state, action.status));
|
|
|
|
map.set('text', statusToTextMentions(state, action.status));
|
|
|
|
map.set('privacy', privacyPreference(action.status.get('visibility'), state.get('default_privacy')));
|
|
|
|
map.set('privacy', privacyPreference(action.status.get('visibility'), state.get('default_privacy')));
|
|
|
|
map.set('advanced_options', new ImmutableMap({
|
|
|
|
map.update(
|
|
|
|
do_not_federate: /👁\ufe0f?<\/p>$/.test(action.status.get('content')),
|
|
|
|
'advanced_options',
|
|
|
|
}));
|
|
|
|
map => map.merge(new ImmutableMap({ do_not_federate: /👁\ufe0f?\u200b?(?:<\/p>)?$/.test(action.status.get('content')) }))
|
|
|
|
|
|
|
|
);
|
|
|
|
map.set('focusDate', new Date());
|
|
|
|
map.set('focusDate', new Date());
|
|
|
|
map.set('preselectDate', new Date());
|
|
|
|
map.set('preselectDate', new Date());
|
|
|
|
map.set('idempotencyKey', uuid());
|
|
|
|
map.set('idempotencyKey', uuid());
|
|
|
@ -243,14 +288,17 @@ export default function compose(state = initialState, action) {
|
|
|
|
map.set('spoiler', false);
|
|
|
|
map.set('spoiler', false);
|
|
|
|
map.set('spoiler_text', '');
|
|
|
|
map.set('spoiler_text', '');
|
|
|
|
map.set('privacy', state.get('default_privacy'));
|
|
|
|
map.set('privacy', state.get('default_privacy'));
|
|
|
|
map.set('advanced_options', state.get('default_advanced_options'));
|
|
|
|
map.update(
|
|
|
|
|
|
|
|
'advanced_options',
|
|
|
|
|
|
|
|
map => map.mergeWith(overwrite, state.get('default_advanced_options'))
|
|
|
|
|
|
|
|
);
|
|
|
|
map.set('idempotencyKey', uuid());
|
|
|
|
map.set('idempotencyKey', uuid());
|
|
|
|
});
|
|
|
|
});
|
|
|
|
case COMPOSE_SUBMIT_REQUEST:
|
|
|
|
case COMPOSE_SUBMIT_REQUEST:
|
|
|
|
case COMPOSE_UPLOAD_CHANGE_REQUEST:
|
|
|
|
case COMPOSE_UPLOAD_CHANGE_REQUEST:
|
|
|
|
return state.set('is_submitting', true);
|
|
|
|
return state.set('is_submitting', true);
|
|
|
|
case COMPOSE_SUBMIT_SUCCESS:
|
|
|
|
case COMPOSE_SUBMIT_SUCCESS:
|
|
|
|
return clearAll(state);
|
|
|
|
return action.status && state.get('advanced_options', 'threaded_mode') ? continueThread(state, action.status) : clearAll(state);
|
|
|
|
case COMPOSE_SUBMIT_FAIL:
|
|
|
|
case COMPOSE_SUBMIT_FAIL:
|
|
|
|
case COMPOSE_UPLOAD_CHANGE_FAIL:
|
|
|
|
case COMPOSE_UPLOAD_CHANGE_FAIL:
|
|
|
|
return state.set('is_submitting', false);
|
|
|
|
return state.set('is_submitting', false);
|
|
|
|