aboutsummaryrefslogtreecommitdiffstats
path: root/src/routes/(app)/send
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2023-02-22 19:38:55 -0800
committerAdam Soltys <[email protected]>2023-02-23 00:31:21 -0800
commit50b270db6fda60b5b3e39a9dbada5c27a14cbad1 (patch)
tree6cc2ce81bd703aab912f3594d8c1c2086fcc731d /src/routes/(app)/send
parentc1c019beae03bbebde70557e1d0a9e064a48927c (diff)
downloadcoinos-ui-50b270db6fda60b5b3e39a9dbada5c27a14cbad1.tar.gz
coinos-ui-50b270db6fda60b5b3e39a9dbada5c27a14cbad1.zip
fee slider wip
Diffstat (limited to 'src/routes/(app)/send')
-rw-r--r--src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js18
-rw-r--r--src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte70
-rw-r--r--src/routes/(app)/send/invoice/[id]/+page.server.js4
-rw-r--r--src/routes/(app)/send/lightning/[payreq]/+page.server.js4
-rw-r--r--src/routes/(app)/send/pot/[name]/[...amount]/+page.server.js2
-rw-r--r--src/routes/(app)/send/user/[username]/[...amount]/+page.server.js4
6 files changed, 72 insertions, 30 deletions
diff --git a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js
index 59e9326d..7b1900cc 100644
--- a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js
+++ b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js
@@ -1,22 +1,26 @@
import { fail, redirect } from '@sveltejs/kit';
-import { auth, post } from '$lib/utils';
+import { auth, post, fd } from '$lib/utils';
let seen = {};
export const actions = {
default: async ({ cookies, request }) => {
try {
- let feeRate, subtract;
- let { address, amount, pin, ts } = Object.fromEntries(await request.formData());
-
+ let { address, amount, confirmed, feeRate, subtract, pin, stale, ts } = await await fd(request);
if (seen[ts]) return fail(400, { message: 'Duplicate form submission' });
- seen[ts] = 1;
- setTimeout(() => delete seen[ts], 30000);
- let { tx } = await post(
+ let estimate = await post(
'/bitcoin/fee',
{ address, amount, feeRate, subtract },
auth(cookies)
);
+
+ let { tx } = estimate;
+
+ if (stale || !confirmed) return fail(400, estimate);
+
+ seen[ts] = 1;
+ setTimeout(() => delete seen[ts], 30000);
+
await post('/bitcoin/send', { pin, tx }, auth(cookies));
} catch (e) {
return fail(400, { message: e.message });
diff --git a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte
index cabe895f..3fb7cefb 100644
--- a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte
+++ b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte
@@ -1,31 +1,44 @@
<script>
+ import { tick } from 'svelte';
import { t } from '$lib/translations';
import { enhance } from '$app/forms';
- import { Icon, Numpad, Spinner } from '$comp';
+ import { Slider, Icon, Numpad, Spinner } from '$comp';
import { page } from '$app/stores';
- import { back, s, sat } from '$lib/utils';
- import { pin } from '$lib/store';
+ import { fiat as af, f, back, s, sat } from '$lib/utils';
+ import { pin, selectedRate } from '$lib/store';
export let data;
export let form;
let { address, amount } = $page.params;
let { balance, currency } = data.user;
- let loading, submit;
- let fiat;
+ let loading, submit, fiat, confirmed, feeRate, min, max, fee, stale;
let toggle = () => (loading = true);
$: update(form);
let update = () => {
- if (form?.message.includes('pin')) $pin = undefined;
loading = false;
+ if (form?.message?.includes('pin')) $pin = undefined;
+ if (form) ({ min, max, feeRate, fee } = form);
+ if (feeRate) confirmed = true;
+ stale = false;
};
- let max = () => {
- fiat = false;
+ let setMax = () => {
+ fiat = false;
amount = balance;
};
+
+ let timeout;
+ let handle = (e) => {
+ stale = true;
+ feeRate = e.target.value;
+ clearTimeout(timeout);
+ timeout = setTimeout(() => {
+ tick().then(() => submit.click());
+ }, 200);
+ };
</script>
<button class="ml-5 md:ml-20 mt-5 md:mt-10 hover:opacity-80" on:click={back}>
@@ -44,21 +57,44 @@
<p class="text-lg text-secondary">{address}</p>
</div>
- <Numpad bind:amount bind:fiat {currency} {submit} />
+ {#if confirmed}
+ <div class="text-center">
+ <h2 class="text-2xl md:text-3xl font-semibold">
+ {f(af(amount, $selectedRate), currency)}
+ </h2>
+ <h3 class="text-secondary md:text-lg mb-6 mt-1">{sat(amount)}</h3>
+ </div>
+ {:else}
+ <Numpad bind:amount bind:fiat {currency} {submit} />
+ {/if}
<form method="POST" use:enhance on:submit={toggle}>
<input name="ts" value={Date.now()} type="hidden" />
<input name="address" value={address} type="hidden" />
<input name="amount" value={amount} type="hidden" />
<input name="pin" value={$pin} type="hidden" />
+ <input name="confirmed" value={confirmed} type="hidden" />
+ <input name="feeRate" value={feeRate} type="hidden" />
+ <input name="stale" value={stale} type="hidden" />
+
+ {#if confirmed}
+ <label>Fee rate</label>
+ {min}
+ {max}
+ {fee}
+ <div class="text-lg text-center -mb-2 text-secondary">{feeRate} sats/kb</div>
+ <Slider bind:value={feeRate} {handle} {min} {max} />
+ {/if}
<div class="flex justify-center gap-2">
- <button
- type="button"
- class="hover:opacity-80 bg-black text-white rounded-2xl py-3 px-4 mt-2 border font-bold"
- on:click|preventDefault={max}
- on:keydown={max}>Max ⚡️{s(balance)}</button
- >
+ {#if !confirmed}
+ <button
+ type="button"
+ class="hover:opacity-80 bg-black text-white rounded-2xl py-3 px-4 mt-2 border font-bold"
+ on:click|preventDefault={setMax}
+ on:keydown={setMax}>Max ⚡️{s(balance)}</button
+ >
+ {/if}
<button
bind:this={submit}
@@ -68,8 +104,10 @@
>
{#if loading}
<Spinner />
- {:else}
+ {:else if confirmed}
{$t('payments.send')}
+ {:else}
+ {$t('payments.next')}
{/if}
</button>
</div>
diff --git a/src/routes/(app)/send/invoice/[id]/+page.server.js b/src/routes/(app)/send/invoice/[id]/+page.server.js
index 2df19985..0ae097af 100644
--- a/src/routes/(app)/send/invoice/[id]/+page.server.js
+++ b/src/routes/(app)/send/invoice/[id]/+page.server.js
@@ -1,5 +1,5 @@
import { error, fail, redirect } from '@sveltejs/kit';
-import { btc as asset, auth, get, post } from '$lib/utils';
+import { fd, btc as asset, auth, get, post } from '$lib/utils';
export async function load({ params: { id }, parent }) {
let { user } = await parent();
@@ -13,7 +13,7 @@ export async function load({ params: { id }, parent }) {
export const actions = {
default: async ({ cookies, params: { hash }, request }) => {
try {
- let body = Object.fromEntries(await request.formData());
+ let body = await fd(request);
let { confirmed } = body;
body.amount = parseInt(body.amount);
body.hash = hash;
diff --git a/src/routes/(app)/send/lightning/[payreq]/+page.server.js b/src/routes/(app)/send/lightning/[payreq]/+page.server.js
index 90e6c0cc..e9e2b12a 100644
--- a/src/routes/(app)/send/lightning/[payreq]/+page.server.js
+++ b/src/routes/(app)/send/lightning/[payreq]/+page.server.js
@@ -7,12 +7,12 @@ export async function load({ params }) {
export const actions = {
setAmount: async ({ cookies, request }) => {
- return Object.fromEntries(await request.formData());
+ return await fd(request);
},
send: async ({ cookies, request }) => {
try {
- let body = Object.fromEntries(await request.formData());
+ let body = await fd(request);
let { amount, confirmed } = body;
if (!confirmed) {
diff --git a/src/routes/(app)/send/pot/[name]/[...amount]/+page.server.js b/src/routes/(app)/send/pot/[name]/[...amount]/+page.server.js
index 0e1b7f5b..6c11811c 100644
--- a/src/routes/(app)/send/pot/[name]/[...amount]/+page.server.js
+++ b/src/routes/(app)/send/pot/[name]/[...amount]/+page.server.js
@@ -3,7 +3,7 @@ import { auth, post } from '$lib/utils';
export const actions = {
default: async ({ cookies, request }) => {
- let body = Object.fromEntries(await request.formData());
+ let body = await fd(request);
let p;
try {
diff --git a/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js b/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js
index 42b47c8f..40c2d919 100644
--- a/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js
+++ b/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js
@@ -1,5 +1,5 @@
import { error, fail, redirect } from '@sveltejs/kit';
-import { btc as asset, auth, get, post } from '$lib/utils';
+import { fd, btc as asset, auth, get, post } from '$lib/utils';
export async function load({ params, parent }) {
let { user } = await parent();
@@ -12,7 +12,7 @@ export async function load({ params, parent }) {
export const actions = {
default: async ({ cookies, request }) => {
try {
- let body = Object.fromEntries(await request.formData());
+ let body = await fd(request);
let { amount, confirmed } = body;
amount = parseInt(amount);