mirror of
https://github.com/discourse/discourse.git
synced 2025-06-03 02:48:28 +08:00
FIX: correctly handle notifications for channels (#27178)
Prior to this fix we had too logic to detect if a user is active or not: - idle codepath on the frontend - online user ids on the backend The frontend solution is not very reliable, and both solution are just trying to be too smart. Making a lot of people questioning why they receive a notification sometimes and sometimes not. This commit removes all this logic and replaces it with a much more simpler logic: - you can't receive notifications for channel you are actually watching - we won't play a sound more than once every 3seconds
This commit is contained in:
@ -1,139 +0,0 @@
|
||||
import { getOwner } from "@ember/application";
|
||||
import { test } from "qunit";
|
||||
import {
|
||||
disable,
|
||||
init,
|
||||
resetIdle,
|
||||
setLastAction,
|
||||
} from "discourse/lib/desktop-notifications";
|
||||
import {
|
||||
acceptance,
|
||||
updateCurrentUser,
|
||||
} from "discourse/tests/helpers/qunit-helpers";
|
||||
import ChatFabricators from "discourse/plugins/chat/discourse/lib/fabricators";
|
||||
|
||||
function buildDirectMessageChannel(owner) {
|
||||
const channel = new ChatFabricators(owner).directMessageChannel();
|
||||
buildMembership(channel);
|
||||
return channel;
|
||||
}
|
||||
function buildCategoryMessageChannel(owner) {
|
||||
const channel = new ChatFabricators(owner).channel();
|
||||
buildMembership(channel);
|
||||
return channel;
|
||||
}
|
||||
|
||||
function buildMembership(channel) {
|
||||
channel.currentUserMembership = {
|
||||
following: true,
|
||||
desktop_notification_level: "always",
|
||||
muted: false,
|
||||
};
|
||||
return channel;
|
||||
}
|
||||
|
||||
acceptance(
|
||||
"Discourse Chat | Unit | Service | chat-channel-notification-sound",
|
||||
function (needs) {
|
||||
needs.hooks.beforeEach(function () {
|
||||
Object.defineProperty(this, "subject", {
|
||||
get: () =>
|
||||
this.container.lookup("service:chat-channel-notification-sound"),
|
||||
});
|
||||
|
||||
Object.defineProperty(this, "site", {
|
||||
get: () => this.container.lookup("service:site"),
|
||||
});
|
||||
|
||||
Object.defineProperty(this, "chat", {
|
||||
get: () => this.container.lookup("service:chat"),
|
||||
});
|
||||
|
||||
updateCurrentUser({ chat_sound: "ding" });
|
||||
|
||||
init(
|
||||
this.container.lookup("service:message-bus"),
|
||||
this.container.lookup("service:app-events")
|
||||
);
|
||||
|
||||
setLastAction(moment().subtract(1, "hour").valueOf());
|
||||
});
|
||||
|
||||
needs.user();
|
||||
|
||||
test("in do not disturb", async function (assert) {
|
||||
updateCurrentUser({ do_not_disturb_until: moment().add(1, "hour") });
|
||||
const channel = buildDirectMessageChannel(getOwner(this));
|
||||
|
||||
assert.deepEqual(await this.subject.play(channel), false);
|
||||
});
|
||||
|
||||
test("no chat sound", async function (assert) {
|
||||
updateCurrentUser({ chat_sound: null });
|
||||
const channel = buildDirectMessageChannel(getOwner(this));
|
||||
|
||||
assert.deepEqual(await this.subject.play(channel), false);
|
||||
});
|
||||
|
||||
test("mobile", async function (assert) {
|
||||
const channel = buildDirectMessageChannel(getOwner(this));
|
||||
this.site.mobileView = true;
|
||||
|
||||
assert.deepEqual(await this.subject.play(channel), false);
|
||||
});
|
||||
|
||||
test("plays sound", async function (assert) {
|
||||
const channel = buildDirectMessageChannel(getOwner(this));
|
||||
|
||||
assert.deepEqual(await this.subject.play(channel), true);
|
||||
});
|
||||
|
||||
test("muted", async function (assert) {
|
||||
const channel = buildDirectMessageChannel(getOwner(this));
|
||||
channel.currentUserMembership.muted = true;
|
||||
|
||||
assert.deepEqual(await this.subject.play(channel), false);
|
||||
});
|
||||
|
||||
test("not following", async function (assert) {
|
||||
const channel = buildDirectMessageChannel(getOwner(this));
|
||||
channel.currentUserMembership.following = false;
|
||||
|
||||
assert.deepEqual(await this.subject.play(channel), false);
|
||||
});
|
||||
|
||||
test("no notification", async function (assert) {
|
||||
const channel = buildDirectMessageChannel(getOwner(this));
|
||||
channel.currentUserMembership.desktopNotificationLevel = "never";
|
||||
|
||||
assert.deepEqual(await this.subject.play(channel), false);
|
||||
});
|
||||
|
||||
test("currently active channel", async function (assert) {
|
||||
const channel = buildDirectMessageChannel(getOwner(this));
|
||||
this.chat.activeChannel = channel;
|
||||
|
||||
assert.deepEqual(await this.subject.play(channel), false);
|
||||
});
|
||||
|
||||
test("category channel", async function (assert) {
|
||||
const channel = buildCategoryMessageChannel(getOwner(this));
|
||||
|
||||
assert.deepEqual(await this.subject.play(channel), false);
|
||||
});
|
||||
|
||||
test("not idle", async function (assert) {
|
||||
const channel = buildDirectMessageChannel(getOwner(this));
|
||||
resetIdle();
|
||||
|
||||
assert.deepEqual(await this.subject.play(channel), true);
|
||||
});
|
||||
|
||||
test("notifications disabled", async function (assert) {
|
||||
const channel = buildDirectMessageChannel(getOwner(this));
|
||||
disable();
|
||||
|
||||
assert.deepEqual(await this.subject.play(channel), false);
|
||||
});
|
||||
}
|
||||
);
|
Reference in New Issue
Block a user