diff --git a/app/soapbox/features/scheduled_statuses/builder.js b/app/soapbox/features/scheduled_statuses/builder.js index 6b3d1a4f8..8e3417582 100644 --- a/app/soapbox/features/scheduled_statuses/builder.js +++ b/app/soapbox/features/scheduled_statuses/builder.js @@ -1,4 +1,4 @@ -import { fromJS } from 'immutable'; +import { Map as ImmutableMap } from 'immutable'; import { normalizeStatus } from 'soapbox/normalizers/status'; import { calculateStatus } from 'soapbox/reducers/statuses'; @@ -11,7 +11,7 @@ export const buildStatus = (state, scheduledStatus) => { const params = scheduledStatus.get('params'); const account = getAccount(state, me); - const status = { + const status = ImmutableMap({ account, content: params.get('text', '').replace(new RegExp('\n', 'g'), '
'), /* eslint-disable-line no-control-regex */ created_at: params.get('scheduled_at'), @@ -23,7 +23,7 @@ export const buildStatus = (state, scheduledStatus) => { uri: `/scheduled_statuses/${scheduledStatus.get('id')}`, url: `/scheduled_statuses/${scheduledStatus.get('id')}`, visibility: params.get('visibility'), - }; + }); - return calculateStatus(normalizeStatus(fromJS(status))); + return calculateStatus(normalizeStatus(status)); }; diff --git a/app/soapbox/features/ui/util/pending_status_builder.js b/app/soapbox/features/ui/util/pending_status_builder.js index 374d79c64..b51b1ceed 100644 --- a/app/soapbox/features/ui/util/pending_status_builder.js +++ b/app/soapbox/features/ui/util/pending_status_builder.js @@ -1,4 +1,4 @@ -import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; +import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { normalizeStatus } from 'soapbox/normalizers/status'; import { calculateStatus } from 'soapbox/reducers/statuses'; @@ -6,11 +6,11 @@ import { makeGetAccount } from 'soapbox/selectors'; const getAccount = makeGetAccount(); -const getMentions = pendingStatus => { +const buildMentions = pendingStatus => { if (pendingStatus.get('in_reply_to_id')) { - return ImmutableList(pendingStatus.get('to') || []).map(mention => ImmutableMap({ - username: mention.split('@')[0], - acct: mention, + return ImmutableList(pendingStatus.get('to') || []).map(acct => ImmutableMap({ + acct, + username: acct.split('@')[0], })); } else { return ImmutableList(); @@ -22,19 +22,19 @@ export const buildStatus = (state, pendingStatus, idempotencyKey) => { const account = getAccount(state, me); const inReplyToId = pendingStatus.get('in_reply_to_id'); - const status = { + const status = ImmutableMap({ account, content: pendingStatus.get('status', '').replace(new RegExp('\n', 'g'), '
'), /* eslint-disable-line no-control-regex */ id: `末pending-${idempotencyKey}`, in_reply_to_account_id: state.getIn(['statuses', inReplyToId, 'account'], null), in_reply_to_id: inReplyToId, media_attachments: pendingStatus.get('media_ids', ImmutableList()).map(id => ImmutableMap({ id })), - mentions: getMentions(pendingStatus), + mentions: buildMentions(pendingStatus), poll: pendingStatus.get('poll', null), quote: pendingStatus.get('quote_id', null), sensitive: pendingStatus.get('sensitive', false), visibility: pendingStatus.get('visibility', 'public'), - }; + }); - return calculateStatus(normalizeStatus(fromJS(status))); + return calculateStatus(normalizeStatus(status)); }; diff --git a/app/soapbox/normalizers/status.js b/app/soapbox/normalizers/status.js index 288a07498..8377a1a51 100644 --- a/app/soapbox/normalizers/status.js +++ b/app/soapbox/normalizers/status.js @@ -28,8 +28,10 @@ const baseStatus = ImmutableMap({ visibility: 'public', }); +// Merger function for only overriding undefined values const mergeDefined = (oldVal, newVal) => oldVal === undefined ? newVal : oldVal; +// Merge base status const setRequiredFields = status => { return status.mergeDeepWith(mergeDefined, baseStatus); }; @@ -49,7 +51,7 @@ const normalizeAttachment = attachment => { remote_url: url, }); - return attachment.mergeWith((o, n) => o || n, base); + return attachment.mergeWith(mergeDefined, base); }; const normalizeAttachments = status => { @@ -58,9 +60,26 @@ const normalizeAttachments = status => { }); }; +// Normalize mentions +const normalizeMention = mention => { + const base = ImmutableMap({ + acct: '', + username: (mention.get('acct') || '').split('@')[0], + url: '', + }); + + return mention.mergeWith(mergeDefined, base); +}; + +const normalizeMentions = status => { + return status.update('mentions', ImmutableList(), mentions => { + return mentions.map(normalizeMention); + }); +}; + // Fix order of mentions -const fixMentions = status => { - const mentions = status.get('mentions'); +const fixMentionsOrder = status => { + const mentions = status.get('mentions', ImmutableList()); const inReplyToAccountId = status.get('in_reply_to_account_id'); // Sort the replied-to mention to the top @@ -103,9 +122,10 @@ const fixQuote = status => { export const normalizeStatus = status => { return status.withMutations(status => { setRequiredFields(status); - fixMentions(status); - fixQuote(status); - addSelfMention(status); normalizeAttachments(status); + normalizeMentions(status); + fixMentionsOrder(status); + addSelfMention(status); + fixQuote(status); }); };