Browse Source

Reduce code repetion in settings

all-modes^2
Miika Turunen 8 years ago
parent
commit
fc0af4fc88
  1. 132
      react/src/components/dashboard/settings/settings.appInfoPanel.js
  2. 113
      react/src/components/dashboard/settings/settings.js
  3. 86
      react/src/components/dashboard/settings/settings.panel.js
  4. 85
      react/src/components/dashboard/settings/settings.panelBody.js
  5. 48
      react/src/components/dashboard/settings/settings.panelUtils.js
  6. 260
      react/src/components/dashboard/settings/settings.render.js
  7. 4
      react/src/components/dashboard/settings/settings.walletInfoPanel.js

132
react/src/components/dashboard/settings/settings.appInfoPanel.js

@ -8,76 +8,82 @@ class AppInfoPanel extends React.Component {
}
render() {
return (
<div className="panel-body">
<div className="col-sm-12 padding-top-15">
<div className="row">
<h5>{ translate('SETTINGS.APP_RELEASE') }</h5>
<div>
{ translate('SETTINGS.NAME') }: { this.props.Settings.appInfo.releaseInfo.name }
</div>
<div>
{ translate('SETTINGS.VERSION') }: { `${this.props.Settings.appInfo.releaseInfo.version.replace('version=', '')}-beta` }
</div>
<div>
{ translate('SETTINGS.APP_SESSION') }: { this.props.Settings.appInfo.appSession }
const releaseInfo = this.props.Settings.appInfo && this.props.Settings.appInfo.releaseInfo;
if (!releaseInfo) {
return null
} else {
return (
<div className="panel-body">
<div className="col-sm-12 padding-top-15">
<div className="row">
<h5>{ translate('SETTINGS.APP_RELEASE') }</h5>
<div>
{ translate('SETTINGS.NAME') }: { this.props.Settings.appInfo.releaseInfo.name }
</div>
<div>
{ translate('SETTINGS.VERSION') }: { `${this.props.Settings.appInfo.releaseInfo.version.replace('version=', '')}-beta` }
</div>
<div>
{ translate('SETTINGS.APP_SESSION') }: { this.props.Settings.appInfo.appSession }
</div>
</div>
</div>
</div>
<div className="col-sm-12 padding-top-20">
<div className="row">
<h5>{ translate('SETTINGS.SYS_INFO') }</h5>
<div>
{ translate('SETTINGS.ARCH') }: { this.props.Settings.appInfo.sysInfo.arch }
</div>
<div>
{ translate('SETTINGS.OS_TYPE') }: { this.props.Settings.appInfo.sysInfo.os_type }
</div>
<div>
{ translate('SETTINGS.OS_PLATFORM') }: { this.props.Settings.appInfo.sysInfo.platform }
</div>
<div>
{ translate('SETTINGS.OS_RELEASE') }: { this.props.Settings.appInfo.sysInfo.os_release }
</div>
<div>
{ translate('SETTINGS.CPU') }: { this.props.Settings.appInfo.sysInfo.cpu }
</div>
<div>
{ translate('SETTINGS.CPU_CORES') }: { this.props.Settings.appInfo.sysInfo.cpu_cores }
</div>
<div>
{ translate('SETTINGS.MEM') }: { this.props.Settings.appInfo.sysInfo.totalmem_readable }
<div className="col-sm-12 padding-top-20">
<div className="row">
<h5>{ translate('SETTINGS.SYS_INFO') }</h5>
<div>
{ translate('SETTINGS.ARCH') }: { this.props.Settings.appInfo.sysInfo.arch }
</div>
<div>
{ translate('SETTINGS.OS_TYPE') }: { this.props.Settings.appInfo.sysInfo.os_type }
</div>
<div>
{ translate('SETTINGS.OS_PLATFORM') }: { this.props.Settings.appInfo.sysInfo.platform }
</div>
<div>
{ translate('SETTINGS.OS_RELEASE') }: { this.props.Settings.appInfo.sysInfo.os_release }
</div>
<div>
{ translate('SETTINGS.CPU') }: { this.props.Settings.appInfo.sysInfo.cpu }
</div>
<div>
{ translate('SETTINGS.CPU_CORES') }: { this.props.Settings.appInfo.sysInfo.cpu_cores }
</div>
<div>
{ translate('SETTINGS.MEM') }: { this.props.Settings.appInfo.sysInfo.totalmem_readable }
</div>
</div>
</div>
</div>
<div className="col-sm-12 padding-top-20">
<div className="row">
<h5>{ translate('SETTINGS.LOCATIONS') }</h5>
<div>
{ translate('SETTINGS.CACHE') }: { this.props.Settings.appInfo.dirs.cacheLocation }
</div>
<div>
{ translate('SETTINGS.CONFIG') }: { this.props.Settings.appInfo.dirs.configLocation }
</div>
<div>
Iguana { translate('SETTINGS.BIN') }: { this.props.Settings.appInfo.dirs.iguanaBin }
</div>
<div>
Iguana { translate('SETTINGS.DIR') }: { this.props.Settings.appInfo.dirs.iguanaDir }
</div>
<div>
Komodo { translate('SETTINGS.BIN') }: { this.props.Settings.appInfo.dirs.komododBin }
</div>
<div>
Komodo { translate('SETTINGS.DIR') }: { this.props.Settings.appInfo.dirs.komodoDir }
</div>
<div>
Komodo wallet.dat: { this.props.Settings.appInfo.dirs.komodoDir }
<div className="col-sm-12 padding-top-20">
<div className="row">
<h5>{ translate('SETTINGS.LOCATIONS') }</h5>
<div>
{ translate('SETTINGS.CACHE') }: { this.props.Settings.appInfo.dirs.cacheLocation }
</div>
<div>
{ translate('SETTINGS.CONFIG') }: { this.props.Settings.appInfo.dirs.configLocation }
</div>
<div>
Iguana { translate('SETTINGS.BIN') }: { this.props.Settings.appInfo.dirs.iguanaBin }
</div>
<div>
Iguana { translate('SETTINGS.DIR') }: { this.props.Settings.appInfo.dirs.iguanaDir }
</div>
<div>
Komodo { translate('SETTINGS.BIN') }: { this.props.Settings.appInfo.dirs.komododBin }
</div>
<div>
Komodo { translate('SETTINGS.DIR') }: { this.props.Settings.appInfo.dirs.komodoDir }
</div>
<div>
Komodo wallet.dat: { this.props.Settings.appInfo.dirs.komodoDir }
</div>
</div>
</div>
</div>
</div>
);
);
}
};
}

113
react/src/components/dashboard/settings/settings.js

@ -1,15 +1,10 @@
import React from 'react';
import { connect } from 'react-redux';
import { translate } from '../../../translate/translate';
import Config from '../../../config';
import {
iguanaActiveHandle,
getAppConfig,
getPeersList,
addPeerNode,
getAppInfo,
shepherdCli,
triggerToaster,
} from '../../../actions/actionCreators';
import Store from '../../../store';
@ -17,19 +12,6 @@ import {
SettingsRender,
} from './settings.render';
import AppUpdatePanel from './settings.appUpdatePanel';
import AppInfoPanel from './settings.appInfoPanel';
import AddNodePanel from './settings.addNodePanel';
import AppSettingsPanel from './settings.appSettingsPanel';
import CliPanel from './settings.cliPanel';
import DebugLogPanel from './settings.debugLogPanel';
import FiatCurrencyPanel from './settings.fiatCurrencyPanel';
import ExportKeysPanel from './settings.exportKeysPanel';
import ImportKeysPanel from './settings.importKeysPanel';
import SupportPanel from './settings.supportPanel';
import WalletInfoPanel from './settings.walletInfoPanel';
import WalletBackupPanel from './settings.walletBackupPanel';
/*
TODO:
1) pre-select active coin in add node tab
@ -38,105 +20,20 @@ import WalletBackupPanel from './settings.walletBackupPanel';
4) batch export/import wallet addresses
*/
class Settings extends React.Component {
constructor() {
super();
this.state = {
activeTab: 0,
tabElId: null,
seedInputVisibility: false,
nativeOnly: Config.iguanaLessMode,
disableWalletSpecificUI: false,
};
this.updateInput = this.updateInput.bind(this);
constructor(props) {
super(props);
}
componentDidMount(props) {
if (!this.props.disableWalletSpecificUI) {
Store.dispatch(iguanaActiveHandle());
}
Store.dispatch(getAppConfig());
Store.dispatch(getAppInfo());
document.getElementById('section-iguana-wallet-settings').setAttribute('style', 'height:auto; min-height: 100%');
}
componentWillReceiveProps(props) {
if (this.state.tabElId) {
this.setState(Object.assign({}, this.state, {
activeTab: this.state.activeTab,
tabElId: this.state.tabElId,
disableWalletSpecificUI: this.props.disableWalletSpecificUI,
}));
}
}
openTab(elemId, tab) {
this.setState(Object.assign({}, this.state, {
activeTab: tab,
tabElId: elemId,
}));
}
updateInput(e) {
this.setState({
[e.target.name]: e.target.value,
});
}
renderAppInfoTab() {
const releaseInfo = this.props.Settings.appInfo && this.props.Settings.appInfo.releaseInfo;
if (releaseInfo) {
return <AppInfoPanel />
}
return null;
}
renderAppUpdateTab() {
return <AppUpdatePanel />
}
renderWalletInfo() {
return <WalletInfoPanel />
}
renderAddNode() {
return <AddNodePanel />
}
renderWalletBackup() {
return <WalletBackupPanel />
}
renderFiatCurrency() {
return <FiatCurrencyPanel />
}
renderExportKeys() {
return <ExportKeysPanel />
}
renderImportKeys() {
return <ImportKeysPanel />
}
renderDebugLog() {
return <DebugLogPanel />
}
renderAppSettings() {
return <AppSettingsPanel />
}
renderCliPanel() {
return <CliPanel />
}
renderSupportPanel() {
return <SupportPanel />
}
render() {
return SettingsRender.call(this);
}
@ -146,13 +43,7 @@ const mapStateToProps = (state) => {
return {
Main: {
coins: state.Main.coins,
activeHandle: state.Main.activeHandle,
},
ActiveCoin: {
coin: state.ActiveCoin.coin,
},
Settings: state.Settings,
Dashboard: state.Dashboard,
};
};

86
react/src/components/dashboard/settings/settings.panel.js

@ -0,0 +1,86 @@
import React from 'react';
import className from 'classnames';
import * as Utils from './settings.panelUtils';
class Panel extends React.Component {
constructor(props) {
super(props);
this.toggleSection = this.toggleSection.bind(this);
this.state = {
singleOpen: this.props.singleOpen,
openByDefault: this.props.openByDefault,
activeSections: [],
};
}
componentWillMount() {
const {
singleOpen,
openByDefault,
uniqId,
children } = this.props;
const settings = {
singleOpen,
openByDefault,
uniqId,
kids: children
};
const initialStateSections = Utils.setupAccordion(settings).activeSections;
this.setState({ activeSections: initialStateSections });
}
getChildrenWithProps() {
const {
children,
} = this.props;
const kids = React.Children.map(children, (child, i) => {
if(child) {
const unqId = `panel-sec-${i}`;
return React.cloneElement(child, {
toggle: (acId) => this.toggleSection(acId),
key: unqId,
unq: unqId,
active: (this.state.activeSections && this.state.activeSections.lastIndexOf(unqId) !== -1)
});
}
});
return kids;
}
toggleSection(sectionId) {
const newActive = Utils.toggleSection(
sectionId,
this.state.activeSections,
this.state.singleOpen);
this.setState({
activeSections: newActive
});
}
render() {
const {
className: propClasses,
uniqId: propId
} = this.props;
const childrenWithProps = this.getChildrenWithProps();
const accordionClasses = className('panel-group', propClasses);
const uniqId = propId || '';
return(
<div className={accordionClasses} id={uniqId}>
{childrenWithProps}
</div>
);
}
}
export default Panel;

85
react/src/components/dashboard/settings/settings.panelBody.js

@ -0,0 +1,85 @@
import React from 'react';
import className from 'classnames';
class PanelSection extends React.Component {
constructor(props) {
super(props);
this.state = {
sectionHeight: 0,
}
this.toggleSection = this.toggleSection.bind(this);
}
componentDidMount() {
const { active } = this.props;
if (active) this.setState({sectionHeight: this.accordionContent.scrollHeight});
}
componentWillReceiveProps(nextProps) {
if(this.props.active) {
this.setState({
sectionHeight: 'auto',
});
}
if (nextProps.active !== this.props.active) {
this.toggleOpen(nextProps.active);
}
}
getHeight() {
const { active } = this.props;
return (active) ? this.accordionContent.scrollHeight : 0;
}
toggleSection() {
const {
unq,
toggle
} = this.props;
toggle(unq);
}
toggleOpen(active) {
const height = (active) ? `${this.accordionContent.scrollHeight}px` : 0;
this.setState({
sectionHeight: height,
});
}
render() {
const {
title,
icon,
children,
active,
className: propClasses
} = this.props;
const contentStyles = {
height: this.state.sectionHeight,
overflow: 'hidden',
transition: 'height .25s ease',
};
const contentClasses = className('panel-collapse', {
active
});
return(
<div className="panel" onClick={() => this.toggleSection()}>
<div className="panel-heading">
<a className='panel-title'>
<i className={icon}></i> {title}
</a>
</div>
<div className={contentClasses} style={contentStyles} ref={(ref) => this.accordionContent = ref}>
<div className="panel-body">
{children}
</div>
</div>
</div>
);
}
}
export default PanelSection;

48
react/src/components/dashboard/settings/settings.panelUtils.js

@ -0,0 +1,48 @@
export function checkUndef(item) {
return (typeof item !== 'undefined');
}
export function toggleSection(sectionId, activeSections, singleOpen) {
let present = null;
let newActiveSections = activeSections;
newActiveSections.map((section) => {
if (section === sectionId) present = true;
return true;
});
if (!singleOpen) {
if (present) {
const pos = newActiveSections.indexOf(sectionId);
newActiveSections.splice(pos, 1);
} else {
newActiveSections.push(sectionId);
}
} else {
newActiveSections = [sectionId];
}
return newActiveSections;
}
export function setupAccordion(info) {
const singleOpen = (checkUndef(info.singleOpen)) ? info.singleOpen : false;
const activeSections = [];
const singleChild = typeof info.kids.length === 'undefined';
if (!singleChild) {
info.kids.forEach((child, i) => {
const { openByDefault } = child ? child.props : false;
if (singleOpen && activeSections.length === 0 && openByDefault) {
activeSections.push(`panel-sec-${i}`);
}
if (!singleOpen && openByDefault) {
activeSections.push(`panel-sec-${i}`);
}
});
}
return {
activeSections,
};
}

260
react/src/components/dashboard/settings/settings.render.js

@ -1,5 +1,20 @@
import React from 'react';
import { translate } from '../../../translate/translate';
import PanelSection from './settings.panelBody';
import Panel from './settings.panel';
import AppUpdatePanel from './settings.appUpdatePanel';
import AppInfoPanel from './settings.appInfoPanel';
import AddNodePanel from './settings.addNodePanel';
import AppSettingsPanel from './settings.appSettingsPanel';
import CliPanel from './settings.cliPanel';
import DebugLogPanel from './settings.debugLogPanel';
import FiatCurrencyPanel from './settings.fiatCurrencyPanel';
import ExportKeysPanel from './settings.exportKeysPanel';
import ImportKeysPanel from './settings.importKeysPanel';
import SupportPanel from './settings.supportPanel';
import WalletInfoPanel from './settings.walletInfoPanel';
import WalletBackupPanel from './settings.walletBackupPanel';
export const SettingsRender = function() {
return (
@ -12,199 +27,86 @@ export const SettingsRender = function() {
<div className="row">
<div className="col-xlg-12 col-md-12">
<h4 className="font-size-14 text-uppercase">{ translate('INDEX.WALLET_SETTINGS') }</h4>
<div
className="panel-group"
id="SettingsAccordion">
<Panel
uniqId={'SettingsAccordion'}
singleOpen={true}>
{ !this.props.disableWalletSpecificUI &&
<div
id="WalletInfo"
onClick={ () => this.openTab('WalletInfo', 0) }
className={ 'panel' + (this.state.nativeOnly ? ' hide' : '') }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 0 ? '' : ' collapsed') }>
<i className="icon md-balance-wallet"></i>{ translate('INDEX.WALLET_INFO') }
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 0 ? ' in' : '') }>
{ this.renderWalletInfo() }
</div>
</div>
<PanelSection
title={ translate('INDEX.WALLET_INFO') }
icon="icon md-balance-wallet"
openByDefault={!this.props.disableWalletSpecificUI}>
<WalletInfoPanel />
</PanelSection>
}
{ !this.props.disableWalletSpecificUI &&
<div
id="AddNodeforCoin"
onClick={ () => this.openTab('AddNodeforCoin', 1) }
className={ 'panel' + (this.state.nativeOnly ? ' hide' : '') }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 1 ? '' : ' collapsed') }>
<i className="icon md-plus-square"></i>{ translate('INDEX.ADD_NODE') }
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 1 ? ' in' : '') }>
{ this.renderAddNode() }
</div>
</div>
<PanelSection
title={ translate('INDEX.ADD_NODE') }
icon="icon md-plus-square">
<AddNodePanel />
</PanelSection>
}
{ !this.props.disableWalletSpecificUI &&
<div
id="DumpWallet"
onClick={ () => this.openTab('DumpWallet', 2) }
className={ 'hide panel' + (this.state.nativeOnly ? ' hide' : '') }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 2 ? '' : ' collapsed') }>
<i className="icon wb-briefcase"></i>{ translate('INDEX.WALLET_BACKUP') }
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 2 ? ' in' : '') }>
{ this.renderWalletBackup() }
</div>
</div>
<PanelSection
title={ translate('INDEX.WALLET_BACKUP') }
icon="icon wb-briefcase">
<WalletBackupPanel />
</PanelSection>
}
{ !this.props.disableWalletSpecificUI &&
<div
id="FiatCurrencySettings"
onClick={ () => this.openTab('FiatCurrencySettings', 3) }
className={ 'hide panel' + (this.state.nativeOnly ? ' hide' : '') }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 3 ? '' : ' collapsed') }>
<i className="icon fa-money"></i>{ translate('INDEX.FIAT_CURRENCY') }
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 3 ? ' in' : '') }>
{ this.renderFiatCurrency() }
</div>
</div>
<PanelSection
title={ translate('INDEX.WALLET_BACKUP') }
icon="icon fa-money">
<FiatCurrencyPanel />
</PanelSection>
}
{ !this.props.disableWalletSpecificUI &&
<div
id="ExportKeys"
onClick={ () => this.openTab('ExportKeys', 4) }
className={ 'panel' + (this.state.nativeOnly ? ' hide' : '') }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 4 ? '' : ' collapsed') }>
<i className="icon md-key"></i>{ translate('INDEX.EXPORT_KEYS') }
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 4 ? ' in' : '') }>
{ this.renderExportKeys() }
</div>
</div>
<PanelSection
title={ translate('INDEX.EXPORT_KEYS') }
icon="icon md-key">
<ExportKeysPanel />
</PanelSection>
}
{ !this.props.disableWalletSpecificUI &&
<div
id="ImportKeys"
onClick={ () => this.openTab('ImportKeys', 5) }
className={ 'panel' + (this.state.nativeOnly ? ' hide' : '') }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 5 ? '' : ' collapsed') }>
<i className="icon md-key"></i>{ translate('INDEX.IMPORT_KEYS') }
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 5 ? ' in' : '') }>
{ this.renderImportKeys() }
</div>
</div>
<PanelSection
title={ translate('INDEX.IMPORT_KEYS') }
icon="icon md-key">
<ImportKeysPanel />
</PanelSection>
}
<div
className="panel"
id="DebugLog"
onClick={ () => this.openTab('DebugLog', 6) }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 6 ? '' : ' collapsed') }>
<i className="icon fa-bug"></i>{ translate('INDEX.DEBUG_LOG') }
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 6 ? ' in' : '') }>
{ this.renderDebugLog() }
</div>
</div>
<div
className="panel"
id="AppSettings"
onClick={ () => this.openTab('AppSettings', 7) }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 7 ? '' : ' collapsed') }>
<i className="icon fa-wrench"></i>{ translate('SETTINGS.APP_CONFIG') } (config.json)
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 7 ? ' in' : '') }>
{ this.renderAppSettings() }
</div>
</div>
<div
className="panel"
id="AppInfo"
onClick={ () => this.openTab('AppInfo', 8) }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 8 ? '' : ' collapsed') }>
<i className="icon md-info"></i>{ translate('SETTINGS.APP_INFO') }
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 8 ? ' in' : '') }>
{ this.renderAppInfoTab() }
</div>
</div>
<PanelSection
title={ translate('INDEX.DEBUG_LOG') }
icon="icon fa-bug"
openByDefault={this.props.disableWalletSpecificUI}>
<DebugLogPanel />
</PanelSection>
<PanelSection
title={ translate('SETTINGS.APP_CONFIG') + ' (config.json)' }
icon="icon fa-bug">
<AppSettingsPanel />
</PanelSection>
<PanelSection
title={ translate('SETTINGS.APP_INFO') }
icon="icon md-info">
<AppInfoPanel />
</PanelSection>
{ this.props.Main && this.props.Main.coins.native &&
<div
id="Cli"
onClick={ () => this.openTab('Cli', 9) }
className={ 'panel' + (!this.props.Main.coins.native.length ? ' hide' : '') }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 9 ? '' : ' collapsed') }>
<i className="icon fa-code"></i> CLI
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 9 ? ' in' : '') }>
{ this.renderCliPanel() }
</div>
</div>
<PanelSection
title="CLI"
icon="icon fa-code">
<CliPanel />
</PanelSection>
}
<div
className="panel"
id="AppUpdate"
onClick={ () => this.openTab('AppUpdate', 10) }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 10 ? '' : ' collapsed') }>
<i className="icon fa fa-cloud-download"></i> { translate('INDEX.UPDATE') }
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 10 ? ' in' : '') }>
{ this.renderAppUpdateTab() }
</div>
</div>
<div
className="panel"
id="Support"
onClick={ () => this.openTab('Support', 11) }>
<div className="panel-heading">
<a className={ 'panel-title' + (this.state.activeTab === 11 ? '' : ' collapsed') }>
<i className="icon fa fa-life-ring"></i> Support
</a>
</div>
<div
className={ 'panel-collapse collapse' + (this.state.activeTab === 11 ? ' in' : '') }>
{ this.renderSupportPanel() }
</div>
</div>
</div>
<PanelSection
title={ translate('INDEX.UPDATE') }
icon="icon fa fa-cloud-download">
<AppUpdatePanel />
</PanelSection>
<PanelSection
title="Support"
icon="icon fa fa-life-ring">
<SupportPanel />
</PanelSection>
</Panel>
</div>
</div>
</div>

4
react/src/components/dashboard/settings/settings.walletInfoPanel.js

@ -9,8 +9,7 @@ class WalletInfoPanel extends React.Component {
render() {
return (
<div className="panel-body">
<table className="table">
<table className="table">
<thead>
<tr>
<th width="10%">{ translate('INDEX.KEY') }</th>
@ -44,7 +43,6 @@ class WalletInfoPanel extends React.Component {
</tr>
</tbody>
</table>
</div>
);
};
}

Loading…
Cancel
Save