2017-11-04 13:59:19 +01:00
|
|
|
// Send command/response
|
|
|
|
|
2017-09-27 15:13:09 +02:00
|
|
|
|
2018-05-14 16:22:03 +02:00
|
|
|
function amountParameterBox(params, context) {
|
2017-09-27 15:13:09 +02:00
|
|
|
|
2018-02-22 10:54:38 +01:00
|
|
|
|
2017-05-10 19:42:52 +03:00
|
|
|
return {
|
|
|
|
title: I18n.t('send_title'),
|
|
|
|
showBack: true,
|
2018-02-22 10:54:38 +01:00
|
|
|
markup: status.components.view({
|
|
|
|
flex: 1
|
|
|
|
}, [
|
|
|
|
status.components.text({
|
|
|
|
style: {
|
|
|
|
fontSize: 14,
|
|
|
|
color: "rgb(147, 155, 161)",
|
|
|
|
paddingTop: 12,
|
|
|
|
paddingLeft: 16,
|
|
|
|
paddingRight: 16,
|
|
|
|
paddingBottom: 20
|
|
|
|
}
|
|
|
|
},
|
|
|
|
I18n.t('send_specify_amount')
|
2018-05-14 16:22:03 +02:00
|
|
|
)
|
2018-02-22 10:54:38 +01:00
|
|
|
])
|
2017-05-10 19:42:52 +03:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
var recipientSendParam = {
|
|
|
|
name: "recipient",
|
|
|
|
type: status.types.TEXT,
|
|
|
|
suggestions: function (params) {
|
|
|
|
return {
|
|
|
|
title: I18n.t('send_title'),
|
|
|
|
markup: status.components.chooseContact(I18n.t('send_choose_recipient'), "recipient", 0)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2018-05-14 16:22:03 +02:00
|
|
|
function amountSendParam() {
|
2017-11-04 13:59:19 +01:00
|
|
|
return {
|
2017-05-10 19:42:52 +03:00
|
|
|
name: "amount",
|
|
|
|
type: status.types.NUMBER,
|
2018-05-14 16:22:03 +02:00
|
|
|
suggestions: amountParameterBox.bind(this)
|
2017-11-04 13:59:19 +01:00
|
|
|
};
|
|
|
|
}
|
2017-05-10 19:42:52 +03:00
|
|
|
|
2018-05-14 16:22:03 +02:00
|
|
|
var paramsPersonalSend = [amountSendParam()];
|
|
|
|
var paramsGroupSend = [recipientSendParam, amountSendParam()];
|
2017-11-04 13:59:19 +01:00
|
|
|
|
|
|
|
function validateSend(validateRecipient, params, context) {
|
2017-05-10 19:42:52 +03:00
|
|
|
|
2018-02-22 10:54:38 +01:00
|
|
|
|
2017-05-10 19:42:52 +03:00
|
|
|
if (!params["amount"]) {
|
2017-02-28 11:14:55 +02:00
|
|
|
return {
|
|
|
|
markup: status.components.validationMessage(
|
|
|
|
I18n.t('validation_title'),
|
|
|
|
I18n.t('validation_amount_specified')
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-05-10 19:42:52 +03:00
|
|
|
var amount = params["amount"].replace(",", ".");
|
2017-02-28 11:14:55 +02:00
|
|
|
var amountSplitted = amount.split(".");
|
|
|
|
if (amountSplitted.length === 2 && amountSplitted[1].length > 18) {
|
|
|
|
return {
|
|
|
|
markup: status.components.validationMessage(
|
|
|
|
I18n.t('validation_title'),
|
|
|
|
I18n.t('validation_amount_is_too_small')
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-05-10 19:42:52 +03:00
|
|
|
if (isNaN(parseFloat(params.amount.replace(",", ".")))) {
|
|
|
|
return {
|
|
|
|
markup: status.components.validationMessage(
|
|
|
|
I18n.t('validation_title'),
|
|
|
|
I18n.t('validation_invalid_number')
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-02-28 11:14:55 +02:00
|
|
|
try {
|
|
|
|
var val = web3.toWei(amount, "ether");
|
2017-10-16 15:42:11 +02:00
|
|
|
if (val < 0) {
|
2017-02-28 11:14:55 +02:00
|
|
|
throw new Error();
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
return {
|
|
|
|
markup: status.components.validationMessage(
|
|
|
|
I18n.t('validation_title'),
|
|
|
|
I18n.t('validation_invalid_number')
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-09-21 12:40:05 +02:00
|
|
|
|
2017-02-28 11:14:55 +02:00
|
|
|
}
|
|
|
|
|
2018-05-14 16:22:03 +02:00
|
|
|
function handleSend(params, context) {
|
2017-11-04 13:59:19 +01:00
|
|
|
|
2017-02-28 11:14:55 +02:00
|
|
|
}
|
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
function previewSend(showRecipient, params, context) {
|
2017-05-10 19:42:52 +03:00
|
|
|
var amountStyle = {
|
|
|
|
fontSize: 36,
|
|
|
|
color: "#000000",
|
|
|
|
height: 40
|
|
|
|
};
|
2017-02-28 11:14:55 +02:00
|
|
|
|
2017-05-10 19:42:52 +03:00
|
|
|
var amount = status.components.view(
|
|
|
|
{
|
|
|
|
flexDirection: "column",
|
|
|
|
alignItems: "flex-end",
|
|
|
|
maxWidth: 250
|
|
|
|
},
|
|
|
|
[status.components.text(
|
2017-02-28 11:14:55 +02:00
|
|
|
{
|
2017-05-10 19:42:52 +03:00
|
|
|
style: amountStyle,
|
|
|
|
numberOfLines: 1,
|
|
|
|
ellipsizeMode: "tail",
|
|
|
|
font: "light"
|
|
|
|
},
|
|
|
|
status.localizeNumber(params.amount, context.delimiter, context.separator)
|
|
|
|
)]);
|
|
|
|
|
|
|
|
var currency = status.components.view(
|
|
|
|
{
|
|
|
|
style: {
|
2017-02-28 11:14:55 +02:00
|
|
|
flexDirection: "column",
|
2017-05-10 19:42:52 +03:00
|
|
|
justifyContent: "flex-end",
|
|
|
|
paddingBottom: 0
|
|
|
|
}
|
|
|
|
},
|
|
|
|
[status.components.text(
|
|
|
|
{
|
|
|
|
style: {
|
|
|
|
color: "#9199a0",
|
|
|
|
fontSize: 16,
|
|
|
|
lineHeight: 18,
|
|
|
|
marginLeft: 7.5
|
|
|
|
}
|
2017-02-28 11:14:55 +02:00
|
|
|
},
|
2017-05-10 19:42:52 +03:00
|
|
|
I18n.t('eth')
|
|
|
|
)]
|
|
|
|
);
|
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
var amountRow = status.components.view(
|
2017-05-10 19:42:52 +03:00
|
|
|
{
|
|
|
|
style: {
|
|
|
|
flexDirection: "row",
|
|
|
|
justifyContent: "space-between",
|
|
|
|
marginTop: 8,
|
|
|
|
marginBottom: 8
|
|
|
|
}
|
|
|
|
},
|
|
|
|
[amount, currency]
|
|
|
|
);
|
2017-02-28 11:14:55 +02:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
var markup = [amountRow];
|
|
|
|
|
|
|
|
if (showRecipient
|
|
|
|
&& params["bot-db"]
|
2017-05-10 19:42:52 +03:00
|
|
|
&& params["bot-db"]["public"]
|
|
|
|
&& params["bot-db"]["public"]["recipient"]
|
|
|
|
&& context["chat"]["group-chat"] === true) {
|
2017-11-04 13:59:19 +01:00
|
|
|
var recipientRow = status.components.text(
|
2017-02-28 11:14:55 +02:00
|
|
|
{
|
|
|
|
style: {
|
2017-05-10 19:42:52 +03:00
|
|
|
color: "#9199a0",
|
|
|
|
fontSize: 14,
|
|
|
|
lineHeight: 18
|
2017-02-28 11:14:55 +02:00
|
|
|
}
|
|
|
|
},
|
2017-07-10 22:27:13 +02:00
|
|
|
I18n.t('send_sending_to') + " " + params["bot-db"]["public"]["recipient"]["name"]
|
2017-02-28 11:14:55 +02:00
|
|
|
);
|
2017-11-04 13:59:19 +01:00
|
|
|
markup.push(recipientRow);
|
2017-05-10 19:42:52 +03:00
|
|
|
}
|
2017-11-04 13:59:19 +01:00
|
|
|
|
2017-05-10 19:42:52 +03:00
|
|
|
return {
|
|
|
|
markup: status.components.view(
|
|
|
|
{
|
|
|
|
style: {
|
|
|
|
flexDirection: "column"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
markup
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function shortPreviewSend(params, context) {
|
|
|
|
return {
|
2017-12-01 12:50:20 +03:00
|
|
|
markup: status.components.chatPreviewText(
|
2017-05-10 19:42:52 +03:00
|
|
|
{},
|
|
|
|
I18n.t('send_title') + ": "
|
|
|
|
+ status.localizeNumber(params.amount, context.delimiter, context.separator)
|
|
|
|
+ " ETH"
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
var personalSend = {
|
|
|
|
name: "send",
|
|
|
|
scope: ["global", "personal-chats", "registered", "humans"],
|
|
|
|
icon: "money_white",
|
|
|
|
color: "#5fc48d",
|
|
|
|
title: I18n.t('send_title'),
|
|
|
|
description: I18n.t('send_description'),
|
|
|
|
params: paramsPersonalSend,
|
|
|
|
validator: validateSend.bind(this, false),
|
2018-05-14 16:22:03 +02:00
|
|
|
handler: handleSend.bind(this),
|
|
|
|
asyncHandler: false,
|
2017-11-04 13:59:19 +01:00
|
|
|
preview: previewSend.bind(this, false),
|
|
|
|
shortPreview: shortPreviewSend
|
|
|
|
};
|
|
|
|
|
|
|
|
var groupSend = {
|
2017-05-10 19:42:52 +03:00
|
|
|
name: "send",
|
2017-11-04 13:59:19 +01:00
|
|
|
scope: ["global", "group-chats", "registered", "humans"],
|
2017-05-10 19:42:52 +03:00
|
|
|
icon: "money_white",
|
|
|
|
color: "#5fc48d",
|
|
|
|
title: I18n.t('send_title'),
|
|
|
|
description: I18n.t('send_description'),
|
2017-11-04 13:59:19 +01:00
|
|
|
params: paramsGroupSend,
|
|
|
|
validator: validateSend.bind(this, true),
|
2018-05-14 16:22:03 +02:00
|
|
|
handler: handleSend.bind(this),
|
|
|
|
asyncHandler: false,
|
2017-11-04 13:59:19 +01:00
|
|
|
preview: previewSend.bind(this, true),
|
2017-05-10 19:42:52 +03:00
|
|
|
shortPreview: shortPreviewSend
|
2017-02-28 11:14:55 +02:00
|
|
|
};
|
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
status.command(personalSend);
|
|
|
|
status.response(personalSend);
|
2017-02-28 11:14:55 +02:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
status.command(groupSend);
|
|
|
|
status.response(groupSend);
|
2017-05-10 19:42:52 +03:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
// Request command
|
2017-05-10 19:42:52 +03:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
var recipientRequestParam = {
|
|
|
|
name: "recipient",
|
|
|
|
type: status.types.TEXT,
|
|
|
|
suggestions: function (params) {
|
2017-02-28 11:14:55 +02:00
|
|
|
return {
|
2017-11-04 13:59:19 +01:00
|
|
|
title: I18n.t('request_title'),
|
|
|
|
markup: status.components.chooseContact(I18n.t('send_choose_recipient'), "recipient", 0)
|
2017-02-28 11:14:55 +02:00
|
|
|
};
|
2017-11-04 13:59:19 +01:00
|
|
|
}
|
|
|
|
};
|
2017-07-10 22:27:13 +02:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
var amountRequestParam = {
|
|
|
|
name: "amount",
|
|
|
|
type: status.types.NUMBER
|
|
|
|
};
|
2017-07-10 22:27:13 +02:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
var paramsPersonalRequest = [amountRequestParam];
|
|
|
|
var paramsGroupRequest = [recipientRequestParam, amountRequestParam];
|
2017-07-10 22:27:13 +02:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
function handlePersonalRequest(params, context) {
|
|
|
|
var val = params["amount"].replace(",", ".");
|
2018-05-18 16:29:42 +03:00
|
|
|
var network = context["network"];
|
2018-02-22 10:54:38 +01:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
return {
|
|
|
|
event: "request",
|
|
|
|
request: {
|
|
|
|
command: "send",
|
|
|
|
params: {
|
2018-05-18 16:29:42 +03:00
|
|
|
network: network,
|
|
|
|
amount: val,
|
2017-11-04 13:59:19 +01:00
|
|
|
},
|
|
|
|
prefill: [val]
|
2017-07-10 22:27:13 +02:00
|
|
|
}
|
2017-11-04 13:59:19 +01:00
|
|
|
};
|
|
|
|
}
|
2017-07-10 22:27:13 +02:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
function handleGroupRequest(params, context) {
|
|
|
|
var val = params["amount"].replace(",", ".");
|
2018-05-18 16:29:42 +03:00
|
|
|
var network = context["network"];
|
2018-02-22 10:54:38 +01:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
return {
|
|
|
|
event: "request",
|
|
|
|
request: {
|
|
|
|
command: "send",
|
|
|
|
params: {
|
|
|
|
recipient: context["current-account"]["name"],
|
2018-05-18 16:29:42 +03:00
|
|
|
network: network,
|
2017-11-04 13:59:19 +01:00
|
|
|
amount: val
|
|
|
|
},
|
|
|
|
prefill: [context["current-account"]["name"], val],
|
|
|
|
prefillBotDb: {
|
|
|
|
public: {
|
|
|
|
recipient: context["current-account"]
|
|
|
|
}
|
|
|
|
}
|
2017-05-10 19:42:52 +03:00
|
|
|
}
|
2017-11-04 13:59:19 +01:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function previewRequest(showRecipient, params, context) {
|
|
|
|
var amountRow = status.components.text(
|
|
|
|
{},
|
|
|
|
I18n.t('request_requesting') + " "
|
|
|
|
+ status.localizeNumber(params.amount, context.delimiter, context.separator)
|
|
|
|
+ " ETH"
|
|
|
|
);
|
|
|
|
|
|
|
|
var markup = [amountRow];
|
|
|
|
|
|
|
|
if (showRecipient
|
|
|
|
&& params["bot-db"]
|
|
|
|
&& params["bot-db"]["public"]
|
|
|
|
&& params["bot-db"]["public"]["recipient"]
|
|
|
|
&& context["chat"]["group-chat"] === true) {
|
|
|
|
|
|
|
|
var recipientRow = status.components.text(
|
|
|
|
{
|
|
|
|
style: {
|
|
|
|
color: "#9199a0",
|
|
|
|
fontSize: 14,
|
|
|
|
lineHeight: 18
|
|
|
|
}
|
|
|
|
},
|
|
|
|
I18n.t('request_requesting_from') + " " + params["bot-db"]["public"]["recipient"]["name"]
|
|
|
|
);
|
|
|
|
markup.push(recipientRow);
|
2018-02-22 10:54:38 +01:00
|
|
|
}
|
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
return {
|
|
|
|
markup: status.components.view(
|
|
|
|
{
|
|
|
|
style: {
|
|
|
|
flexDirection: "column"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
markup
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function shortPreviewRequest(params, context) {
|
|
|
|
return {
|
2017-12-01 12:50:20 +03:00
|
|
|
markup: status.components.chatPreviewText(
|
2017-11-04 13:59:19 +01:00
|
|
|
{},
|
|
|
|
I18n.t('request_requesting') + " "
|
|
|
|
+ status.localizeNumber(params.amount, context.delimiter, context.separator)
|
|
|
|
+ " ETH"
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
2017-05-10 19:42:52 +03:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
function validateRequest(validateRecipient, params) {
|
|
|
|
if (!params["bot-db"]) {
|
|
|
|
params["bot-db"] = {};
|
|
|
|
}
|
|
|
|
|
|
|
|
if (validateRecipient) {
|
2017-05-10 19:42:52 +03:00
|
|
|
if (!params["bot-db"]["public"] || !params["bot-db"]["public"]["recipient"] || !params["bot-db"]["public"]["recipient"]["address"]) {
|
|
|
|
return {
|
|
|
|
markup: status.components.validationMessage(
|
|
|
|
"Wrong address",
|
|
|
|
"Recipient address must be specified"
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
2017-11-04 13:59:19 +01:00
|
|
|
}
|
2018-02-22 10:54:38 +01:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
if (!params["amount"]) {
|
|
|
|
return {
|
|
|
|
markup: status.components.validationMessage(
|
|
|
|
I18n.t('validation_title'),
|
|
|
|
I18n.t('validation_amount_specified')
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
2017-05-10 19:42:52 +03:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
var amount = params.amount.replace(",", ".");
|
|
|
|
var amountSplitted = amount.split(".");
|
|
|
|
if (amountSplitted.length === 2 && amountSplitted[1].length > 18) {
|
|
|
|
return {
|
|
|
|
markup: status.components.validationMessage(
|
|
|
|
I18n.t('validation_title'),
|
|
|
|
I18n.t('validation_amount_is_too_small')
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
2017-05-10 19:42:52 +03:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
if (isNaN(parseFloat(params.amount.replace(",", ".")))) {
|
|
|
|
return {
|
|
|
|
markup: status.components.validationMessage(
|
|
|
|
I18n.t('validation_title'),
|
|
|
|
I18n.t('validation_invalid_number')
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
2018-02-22 10:54:38 +01:00
|
|
|
|
2017-11-04 13:59:19 +01:00
|
|
|
try {
|
|
|
|
var val = web3.toWei(amount, "ether");
|
|
|
|
if (val < 0) {
|
|
|
|
throw new Error();
|
2017-02-28 11:14:55 +02:00
|
|
|
}
|
2017-11-04 13:59:19 +01:00
|
|
|
} catch (err) {
|
|
|
|
return {
|
|
|
|
markup: status.components.validationMessage(
|
|
|
|
I18n.t('validation_title'),
|
|
|
|
I18n.t('validation_invalid_number')
|
|
|
|
)
|
|
|
|
};
|
2017-02-28 11:14:55 +02:00
|
|
|
}
|
2017-11-04 13:59:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
status.command({
|
|
|
|
name: "request",
|
|
|
|
scope: ["global", "personal-chats", "registered", "humans"],
|
|
|
|
icon: "money_white",
|
|
|
|
color: "#5fc48d",
|
|
|
|
title: I18n.t('request_title'),
|
|
|
|
description: I18n.t('request_description'),
|
|
|
|
params: paramsPersonalRequest,
|
|
|
|
handler: handlePersonalRequest,
|
|
|
|
preview: previewRequest.bind(null, false),
|
|
|
|
shortPreview: shortPreviewRequest,
|
|
|
|
validator: validateRequest.bind(null, false)
|
|
|
|
});
|
|
|
|
|
|
|
|
status.command({
|
|
|
|
name: "request",
|
|
|
|
scope: ["global", "group-chats", "registered", "humans"],
|
|
|
|
icon: "money_white",
|
|
|
|
color: "#5fc48d",
|
|
|
|
title: I18n.t('request_title'),
|
|
|
|
description: I18n.t('request_description'),
|
|
|
|
params: paramsGroupRequest,
|
|
|
|
handler: handleGroupRequest,
|
|
|
|
preview: previewRequest.bind(null, true),
|
|
|
|
shortPreview: shortPreviewRequest,
|
|
|
|
validator: validateRequest.bind(null, true)
|
2017-02-28 11:14:55 +02:00
|
|
|
});
|