diff --git a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml
index 109e357206..d3de8f745b 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;
@@ -553,7 +553,7 @@ Rectangle {
}
RalewayRegular {
id: balanceAfterPurchaseText;
- text: balanceAfterPurchase.toFixed(2) + " HFC";
+ text: balanceAfterPurchase + " HFC";
// Text size
size: balanceAfterPurchaseTextLabel.size;
// Anchors
@@ -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..2055229059 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,64 @@ 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
+ 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
+#ifdef Q_OS_MAC
+ QDateTime createdAt = QDateTime::fromTime_t(valueObject["created_at"].toInt(), Qt::UTC);
+#else
+ 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());
+ 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 +175,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
+}
diff --git a/scripts/system/html/js/marketplacesInject.js b/scripts/system/html/js/marketplacesInject.js
index 28d116d3ec..50ed642529 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,12 @@
if (confirmAllPurchases) {
var href = $('#side-info').find('.btn').first().attr('href');
$('#side-info').find('.btn').first().attr('href', '#');
-
+
var cost = $('.item-cost').text();
if (parseInt(cost) > 0 && $('#side-info').find('#buyItemButton').size() === 0) {
- $('#side-info').find('.btn').first().html('Own Item: ' + (parseFloat(cost / 100).toFixed(2)) + ' HFC');
+ $('#side-info').find('.btn').first().html('Own Item: ' + cost + ' HFC');
+
}
$('#side-info').find('.btn').first().on('click', function () {
@@ -264,7 +265,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 +448,7 @@
cancelClaraDownload();
} else {
var parsedJsonMessage = JSON.parse(message);
-
+
if (parsedJsonMessage.type === "marketplaces") {
if (parsedJsonMessage.action === "inspectionModeSetting") {
confirmAllPurchases = !!parsedJsonMessage.data;