Merge pull request #6227 from SimonBrandner/feature/copy-version/17603

This commit is contained in:
Michael Telatynski 2021-08-06 12:56:38 +01:00 committed by GitHub
commit 381108a9c2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 61 additions and 32 deletions

View file

@ -28,28 +28,32 @@ limitations under the License.
user-select: all; user-select: all;
} }
.mx_HelpUserSettingsTab_accessToken { .mx_HelpUserSettingsTab_copy {
display: flex; display: flex;
justify-content: space-between;
border-radius: 5px; border-radius: 5px;
border: solid 1px $light-fg-color; border: solid 1px $light-fg-color;
margin-bottom: 10px; margin-bottom: 10px;
margin-top: 10px; margin-top: 10px;
padding: 10px; padding: 10px;
} width: max-content;
.mx_HelpUserSettingsTab_accessToken_copy { .mx_HelpUserSettingsTab_copyButton {
flex-shrink: 0; flex-shrink: 0;
cursor: pointer;
margin-left: 20px;
display: inherit;
}
.mx_HelpUserSettingsTab_accessToken_copy > div {
mask-image: url($copy-button-url);
background-color: $message-action-bar-fg-color;
margin-left: 5px;
width: 20px; width: 20px;
height: 20px; height: 20px;
cursor: pointer;
margin-left: 20px;
display: block;
&::before {
content: "";
mask-image: url($copy-button-url);
background-color: $message-action-bar-fg-color;
width: 20px;
height: 20px;
display: block;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
}
}

View file

@ -15,9 +15,9 @@ limitations under the License.
*/ */
import React from 'react'; import React from 'react';
import AccessibleButton, { ButtonEvent } from "../../../elements/AccessibleButton";
import { _t, getCurrentLanguage } from "../../../../../languageHandler"; import { _t, getCurrentLanguage } from "../../../../../languageHandler";
import { MatrixClientPeg } from "../../../../../MatrixClientPeg"; import { MatrixClientPeg } from "../../../../../MatrixClientPeg";
import AccessibleButton from "../../../elements/AccessibleButton";
import AccessibleTooltipButton from '../../../elements/AccessibleTooltipButton'; import AccessibleTooltipButton from '../../../elements/AccessibleTooltipButton';
import SdkConfig from "../../../../../SdkConfig"; import SdkConfig from "../../../../../SdkConfig";
import createRoom from "../../../../../createRoom"; import createRoom from "../../../../../createRoom";
@ -69,6 +69,18 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
if (this.closeCopiedTooltip) this.closeCopiedTooltip(); if (this.closeCopiedTooltip) this.closeCopiedTooltip();
} }
private getVersionInfo(): { appVersion: string, olmVersion: string } {
const brand = SdkConfig.get().brand;
const appVersion = this.state.appVersion || 'unknown';
let olmVersion = MatrixClientPeg.get().olmVersion;
olmVersion = olmVersion ? `${olmVersion[0]}.${olmVersion[1]}.${olmVersion[2]}` : '<not-enabled>';
return {
appVersion: `${_t("%(brand)s version:", { brand })} ${appVersion}`,
olmVersion: `${_t("Olm version:")} ${olmVersion}`,
};
}
private onClearCacheAndReload = (e) => { private onClearCacheAndReload = (e) => {
if (!PlatformPeg.get()) return; if (!PlatformPeg.get()) return;
@ -173,17 +185,26 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
); );
} }
onAccessTokenCopyClick = async (e) => { private async copy(text: string, e: ButtonEvent) {
e.preventDefault(); e.preventDefault();
const target = e.target; // copy target before we go async and React throws it away const target = e.target as HTMLDivElement; // copy target before we go async and React throws it away
const successful = await copyPlaintext(MatrixClientPeg.get().getAccessToken()); const successful = await copyPlaintext(text);
const buttonRect = target.getBoundingClientRect(); const buttonRect = target.getBoundingClientRect();
const { close } = ContextMenu.createMenu(GenericTextContextMenu, { const { close } = ContextMenu.createMenu(GenericTextContextMenu, {
...toRightOf(buttonRect, 2), ...toRightOf(buttonRect, 2),
message: successful ? _t('Copied!') : _t('Failed to copy'), message: successful ? _t('Copied!') : _t('Failed to copy'),
}); });
this.closeCopiedTooltip = target.onmouseleave = close; this.closeCopiedTooltip = target.onmouseleave = close;
}
private onAccessTokenCopyClick = (e: ButtonEvent) => {
this.copy(MatrixClientPeg.get().getAccessToken(), e);
};
private onCopyVersionClicked = (e: ButtonEvent) => {
const { appVersion, olmVersion } = this.getVersionInfo();
this.copy(`${appVersion}\n${olmVersion}`, e);
}; };
render() { render() {
@ -232,11 +253,6 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
); );
} }
const appVersion = this.state.appVersion || 'unknown';
let olmVersion = MatrixClientPeg.get().olmVersion;
olmVersion = olmVersion ? `${olmVersion[0]}.${olmVersion[1]}.${olmVersion[2]}` : '<not-enabled>';
let updateButton = null; let updateButton = null;
if (this.state.canUpdate) { if (this.state.canUpdate) {
updateButton = <UpdateCheckButton />; updateButton = <UpdateCheckButton />;
@ -275,6 +291,8 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
); );
} }
const { appVersion, olmVersion } = this.getVersionInfo();
return ( return (
<div className="mx_SettingsTab mx_HelpUserSettingsTab"> <div className="mx_SettingsTab mx_HelpUserSettingsTab">
<div className="mx_SettingsTab_heading">{ _t("Help & About") }</div> <div className="mx_SettingsTab_heading">{ _t("Help & About") }</div>
@ -291,8 +309,15 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
<div className='mx_SettingsTab_section mx_HelpUserSettingsTab_versions'> <div className='mx_SettingsTab_section mx_HelpUserSettingsTab_versions'>
<span className='mx_SettingsTab_subheading'>{ _t("Versions") }</span> <span className='mx_SettingsTab_subheading'>{ _t("Versions") }</span>
<div className='mx_SettingsTab_subsectionText'> <div className='mx_SettingsTab_subsectionText'>
{ _t("%(brand)s version:", { brand }) } { appVersion }<br /> <div className="mx_HelpUserSettingsTab_copy">
{ _t("olm version:") } { olmVersion }<br /> { appVersion }<br />
{ olmVersion }<br />
<AccessibleTooltipButton
title={_t("Copy")}
onClick={this.onCopyVersionClicked}
className="mx_HelpUserSettingsTab_copyButton"
/>
</div>
{ updateButton } { updateButton }
</div> </div>
</div> </div>
@ -308,12 +333,12 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
<summary>{ _t("Access Token") }</summary><br /> <summary>{ _t("Access Token") }</summary><br />
<b>{ _t("Your access token gives full access to your account." <b>{ _t("Your access token gives full access to your account."
+ " Do not share it with anyone." ) }</b> + " Do not share it with anyone." ) }</b>
<div className="mx_HelpUserSettingsTab_accessToken"> <div className="mx_HelpUserSettingsTab_copy">
<code>{ MatrixClientPeg.get().getAccessToken() }</code> <code>{ MatrixClientPeg.get().getAccessToken() }</code>
<AccessibleTooltipButton <AccessibleTooltipButton
title={_t("Copy")} title={_t("Copy")}
onClick={this.onAccessTokenCopyClick} onClick={this.onAccessTokenCopyClick}
className="mx_HelpUserSettingsTab_accessToken_copy" className="mx_HelpUserSettingsTab_copyButton"
/> />
</div> </div>
</details><br /> </details><br />

View file

@ -1276,6 +1276,8 @@
"Deactivate Account": "Deactivate Account", "Deactivate Account": "Deactivate Account",
"Deactivate account": "Deactivate account", "Deactivate account": "Deactivate account",
"Discovery": "Discovery", "Discovery": "Discovery",
"%(brand)s version:": "%(brand)s version:",
"Olm version:": "Olm version:",
"Legal": "Legal", "Legal": "Legal",
"Credits": "Credits", "Credits": "Credits",
"For help with using %(brand)s, click <a>here</a>.": "For help with using %(brand)s, click <a>here</a>.", "For help with using %(brand)s, click <a>here</a>.": "For help with using %(brand)s, click <a>here</a>.",
@ -1289,13 +1291,11 @@
"FAQ": "FAQ", "FAQ": "FAQ",
"Keyboard Shortcuts": "Keyboard Shortcuts", "Keyboard Shortcuts": "Keyboard Shortcuts",
"Versions": "Versions", "Versions": "Versions",
"%(brand)s version:": "%(brand)s version:", "Copy": "Copy",
"olm version:": "olm version:",
"Homeserver is": "Homeserver is", "Homeserver is": "Homeserver is",
"Identity server is": "Identity server is", "Identity server is": "Identity server is",
"Access Token": "Access Token", "Access Token": "Access Token",
"Your access token gives full access to your account. Do not share it with anyone.": "Your access token gives full access to your account. Do not share it with anyone.", "Your access token gives full access to your account. Do not share it with anyone.": "Your access token gives full access to your account. Do not share it with anyone.",
"Copy": "Copy",
"Clear cache and reload": "Clear cache and reload", "Clear cache and reload": "Clear cache and reload",
"Labs": "Labs", "Labs": "Labs",
"Feeling experimental? Labs are the best way to get things early, test out new features and help shape them before they actually launch. <a>Learn more</a>.": "Feeling experimental? Labs are the best way to get things early, test out new features and help shape them before they actually launch. <a>Learn more</a>.", "Feeling experimental? Labs are the best way to get things early, test out new features and help shape them before they actually launch. <a>Learn more</a>.": "Feeling experimental? Labs are the best way to get things early, test out new features and help shape them before they actually launch. <a>Learn more</a>.",