2018-11-23 15:23:41 -08:00
// @flow
2019-01-12 10:02:34 -08:00
import React , { PureComponent } from 'react' ;
import styled from 'styled-components' ;
2018-11-23 15:23:41 -08:00
2019-01-12 10:02:34 -08:00
import { Button } from '../components/button' ;
import { ConfirmDialogComponent } from '../components/confirm-dialog' ;
import { TextComponent } from '../components/text' ;
import { InputComponent } from '../components/input' ;
2019-01-12 11:30:44 -08:00
import { InputLabelComponent } from '../components/input-label' ;
import { RowComponent } from '../components/row' ;
import { Clipboard } from '../components/clipboard' ;
2018-11-23 15:23:41 -08:00
2019-01-12 10:02:34 -08:00
import rpc from '../../services/api' ;
const Wrapper = styled . div `
margin - top : $ { props => props . theme . layoutContentPaddingTop } ;
` ;
const ModalContent = styled . div `
padding : 20 px ;
width : 100 % ;
2019-01-12 11:30:44 -08:00
max - height : 600 px ;
overflow - y : auto ;
p {
word - break : break - all ;
}
` ;
const Btn = styled ( Button ) `
margin - bottom : 10 px ;
2019-01-12 10:02:34 -08:00
` ;
2019-01-12 11:30:44 -08:00
const ClipboardButton = styled ( Clipboard ) `
width : 50 px ;
border - radius : $ { props => props . theme . boxBorderRadius } ;
height : 45 px ;
margin - left : 5 px ;
` ;
type Key = {
2019-01-12 10:02:34 -08:00
zAddress : string ,
key : string ,
} ;
type Props = {
addresses : string [ ] ,
} ;
type State = {
2019-01-12 11:30:44 -08:00
viewKeys : Key [ ] ,
privateKeys : Key [ ] ,
2019-01-12 10:02:34 -08:00
isLoading : boolean ,
successExportViewKeys : boolean ,
2019-01-12 11:30:44 -08:00
successExportPrivateKeys : boolean ,
2019-01-12 10:02:34 -08:00
} ;
export class SettingsView extends PureComponent < Props , State > {
state = {
viewKeys : [ ] ,
2019-01-12 11:30:44 -08:00
privateKeys : [ ] ,
2019-01-12 10:02:34 -08:00
isLoading : false ,
successExportViewKeys : false ,
2019-01-12 11:30:44 -08:00
successExportPrivateKeys : false ,
2019-01-12 10:02:34 -08:00
} ;
exportViewKeys = ( ) => {
const { addresses } = this . props ;
const zAddresses = addresses . filter ( addr => addr . startsWith ( 'z' ) ) ;
2019-01-12 11:30:44 -08:00
this . setState ( { isLoading : true } ) ;
2019-01-12 10:02:34 -08:00
Promise . all (
zAddresses . map ( async ( zAddr ) => {
const viewKey = await rpc . z _exportviewingkey ( zAddr ) ;
return { zAddress : zAddr , key : viewKey } ;
} ) ,
) . then ( ( viewKeys ) => {
this . setState ( {
viewKeys ,
successExportViewKeys : true ,
2019-01-12 11:30:44 -08:00
isLoading : false ,
2019-01-12 10:02:34 -08:00
} ) ;
} ) ;
} ;
2019-01-12 11:30:44 -08:00
exportPrivateKeys = ( ) => {
const { addresses } = this . props ;
const zAddresses = addresses . filter ( addr => addr . startsWith ( 'z' ) ) ;
this . setState ( { isLoading : true } ) ;
Promise . all (
zAddresses . map ( async ( zAddr ) => {
const privateKey = await rpc . z _exportkey ( zAddr ) ;
return { zAddress : zAddr , key : privateKey } ;
} ) ,
) . then ( ( privateKeys ) => {
this . setState ( {
privateKeys ,
successExportPrivateKeys : true ,
isLoading : false ,
} ) ;
} ) ;
2019-01-12 10:02:34 -08:00
} ;
render = ( ) => {
const {
2019-01-12 11:30:44 -08:00
viewKeys ,
isLoading ,
successExportViewKeys ,
privateKeys ,
successExportPrivateKeys ,
2019-01-12 10:02:34 -08:00
} = this . state ;
return (
< Wrapper >
2019-01-12 11:30:44 -08:00
< ConfirmDialogComponent
title = 'Export view keys'
2019-01-12 10:02:34 -08:00
renderTrigger = { toggleVisibility => (
2019-01-12 11:30:44 -08:00
< Btn label = 'Export view keys' onClick = { toggleVisibility } / >
2019-01-12 10:02:34 -08:00
) }
2019-01-12 11:30:44 -08:00
onConfirm = { this . exportViewKeys }
showButtons = { ! successExportViewKeys }
width = { 750 }
2019-01-12 10:02:34 -08:00
>
2019-01-12 11:30:44 -08:00
< ModalContent >
{ successExportViewKeys ? (
viewKeys . map ( ( { zAddress , key } ) => (
< >
< InputLabelComponent value = { zAddress } / >
< RowComponent alignItems = 'center' >
2019-01-12 10:02:34 -08:00
< InputComponent
2019-01-12 11:30:44 -08:00
value = { key }
2019-01-12 10:02:34 -08:00
onFocus = { ( event ) => {
event . currentTarget . select ( ) ;
} }
/ >
2019-01-12 11:30:44 -08:00
< ClipboardButton text = { key } / >
< / R o w C o m p o n e n t >
< / >
) )
) : (
< TextComponent
value = {
isLoading
? 'Loading...'
: 'Ut id vulputate arcu. Curabitur mattis aliquam magna sollicitudin vulputate. Morbi tempus bibendum porttitor. Quisque dictum ac ipsum a luctus. Donec et lacus ac erat consectetur molestie a id erat.'
}
/ >
) }
< / M o d a l C o n t e n t >
< / C o n f i r m D i a l o g C o m p o n e n t >
< ConfirmDialogComponent
title = 'Export private keys'
renderTrigger = { toggleVisibility => (
< Btn label = 'Export private keys' onClick = { toggleVisibility } / >
2019-01-12 10:02:34 -08:00
) }
2019-01-12 11:30:44 -08:00
onConfirm = { this . exportPrivateKeys }
showButtons = { ! successExportPrivateKeys }
width = { 750 }
>
< ModalContent >
{ successExportPrivateKeys ? (
privateKeys . map ( ( { zAddress , key } ) => (
< >
< InputLabelComponent value = { zAddress } / >
< RowComponent alignItems = 'center' >
< InputComponent
value = { key }
onFocus = { ( event ) => {
event . currentTarget . select ( ) ;
} }
/ >
< ClipboardButton text = { key } / >
< / R o w C o m p o n e n t >
< / >
) )
) : (
< TextComponent
value = {
isLoading
? 'Loading...'
: 'Ut id vulputate arcu. Curabitur mattis aliquam magna sollicitudin vulputate. Morbi tempus bibendum porttitor. Quisque dictum ac ipsum a luctus. Donec et lacus ac erat consectetur molestie a id erat.'
}
/ >
) }
< / M o d a l C o n t e n t >
< / C o n f i r m D i a l o g C o m p o n e n t >
2019-01-12 10:02:34 -08:00
< / W r a p p e r >
) ;
} ;
}