/* Copyright 2024 New Vector Ltd. Copyright 2019-2023 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 } from "react"; import { logger } from "matrix-js-sdk/src/logger"; import AccessibleButton from "../../../elements/AccessibleButton"; import { _t } from "../../../../../languageHandler"; import SdkConfig from "../../../../../SdkConfig"; import Modal from "../../../../../Modal"; import PlatformPeg from "../../../../../PlatformPeg"; import UpdateCheckButton from "../../UpdateCheckButton"; import BugReportDialog from "../../../dialogs/BugReportDialog"; import CopyableText from "../../../elements/CopyableText"; import SettingsTab from "../SettingsTab"; import { SettingsSection } from "../../shared/SettingsSection"; import { SettingsSubsection, SettingsSubsectionText } from "../../shared/SettingsSubsection"; import ExternalLink from "../../../elements/ExternalLink"; import MatrixClientContext from "../../../../../contexts/MatrixClientContext"; interface IProps {} interface IState { appVersion: string | null; canUpdate: boolean; } export default class HelpUserSettingsTab extends React.Component { public static contextType = MatrixClientContext; declare public context: React.ContextType; public constructor(props: IProps, context: React.ContextType) { super(props, context); this.state = { appVersion: null, canUpdate: false, }; } public componentDidMount(): void { PlatformPeg.get() ?.getAppVersion() .then((ver) => this.setState({ appVersion: ver })) .catch((e) => { logger.error("Error getting vector version: ", e); }); PlatformPeg.get() ?.canSelfUpdate() .then((v) => this.setState({ canUpdate: v })) .catch((e) => { logger.error("Error getting self updatability: ", e); }); } private getVersionInfo(): { appVersion: string; cryptoVersion: string } { const brand = SdkConfig.get().brand; const appVersion = this.state.appVersion || "unknown"; const cryptoVersion = this.context.getCrypto()?.getVersion() ?? ""; return { appVersion: `${_t("setting|help_about|brand_version", { brand })} ${appVersion}`, cryptoVersion: `${_t("setting|help_about|crypto_version")} ${cryptoVersion}`, }; } private onClearCacheAndReload = (): void => { if (!PlatformPeg.get()) return; // Dev note: please keep this log line, it's useful when troubleshooting a MatrixClient suddenly // stopping in the middle of the logs. logger.log("Clear cache & reload clicked"); this.context.stopClient(); this.context.store.deleteAllData().then(() => { PlatformPeg.get()?.reload(); }); }; private onBugReport = (): void => { Modal.createDialog(BugReportDialog, {}); }; private renderLegal(): ReactNode { const tocLinks = SdkConfig.get().terms_and_conditions_links; if (!tocLinks) return null; const legalLinks: JSX.Element[] = []; for (const tocEntry of tocLinks) { legalLinks.push(
{tocEntry.text}
, ); } return ( {legalLinks} ); } private renderCredits(): JSX.Element { // Note: This is not translated because it is legal text. // Also,   is ugly but necessary. return (
  • {_t( "credits|default_cover_photo", {}, { photo: (sub) => ( {sub} ), author: (sub) => ( {sub} ), terms: (sub) => ( {sub} ), }, )}
  • {_t( "credits|twemoji_colr", {}, { colr: (sub) => ( {sub} ), author: (sub) => {sub}, terms: (sub) => ( {sub} ), }, )}
  • {_t( "credits|twemoji", {}, { twemoji: (sub) => ( {sub} ), author: (sub) => ( {sub} ), terms: (sub) => ( {sub} ), }, )}
); } private getVersionTextToCopy = (): string => { const { appVersion, cryptoVersion } = this.getVersionInfo(); return `${appVersion}\n${cryptoVersion}`; }; public render(): React.ReactNode { const brand = SdkConfig.get().brand; const faqText = _t( "setting|help_about|help_link", { brand, }, { a: (sub) => {sub}, }, ); let updateButton: JSX.Element | undefined; if (this.state.canUpdate) { updateButton = ; } let bugReportingSection; if (SdkConfig.get().bug_report_endpoint_url) { bugReportingSection = ( {_t("bug_reporting|introduction")} {_t("bug_reporting|description")} } > {_t("bug_reporting|submit_debug_logs")} {_t( "bug_reporting|matrix_security_issue", {}, { a: (sub) => ( {sub} ), }, )} ); } const { appVersion, cryptoVersion } = this.getVersionInfo(); return ( {bugReportingSection} {appVersion}
{cryptoVersion}
{updateButton}
{this.renderLegal()} {this.renderCredits()} {_t( "setting|help_about|homeserver", { homeserverUrl: this.context.getHomeserverUrl(), }, { code: (sub) => {sub}, }, )} {this.context.getIdentityServerUrl() && ( {_t( "setting|help_about|identity_server", { identityServerUrl: this.context.getIdentityServerUrl(), }, { code: (sub) => {sub}, }, )} )}
{_t("common|access_token")} {_t("setting|help_about|access_token_detail")} this.context.getAccessToken()}> {this.context.getAccessToken()}
{_t("setting|help_about|clear_cache_reload")}
); } }