Device manager - device details section (#9169)

* add device metadata table

* test devicedetails

* handle missing last activity metadata

* remove debugs

* revert tile style changes

* fuss with indentation

* code formatting
This commit is contained in:
Kerry 2022-08-11 11:13:17 +02:00 committed by GitHub
parent 988cd335db
commit 09aade2907
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 371 additions and 5 deletions

View file

@ -17,6 +17,7 @@ limitations under the License.
import React from 'react';
import { IMyDevice } from 'matrix-js-sdk/src/client';
import { logger } from "matrix-js-sdk/src/logger";
import classNames from 'classnames';
import { _t } from '../../../languageHandler';
import { MatrixClientPeg } from '../../../MatrixClientPeg';
@ -113,8 +114,6 @@ export default class DevicesPanelEntry extends React.Component<IProps, IState> {
};
public render(): JSX.Element {
const myDeviceClass = this.props.isOwnDevice ? " mx_DevicesPanel_myDevice" : '';
let iconClass = '';
let verifyButton: JSX.Element;
if (this.props.verified !== null) {
@ -160,7 +159,7 @@ export default class DevicesPanelEntry extends React.Component<IProps, IState> {
};
if (this.props.isOwnDevice) {
return <div className={"mx_DevicesPanel_device" + myDeviceClass}>
return <div className={classNames("mx_DevicesPanel_device", "mx_DevicesPanel_myDevice")}>
<div className="mx_DevicesPanel_deviceTrust">
<span className={"mx_DevicesPanel_icon mx_E2EIcon " + iconClass} />
</div>
@ -171,7 +170,7 @@ export default class DevicesPanelEntry extends React.Component<IProps, IState> {
}
return (
<div className={"mx_DevicesPanel_device" + myDeviceClass}>
<div className="mx_DevicesPanel_device">
<SelectableDeviceTile device={deviceWithVerification} onClick={this.onDeviceToggled} isSelected={this.props.selected}>
{ buttons }
</SelectableDeviceTile>

View file

@ -0,0 +1,79 @@
/*
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 React from 'react';
import { IMyDevice } from 'matrix-js-sdk/src/matrix';
import { formatDate } from '../../../../DateUtils';
import { _t } from '../../../../languageHandler';
import Heading from '../../typography/Heading';
interface Props {
device: IMyDevice;
}
interface MetadataTable {
heading?: string;
values: { label: string, value?: string | React.ReactNode }[];
}
const DeviceDetails: React.FC<Props> = ({ device }) => {
const metadata: MetadataTable[] = [
{
values: [
{ label: _t('Session ID'), value: device.device_id },
{
label: _t('Last activity'),
value: device.last_seen_ts && formatDate(new Date(device.last_seen_ts)),
},
],
},
{
heading: _t('Device'),
values: [
{ label: _t('IP address'), value: device.last_seen_ip },
],
},
];
return <div className='mx_DeviceDetails'>
<section className='mx_DeviceDetails_section'>
<Heading size='h3'>{ device.display_name ?? device.device_id }</Heading>
</section>
<section className='mx_DeviceDetails_section'>
<p className='mx_DeviceDetails_sectionHeading'>{ _t('Session details') }</p>
{ metadata.map(({ heading, values }, index) => <table
className='mxDeviceDetails_metadataTable'
key={index}
>
{ heading &&
<thead>
<tr><th>{ heading }</th></tr>
</thead>
}
<tbody>
{ values.map(({ label, value }) => <tr key={label}>
<td className='mxDeviceDetails_metadataLabel'>{ label }</td>
<td className='mxDeviceDetails_metadataValue'>{ value }</td>
</tr>) }
</tbody>
</table>,
) }
</section>
</div>;
};
export default DeviceDetails;

View file

@ -1692,7 +1692,11 @@
"Sign out devices|other": "Sign out devices",
"Sign out devices|one": "Sign out device",
"Authentication": "Authentication",
"Session ID": "Session ID",
"Last activity": "Last activity",
"Device": "Device",
"IP address": "IP address",
"Session details": "Session details",
"Verified": "Verified",
"Unverified": "Unverified",
"Unable to remove contact information": "Unable to remove contact information",
@ -2720,7 +2724,6 @@
"Confirm by comparing the following with the User Settings in your other session:": "Confirm by comparing the following with the User Settings in your other session:",
"Confirm this user's session by comparing the following with their User Settings:": "Confirm this user's session by comparing the following with their User Settings:",
"Session name": "Session name",
"Session ID": "Session ID",
"Session key": "Session key",
"If they don't match, the security of your communication may be compromised.": "If they don't match, the security of your communication may be compromised.",
"Verify session": "Verify session",