diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb
index 6290a1746..9a8c0c161 100644
--- a/app/controllers/api/v1/statuses_controller.rb
+++ b/app/controllers/api/v1/statuses_controller.rb
@@ -79,6 +79,7 @@ class Api::V1::StatusesController < Api::BaseController
current_account.id,
text: status_params[:status],
media_ids: status_params[:media_ids],
+ media_attributes: status_params[:media_attributes],
sensitive: status_params[:sensitive],
language: status_params[:language],
spoiler_text: status_params[:spoiler_text],
@@ -128,6 +129,12 @@ class Api::V1::StatusesController < Api::BaseController
:language,
:scheduled_at,
media_ids: [],
+ media_attributes: [
+ :id,
+ :thumbnail,
+ :description,
+ :focus,
+ ],
poll: [
:multiple,
:hide_totals,
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index 531a5eb2b..72e592935 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -160,6 +160,18 @@ export function submitCompose(routerHistory) {
dispatch(submitComposeRequest());
+ // If we're editing a post with media attachments, those have not
+ // necessarily been changed on the server. Do it now in the same
+ // API call.
+ let media_attributes;
+ if (statusId !== null) {
+ media_attributes = media.map(item => ({
+ id: item.get('id'),
+ description: item.get('description'),
+ focus: item.get('focus'),
+ }));
+ }
+
api(getState).request({
url: statusId === null ? '/api/v1/statuses' : `/api/v1/statuses/${statusId}`,
method: statusId === null ? 'post' : 'put',
@@ -167,6 +179,7 @@ export function submitCompose(routerHistory) {
status,
in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null),
media_ids: media.map(item => item.get('id')),
+ media_attributes,
sensitive: getState().getIn(['compose', 'sensitive']),
spoiler_text: getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '',
visibility: getState().getIn(['compose', 'privacy']),
@@ -375,11 +388,31 @@ export function changeUploadCompose(id, params) {
return (dispatch, getState) => {
dispatch(changeUploadComposeRequest());
- api(getState).put(`/api/v1/media/${id}`, params).then(response => {
- dispatch(changeUploadComposeSuccess(response.data));
- }).catch(error => {
- dispatch(changeUploadComposeFail(id, error));
- });
+ let media = getState().getIn(['compose', 'media_attachments']).find((item) => item.get('id') === id);
+
+ // Editing already-attached media is deferred to editing the post itself.
+ // For simplicity's sake, fake an API reply.
+ if (media && !media.get('unattached')) {
+ let { description, focus } = params;
+ const data = media.toJS();
+
+ if (description) {
+ data.description = description;
+ }
+
+ if (focus) {
+ focus = focus.split(',');
+ data.meta = { focus: { x: parseFloat(focus[0]), y: parseFloat(focus[1]) } };
+ }
+
+ dispatch(changeUploadComposeSuccess(data, true));
+ } else {
+ api(getState).put(`/api/v1/media/${id}`, params).then(response => {
+ dispatch(changeUploadComposeSuccess(response.data, false));
+ }).catch(error => {
+ dispatch(changeUploadComposeFail(id, error));
+ });
+ }
};
}
@@ -390,10 +423,11 @@ export function changeUploadComposeRequest() {
};
}
-export function changeUploadComposeSuccess(media) {
+export function changeUploadComposeSuccess(media, attached) {
return {
type: COMPOSE_UPLOAD_CHANGE_SUCCESS,
media: media,
+ attached: attached,
skipLoading: true,
};
}
diff --git a/app/javascript/mastodon/features/compose/components/upload.js b/app/javascript/mastodon/features/compose/components/upload.js
index b08307ade..af06ce1bf 100644
--- a/app/javascript/mastodon/features/compose/components/upload.js
+++ b/app/javascript/mastodon/features/compose/components/upload.js
@@ -43,10 +43,10 @@ export default class Upload extends ImmutablePureComponent {
- {!!media.get('unattached') && ()}
+
- {(media.get('description') || '').length === 0 && !!media.get('unattached') && (
+ {(media.get('description') || '').length === 0 && (
diff --git a/app/javascript/mastodon/features/ui/components/focal_point_modal.js b/app/javascript/mastodon/features/ui/components/focal_point_modal.js
index 479f4abd2..b9dbd9390 100644
--- a/app/javascript/mastodon/features/ui/components/focal_point_modal.js
+++ b/app/javascript/mastodon/features/ui/components/focal_point_modal.js
@@ -320,7 +320,7 @@ class FocalPointModal extends ImmutablePureComponent {
-
+