From 8fbdd207c8da2933c1177bb896bfc5e1b4fffad2 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Thu, 31 Aug 2017 12:10:12 -0700 Subject: [PATCH 1/6] display hfc in "pennies" --- .../qml/hifi/commerce/checkout/Checkout.qml | 28 ++++----- .../qml/hifi/commerce/wallet/WalletHome.qml | 4 +- interface/src/commerce/Ledger.cpp | 59 ++++++++++++++++++- 3 files changed, 73 insertions(+), 18 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml index 109e357206..72e4e7622b 100644 --- a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml +++ b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml @@ -89,8 +89,8 @@ Rectangle { console.log("Failed to get balance", result.data.message); } else { root.balanceReceived = true; - hfcBalanceText.text = (parseFloat(result.data.balance/100).toFixed(2)) + " HFC"; - balanceAfterPurchase = parseFloat(result.data.balance/100) - root.itemPriceFull/100; + hfcBalanceText.text = result.data.balance + " HFC"; + balanceAfterPurchase = result.data.balance - root.itemPriceFull; root.setBuyText(); } } @@ -199,7 +199,7 @@ Rectangle { commerce.getLoginStatus(); } } - + HifiWallet.NeedsLogIn { id: needsLogIn; visible: root.activeView === "needsLogIn"; @@ -222,7 +222,7 @@ Rectangle { } - + // // "WALLET NOT SET UP" START // @@ -233,7 +233,7 @@ Rectangle { anchors.bottom: parent.bottom; anchors.left: parent.left; anchors.right: parent.right; - + RalewayRegular { id: notSetUpText; text: "Your wallet isn't set up.

Set up your Wallet (no credit card necessary) to claim your free HFC " + @@ -264,7 +264,7 @@ Rectangle { anchors.left: parent.left; anchors.bottom: parent.bottom; anchors.bottomMargin: 24; - + // "Cancel" button HifiControlsUit.Button { id: cancelButton; @@ -648,7 +648,7 @@ Rectangle { sendToScript({method: 'checkout_goToPurchases'}); } } - + RalewayRegular { id: buyText; // Text size @@ -687,7 +687,7 @@ Rectangle { anchors.bottom: root.bottom; anchors.left: parent.left; anchors.right: parent.right; - + RalewayRegular { id: completeText; text: "Purchase Complete!

You bought " + (itemNameText.text) + " by " + (itemAuthorText.text) + ""; @@ -706,7 +706,7 @@ Rectangle { horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter; } - + Item { id: checkoutSuccessActionButtonsContainer; // Size @@ -756,7 +756,7 @@ Rectangle { } } } - + Item { id: continueShoppingButtonContainer; // Size @@ -799,7 +799,7 @@ Rectangle { anchors.bottom: root.bottom; anchors.left: parent.left; anchors.right: parent.right; - + RalewayRegular { id: failureHeaderText; text: "Purchase Failed.
Your Purchases and HFC balance haven't changed."; @@ -818,7 +818,7 @@ Rectangle { horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter; } - + RalewayRegular { id: failureErrorText; // Text size @@ -836,7 +836,7 @@ Rectangle { horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter; } - + Item { id: backToMarketplaceButtonContainer; // Size @@ -892,7 +892,7 @@ Rectangle { itemNameText.text = message.params.itemName; itemAuthorText.text = message.params.itemAuthor; root.itemPriceFull = message.params.itemPrice; - itemPriceText.text = root.itemPriceFull === 0 ? "Free" : "" + (parseFloat(root.itemPriceFull/100).toFixed(2)) + " HFC"; + itemPriceText.text = root.itemPriceFull === 0 ? "Free" : "" + root.itemPriceFull + " HFC"; itemHref = message.params.itemHref; if (itemHref.indexOf('.json') === -1) { root.itemIsJson = false; diff --git a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml index b55f7f800a..413fd8b71c 100644 --- a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml +++ b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml @@ -38,7 +38,7 @@ Item { } onBalanceResult : { - balanceText.text = parseFloat(result.data.balance/100).toFixed(2); + balanceText.text = result.data.balance; } onHistoryResult : { @@ -272,7 +272,7 @@ Item { horizontalAlignment: Text.AlignLeft; verticalAlignment: Text.AlignVCenter; } - + HifiControlsUit.Separator { anchors.left: parent.left; anchors.right: parent.right; diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index 08eb79017f..9991958455 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include "AccountManager.h" #include "Wallet.h" @@ -45,7 +46,6 @@ Handler(buy) Handler(receiveAt) Handler(balance) Handler(inventory) -Handler(history) void Ledger::send(const QString& endpoint, const QString& success, const QString& fail, QNetworkAccessManager::Operation method, QJsonObject request) { auto accountManager = DependencyManager::get(); @@ -108,6 +108,61 @@ void Ledger::inventory(const QStringList& keys) { keysQuery("inventory", "inventorySuccess", "inventoryFailure"); } +QString nameFromKey(const QString& key, const QStringList& publicKeys) { + if (key.isNull() || key.isEmpty()) { + return "Marketplace"; + } + if (publicKeys.contains(key)) { + return "You"; + } + return "Someone"; +} + +void Ledger::historySuccess(QNetworkReply& reply) { + // here we send a historyResult with some extra stuff in it + // Namely, the styled text we'd like to show. The issue is the + // QML cannot do that easily since it doesn't know what the wallet + // public key(s) are. Let's keep it that way + QByteArray response = reply.readAll(); + QJsonObject data = QJsonDocument::fromJson(response).object(); + + // we will need the array of public keys from the wallet + auto wallet = DependencyManager::get(); + auto keys = wallet->listPublicKeys(); + + // now we need to loop through the transactions and add fancy text... + auto historyArray = data.find("data").value().toObject().find("history").value().toArray(); + QJsonArray newHistoryArray; + + // TODO: do this with 0 copies if possible + auto it = historyArray.begin(); + for(auto it = historyArray.begin(); it != historyArray.end(); it++) { + auto valueObject = (*it).toObject(); + QString from = nameFromKey(valueObject["sender_key"].toString(), keys); + QString to = nameFromKey(valueObject["recipient_key"].toString(), keys); + // turns out on my machine, toLocalTime convert to some weird timezone, yet the + // systemTimeZone is correct. To avoid a strange bug with other's systems too, lets + // be explicit + QDateTime createdAt = QDateTime::fromSecsSinceEpoch(valueObject["created_at"].toInt(), Qt::UTC); + QDateTime localCreatedAt = createdAt.toTimeZone(QTimeZone::systemTimeZone()); + valueObject["text"] = QString("%1 sent %2 %3 %4 on %5 with message \"%6\""). + arg(from, to, QString::number(valueObject["quantity"].toInt()), valueObject["asset_title"].toString(), localCreatedAt.toString(Qt::SystemLocaleShortDate), valueObject["message"].toString()); + newHistoryArray.push_back(valueObject); + } + // now copy the rest of the json -- this is inefficient + // TODO: try to do this without making copies + QJsonObject newData; + newData["status"] = "success"; + QJsonObject newDataData; + newDataData["history"] = newHistoryArray; + newData["data"] = newDataData; + emit historyResult(newData); +} + +void Ledger::historyFailure(QNetworkReply& reply) { + failResponse("history", reply); +} + void Ledger::history(const QStringList& keys) { keysQuery("history", "historySuccess", "historyFailure"); } @@ -117,4 +172,4 @@ void Ledger::resetSuccess(QNetworkReply& reply) { apiResponse("reset", reply); } void Ledger::resetFailure(QNetworkReply& reply) { failResponse("reset", reply); } void Ledger::reset() { send("reset_user_hfc_account", "resetSuccess", "resetFailure", QNetworkAccessManager::PutOperation, QJsonObject()); -} \ No newline at end of file +} From 396f1081824ff4bc2b5bab40c9a23e9109ba6a22 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Thu, 31 Aug 2017 12:18:46 -0700 Subject: [PATCH 2/6] forgot this the first time --- scripts/system/html/js/marketplacesInject.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/scripts/system/html/js/marketplacesInject.js b/scripts/system/html/js/marketplacesInject.js index 2675bb97b6..57450d043b 100644 --- a/scripts/system/html/js/marketplacesInject.js +++ b/scripts/system/html/js/marketplacesInject.js @@ -27,7 +27,7 @@ var isPreparing = false; // Explicitly track download request status. var confirmAllPurchases = false; // Set this to "true" to cause Checkout.qml to popup for all items, even if free - + function injectCommonCode(isDirectoryPage) { // Supporting styles from marketplaces.css. @@ -122,7 +122,7 @@ function injectBuyButtonOnMainPage() { var cost; - + $('.grid-item').find('#price-or-edit').find('a').each(function() { $(this).attr('data-href', $(this).attr('href')); $(this).attr('href', '#'); @@ -130,7 +130,7 @@ $(this).closest('.col-xs-3').prev().attr("class", 'col-xs-6'); $(this).closest('.col-xs-3').attr("class", 'col-xs-6'); - + if (parseInt(cost) > 0) { var priceElement = $(this).find('.price') priceElement.css({ "width": "auto", "padding": "3px 5px", "height": "26px" }); @@ -138,8 +138,8 @@ priceElement.css({ "min-width": priceElement.width() + 10 }); } }); - - + + $('.grid-item').find('#price-or-edit').find('a').on('click', function () { buyButtonClicked($(this).closest('.grid-item').attr('data-item-id'), $(this).closest('.grid-item').find('.item-title').text(), @@ -175,11 +175,11 @@ if (confirmAllPurchases) { var href = $('#side-info').find('.btn').attr('href'); $('#side-info').find('.btn').attr('href', '#'); - + var cost = $('.item-cost').text(); if (parseInt(cost) > 0 && $('#side-info').find('#buyItemButton').size() === 0) { - $('#side-info').find('.btn').html('Own Item: ' + (parseFloat(cost / 100).toFixed(2)) + ' HFC'); + $('#side-info').find('.btn').html('Own Item: ' + cost + ' HFC'); } $('#side-info').find('.btn').on('click', function () { @@ -264,7 +264,7 @@ // Reference: https://clara.io/learn/sdk/api/export //var XMLHTTPREQUEST_URL = "https://clara.io/api/scenes/{uuid}/export/fbx?zip=true¢erScene=true&alignSceneGround=true&fbxUnit=Meter&fbxVersion=7&fbxEmbedTextures=true&imageFormat=WebGL"; - // 13 Jan 2017: Specify FBX version 5 and remove some options in order to make Clara.io site more likely to + // 13 Jan 2017: Specify FBX version 5 and remove some options in order to make Clara.io site more likely to // be successful in generating zip files. var XMLHTTPREQUEST_URL = "https://clara.io/api/scenes/{uuid}/export/fbx?fbxUnit=Meter&fbxVersion=5&fbxEmbedTextures=true&imageFormat=WebGL"; @@ -447,7 +447,7 @@ cancelClaraDownload(); } else { var parsedJsonMessage = JSON.parse(message); - + if (parsedJsonMessage.type === "marketplaces") { if (parsedJsonMessage.action === "inspectionModeSetting") { confirmAllPurchases = !!parsedJsonMessage.data; From f8341ce1daacf48626516b756b8605f4102c90e4 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Thu, 31 Aug 2017 13:24:07 -0700 Subject: [PATCH 3/6] warning --- interface/src/commerce/Ledger.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index 9991958455..0f7f533e13 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -135,7 +135,6 @@ void Ledger::historySuccess(QNetworkReply& reply) { QJsonArray newHistoryArray; // TODO: do this with 0 copies if possible - auto it = historyArray.begin(); for(auto it = historyArray.begin(); it != historyArray.end(); it++) { auto valueObject = (*it).toObject(); QString from = nameFromKey(valueObject["sender_key"].toString(), keys); From cdadaa8c9c220b15d868095d8e68b43432a2c0fa Mon Sep 17 00:00:00 2001 From: David Kelly Date: Thu, 31 Aug 2017 13:41:53 -0700 Subject: [PATCH 4/6] missed one --- interface/resources/qml/hifi/commerce/checkout/Checkout.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml index 72e4e7622b..d3de8f745b 100644 --- a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml +++ b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml @@ -553,7 +553,7 @@ Rectangle { } RalewayRegular { id: balanceAfterPurchaseText; - text: balanceAfterPurchase.toFixed(2) + " HFC"; + text: balanceAfterPurchase + " HFC"; // Text size size: balanceAfterPurchaseTextLabel.size; // Anchors From 1eb503f526b548705c3695cdfd4932562726cc52 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Thu, 31 Aug 2017 16:49:12 -0700 Subject: [PATCH 5/6] we are qt5.6 on mac --- interface/src/commerce/Ledger.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index 0f7f533e13..7937fa4bbb 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -142,7 +142,11 @@ void Ledger::historySuccess(QNetworkReply& reply) { // turns out on my machine, toLocalTime convert to some weird timezone, yet the // systemTimeZone is correct. To avoid a strange bug with other's systems too, lets // be explicit +#ifdef Q_OS_MAC + QDateTime createdAt = QDateTime::fromTime_t(valueObject["created_at"].toInt(), Qt::UTC); +#elif QDateTime createdAt = QDateTime::fromSecsSinceEpoch(valueObject["created_at"].toInt(), Qt::UTC); +#endif QDateTime localCreatedAt = createdAt.toTimeZone(QTimeZone::systemTimeZone()); valueObject["text"] = QString("%1 sent %2 %3 %4 on %5 with message \"%6\""). arg(from, to, QString::number(valueObject["quantity"].toInt()), valueObject["asset_title"].toString(), localCreatedAt.toString(Qt::SystemLocaleShortDate), valueObject["message"].toString()); From 655dc61ff270f717755896b33b92674023e04fdf Mon Sep 17 00:00:00 2001 From: David Kelly Date: Fri, 1 Sep 2017 10:16:45 -0700 Subject: [PATCH 6/6] doh --- interface/src/commerce/Ledger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index 7937fa4bbb..2055229059 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -144,7 +144,7 @@ void Ledger::historySuccess(QNetworkReply& reply) { // be explicit #ifdef Q_OS_MAC QDateTime createdAt = QDateTime::fromTime_t(valueObject["created_at"].toInt(), Qt::UTC); -#elif +#else QDateTime createdAt = QDateTime::fromSecsSinceEpoch(valueObject["created_at"].toInt(), Qt::UTC); #endif QDateTime localCreatedAt = createdAt.toTimeZone(QTimeZone::systemTimeZone());