UX: improves topic-notifications-button loading behavior (#9832)

This commit is contained in:
Joffrey JAFFEUX 2020-05-19 17:13:40 +02:00 committed by GitHub
parent 38c05a4f07
commit ab6737c44a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 25 deletions

View File

@ -62,13 +62,14 @@ const TopicDetails = RestModel.extend({
},
updateNotifications(level) {
this.setProperties({
notification_level: level,
notifications_reason_id: null
});
return ajax(`/t/${this.get("topic.id")}/notifications`, {
type: "POST",
data: { notification_level: level }
}).then(() => {
this.setProperties({
notification_level: level,
notifications_reason_id: null
});
});
},

View File

@ -1,6 +1,5 @@
import Component from "@ember/component";
import { action, computed } from "@ember/object";
import { later, cancel } from "@ember/runloop";
export default Component.extend({
layoutName: "select-kit/templates/components/topic-notifications-button",
@ -17,22 +16,13 @@ export default Component.extend({
return this.isLoading ? "spinner" : null;
}),
willDestroyElement() {
this._super(...arguments);
this._endLoadingHandler && cancel(this._endLoadingHandler);
},
@action
changeTopicNotificationLevel(levelId) {
if (levelId !== this.notificationLevel) {
this.set("isLoading", true);
this.topic.details.updateNotifications(levelId).finally(() => {
this._endLoadingHandler = later(
() => this.set("isLoading", false),
250
);
});
this.topic.details
.updateNotifications(levelId)
.finally(() => this.set("isLoading", false));
}
}
});

View File

@ -1026,14 +1026,6 @@ a.mention-group {
margin-top: 0;
}
.topic-notifications-button.is-loading {
pointer-events: none;
user-select: none;
.topic-notifications-options {
opacity: 0.5;
}
}
.pinned-button,
.topic-notifications-button {
margin: 1em 0;

View File

@ -0,0 +1,18 @@
.topic-notifications-button {
&.is-loading {
pointer-events: none;
user-select: none;
.d-icon-spinner {
margin: 0;
}
.selected-name .d-icon {
display: none;
}
.topic-notifications-options {
opacity: 0.5;
}
}
}