DEV: Allow `onStateChange` callbacks for PM topic tracking state. (#14479)

The changes here are in anticipation of a private plugin that will soon
be merged into Discourse core.
This commit is contained in:
Alan Guo Xiang Tan 2021-10-05 14:12:01 +08:00 committed by GitHub
parent d82e5cd37c
commit 085eb56ea4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 3 deletions

View File

@ -25,6 +25,11 @@ const PrivateMessageTopicTrackingState = EmberObject.extend({
this.statesModificationCounter = 0;
this.isTracking = false;
this.newIncoming = [];
this.stateChangeCallbacks = {};
},
onStateChange(name, callback) {
this.stateChangeCallbacks[name] = callback;
},
startTracking() {
@ -34,7 +39,7 @@ const PrivateMessageTopicTrackingState = EmberObject.extend({
this._establishChannels();
this._loadInitialState().finally(() => {
return this._loadInitialState().finally(() => {
this.set("isTracking", true);
});
},
@ -98,7 +103,7 @@ const PrivateMessageTopicTrackingState = EmberObject.extend({
}
topicIds.forEach((topicId) => this.states.delete(topicId));
this.incrementProperty("statesModificationCounter");
this._afterStateChange();
},
_userChannel() {
@ -236,9 +241,14 @@ const PrivateMessageTopicTrackingState = EmberObject.extend({
this.states.set(topicId, newState);
if (!opts.skipIncrement) {
this.incrementProperty("statesModificationCounter");
this._afterStateChange();
}
},
_afterStateChange() {
this.incrementProperty("statesModificationCounter");
Object.values(this.stateChangeCallbacks).forEach((callback) => callback());
},
});
export default PrivateMessageTopicTrackingState;

View File

@ -0,0 +1,32 @@
import { test } from "qunit";
import { discourseModule } from "discourse/tests/helpers/qunit-helpers";
import MessageBus from "message-bus-client";
import PrivateMessageTopicTrackingState from "discourse/models/private-message-topic-tracking-state";
import User from "discourse/models/user";
discourseModule(
"Unit | Model | private-message-topic-tracking-state",
function (hooks) {
let pmTopicTrackingState;
hooks.beforeEach(function () {
pmTopicTrackingState = PrivateMessageTopicTrackingState.create({
messageBus: MessageBus,
currentUser: User.create({ id: 1, username: "test" }),
});
});
test("modifying state calls onStateChange callbacks", function (assert) {
let callbackCalled = false;
pmTopicTrackingState.onStateChange("testing", () => {
callbackCalled = true;
});
pmTopicTrackingState.set("isTracking", true);
pmTopicTrackingState.removeTopics([]);
assert.ok(callbackCalled);
});
}
);