From f45c584c8a1993d045373e047bb1af300f14f18d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 29 May 2020 19:13:59 +0100 Subject: [PATCH 1/2] Correct the GenericToast props to show the two modes of operation Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/@types/common.ts | 19 +++++++++++++++++++ src/components/views/toasts/GenericToast.tsx | 10 +++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 src/@types/common.ts diff --git a/src/@types/common.ts b/src/@types/common.ts new file mode 100644 index 0000000000..26e5317aa3 --- /dev/null +++ b/src/@types/common.ts @@ -0,0 +1,19 @@ +/* +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. +*/ + +// Based on https://stackoverflow.com/a/53229857/3532235 +export type Without = {[P in Exclude] ? : never} +export type XOR = (T | U) extends object ? (Without & U) | (Without & T) : T | U; diff --git a/src/components/views/toasts/GenericToast.tsx b/src/components/views/toasts/GenericToast.tsx index 9d69330857..ea12641948 100644 --- a/src/components/views/toasts/GenericToast.tsx +++ b/src/components/views/toasts/GenericToast.tsx @@ -17,17 +17,21 @@ limitations under the License. import React, {ReactChild} from "react"; import FormButton from "../elements/FormButton"; +import {XOR} from "../../../@types/common"; interface IProps { description: ReactChild; acceptLabel: string; - rejectLabel?: string; onAccept(); - onReject?(); } -const GenericToast: React.FC = ({description, acceptLabel, rejectLabel, onAccept, onReject}) => { +interface IPropsExtended extends IProps { + rejectLabel: string; + onReject(); +} + +const GenericToast: React.FC> = ({description, acceptLabel, rejectLabel, onAccept, onReject}) => { return
{ description } From 9431393bdaa107be1505a698963ac79eba25e917 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 29 May 2020 19:59:47 +0100 Subject: [PATCH 2/2] Allow deferring of Update Toast until the next morning Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/BasePlatform.ts | 36 +++++++++++++++++++ .../views/settings/UpdateCheckButton.tsx | 2 -- src/toasts/UpdateToast.tsx | 6 ++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/BasePlatform.ts b/src/BasePlatform.ts index 0465b434d0..c5f58f7f0c 100644 --- a/src/BasePlatform.ts +++ b/src/BasePlatform.ts @@ -23,6 +23,7 @@ import BaseEventIndexManager from './indexing/BaseEventIndexManager'; import {ActionPayload} from "./dispatcher/payloads"; import {CheckUpdatesPayload} from "./dispatcher/payloads/CheckUpdatesPayload"; import {Action} from "./dispatcher/actions"; +import {hideToast as hideUpdateToast} from "./toasts/UpdateToast"; export enum UpdateCheckStatus { Checking = "CHECKING", @@ -32,6 +33,8 @@ export enum UpdateCheckStatus { Ready = "READY", } +const UPDATE_DEFER_KEY = "mx_defer_update"; + /** * Base class for classes that provide platform-specific functionality * eg. Setting an application badge or displaying notifications @@ -74,12 +77,45 @@ export default abstract class BasePlatform { } startUpdateCheck() { + hideUpdateToast(); + localStorage.removeItem(UPDATE_DEFER_KEY); dis.dispatch({ action: Action.CheckUpdates, status: UpdateCheckStatus.Checking, }); } + /** + * Update the currently running app to the latest available version + * and replace this instance of the app with the new version. + */ + installUpdate() { + } + + /** + * Check if the version update has been deferred and that deferment is still in effect + * @param newVersion the version string to check + */ + protected shouldShowUpdate(newVersion: string): boolean { + try { + const [version, deferUntil] = JSON.parse(localStorage.getItem(UPDATE_DEFER_KEY)); + return newVersion !== version || Date.now() > deferUntil; + } catch (e) { + return true; + } + } + + /** + * Ignore the pending update and don't prompt about this version + * until the next morning (8am). + */ + deferUpdate(newVersion: string) { + const date = new Date(Date.now() + 24 * 60 * 60 * 1000); + date.setHours(8, 0, 0, 0); // set to next 8am + localStorage.setItem(UPDATE_DEFER_KEY, JSON.stringify([newVersion, date.getTime()])); + hideUpdateToast(); + } + /** * Returns true if the platform supports displaying * notifications, otherwise false. diff --git a/src/components/views/settings/UpdateCheckButton.tsx b/src/components/views/settings/UpdateCheckButton.tsx index 3f7c11dfc8..10e0e29f31 100644 --- a/src/components/views/settings/UpdateCheckButton.tsx +++ b/src/components/views/settings/UpdateCheckButton.tsx @@ -18,7 +18,6 @@ import React, {useState} from "react"; import {UpdateCheckStatus} from "../../../BasePlatform"; import PlatformPeg from "../../../PlatformPeg"; -import {hideToast as hideUpdateToast} from "../../../toasts/UpdateToast"; import {useDispatcher} from "../../../hooks/useDispatcher"; import dis from "../../../dispatcher/dispatcher"; import {Action} from "../../../dispatcher/actions"; @@ -60,7 +59,6 @@ const UpdateCheckButton = () => { const onCheckForUpdateClick = () => { setState(null); PlatformPeg.get().startUpdateCheck(); - hideUpdateToast(); }; useDispatcher(dis, ({action, ...params}) => { diff --git a/src/toasts/UpdateToast.tsx b/src/toasts/UpdateToast.tsx index 3d4b55a4ff..7a8d3671db 100644 --- a/src/toasts/UpdateToast.tsx +++ b/src/toasts/UpdateToast.tsx @@ -40,6 +40,10 @@ function installUpdate() { } export const showToast = (version: string, newVersion: string, releaseNotes?: string) => { + function onReject() { + PlatformPeg.get().deferUpdate(newVersion); + } + let onAccept; let acceptLabel = _t("What's new?"); if (releaseNotes) { @@ -79,6 +83,8 @@ export const showToast = (version: string, newVersion: string, releaseNotes?: st description: _t("A new version of Riot is available!"), acceptLabel, onAccept, + rejectLabel: _t("Later"), + onReject, }, component: GenericToast, priority: 20,