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);
});
};