mirror of
https://github.com/vector-im/element-web.git
synced 2024-11-15 20:54:59 +08:00
Fix: sync intentional mentions push rules with legacy rules (#11667)
* fix monitorSyncedPushRules when primary rule is disabled * sync intentional mentions rules * remove debug log
This commit is contained in:
parent
4d0d024e86
commit
0d367a7c7e
@ -111,6 +111,7 @@ export const VectorPushRulesDefinitions: Record<string, VectorPushRuleDefinition
|
||||
[VectorState.Loud]: StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND,
|
||||
[VectorState.Off]: StandardActions.ACTION_DISABLED,
|
||||
},
|
||||
syncedRuleIds: [RuleId.IsUserMention],
|
||||
}),
|
||||
|
||||
// Messages containing @room
|
||||
@ -122,6 +123,7 @@ export const VectorPushRulesDefinitions: Record<string, VectorPushRuleDefinition
|
||||
[VectorState.Loud]: StandardActions.ACTION_HIGHLIGHT,
|
||||
[VectorState.Off]: StandardActions.ACTION_DISABLED,
|
||||
},
|
||||
syncedRuleIds: [RuleId.IsRoomMention],
|
||||
}),
|
||||
|
||||
// Messages just sent to the user in a 1:1 room
|
||||
|
@ -63,7 +63,9 @@ const monitorSyncedRule = async (
|
||||
const primaryRuleVectorState = definition.ruleToVectorState(primaryRule);
|
||||
|
||||
const outOfSyncRules = syncedRules.filter(
|
||||
(syncedRule) => definition.ruleToVectorState(syncedRule) !== primaryRuleVectorState,
|
||||
(syncedRule) =>
|
||||
syncedRule.enabled !== primaryRule.enabled ||
|
||||
definition.ruleToVectorState(syncedRule) !== primaryRuleVectorState,
|
||||
);
|
||||
|
||||
if (outOfSyncRules.length) {
|
||||
@ -71,7 +73,7 @@ const monitorSyncedRule = async (
|
||||
matrixClient,
|
||||
// eslint-disable-next-line camelcase, @typescript-eslint/naming-convention
|
||||
outOfSyncRules.map(({ rule_id }) => rule_id),
|
||||
primaryRule.actions,
|
||||
primaryRule.enabled ? primaryRule.actions : undefined,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
@ -16,7 +16,7 @@ limitations under the License.
|
||||
|
||||
import React from "react";
|
||||
import { render, RenderResult } from "@testing-library/react";
|
||||
import { ConditionKind, EventType, IPushRule, MatrixEvent, ClientEvent } from "matrix-js-sdk/src/matrix";
|
||||
import { ConditionKind, EventType, IPushRule, MatrixEvent, ClientEvent, PushRuleKind } from "matrix-js-sdk/src/matrix";
|
||||
import { MediaHandler } from "matrix-js-sdk/src/webrtc/mediaHandler";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
|
||||
@ -81,6 +81,11 @@ describe("<LoggedInView />", () => {
|
||||
enabled: true,
|
||||
} as IPushRule;
|
||||
|
||||
const oneToOneRuleDisabled = {
|
||||
...oneToOneRule,
|
||||
enabled: false,
|
||||
};
|
||||
|
||||
const groupRule = {
|
||||
conditions: [{ kind: ConditionKind.EventMatch, key: "type", pattern: "m.room.message" }],
|
||||
actions: StandardActions.ACTION_NOTIFY,
|
||||
@ -221,6 +226,36 @@ describe("<LoggedInView />", () => {
|
||||
);
|
||||
});
|
||||
|
||||
it("updates all mismatched rules from synced rules when primary rule is disabled", async () => {
|
||||
setPushRules([
|
||||
// poll 1-1 rules are synced with oneToOneRule
|
||||
oneToOneRuleDisabled, // off
|
||||
pollStartOneToOne, // on
|
||||
pollEndOneToOne, // loud
|
||||
// poll group rules are synced with groupRule
|
||||
groupRule, // on
|
||||
pollStartGroup, // loud
|
||||
]);
|
||||
|
||||
getComponent();
|
||||
|
||||
await flushPromises();
|
||||
|
||||
// set to match primary rule
|
||||
expect(mockClient.setPushRuleEnabled).toHaveBeenCalledWith(
|
||||
"global",
|
||||
PushRuleKind.Underride,
|
||||
pollStartOneToOne.rule_id,
|
||||
false,
|
||||
);
|
||||
expect(mockClient.setPushRuleEnabled).toHaveBeenCalledWith(
|
||||
"global",
|
||||
PushRuleKind.Underride,
|
||||
pollEndOneToOne.rule_id,
|
||||
false,
|
||||
);
|
||||
});
|
||||
|
||||
it("catches and logs errors while updating a rule", async () => {
|
||||
mockClient.setPushRuleActions.mockRejectedValueOnce("oups").mockResolvedValueOnce({});
|
||||
|
||||
@ -302,6 +337,31 @@ describe("<LoggedInView />", () => {
|
||||
);
|
||||
});
|
||||
|
||||
it("updates all mismatched rules from synced rules on a change to push rules account data when primary rule is disabled", async () => {
|
||||
// setup a push rule state with mismatched rules
|
||||
setPushRules([
|
||||
// poll 1-1 rules are synced with oneToOneRule
|
||||
oneToOneRuleDisabled, // off
|
||||
pollEndOneToOne, // loud
|
||||
]);
|
||||
|
||||
getComponent();
|
||||
|
||||
await flushPromises();
|
||||
|
||||
mockClient.setPushRuleEnabled.mockClear();
|
||||
|
||||
mockClient.emit(ClientEvent.AccountData, pushRulesEvent);
|
||||
|
||||
// set to match primary rule
|
||||
expect(mockClient.setPushRuleEnabled).toHaveBeenCalledWith(
|
||||
"global",
|
||||
"underride",
|
||||
pollEndOneToOne.rule_id,
|
||||
false,
|
||||
);
|
||||
});
|
||||
|
||||
it("stops listening to account data events on unmount", () => {
|
||||
// setup a push rule state with mismatched rules
|
||||
setPushRules([
|
||||
|
Loading…
Reference in New Issue
Block a user