2018-01-07 05:20:45 +00:00
// Copyright (c) 2014-2018, The Monero Project
2015-04-01 08:56:05 +00:00
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2014-07-07 17:08:30 +00:00
import QtQuick 2.0
2017-03-08 20:39:12 +00:00
import QtQuick . Layouts 1.1
2019-02-01 18:53:01 +00:00
import QtQuick . Dialogs 1.2
2018-12-12 21:31:24 +00:00
import "../components" as MoneroComponents
2019-02-01 18:53:01 +00:00
import "../js/TxUtils.js" as TxUtils
2016-12-10 01:01:04 +00:00
import moneroComponents . AddressBook 1.0
import moneroComponents . AddressBookModel 1.0
2018-12-12 21:31:24 +00:00
import moneroComponents . Clipboard 1.0
2019-02-24 21:25:11 +00:00
import moneroComponents . NetworkType 1.0
2014-07-07 17:08:30 +00:00
2019-01-15 16:48:22 +00:00
ColumnLayout {
2016-12-10 01:01:04 +00:00
id: root
property var model
2019-01-15 16:48:22 +00:00
property bool selectAndSend: false
2018-12-12 21:31:24 +00:00
Clipboard { id: clipboard }
2014-07-09 14:18:48 +00:00
2017-08-08 09:18:15 +00:00
ColumnLayout {
2019-01-15 16:48:22 +00:00
Layout.margins: ( isMobile ? 17 : 20 ) * scaleRatio
Layout.topMargin: 40 * scaleRatio
Layout.fillWidth: true
2017-12-08 23:01:10 +00:00
spacing: 26 * scaleRatio
2019-01-15 16:48:22 +00:00
visible: ! root . selectAndSend
2014-07-16 08:24:59 +00:00
2018-12-12 21:31:24 +00:00
MoneroComponents . LineEditMulti {
id: addressLine
Layout.fillWidth: true
fontBold: true
labelText: qsTr ( "Address" ) + translationManager . emptyString
2019-02-24 21:25:11 +00:00
placeholderText: {
switch ( persistentSettings . nettype ) {
case NetworkType.MAINNET:
return "4.. / 8.. / OpenAlias" ;
case NetworkType.STAGENET:
return "5.. / 7.." ;
case NetworkType.TESTNET:
return "9.. / B.." ;
default:
break ;
}
}
2018-12-12 21:31:24 +00:00
wrapMode: Text . WrapAnywhere
addressValidation: true
2019-02-01 18:53:01 +00:00
pasteButton: true
onPaste: function ( clipboardText ) {
const parsed = walletManager . parse_uri_to_object ( clipboardText ) ;
if ( ! parsed . error ) {
addressLine . text = parsed . address ;
setPaymentId ( parsed . payment_id ) ;
setDescription ( parsed . tx_description ) ;
} else {
addressLine . text = clipboardText ;
}
}
2018-12-12 21:31:24 +00:00
inlineButton.icon: "../images/qr.png"
inlineButton.buttonColor: MoneroComponents . Style . orange
inlineButton.onClicked: {
cameraUi . state = "Capture"
cameraUi . qrcode_decoded . connect ( updateFromQrCode )
2017-08-08 09:18:15 +00:00
}
2018-12-12 21:31:24 +00:00
inlineButtonVisible : appWindow . qrScannerEnabled && ! addressLine . text
2017-08-08 09:18:15 +00:00
}
2014-07-16 08:24:59 +00:00
2019-02-01 18:53:01 +00:00
MoneroComponents . StandardButton {
id: resolveButton
text: qsTr ( "Resolve" ) + translationManager . emptyString
visible: TxUtils . isValidOpenAliasAddress ( addressLine . text )
enabled : visible
onClicked: {
var result = walletManager . resolveOpenAlias ( addressLine . text )
if ( result ) {
var parts = result . split ( "|" )
if ( parts . length === 2 ) {
var address_ok = walletManager . addressValid ( parts [ 1 ] , appWindow . persistentSettings . nettype )
if ( parts [ 0 ] === "true" ) {
if ( address_ok ) {
// prepend openalias to description
descriptionLine . text = descriptionLine . text ? addressLine . text + " " + descriptionLine.text : addressLine . text
addressLine . text = parts [ 1 ]
}
else
oa_message ( qsTr ( "No valid address found at this OpenAlias address" ) )
}
else if ( parts [ 0 ] === "false" ) {
if ( address_ok ) {
addressLine . text = parts [ 1 ]
oa_message ( qsTr ( "Address found, but the DNSSEC signatures could not be verified, so this address may be spoofed" ) )
}
else
{
oa_message ( qsTr ( "No valid address found at this OpenAlias address, but the DNSSEC signatures could not be verified, so this may be spoofed" ) )
}
}
else {
oa_message ( qsTr ( "Internal error" ) )
}
}
else {
oa_message ( qsTr ( "Internal error" ) )
}
}
else {
oa_message ( qsTr ( "No address found" ) )
}
}
}
2018-12-12 21:31:24 +00:00
MoneroComponents . LineEditMulti {
2017-08-08 09:18:15 +00:00
id: paymentIdLine
2018-12-27 18:12:40 +00:00
visible: appWindow . persistentSettings . showPid
2018-12-12 21:31:24 +00:00
Layout.fillWidth: true
2017-12-06 21:52:36 +00:00
labelText: qsTr ( "Payment ID <font size='2'>(Optional)</font>" ) + translationManager . emptyString
2017-08-08 09:18:15 +00:00
placeholderText: qsTr ( "Paste 64 hexadecimal characters" ) + translationManager . emptyString
2018-12-04 18:56:21 +00:00
wrapMode: Text . WrapAnywhere
2017-12-06 21:52:36 +00:00
// tipText: qsTr("<b>Payment ID</b><br/><br/>A unique user name used in<br/>the address book. It is not a<br/>transfer of information sent<br/>during the transfer")
// + translationManager.emptyString
2017-08-08 09:18:15 +00:00
}
2016-12-10 01:01:04 +00:00
2018-12-12 21:31:24 +00:00
MoneroComponents . LineEditMulti {
2017-08-08 09:18:15 +00:00
id: descriptionLine
2018-12-12 21:31:24 +00:00
Layout.fillWidth: true
2017-12-06 21:52:36 +00:00
labelText: qsTr ( "Description <font size='2'>(Optional)</font>" ) + translationManager . emptyString
2017-08-08 09:18:15 +00:00
placeholderText: qsTr ( "Give this entry a name or description" ) + translationManager . emptyString
2018-12-04 18:56:21 +00:00
wrapMode: Text . WrapAnywhere
2017-08-08 09:18:15 +00:00
}
2017-03-08 20:39:12 +00:00
2017-08-08 09:18:15 +00:00
RowLayout {
id: addButton
Layout.bottomMargin: 17 * scaleRatio
2018-12-12 21:31:24 +00:00
MoneroComponents . StandardButton {
2017-08-08 09:18:15 +00:00
text: qsTr ( "Add" ) + translationManager . emptyString
2018-03-05 16:19:45 +00:00
enabled: checkInformation ( addressLine . text , paymentIdLine . text , appWindow . persistentSettings . nettype )
2017-08-08 09:18:15 +00:00
onClicked: {
if ( ! currentWallet . addressBook . addRow ( addressLine . text . trim ( ) , paymentIdLine . text . trim ( ) , descriptionLine . text ) ) {
informationPopup . title = qsTr ( "Error" ) + translationManager . emptyString ;
// TODO: check currentWallet.addressBook.errorString() instead.
if ( currentWallet . addressBook . errorCode ( ) === AddressBook . Invalid_Address )
informationPopup . text = qsTr ( "Invalid address" ) + translationManager . emptyString
else if ( currentWallet . addressBook . errorCode ( ) === AddressBook . Invalid_Payment_Id )
informationPopup . text = currentWallet . addressBook . errorString ( )
else
informationPopup . text = qsTr ( "Can't create entry" ) + translationManager . emptyString
informationPopup . onCloseCallback = null
informationPopup . open ( ) ;
} else {
2018-12-18 19:06:29 +00:00
clearFields ( ) ;
2017-08-08 09:18:15 +00:00
}
2017-03-08 20:39:12 +00:00
}
2016-12-10 01:01:04 +00:00
}
}
2014-07-16 14:48:17 +00:00
}
2014-07-16 08:24:59 +00:00
Rectangle {
2014-07-16 14:48:17 +00:00
id: tableRect
2019-01-15 16:48:22 +00:00
Layout.leftMargin: ( isMobile ? 17 : 40 ) * scaleRatio
Layout.rightMargin: ( isMobile ? 17 : 40 ) * scaleRatio
Layout.topMargin: ( root . selectAndSend ? 40 : 0 ) * scaleRatio
Layout.fillHeight: true
Layout.fillWidth: true
2017-12-06 21:52:36 +00:00
color: "transparent"
2014-07-16 08:24:59 +00:00
2014-07-16 14:48:17 +00:00
Behavior on height {
NumberAnimation { duration: 200 ; easing.type: Easing . InQuad }
}
2018-12-12 21:31:24 +00:00
MoneroComponents . Scroll {
2014-07-16 08:24:59 +00:00
id: flickableScroll
2014-07-23 10:39:35 +00:00
anchors.right: table . right
2018-12-12 21:31:24 +00:00
anchors.rightMargin: - 14 * scaleRatio
2014-07-23 10:39:35 +00:00
anchors.top: table . top
anchors.bottom: table . bottom
2014-07-16 08:24:59 +00:00
flickable: table
}
2018-12-12 21:31:24 +00:00
MoneroComponents . AddressBookTable {
2014-07-16 08:24:59 +00:00
id: table
anchors.left: parent . left
anchors.right: parent . right
2017-08-08 09:18:15 +00:00
anchors.top: parent . top
2014-07-16 08:24:59 +00:00
anchors.bottom: parent . bottom
onContentYChanged: flickableScroll . flickableContentYChanged ( )
2016-12-10 01:01:04 +00:00
model: root . model
2019-01-15 16:48:22 +00:00
selectAndSend: root . selectAndSend
2014-07-16 08:24:59 +00:00
}
}
2016-12-10 01:01:04 +00:00
2018-03-05 16:19:45 +00:00
function checkInformation ( address , payment_id , nettype ) {
2016-12-10 01:01:04 +00:00
address = address . trim ( )
payment_id = payment_id . trim ( )
2018-03-05 16:19:45 +00:00
var address_ok = walletManager . addressValid ( address , nettype )
2019-02-01 18:53:01 +00:00
var payment_id_ok = payment_id . length === 0 || walletManager . paymentIdValid ( payment_id )
2018-03-05 16:19:45 +00:00
var ipid = walletManager . paymentIdFromAddress ( address , nettype )
2016-12-10 01:01:04 +00:00
if ( ipid . length > 0 && payment_id . length > 0 )
payment_id_ok = false
addressLine . error = ! address_ok
paymentIdLine . error = ! payment_id_ok
return address_ok && payment_id_ok
}
2019-01-15 16:48:22 +00:00
function onPageClosed ( ) {
root . selectAndSend = false ;
}
2016-12-10 01:01:04 +00:00
function onPageCompleted ( ) {
console . log ( "adress book" ) ;
root . model = currentWallet . addressBookModel ;
}
2017-01-31 04:36:08 +00:00
function updateFromQrCode ( address , payment_id , amount , tx_description , recipient_name ) {
console . log ( "updateFromQrCode" )
addressLine . text = address
paymentIdLine . text = payment_id
descriptionLine . text = recipient_name + " " + tx_description
cameraUi . qrcode_decoded . disconnect ( updateFromQrCode )
}
2016-12-10 01:01:04 +00:00
2019-02-01 18:53:01 +00:00
function setDescription ( value ) {
descriptionLine . text = value ;
}
function setPaymentId ( value ) {
paymentIdLine . text = value ;
}
2018-12-18 19:06:29 +00:00
function clearFields ( ) {
addressLine . text = "" ;
paymentIdLine . text = "" ;
descriptionLine . text = "" ;
}
2019-02-01 18:53:01 +00:00
function oa_message ( text ) {
oaPopup . title = qsTr ( "OpenAlias error" ) + translationManager . emptyString
oaPopup . text = text
oaPopup . icon = StandardIcon . Information
oaPopup . onCloseCallback = null
oaPopup . open ( )
}
MoneroComponents . StandardDialog {
// dynamically change onclose handler
property var onCloseCallback
id: oaPopup
cancelVisible: false
onAccepted: {
if ( onCloseCallback ) {
onCloseCallback ( )
}
}
}
2014-07-07 17:08:30 +00:00
}