mirror of
https://github.com/element-hq/element-web
synced 2024-11-27 11:47:23 +03:00
Merge pull request #4829 from matrix-org/t3chguy/notifications0
Small tweaks in preparation for Notifications rework
This commit is contained in:
commit
98fc23acb3
9 changed files with 197 additions and 65 deletions
|
@ -122,7 +122,7 @@ const Notifier = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
getSoundForRoom: async function(roomId) {
|
getSoundForRoom: function(roomId) {
|
||||||
// We do no caching here because the SDK caches setting
|
// We do no caching here because the SDK caches setting
|
||||||
// and the browser will cache the sound.
|
// and the browser will cache the sound.
|
||||||
const content = SettingsStore.getValue("notificationSound", roomId);
|
const content = SettingsStore.getValue("notificationSound", roomId);
|
||||||
|
@ -151,7 +151,7 @@ const Notifier = {
|
||||||
},
|
},
|
||||||
|
|
||||||
_playAudioNotification: async function(ev, room) {
|
_playAudioNotification: async function(ev, room) {
|
||||||
const sound = await this.getSoundForRoom(room.roomId);
|
const sound = this.getSoundForRoom(room.roomId);
|
||||||
console.log(`Got sound ${sound && sound.name || "default"} for ${room.roomId}`);
|
console.log(`Got sound ${sound && sound.name || "default"} for ${room.roomId}`);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -39,12 +39,11 @@ export default class NotificationsSettingsTab extends React.Component {
|
||||||
|
|
||||||
// TODO: [REACT-WARNING] Replace component with real class, use constructor for refs
|
// TODO: [REACT-WARNING] Replace component with real class, use constructor for refs
|
||||||
UNSAFE_componentWillMount() { // eslint-disable-line camelcase
|
UNSAFE_componentWillMount() { // eslint-disable-line camelcase
|
||||||
Notifier.getSoundForRoom(this.props.roomId).then((soundData) => {
|
const soundData = Notifier.getSoundForRoom(this.props.roomId);
|
||||||
if (!soundData) {
|
if (!soundData) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.setState({currentSound: soundData.name || soundData.url});
|
this.setState({currentSound: soundData.name || soundData.url});
|
||||||
});
|
|
||||||
|
|
||||||
this._soundUpload = createRef();
|
this._soundUpload = createRef();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2016 OpenMarket Ltd
|
Copyright 2016 OpenMarket Ltd
|
||||||
Copyright 2019 The Matrix.org Foundation C.I.C.
|
Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
@ -15,9 +15,17 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'use strict';
|
import {PushRuleVectorState, State} from "./PushRuleVectorState";
|
||||||
|
import {IExtendedPushRule, IPushRuleSet, IRuleSets} from "./types";
|
||||||
|
|
||||||
import {PushRuleVectorState} from "./PushRuleVectorState";
|
export interface IContentRules {
|
||||||
|
vectorState: State;
|
||||||
|
rules: IExtendedPushRule[];
|
||||||
|
externalRules: IExtendedPushRule[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SCOPE = "global";
|
||||||
|
export const KIND = "content";
|
||||||
|
|
||||||
export class ContentRules {
|
export class ContentRules {
|
||||||
/**
|
/**
|
||||||
|
@ -31,7 +39,7 @@ export class ContentRules {
|
||||||
* externalRules: a list of other keyword rules, with states other than
|
* externalRules: a list of other keyword rules, with states other than
|
||||||
* vectorState
|
* vectorState
|
||||||
*/
|
*/
|
||||||
static parseContentRules(rulesets) {
|
static parseContentRules(rulesets: IRuleSets): IContentRules {
|
||||||
// first categorise the keyword rules in terms of their actions
|
// first categorise the keyword rules in terms of their actions
|
||||||
const contentRules = this._categoriseContentRules(rulesets);
|
const contentRules = this._categoriseContentRules(rulesets);
|
||||||
|
|
||||||
|
@ -51,59 +59,72 @@ export class ContentRules {
|
||||||
|
|
||||||
if (contentRules.loud.length) {
|
if (contentRules.loud.length) {
|
||||||
return {
|
return {
|
||||||
vectorState: PushRuleVectorState.LOUD,
|
vectorState: State.Loud,
|
||||||
rules: contentRules.loud,
|
rules: contentRules.loud,
|
||||||
externalRules: [].concat(contentRules.loud_but_disabled, contentRules.on, contentRules.on_but_disabled, contentRules.other),
|
externalRules: [
|
||||||
|
...contentRules.loud_but_disabled,
|
||||||
|
...contentRules.on,
|
||||||
|
...contentRules.on_but_disabled,
|
||||||
|
...contentRules.other,
|
||||||
|
],
|
||||||
};
|
};
|
||||||
} else if (contentRules.loud_but_disabled.length) {
|
} else if (contentRules.loud_but_disabled.length) {
|
||||||
return {
|
return {
|
||||||
vectorState: PushRuleVectorState.OFF,
|
vectorState: State.Off,
|
||||||
rules: contentRules.loud_but_disabled,
|
rules: contentRules.loud_but_disabled,
|
||||||
externalRules: [].concat(contentRules.on, contentRules.on_but_disabled, contentRules.other),
|
externalRules: [...contentRules.on, ...contentRules.on_but_disabled, ...contentRules.other],
|
||||||
};
|
};
|
||||||
} else if (contentRules.on.length) {
|
} else if (contentRules.on.length) {
|
||||||
return {
|
return {
|
||||||
vectorState: PushRuleVectorState.ON,
|
vectorState: State.On,
|
||||||
rules: contentRules.on,
|
rules: contentRules.on,
|
||||||
externalRules: [].concat(contentRules.on_but_disabled, contentRules.other),
|
externalRules: [...contentRules.on_but_disabled, ...contentRules.other],
|
||||||
};
|
};
|
||||||
} else if (contentRules.on_but_disabled.length) {
|
} else if (contentRules.on_but_disabled.length) {
|
||||||
return {
|
return {
|
||||||
vectorState: PushRuleVectorState.OFF,
|
vectorState: State.Off,
|
||||||
rules: contentRules.on_but_disabled,
|
rules: contentRules.on_but_disabled,
|
||||||
externalRules: contentRules.other,
|
externalRules: contentRules.other,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
vectorState: PushRuleVectorState.ON,
|
vectorState: State.On,
|
||||||
rules: [],
|
rules: [],
|
||||||
externalRules: contentRules.other,
|
externalRules: contentRules.other,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static _categoriseContentRules(rulesets) {
|
static _categoriseContentRules(rulesets: IRuleSets) {
|
||||||
const contentRules = {on: [], on_but_disabled: [], loud: [], loud_but_disabled: [], other: []};
|
const contentRules: Record<"on"|"on_but_disabled"|"loud"|"loud_but_disabled"|"other", IExtendedPushRule[]> = {
|
||||||
|
on: [],
|
||||||
|
on_but_disabled: [],
|
||||||
|
loud: [],
|
||||||
|
loud_but_disabled: [],
|
||||||
|
other: [],
|
||||||
|
};
|
||||||
|
|
||||||
for (const kind in rulesets.global) {
|
for (const kind in rulesets.global) {
|
||||||
for (let i = 0; i < Object.keys(rulesets.global[kind]).length; ++i) {
|
for (let i = 0; i < Object.keys(rulesets.global[kind]).length; ++i) {
|
||||||
const r = rulesets.global[kind][i];
|
const r = rulesets.global[kind][i];
|
||||||
|
|
||||||
// check it's not a default rule
|
// check it's not a default rule
|
||||||
if (r.rule_id[0] === '.' || kind !== 'content') {
|
if (r.rule_id[0] === '.' || kind !== "content") {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
r.kind = kind; // is this needed? not sure
|
// this is needed as we are flattening an object of arrays into a single array
|
||||||
|
r.kind = kind;
|
||||||
|
|
||||||
switch (PushRuleVectorState.contentRuleVectorStateKind(r)) {
|
switch (PushRuleVectorState.contentRuleVectorStateKind(r)) {
|
||||||
case PushRuleVectorState.ON:
|
case State.On:
|
||||||
if (r.enabled) {
|
if (r.enabled) {
|
||||||
contentRules.on.push(r);
|
contentRules.on.push(r);
|
||||||
} else {
|
} else {
|
||||||
contentRules.on_but_disabled.push(r);
|
contentRules.on_but_disabled.push(r);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PushRuleVectorState.LOUD:
|
case State.Loud:
|
||||||
if (r.enabled) {
|
if (r.enabled) {
|
||||||
contentRules.loud.push(r);
|
contentRules.loud.push(r);
|
||||||
} else {
|
} else {
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2016 OpenMarket Ltd
|
Copyright 2016 OpenMarket Ltd
|
||||||
Copyright 2019 The Matrix.org Foundation C.I.C.
|
Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
@ -15,7 +15,13 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'use strict';
|
import {Action, Actions} from "./types";
|
||||||
|
|
||||||
|
interface IEncodedActions {
|
||||||
|
notify: boolean;
|
||||||
|
sound?: string;
|
||||||
|
highlight?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
export class NotificationUtils {
|
export class NotificationUtils {
|
||||||
// Encodes a dictionary of {
|
// Encodes a dictionary of {
|
||||||
|
@ -24,12 +30,12 @@ export class NotificationUtils {
|
||||||
// "highlight: true/false,
|
// "highlight: true/false,
|
||||||
// }
|
// }
|
||||||
// to a list of push actions.
|
// to a list of push actions.
|
||||||
static encodeActions(action) {
|
static encodeActions(action: IEncodedActions) {
|
||||||
const notify = action.notify;
|
const notify = action.notify;
|
||||||
const sound = action.sound;
|
const sound = action.sound;
|
||||||
const highlight = action.highlight;
|
const highlight = action.highlight;
|
||||||
if (notify) {
|
if (notify) {
|
||||||
const actions = ["notify"];
|
const actions: Action[] = [Actions.Notify];
|
||||||
if (sound) {
|
if (sound) {
|
||||||
actions.push({"set_tweak": "sound", "value": sound});
|
actions.push({"set_tweak": "sound", "value": sound});
|
||||||
}
|
}
|
||||||
|
@ -40,7 +46,7 @@ export class NotificationUtils {
|
||||||
}
|
}
|
||||||
return actions;
|
return actions;
|
||||||
} else {
|
} else {
|
||||||
return ["dont_notify"];
|
return [Actions.DontNotify];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,18 +56,18 @@ export class NotificationUtils {
|
||||||
// "highlight: true/false,
|
// "highlight: true/false,
|
||||||
// }
|
// }
|
||||||
// If the actions couldn't be decoded then returns null.
|
// If the actions couldn't be decoded then returns null.
|
||||||
static decodeActions(actions) {
|
static decodeActions(actions: Action[]): IEncodedActions {
|
||||||
let notify = false;
|
let notify = false;
|
||||||
let sound = null;
|
let sound = null;
|
||||||
let highlight = false;
|
let highlight = false;
|
||||||
|
|
||||||
for (let i = 0; i < actions.length; ++i) {
|
for (let i = 0; i < actions.length; ++i) {
|
||||||
const action = actions[i];
|
const action = actions[i];
|
||||||
if (action === "notify") {
|
if (action === Actions.Notify) {
|
||||||
notify = true;
|
notify = true;
|
||||||
} else if (action === "dont_notify") {
|
} else if (action === Actions.DontNotify) {
|
||||||
notify = false;
|
notify = false;
|
||||||
} else if (typeof action === 'object') {
|
} else if (typeof action === "object") {
|
||||||
if (action.set_tweak === "sound") {
|
if (action.set_tweak === "sound") {
|
||||||
sound = action.value;
|
sound = action.value;
|
||||||
} else if (action.set_tweak === "highlight") {
|
} else if (action.set_tweak === "highlight") {
|
||||||
|
@ -81,7 +87,7 @@ export class NotificationUtils {
|
||||||
highlight = true;
|
highlight = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = {notify: notify, highlight: highlight};
|
const result: IEncodedActions = { notify, highlight };
|
||||||
if (sound !== null) {
|
if (sound !== null) {
|
||||||
result.sound = sound;
|
result.sound = sound;
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2016 OpenMarket Ltd
|
Copyright 2016 OpenMarket Ltd
|
||||||
Copyright 2019 The Matrix.org Foundation C.I.C.
|
Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
@ -15,43 +15,42 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
import {StandardActions} from "./StandardActions";
|
import {StandardActions} from "./StandardActions";
|
||||||
import {NotificationUtils} from "./NotificationUtils";
|
import {NotificationUtils} from "./NotificationUtils";
|
||||||
|
import {IPushRule} from "./types";
|
||||||
|
|
||||||
|
export enum State {
|
||||||
|
/** The push rule is disabled */
|
||||||
|
Off = "off",
|
||||||
|
/** The user will receive push notification for this rule */
|
||||||
|
On = "on",
|
||||||
|
/** The user will receive push notification for this rule with sound and
|
||||||
|
highlight if this is legitimate */
|
||||||
|
Loud = "loud",
|
||||||
|
}
|
||||||
|
|
||||||
export class PushRuleVectorState {
|
export class PushRuleVectorState {
|
||||||
// Backwards compatibility (things should probably be using .states instead)
|
// Backwards compatibility (things should probably be using the enum above instead)
|
||||||
static OFF = "off";
|
static OFF = State.Off;
|
||||||
static ON = "on";
|
static ON = State.On;
|
||||||
static LOUD = "loud";
|
static LOUD = State.Loud;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enum for state of a push rule as defined by the Vector UI.
|
* Enum for state of a push rule as defined by the Vector UI.
|
||||||
* @readonly
|
* @readonly
|
||||||
* @enum {string}
|
* @enum {string}
|
||||||
*/
|
*/
|
||||||
static states = {
|
static states = State;
|
||||||
/** The push rule is disabled */
|
|
||||||
OFF: PushRuleVectorState.OFF,
|
|
||||||
|
|
||||||
/** The user will receive push notification for this rule */
|
|
||||||
ON: PushRuleVectorState.ON,
|
|
||||||
|
|
||||||
/** The user will receive push notification for this rule with sound and
|
|
||||||
highlight if this is legitimate */
|
|
||||||
LOUD: PushRuleVectorState.LOUD,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a PushRuleVectorState to a list of actions
|
* Convert a PushRuleVectorState to a list of actions
|
||||||
*
|
*
|
||||||
* @return [object] list of push-rule actions
|
* @return [object] list of push-rule actions
|
||||||
*/
|
*/
|
||||||
static actionsFor(pushRuleVectorState) {
|
static actionsFor(pushRuleVectorState: State) {
|
||||||
if (pushRuleVectorState === PushRuleVectorState.ON) {
|
if (pushRuleVectorState === State.On) {
|
||||||
return StandardActions.ACTION_NOTIFY;
|
return StandardActions.ACTION_NOTIFY;
|
||||||
} else if (pushRuleVectorState === PushRuleVectorState.LOUD) {
|
} else if (pushRuleVectorState === State.Loud) {
|
||||||
return StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND;
|
return StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,7 +62,7 @@ export class PushRuleVectorState {
|
||||||
* category or in PushRuleVectorState.LOUD, regardless of its enabled
|
* category or in PushRuleVectorState.LOUD, regardless of its enabled
|
||||||
* state. Returns null if it does not match these categories.
|
* state. Returns null if it does not match these categories.
|
||||||
*/
|
*/
|
||||||
static contentRuleVectorStateKind(rule) {
|
static contentRuleVectorStateKind(rule: IPushRule): State {
|
||||||
const decoded = NotificationUtils.decodeActions(rule.actions);
|
const decoded = NotificationUtils.decodeActions(rule.actions);
|
||||||
|
|
||||||
if (!decoded) {
|
if (!decoded) {
|
||||||
|
@ -81,10 +80,10 @@ export class PushRuleVectorState {
|
||||||
let stateKind = null;
|
let stateKind = null;
|
||||||
switch (tweaks) {
|
switch (tweaks) {
|
||||||
case 0:
|
case 0:
|
||||||
stateKind = PushRuleVectorState.ON;
|
stateKind = State.On;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
stateKind = PushRuleVectorState.LOUD;
|
stateKind = State.Loud;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return stateKind;
|
return stateKind;
|
|
@ -15,8 +15,6 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
import {NotificationUtils} from "./NotificationUtils";
|
import {NotificationUtils} from "./NotificationUtils";
|
||||||
|
|
||||||
const encodeActions = NotificationUtils.encodeActions;
|
const encodeActions = NotificationUtils.encodeActions;
|
111
src/notifications/types.ts
Normal file
111
src/notifications/types.ts
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 The Matrix.org Foundation C.I.C.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export enum NotificationSetting {
|
||||||
|
AllMessages = "all_messages", // .m.rule.message = notify
|
||||||
|
DirectMessagesMentionsKeywords = "dm_mentions_keywords", // .m.rule.message = mark_unread. This is the new default.
|
||||||
|
MentionsKeywordsOnly = "mentions_keywords", // .m.rule.message = mark_unread; .m.rule.room_one_to_one = mark_unread
|
||||||
|
Never = "never", // .m.rule.master = enabled (dont_notify)
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ISoundTweak {
|
||||||
|
set_tweak: "sound";
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
export interface IHighlightTweak {
|
||||||
|
set_tweak: "highlight";
|
||||||
|
value?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Tweak = ISoundTweak | IHighlightTweak;
|
||||||
|
|
||||||
|
export enum Actions {
|
||||||
|
Notify = "notify",
|
||||||
|
DontNotify = "dont_notify", // no-op
|
||||||
|
Coalesce = "coalesce", // unused
|
||||||
|
MarkUnread = "mark_unread", // new
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Action = Actions | Tweak;
|
||||||
|
|
||||||
|
// Push rule kinds in descending priority order
|
||||||
|
export enum Kind {
|
||||||
|
Override = "override",
|
||||||
|
ContentSpecific = "content",
|
||||||
|
RoomSpecific = "room",
|
||||||
|
SenderSpecific = "sender",
|
||||||
|
Underride = "underride",
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IEventMatchCondition {
|
||||||
|
kind: "event_match";
|
||||||
|
key: string;
|
||||||
|
pattern: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IContainsDisplayNameCondition {
|
||||||
|
kind: "contains_display_name";
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IRoomMemberCountCondition {
|
||||||
|
kind: "room_member_count";
|
||||||
|
is: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ISenderNotificationPermissionCondition {
|
||||||
|
kind: "sender_notification_permission";
|
||||||
|
key: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Condition =
|
||||||
|
IEventMatchCondition |
|
||||||
|
IContainsDisplayNameCondition |
|
||||||
|
IRoomMemberCountCondition |
|
||||||
|
ISenderNotificationPermissionCondition;
|
||||||
|
|
||||||
|
export enum RuleIds {
|
||||||
|
MasterRule = ".m.rule.master", // The master rule (all notifications disabling)
|
||||||
|
MessageRule = ".m.rule.message",
|
||||||
|
EncryptedMessageRule = ".m.rule.encrypted",
|
||||||
|
RoomOneToOneRule = ".m.rule.room_one_to_one",
|
||||||
|
EncryptedRoomOneToOneRule = ".m.rule.room_one_to_one",
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IPushRule {
|
||||||
|
enabled: boolean;
|
||||||
|
rule_id: RuleIds | string;
|
||||||
|
actions: Action[];
|
||||||
|
default: boolean;
|
||||||
|
conditions?: Condition[]; // only applicable to `underride` and `override` rules
|
||||||
|
pattern?: string; // only applicable to `content` rules
|
||||||
|
}
|
||||||
|
|
||||||
|
// push rule extended with kind, used by ContentRules and js-sdk's pushprocessor
|
||||||
|
export interface IExtendedPushRule extends IPushRule {
|
||||||
|
kind: Kind;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IPushRuleSet {
|
||||||
|
override: IPushRule[];
|
||||||
|
content: IPushRule[];
|
||||||
|
room: IPushRule[];
|
||||||
|
sender: IPushRule[];
|
||||||
|
underride: IPushRule[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IRuleSets {
|
||||||
|
global: IPushRuleSet;
|
||||||
|
}
|
|
@ -192,7 +192,7 @@ export const SETTINGS = {
|
||||||
},
|
},
|
||||||
// TODO: Wire up appropriately to UI (FTUE notifications)
|
// TODO: Wire up appropriately to UI (FTUE notifications)
|
||||||
"Notifications.alwaysShowBadgeCounts": {
|
"Notifications.alwaysShowBadgeCounts": {
|
||||||
supportedLevels: ['account'],
|
supportedLevels: LEVELS_ROOM_OR_ACCOUNT,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
"useCompactLayout": {
|
"useCompactLayout": {
|
||||||
|
|
|
@ -24,14 +24,12 @@ import GenericToast from "../components/views/toasts/GenericToast";
|
||||||
import ToastStore from "../stores/ToastStore";
|
import ToastStore from "../stores/ToastStore";
|
||||||
|
|
||||||
const onAccept = () => {
|
const onAccept = () => {
|
||||||
console.log("DEBUG onAccept AnalyticsToast");
|
|
||||||
dis.dispatch({
|
dis.dispatch({
|
||||||
action: 'accept_cookies',
|
action: 'accept_cookies',
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const onReject = () => {
|
const onReject = () => {
|
||||||
console.log("DEBUG onReject AnalyticsToast");
|
|
||||||
dis.dispatch({
|
dis.dispatch({
|
||||||
action: "reject_cookies",
|
action: "reject_cookies",
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue