/* Copyright 2024 New Vector Ltd. Copyright 2020 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ import React, { ReactNode, useState } from "react"; import { UpdateCheckStatus } from "../../../BasePlatform"; import PlatformPeg from "../../../PlatformPeg"; import { useDispatcher } from "../../../hooks/useDispatcher"; import dis from "../../../dispatcher/dispatcher"; import { Action } from "../../../dispatcher/actions"; import { _t } from "../../../languageHandler"; import InlineSpinner from "../../../components/views/elements/InlineSpinner"; import AccessibleButton from "../../../components/views/elements/AccessibleButton"; import { CheckUpdatesPayload } from "../../../dispatcher/payloads/CheckUpdatesPayload"; function installUpdate(): void { PlatformPeg.get()?.installUpdate(); } function getStatusText(status: UpdateCheckStatus, errorDetail?: string): ReactNode { switch (status) { case UpdateCheckStatus.Error: return _t("update|error_encountered", { errorDetail }); case UpdateCheckStatus.Checking: return _t("update|checking"); case UpdateCheckStatus.NotAvailable: return _t("update|no_update"); case UpdateCheckStatus.Downloading: return _t("update|downloading"); case UpdateCheckStatus.Ready: return _t( "update|new_version_available", {}, { a: (sub) => ( {sub} ), }, ); } } const doneStatuses = [UpdateCheckStatus.Ready, UpdateCheckStatus.Error, UpdateCheckStatus.NotAvailable]; const UpdateCheckButton: React.FC = () => { const [state, setState] = useState(null); const onCheckForUpdateClick = (): void => { setState(null); PlatformPeg.get()?.startUpdateCheck(); }; useDispatcher(dis, ({ action, ...params }) => { if (action === Action.CheckUpdates) { setState(params as CheckUpdatesPayload); } }); const busy = !!state && !doneStatuses.includes(state.status); let suffix: JSX.Element | undefined; if (state) { suffix = ( {getStatusText(state.status, state.detail)} {busy && } ); } return ( {_t("update|check_action")} {suffix} ); }; export default UpdateCheckButton;