oxen-electron-gui-wallet/src/components/advanced/check_transaction.vue

241 lines
6.2 KiB
Vue

<template>
<div class="check-transaction">
<div class="q-pa-md">
<div class="q-mb-lg tab-desc">
{{ $t("strings.checkTransaction.description") }}
</div>
<div>
<OxenField
:label="$t('fieldLabels.transactionId')"
:error="$v.txid.$error"
>
<q-input
v-model.trim="txid"
:dark="theme == 'dark'"
:placeholder="$t('placeholders.pasteTransactionId')"
borderless
dense
@blur="$v.txid.$touch"
/>
</OxenField>
<OxenField
class="q-mt-md"
:label="$t('fieldLabels.address')"
:error="$v.address.$error"
optional
>
<q-input
v-model.trim="address"
:dark="theme == 'dark'"
:placeholder="$t('placeholders.recipientWalletAddress')"
borderless
dense
@blur="$v.address.$touch"
/>
</OxenField>
<OxenField class="q-mt-md" :label="$t('fieldLabels.message')" optional>
<q-input
v-model.trim="message"
:dark="theme == 'dark'"
:placeholder="$t('placeholders.proveOptionalMessage')"
borderless
dense
/>
</OxenField>
<OxenField
class="q-mt-md"
:label="$t('fieldLabels.signature')"
:error="$v.signature.$error"
>
<q-input
v-model.trim="signature"
:dark="theme == 'dark'"
:placeholder="$t('placeholders.pasteTransactionProof')"
borderless
dense
/>
</OxenField>
<div class="submit-button">
<q-btn color="primary" :label="$t('buttons.check')" @click="check" />
<q-btn
v-if="canClear"
color="secondsary="
:label="$t('buttons.clear')"
@click="clear"
/>
</div>
</div>
<div v-if="status.state.txid">
<div class="q-mb-sm">
<div class="title">{{ $t("strings.transactionID") }}</div>
<div>{{ status.state.txid }}</div>
</div>
<div class="q-mb-sm">
<div class="title">
{{ $t("strings.checkTransaction.infoTitles.validTransaction") }}
</div>
<div :class="status.state.good ? 'good' : 'bad'">
{{ validTransaction }}
</div>
</div>
<div v-if="status.state.received != null" class="q-mb-sm">
<div class="title">
{{ $t("strings.checkTransaction.infoTitles.received") }}
</div>
<div>
<FormatOxen :amount="status.state.received" raw-value />
</div>
</div>
<div v-if="status.state.in_pool != null" class="q-mb-sm">
<div class="title">
{{ $t("strings.checkTransaction.infoTitles.inPool") }}
</div>
<div>{{ status.state.in_pool }}</div>
</div>
<div v-if="status.state.confirmations != null" class="q-mb-sm">
<div class="title">
{{ $t("strings.checkTransaction.infoTitles.confirmations") }}
</div>
<div>{{ status.state.confirmations }}</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { mapState } from "vuex";
import { required } from "vuelidate/lib/validators";
import { address } from "src/validators/common";
import { i18n } from "boot/i18n";
import OxenField from "components/oxen_field";
import FormatOxen from "components/format_oxen";
export default {
name: "CheckTransaction",
components: {
OxenField,
FormatOxen
},
data() {
return {
txid: "",
address: "",
message: "",
signature: ""
};
},
computed: mapState({
theme: state => state.gateway.app.config.appearance.theme,
status: state => state.gateway.check_transaction_status,
canClear() {
return (
this.txid !== "" ||
this.address !== "" ||
this.message !== "" ||
this.signature != ""
);
},
validTransaction() {
let key = this.status.state.good ? "yes" : "no";
return i18n.t(`strings.checkTransaction.validTransaction.${key}`);
}
}),
validations: {
txid: { required },
address: {
isAddress(value) {
if (value === "") return true;
return new Promise(resolve => {
address(value, this.$gateway)
.then(() => resolve(true))
.catch(() => resolve(false));
});
}
},
signature: { required }
},
watch: {
status: {
handler(val, old) {
if (val.code == old.code) return;
const { code, message } = val;
switch (code) {
case -1:
this.$q.notify({
type: "negative",
timeout: 3000,
message
});
break;
}
},
deep: true
}
},
methods: {
check() {
this.$v.txid.$touch();
this.$v.address.$touch();
this.$v.signature.$touch();
if (this.$v.txid.$error) {
this.$q.notify({
type: "negative",
timeout: 1000,
message: this.$t("notification.errors.enterTransactionId")
});
return;
}
if (this.$v.signature.$error) {
this.$q.notify({
type: "negative",
timeout: 1000,
message: this.$t("notification.errors.enterTransactionProof")
});
return;
}
if (this.$v.address.$error) {
this.$q.notify({
type: "negative",
timeout: 1000,
message: this.$t("notification.errors.invalidAddress")
});
return;
}
this.$gateway.send("wallet", "check_transaction", {
txid: this.txid,
signature: this.signature,
address: this.address,
message: this.message
});
},
clear() {
this.txid = "";
this.address = "";
this.message = "";
this.signature = "";
this.$v.$reset();
}
}
};
</script>
<style lang="scss">
.check-transaction {
.description {
white-space: pre-line;
}
.submit-button {
.q-btn:not(:first-child) {
margin-left: 8px;
}
margin-bottom: 12px;
}
}
</style>