diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/socket.js | 5 | ||||
| -rw-r--r-- | src/lib/store.js | 2 | ||||
| -rw-r--r-- | src/routes/[username]/index.svelte | 7 | ||||
| -rw-r--r-- | src/routes/__layout.svelte | 2 | ||||
| -rw-r--r-- | src/routes/invoice/[id].svelte | 206 | ||||
| -rw-r--r-- | src/routes/support.svelte (renamed from src/routes/[username]/support.svelte) | 0 |
6 files changed, 128 insertions, 94 deletions
diff --git a/src/lib/socket.js b/src/lib/socket.js index c7c541e1..4898f481 100644 --- a/src/lib/socket.js +++ b/src/lib/socket.js @@ -1,5 +1,5 @@ import { get } from 'svelte/store'; -import { rate, user, token } from '$lib/store'; +import { rate, user, token, invoicePaid, preferredCurrency } from '$lib/store'; let interval, socket; @@ -18,13 +18,14 @@ export const messages = (data) => ({ }, payment() { - console.log(data, 'payment'); + invoicePaid.set(true); }, connected: auth, login() { user.set(data); + preferredCurrency.set(data.currency); } }); diff --git a/src/lib/store.js b/src/lib/store.js index 6f4a9515..f910dfa6 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -18,3 +18,5 @@ export const user = writable(); export const invoiceAmount = writable(); export const invoiceAmountFiat = writable(); export const token = persisted('token'); +export const invoicePaid = writable(); +export const preferredCurrency = writable(); diff --git a/src/routes/[username]/index.svelte b/src/routes/[username]/index.svelte index a53b94cc..6e3978ad 100644 --- a/src/routes/[username]/index.svelte +++ b/src/routes/[username]/index.svelte @@ -7,8 +7,7 @@ import { copy } from '$lib/utils'; export let username; - //this needs to be pulled from user - let lightning = 'lnbc1p3dzl8tpp5jgq2dxefjdhvmvs3uvtjc'; + let lightningAddress = `${username}@coinos.io`; onMount(async () => { if (browser) { @@ -39,7 +38,7 @@ setTimeout(() => (qrSkeleton = false), 100); const handleCopy = () => { - copy(lightning); + copy(lightningAddress); toast.push('Copied!', { theme: { '--toastBarBackground': '#2F855A' @@ -84,7 +83,7 @@ <div class="bg-primary font-semibold rounded-xl text-sm py-2 px-3 flex flex-wrap justify-center items-center" > - <span>{lightning}</span> + <span>{lightningAddress}</span> <button on:click={handleCopy}> <Icon icon="copy" style="ml-2" /> </button> diff --git a/src/routes/__layout.svelte b/src/routes/__layout.svelte index b2cb8aae..406c29e2 100644 --- a/src/routes/__layout.svelte +++ b/src/routes/__layout.svelte @@ -11,7 +11,7 @@ import { LoadingSplash } from '$comp'; browser && ($token ||= $session.token); - let protectedRoutes = [/receive/]; + let protectedRoutes = [/receive/, /customers/, /dashboard/, /settings/, /transactions/]; let ready = false; onMount(() => { diff --git a/src/routes/invoice/[id].svelte b/src/routes/invoice/[id].svelte index 0f5a1437..0bb6c41a 100644 --- a/src/routes/invoice/[id].svelte +++ b/src/routes/invoice/[id].svelte @@ -1,16 +1,16 @@ <script> + import { toast } from '@zerodevx/svelte-toast'; import { get, post, reverseFormat } from '$lib/utils'; import { browser } from '$app/env'; - import { user } from '$lib/store'; - import { Icon } from '$comp'; + import { user, invoicePaid, preferredCurrency } from '$lib/store'; + import { Icon, Image } from '$comp'; import { goto } from '$app/navigation'; import { onMount } from 'svelte'; + import { copy } from '$lib/utils'; export let amount, rate, text, username; - let mobileMenu; - $: logMobileParent(showMobileTip); - let logMobileParent = () => mobileMenu && console.log(mobileMenu.offsetParent); + console.log($user); $: amountFiat = parseFloat(((amount * rate) / 100000000).toFixed(2)); @@ -50,7 +50,7 @@ $: totalAmountFormatted = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' - }).format(amountFiat + tipAmount); + }).format(amountFiat + parseFloat(tipAmount)); const amountFormatted = new Intl.NumberFormat('en-US', { maximumFractionDigits: 0 @@ -67,6 +67,8 @@ const handleTipButtonClick = (amount) => { customTipAmount = ''; + customInput.value = ''; + if (amount === 'None') { tipPercent = 0; } else { @@ -119,27 +121,42 @@ }; let customInput; + + const handleCopy = () => { + copy(text); + toast.push('Copied!', { + theme: { + '--toastBarBackground': '#2F855A' + } + }); + }; + + const handleDoneClick = () => { + if ($user) { + goto(`/${user.username}/receive`); + } else { + goto('/'); + } + }; </script> -<div class:full-shadow={showMobileTip}> - {#if $user} +{#if $user && !invoicePaid} + <div class:full-shadow={showMobileTip}> <button class="ml-5 md:ml-20 mt-5 md:mt-10" on:click={handleBackButton}> <Icon icon="arrow-left" style="w-10" /> </button> - {/if} <div class="flex justify-center items-center mb-20 md:mt-[20px] px-3"> <div class="block lg:flex justify-center items-center space-y-10 lg:space-y-0 space-x-0 lg:space-x-24" > - <!-- tipping section --> - <div - bind:this={mobileMenu} - class="absolute {showMobileTip - ? 'top-[calc(100vh - 100%)]' - : 'top-[calc(100vh)]'} left-0 bg-white p-6 md:p-0 rounded-t-3xl md:rounded-none transition-all md:transition-none ease-in-out duration-500 md:static text-center space-y-5 z-50" - > - <h1 class="hidden md:block text-4xl font-semibold">Add a tip?</h1> + <!-- tipping section --> + <div + class="w-[100%] md:w-auto absolute {showMobileTip + ? 'bottom-0' + : '-bottom-full'} bg-white p-6 md:p-0 rounded-t-3xl md:rounded-none transition-all md:transition-none ease-in-out duration-500 left-0 md:static text-center space-y-5" + > + <h1 class="hidden md:block text-4xl font-semibold">Add a tip?</h1> <div> <span class="font-semibold mr-1">{tipAmountFormatted}</span><span @@ -148,51 +165,54 @@ <span class="block text-secondary text-sm">{tipPercent}%</span> </div> - <input - id="slider" - type="range" - min="0" - max="100" - value={tipPercent} - class="px-2" - on:input={(e) => { - customTipAmount = ''; - tipPercent = e.target.value; - }} - /> + <input + id="slider" + type="range" + min="0" + max="100" + value={tipPercent} + class="px-2" + on:input={(e) => { + customTipAmount = ''; + customInput.value = ''; + tipPercent = e.target.value; + }} + /> - <div> - {#each tipAmounts as amount} - <button - class="bg-primary w-16 md:w-20 py-3 m-1 rounded-2xl font-semibold {tipPercent === - amount.slice(0, 2) || - ((tipPercent === 0 || tipPercent === '0') && amount === 'None') - ? '!bg-black text-white' - : ''}" - on:click={() => handleTipButtonClick(amount)}>{amount}</button - > - {/each} + <div> + {#each tipAmounts as amount} + <button + class="bg-primary w-16 md:w-20 py-3 m-1 rounded-2xl font-semibold {customTipAmount + ? '' + : tipPercent === amount.slice(0, 2) || + ((tipPercent === 0 || tipPercent === '0') && amount === 'None') + ? '!bg-black text-white' + : ''}" + on:click={() => handleTipButtonClick(amount)}>{amount}</button + > + {/each} - <div class="relative"> - <span - class="absolute top-[20px] left-5 font-semibold {!customTipAmount - ? 'opacity-50' - : 'opacity-100'}">$</span - > - <input - bind:this={customInput} - type="number" - min="0" - on:input={(e) => handleCustomTipAmount(e)} - class="bg-primary rounded-2xl py-3 px-10 font-semibold mt-2 mr-1 w-full md:w-auto" - placeholder="Other" - /> - <button - class="w-full md:w-auto mt-2 md:mt-0 bg-black text-white font-semibold py-3 px-7 rounded-2xl {showMobileTip - ? !customTipAmount && !tipAmount + <div class="relative"> + <span + class="absolute top-[20px] left-5 font-semibold {!customTipAmount ? 'opacity-50' - : 'opacity-100' - : !customTipAmount + : 'opacity-100'}">$</span + > + <input + bind:this={customInput} + type="number" + min="0" + on:input={(e) => handleCustomTipAmount(e)} + class="bg-primary rounded-2xl py-3 px-10 font-semibold mt-2 mr-1 w-full md:w-auto" + placeholder="Other" + /> + <button + class="w-full md:w-auto mt-2 md:mt-0 bg-black text-white font-semibold py-3 px-7 rounded-2xl {showMobileTip + ? !customTipAmount && !tipAmount + ? 'opacity-50' + : 'opacity-100' + : !customTipAmount + ? 'opacity-50' : 'opacity-100'}" disabled={showMobileTip ? !customTipAmount && !tipAmount : !customTipAmount} @@ -238,42 +258,54 @@ >Scan to pay <span class="text-black font-semibold">{username}</span></span > - <div - bind:this={qr} - class="border {showMobileTip - ? 'border-gray-400' - : 'border-lightgrey'} rounded-3xl block md:flex md:p-5 justify-center items-center h-[300px] md:h-[342px] w-[250px] md:w-[342px] relative" - /> + <div + bind:this={qr} + on:click={handleCopy} + class="border {showMobileTip + ? 'border-gray-400' + : 'border-lightgrey'} rounded-3xl block md:flex justify-center items-center cursor-pointer" + /> - <div class="px-5 space-y-3"> - <div class="flex justify-between"> - <span class="font-semibold text-sm">Invoice</span> - <span class="font-semibold text-sm" - >{invoiceAmountFiatFormatted} - <span class="text-secondary font-normal">{`(${amountFormatted} SATS)`}</span></span - > - </div> + <div class="px-5 space-y-3"> + <div class="flex justify-between"> + <span class="font-semibold text-sm">Invoice</span> + <span class="font-semibold text-sm" + >{invoiceAmountFiatFormatted} + <span class="text-secondary font-normal">{`(${amountFormatted} SATS)`}</span></span + > + </div> - <div class="flex justify-between"> - <span class="font-semibold text-sm">Tip</span> - <span class="font-semibold text-sm" - >{tipAmountFormatted} - <span class="text-secondary font-normal">{`(${tipAmountSats} SATS)`}</span></span - > - </div> + <div class="flex justify-between"> + <span class="font-semibold text-sm">Tip</span> + <span class="font-semibold text-sm" + >{tipAmountFormatted} + <span class="text-secondary font-normal">{`(${tipAmountSats} SATS)`}</span></span + > + </div> - <div class="flex justify-between"> - <span class="font-bold">Total</span> - <span class="font-bold" - >{totalAmountFormatted} - <span class="text-secondary font-normal">{`(${totalAmountSats} SATS)`}</span></span - > + <div class="flex justify-between"> + <span class="font-bold">Total</span> + <span class="font-bold" + >{totalAmountFormatted} + <span class="text-secondary font-normal">{`(${totalAmountSats} SATS)`}</span></span + > + </div> </div> </div> </div> </div> </div> -</div> +{:else} + <div class="text-center mt-20 md:mt-0"> + <Image image="success" style="w-full md:w-3/4 xl:w-1/2 mx-auto max-w-3xl" /> + <h1 class="text-3xl md:text-4xl font-bold mb-6">Payment Successful!</h1> + <h2 class="text-2xl md:text-3xl font-semibold">{totalAmountFormatted} {$preferredCurrency}</h2> + <h3 class="text-secondary md:text-lg mb-6 mt-1">({totalAmountSats} SATS)</h3> + <button class="bg-black text-white rounded-2xl w-20 py-3 font-bold" on:click={handleDoneClick}> + Done + </button> + </div> +{/if} <style> #slider { diff --git a/src/routes/[username]/support.svelte b/src/routes/support.svelte index 1935b156..1935b156 100644 --- a/src/routes/[username]/support.svelte +++ b/src/routes/support.svelte |
