From e4bc013d6f5e0fb8c6e612460182207a6c5d1c43 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Fri, 5 Jan 2018 18:23:06 -0800 Subject: Threaded mode~ --- app/javascript/flavours/glitch/reducers/compose.js | 64 +++++++++++++++++++--- 1 file changed, 56 insertions(+), 8 deletions(-) (limited to 'app/javascript/flavours/glitch/reducers/compose.js') diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js index e1f811f6f..610cc9446 100644 --- a/app/javascript/flavours/glitch/reducers/compose.js +++ b/app/javascript/flavours/glitch/reducers/compose.js @@ -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 uuid from 'flavours/glitch/util/uuid'; import { me } from 'flavours/glitch/util/initial_state'; +import { overwrite } from 'flavours/glitch/util/js_helpers'; const initialState = ImmutableMap({ mounted: false, advanced_options: ImmutableMap({ do_not_federate: false, + threaded_mode: false, }), sensitive: false, spoiler: false, @@ -55,6 +57,7 @@ const initialState = ImmutableMap({ suggestions: ImmutableList(), default_advanced_options: ImmutableMap({ do_not_federate: false, + threaded_mode: null, // Do not reset }), default_privacy: 'public', 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(''); }; +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) { return state.withMutations(map => { map.set('text', ''); @@ -90,7 +107,10 @@ function clearAll(state) { map.set('spoiler_text', ''); map.set('is_submitting', false); 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('sensitive', false); 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) { const prevSize = state.get('media_attachments').size; @@ -182,8 +227,7 @@ export default function compose(state = initialState, action) { return state.set('mounted', false); case COMPOSE_ADVANCED_OPTIONS_CHANGE: return state - .set('advanced_options', - state.get('advanced_options').set(action.option, !state.getIn(['advanced_options', action.option]))) + .set('advanced_options', state.get('advanced_options').set(action.option, !!overwrite(!state.getIn(['advanced_options', action.option]), action.value))) .set('idempotencyKey', uuid()); case COMPOSE_SENSITIVITY_CHANGE: 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('text', statusToTextMentions(state, action.status)); map.set('privacy', privacyPreference(action.status.get('visibility'), state.get('default_privacy'))); - map.set('advanced_options', new ImmutableMap({ - do_not_federate: /👁\ufe0f?<\/p>$/.test(action.status.get('content')), - })); + map.update( + '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('preselectDate', new Date()); map.set('idempotencyKey', uuid()); @@ -243,14 +288,17 @@ export default function compose(state = initialState, action) { map.set('spoiler', false); map.set('spoiler_text', ''); 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()); }); case COMPOSE_SUBMIT_REQUEST: case COMPOSE_UPLOAD_CHANGE_REQUEST: return state.set('is_submitting', true); 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_UPLOAD_CHANGE_FAIL: return state.set('is_submitting', false); -- cgit