Don't show the prompt to enable desktop notifications immediately after registration (#8274)
* Fix MatrixClientPeg.userRegisteredWithinLastHours so that it works * Try fixing end-to-end test + add case for New search beta * Remove end-to-end test case for Search beta toast as it only shows up after 5 minutes * Revert to localStorage based solution + non-inverted logic + test including time advancement
This commit is contained in:
parent
d151365fd7
commit
26b771bbf9
4 changed files with 74 additions and 14 deletions
|
@ -875,8 +875,9 @@ async function clearStorage(opts?: { deleteEverything?: boolean }): Promise<void
|
||||||
Analytics.disable();
|
Analytics.disable();
|
||||||
|
|
||||||
if (window.localStorage) {
|
if (window.localStorage) {
|
||||||
// try to save any 3pid invites from being obliterated
|
// try to save any 3pid invites from being obliterated and registration time
|
||||||
const pendingInvites = ThreepidInviteStore.instance.getWireInvites();
|
const pendingInvites = ThreepidInviteStore.instance.getWireInvites();
|
||||||
|
const registrationTime = window.localStorage.getItem("mx_registration_time");
|
||||||
|
|
||||||
window.localStorage.clear();
|
window.localStorage.clear();
|
||||||
|
|
||||||
|
@ -886,13 +887,17 @@ async function clearStorage(opts?: { deleteEverything?: boolean }): Promise<void
|
||||||
logger.error("idbDelete failed for account:mx_access_token", e);
|
logger.error("idbDelete failed for account:mx_access_token", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// now restore those invites
|
// now restore those invites and registration time
|
||||||
if (!opts?.deleteEverything) {
|
if (!opts?.deleteEverything) {
|
||||||
pendingInvites.forEach(i => {
|
pendingInvites.forEach(i => {
|
||||||
const roomId = i.roomId;
|
const roomId = i.roomId;
|
||||||
delete i.roomId; // delete to avoid confusing the store
|
delete i.roomId; // delete to avoid confusing the store
|
||||||
ThreepidInviteStore.instance.storeInvite(roomId, i);
|
ThreepidInviteStore.instance.storeInvite(roomId, i);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (registrationTime) {
|
||||||
|
window.localStorage.setItem("mx_registration_time", registrationTime);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ class MatrixClientPegClass implements IMatrixClientPeg {
|
||||||
};
|
};
|
||||||
|
|
||||||
private matrixClient: MatrixClient = null;
|
private matrixClient: MatrixClient = null;
|
||||||
private justRegisteredUserId: string;
|
private justRegisteredUserId: string | null = null;
|
||||||
|
|
||||||
// the credentials used to init the current client object.
|
// the credentials used to init the current client object.
|
||||||
// used if we tear it down & recreate it with a different store
|
// used if we tear it down & recreate it with a different store
|
||||||
|
@ -136,7 +136,7 @@ class MatrixClientPegClass implements IMatrixClientPeg {
|
||||||
MatrixActionCreators.stop();
|
MatrixActionCreators.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
public setJustRegisteredUserId(uid: string): void {
|
public setJustRegisteredUserId(uid: string | null): void {
|
||||||
this.justRegisteredUserId = uid;
|
this.justRegisteredUserId = uid;
|
||||||
if (uid) {
|
if (uid) {
|
||||||
window.localStorage.setItem("mx_registration_time", String(new Date().getTime()));
|
window.localStorage.setItem("mx_registration_time", String(new Date().getTime()));
|
||||||
|
@ -151,9 +151,14 @@ class MatrixClientPegClass implements IMatrixClientPeg {
|
||||||
}
|
}
|
||||||
|
|
||||||
public userRegisteredWithinLastHours(hours: number): boolean {
|
public userRegisteredWithinLastHours(hours: number): boolean {
|
||||||
|
if (hours <= 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const date = new Date(window.localStorage.getItem("mx_registration_time"));
|
const registrationTime = parseInt(window.localStorage.getItem("mx_registration_time"));
|
||||||
return ((new Date().getTime() - date.getTime()) / 36e5) <= hours;
|
const diff = Date.now() - registrationTime;
|
||||||
|
return (diff / 36e5) <= hours;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
58
test/MatrixClientPeg-test.ts
Normal file
58
test/MatrixClientPeg-test.ts
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
Copyright 2022 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { advanceDateAndTime, stubClient } from "./test-utils";
|
||||||
|
import { MatrixClientPeg as peg } from "../src/MatrixClientPeg";
|
||||||
|
|
||||||
|
describe("MatrixClientPeg", () => {
|
||||||
|
afterEach(() => {
|
||||||
|
localStorage.clear();
|
||||||
|
advanceDateAndTime(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("setJustRegisteredUserId", () => {
|
||||||
|
stubClient();
|
||||||
|
(peg as any).matrixClient = peg.get();
|
||||||
|
peg.setJustRegisteredUserId("@userId:matrix.rog");
|
||||||
|
expect(peg.get().credentials.userId).toBe("@userId:matrix.rog");
|
||||||
|
expect(peg.currentUserIsJustRegistered()).toBe(true);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(0)).toBe(false);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(1)).toBe(true);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(24)).toBe(true);
|
||||||
|
advanceDateAndTime(1 * 60 * 60 * 1000);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(0)).toBe(false);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(1)).toBe(false);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(24)).toBe(true);
|
||||||
|
advanceDateAndTime(24 * 60 * 60 * 1000);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(0)).toBe(false);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(1)).toBe(false);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(24)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("setJustRegisteredUserId(null)", () => {
|
||||||
|
stubClient();
|
||||||
|
(peg as any).matrixClient = peg.get();
|
||||||
|
peg.setJustRegisteredUserId(null);
|
||||||
|
expect(peg.currentUserIsJustRegistered()).toBe(false);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(0)).toBe(false);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(1)).toBe(false);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(24)).toBe(false);
|
||||||
|
advanceDateAndTime(1 * 60 * 60 * 1000);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(0)).toBe(false);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(1)).toBe(false);
|
||||||
|
expect(peg.userRegisteredWithinLastHours(24)).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
|
@ -21,10 +21,6 @@ export async function toastScenarios(alice: ElementSession, bob: ElementSession)
|
||||||
console.log(" checking and clearing toasts:");
|
console.log(" checking and clearing toasts:");
|
||||||
|
|
||||||
alice.log.startGroup(`clears toasts`);
|
alice.log.startGroup(`clears toasts`);
|
||||||
alice.log.step(`reject desktop notifications toast`);
|
|
||||||
await rejectToast(alice, "Notifications");
|
|
||||||
alice.log.done();
|
|
||||||
|
|
||||||
alice.log.step(`accepts analytics toast`);
|
alice.log.step(`accepts analytics toast`);
|
||||||
await acceptToast(alice, "Help improve Element");
|
await acceptToast(alice, "Help improve Element");
|
||||||
alice.log.done();
|
alice.log.done();
|
||||||
|
@ -35,10 +31,6 @@ export async function toastScenarios(alice: ElementSession, bob: ElementSession)
|
||||||
alice.log.endGroup();
|
alice.log.endGroup();
|
||||||
|
|
||||||
bob.log.startGroup(`clears toasts`);
|
bob.log.startGroup(`clears toasts`);
|
||||||
bob.log.step(`reject desktop notifications toast`);
|
|
||||||
await rejectToast(bob, "Notifications");
|
|
||||||
bob.log.done();
|
|
||||||
|
|
||||||
bob.log.step(`reject analytics toast`);
|
bob.log.step(`reject analytics toast`);
|
||||||
await rejectToast(bob, "Help improve Element");
|
await rejectToast(bob, "Help improve Element");
|
||||||
bob.log.done();
|
bob.log.done();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue