diff options
| author | Adam Soltys <[email protected]> | 2022-10-17 23:29:32 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2022-10-17 23:29:32 -0700 |
| commit | 02af363d2f0d552a72dc1c90bf8d785e04465d3a (patch) | |
| tree | 03fe0719e4c623cf6d6b649c0867b910b6db5199 /src | |
| parent | 5e3d4133760962db28c4f3a595f0566bd59391ff (diff) | |
| download | coinos-ui-02af363d2f0d552a72dc1c90bf8d785e04465d3a.tar.gz coinos-ui-02af363d2f0d552a72dc1c90bf8d785e04465d3a.zip | |
invoice redirect
Diffstat (limited to 'src')
| -rw-r--r-- | src/components/RegisterOrLogin.svelte | 6 | ||||
| -rw-r--r-- | src/hooks.server.js | 4 | ||||
| -rw-r--r-- | src/lib/socket.js | 4 | ||||
| -rw-r--r-- | src/lib/store.js | 3 | ||||
| -rw-r--r-- | src/lib/upload.js | 2 | ||||
| -rw-r--r-- | src/lib/utils.js | 11 | ||||
| -rw-r--r-- | src/routes/+layout.server.js | 9 | ||||
| -rw-r--r-- | src/routes/+layout.svelte | 3 | ||||
| -rw-r--r-- | src/routes/[username]/dashboard/+page.server.js | 1 | ||||
| -rw-r--r-- | src/routes/invoice/[id]/+page.svelte | 6 | ||||
| -rw-r--r-- | src/routes/launch/+page.server.js | 6 | ||||
| -rw-r--r-- | src/routes/launch/+page.svelte | 22 | ||||
| -rw-r--r-- | src/routes/launch/purchase/+page.server.js | 37 | ||||
| -rw-r--r-- | src/routes/launch/purchase/+page.svelte | 16 | ||||
| -rw-r--r-- | src/routes/launch/purchase/card/+page.server.js | 7 | ||||
| -rw-r--r-- | src/routes/launch/purchase/card/+page.svelte | 18 | ||||
| -rw-r--r-- | src/routes/launch/thanks/[asset]/+page.server.js | 1 | ||||
| -rw-r--r-- | src/routes/launch/thanks/[asset]/+page.svelte | 4 | ||||
| -rw-r--r-- | src/routes/launch/ticket/+page.svelte | 9 | ||||
| -rw-r--r-- | src/routes/login/+page.server.js | 4 | ||||
| -rw-r--r-- | src/routes/register/+page.server.js | 4 | ||||
| -rw-r--r-- | src/routes/register/+page.svelte | 2 |
22 files changed, 111 insertions, 68 deletions
diff --git a/src/components/RegisterOrLogin.svelte b/src/components/RegisterOrLogin.svelte index 0b954387..7f254400 100644 --- a/src/components/RegisterOrLogin.svelte +++ b/src/components/RegisterOrLogin.svelte @@ -3,7 +3,7 @@ import { enhance } from '$app/forms'; import { Icon } from '$comp'; import { focus } from '$lib/utils'; - import { redirect } from '$lib/store'; + import { loginRedirect } from '$lib/store'; import { t } from '$lib/translations'; export let form; @@ -40,8 +40,8 @@ {/if} <form class="space-y-5" {action} method="POST" use:enhance> - {#if $redirect} - <input type="hidden" name="redirect" value={$redirect} /> + {#if $loginRedirect} + <input type="hidden" name="loginRedirect" value={$loginRedirect} /> {/if} <div> diff --git a/src/hooks.server.js b/src/hooks.server.js index 58882771..a5b1eef3 100644 --- a/src/hooks.server.js +++ b/src/hooks.server.js @@ -2,9 +2,8 @@ import { auth, get } from '$lib/utils'; export async function handle({ event, resolve }) { let token = event.cookies.get('token'); - if (token) { - event.request.headers.set('authorization', `Bearer ${token}`); + if (token) { try { event.locals.user = await get('/me', auth(event.cookies)); } catch (e) { @@ -13,7 +12,6 @@ export async function handle({ event, resolve }) { } const response = await resolve(event); - response.headers.set('x-custom-header', 'potato'); return response; } diff --git a/src/lib/socket.js b/src/lib/socket.js index 7cce0071..fb77333f 100644 --- a/src/lib/socket.js +++ b/src/lib/socket.js @@ -1,5 +1,5 @@ import { get } from 'svelte/store'; -import { invoices, newPayment, rate } from '$lib/store'; +import { invoices, newPayment, rate, user } from '$lib/store'; import { success } from '$lib/utils'; import { env } from '$env/dynamic/public'; @@ -21,7 +21,7 @@ export const messages = (data) => ({ payment() { let { amount, invoice } = data; - if (get(user).account_id !== data.account_id ) return; + if (get(user).account_id !== data.account_id) return; if (invoice) { invoices.set({ ...get(invoices), [invoice.uuid]: invoice }); diff --git a/src/lib/store.js b/src/lib/store.js index 765e14cf..ffafa70b 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -27,7 +27,8 @@ const persistLocal = (key, defaultValue) => { return s; }; -export const redirect = writable(); +export const invoiceRedirect = writable(); +export const loginRedirect = writable(); export const rate = writable(); export const user = writable(); export const selectedRate = writable(); diff --git a/src/lib/upload.js b/src/lib/upload.js index 6354b7f4..0e8a2908 100644 --- a/src/lib/upload.js +++ b/src/lib/upload.js @@ -1,5 +1,5 @@ export const upload = async (file, type, progress, token) => { - console.log("FILE", file) + console.log('FILE', file); let url = `/api/upload/${type}`; let formData = new FormData(); formData.append('file', file); diff --git a/src/lib/utils.js b/src/lib/utils.js index 54e965d9..76ce5077 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -9,6 +9,17 @@ export function scroll(section) { const base = browser ? '' : env.PUBLIC_COINOS_URL; +export const g = (url, fetch, headers) => + fetch(base + url, { headers }) + .then((r) => r.text()) + .then((body) => { + try { + return JSON.parse(body); + } catch (e) { + throw new Error(body); + } + }); + export const get = (url, headers = {}) => fetch(base + url, { headers }) .then((r) => r.text()) diff --git a/src/routes/+layout.server.js b/src/routes/+layout.server.js index 7f6e8801..6af13a06 100644 --- a/src/routes/+layout.server.js +++ b/src/routes/+layout.server.js @@ -5,7 +5,8 @@ import { env } from '$env/dynamic/public'; export const { PUBLIC_BTC: btc } = env; -export async function load({ cookies, request, url, params }) { +export async function load({ cookies, locals, request, url, params }) { + url.pathname; let token = cookies.get('token'); let user; let rates; @@ -16,11 +17,7 @@ export async function load({ cookies, request, url, params }) { } if (token && token !== 'undefined') { - try { - user = await get('/me', auth(cookies)); - } catch (e) { - throw redirect(307, '/logout'); - } + user = locals.user; if (protectedRoutes.find((p) => url.pathname.match(p))) { if (user.username !== params.username) throw error(404, 'user not found'); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 0064cce0..5cc75b30 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -14,7 +14,8 @@ const localeLocalStorageKey = 'sveltekit-i18n-locale'; export let data; - let r, u, token, rates; + + let r, u, token, rates; $: update(data); let update = () => { diff --git a/src/routes/[username]/dashboard/+page.server.js b/src/routes/[username]/dashboard/+page.server.js new file mode 100644 index 00000000..b6206324 --- /dev/null +++ b/src/routes/[username]/dashboard/+page.server.js @@ -0,0 +1 @@ +export const load = ({ parent }) => parent(); diff --git a/src/routes/invoice/[id]/+page.svelte b/src/routes/invoice/[id]/+page.svelte index 04a31813..8e9e6ff4 100644 --- a/src/routes/invoice/[id]/+page.svelte +++ b/src/routes/invoice/[id]/+page.svelte @@ -1,7 +1,7 @@ <script> import { copy, f, get, reverseFormat, s, sats } from '$lib/utils'; import { browser } from '$app/environment'; - import { invoices } from '$lib/store'; + import { invoices, invoiceRedirect } from '$lib/store'; import { Icon, Heart, Image, Qr, Tip } from '$comp'; import { goto } from '$app/navigation'; import { t } from '$lib/translations'; @@ -44,7 +44,9 @@ $: tip = Math.round((amount / 100) * tipPercent); $invoices[id] = { amount, id, rate, received, text, tip, username }; - $: browser && $invoices[id]?.received >= $invoices[id]?.amount && goto(`/invoice/${id}/paid`); + $: browser && + $invoices[id]?.received >= $invoices[id]?.amount && + goto($invoiceRedirect || `/invoice/${id}/paid`); $: amountFiat = parseFloat(((amount * rate) / sats).toFixed(2)); diff --git a/src/routes/launch/+page.server.js b/src/routes/launch/+page.server.js new file mode 100644 index 00000000..2b44dfae --- /dev/null +++ b/src/routes/launch/+page.server.js @@ -0,0 +1,6 @@ +import { auth, get } from '$lib/utils'; + +export const load = async ({ parent }) => { + let tickets = await get('/tickets'); + return { ...(await parent()), tickets }; +}; diff --git a/src/routes/launch/+page.svelte b/src/routes/launch/+page.svelte index 74638257..843c7705 100644 --- a/src/routes/launch/+page.svelte +++ b/src/routes/launch/+page.svelte @@ -1,15 +1,18 @@ <script> - import { redirect } from '$lib/store'; + import { loginRedirect } from '$lib/store'; import { beforeNavigate } from '$app/navigation'; import { info } from '$lib/utils'; export let data; - let { user } = data; - $: link = user ? '/launch/purchase' : '/register'; - $redirect = '/launch/purchase'; + let { user, tickets } = data; + $loginRedirect = '/launch/purchase'; + + let hasTicket = !!user?.accounts.find((a) => tickets.includes(a.asset)); + $: link = user ? $loginRedirect : '/register'; + $: text = (hasTicket ? 'View' : 'Purchase') + ' Ticket'; beforeNavigate(({ to }) => { - if (to.routeId === 'register') info('Please sign in so we can get you a ticket'); + if (to?.routeId === 'register') info('Please sign in so we can get you a ticket'); }); </script> @@ -29,7 +32,12 @@ </h1> <p class="leading-normal mb-2"> - Come join us at our launch party celebrating our new design and 10 years since our <a href="https://github.com/coinos/coinos-server/commit/b25d11b" class="underline" target="_blank">first commit</a>! + Come join us at our launch party celebrating our new design and 10 years since our <a + href="https://github.com/coinos/coinos-server/commit/b25d11b" + class="underline" + target="_blank" + rel="noreferrer">first commit</a + >! </p> <div class="ml-8"> <p><b>When</b></p> @@ -58,7 +66,7 @@ <button class="bg-white text-black border rounded-full px-8 py-4 font-bold hover:opacity-80 text-2xl" > - Purchase Ticket + {text} </button> </a> </div> diff --git a/src/routes/launch/purchase/+page.server.js b/src/routes/launch/purchase/+page.server.js index b9b20f28..ff5efc84 100644 --- a/src/routes/launch/purchase/+page.server.js +++ b/src/routes/launch/purchase/+page.server.js @@ -1,16 +1,18 @@ import { auth, get, post } from '$lib/utils'; import tickets from '$lib/tickets'; -import { redirect } from "@sveltejs/kit"; +import { redirect } from '@sveltejs/kit'; +import { env } from '$env/dynamic/private'; +import { invalidateAll } from '$app/navigation'; +import { browser } from '$app/environment'; export const load = async ({ parent }) => { - let p = await parent(); - let t = await get('/ticket'); - return { ...p, ...t }; + let tickets = await get('/tickets'); + return { ...(await parent()), tickets }; }; export const actions = { - internal: async ({ cookies, request, parent }) => { - let { ticket } = Object.fromEntries(await request.formData()); + internal: async ({ cookies, request }) => { + let { ticket } = await get('/ticket'); let { asset } = await post( '/assets', @@ -26,7 +28,9 @@ export const actions = { auth(cookies) ); - throw redirect(307, `/launch/thanks/${asset}`); + await post('/ticket', { asset }, { authorization: `Bearer ${env.LAUNCH}` }); + + throw redirect(307, `/launch/thanks/${asset}`); }, lightning: async ({ cookies, request }) => { @@ -35,10 +39,9 @@ export const actions = { let rates = await get('/rates'); let invoice = { - amount: parseInt(form.get('amount')), - tip: parseInt(form.get('tip')), + amount: 25000, network: 'lightning', - prompt: form.get('prompt') === 'true', + prompt: false, rate: rates[form.get('currency')] }; @@ -50,3 +53,17 @@ export const actions = { }, bitcoin: () => console.log('YYEAH') }; + +export async function POST({ request }) { + let { address, amount, confirmed } = await request.json(); + if (!confirmed) return; + + if (request.headers.get('x-webhook') !== env.WEBHOOK) { + throw new Error('access denied'); + } + + let username = invoices[address]; + amount = Math.round(amount / 2100); + + await post('/send', { username, asset, amount }, { authorization: `Bearer ${token}` }); +} diff --git a/src/routes/launch/purchase/+page.svelte b/src/routes/launch/purchase/+page.svelte index a7a2b51c..d31d20f0 100644 --- a/src/routes/launch/purchase/+page.svelte +++ b/src/routes/launch/purchase/+page.svelte @@ -1,21 +1,21 @@ <script> import { enhance } from '$app/forms'; - import { selectedRate } from '$lib/store'; + import { invoiceRedirect, selectedRate } from '$lib/store'; import { post } from '$lib/utils'; import { goto } from '$app/navigation'; export let data; - export let form; let amount = 25000; let { address, - currency, + currency, account: { balance }, username } = data.user; - let { ticket } = data; + let { tickets } = data; + let ticket = tickets.length; let invoice; let get = async (network) => { @@ -26,6 +26,7 @@ username }); + $invoiceRedirect = '/launch/purchase'; goto(`/invoice/${uuid}`); }; @@ -38,12 +39,13 @@ <div class="mx-auto h-screen flex items-center justify-center px-4"> <div class="font-normal text-gray-800 mx-auto mb-8 space-y-8"> <h1 class="mb-4 text-4xl font-bold leading-none tracking-tight text-gray-800 text-center"> - Confirm Purchase + Confirm Purchase </h1> <img src={`/tickets/${(ticket + 1).toString().padStart(2, '0')}.png`} class="w-full max-w-[800px]" + alt="Ticket" /> {#if balance > amount} @@ -63,8 +65,8 @@ </h1> <form action="?/lightning" method="POST"> - <input type="hidden" name="currency" value={currency} /> - <input type="hidden" name="username" value={username} /> + <input type="hidden" name="currency" value={currency} /> + <input type="hidden" name="username" value={username} /> <button class="bg-black text-white border rounded-full px-8 py-4 font-bold hover:opacity-80 mx-auto text-2xl" > diff --git a/src/routes/launch/purchase/card/+page.server.js b/src/routes/launch/purchase/card/+page.server.js index 1393eecc..eaa8d5f3 100644 --- a/src/routes/launch/purchase/card/+page.server.js +++ b/src/routes/launch/purchase/card/+page.server.js @@ -1,3 +1,5 @@ +import { env } from '$env/dynamic/private'; + let stripe = 'https://api.stripe.com/v1'; export const actions = { @@ -5,10 +7,7 @@ export const actions = { let form = await request.formData(); let headers = new Headers(); - headers.set( - 'Authorization', - 'Basic ' + new Buffer('sk_test_mBv5bAeAhiYSDYFZJNsDwjht:').toString('base64') - ); + headers.set('Authorization', 'Basic ' + new Buffer(env.STRIPE + ':').toString('base64')); let body = new URLSearchParams({ 'card[number]': form.get('number'), diff --git a/src/routes/launch/purchase/card/+page.svelte b/src/routes/launch/purchase/card/+page.svelte index 73f2d880..79240078 100644 --- a/src/routes/launch/purchase/card/+page.svelte +++ b/src/routes/launch/purchase/card/+page.svelte @@ -9,7 +9,7 @@ type="text" name="number" placeholder="0000 0000 0000" - value="4242424242424242" + value="4242424242424242" /> <svg xmlns="http://www.w3.org/2000/svg" @@ -34,7 +34,7 @@ type="text" name="expiry" placeholder="MM/YY" - value="0123" + value="0123" /> <svg xmlns="http://www.w3.org/2000/svg" @@ -82,7 +82,7 @@ type="text" name="cvc" placeholder="•••" - value="123" + value="123" /> <svg xmlns="http://www.w3.org/2000/svg" @@ -100,10 +100,10 @@ </svg> </label> - <div class="w-full flex"> - <button - - class="bg-black text-white border rounded-full px-8 py-4 font-bold hover:opacity-80 mx-auto text-2xl" - type="submit">Submit</button> - </div> + <div class="w-full flex"> + <button + class="bg-black text-white border rounded-full px-8 py-4 font-bold hover:opacity-80 mx-auto text-2xl" + type="submit">Submit</button + > + </div> </form> diff --git a/src/routes/launch/thanks/[asset]/+page.server.js b/src/routes/launch/thanks/[asset]/+page.server.js new file mode 100644 index 00000000..e9e01376 --- /dev/null +++ b/src/routes/launch/thanks/[asset]/+page.server.js @@ -0,0 +1 @@ +// export const load = ({ parent }) => parent(); diff --git a/src/routes/launch/thanks/[asset]/+page.svelte b/src/routes/launch/thanks/[asset]/+page.svelte index 6cf0915f..4f0ec3bb 100644 --- a/src/routes/launch/thanks/[asset]/+page.svelte +++ b/src/routes/launch/thanks/[asset]/+page.svelte @@ -2,7 +2,9 @@ import { page } from '$app/stores'; export let data; + let { user } = data; + let { asset } = $page.params; </script> @@ -18,7 +20,7 @@ We've minted your ticket as an <a href={`https://blockstream.info/liquid/asset/${asset}`} class="underline">NFT on the Liquid Blockchain</a - > as a proof of purchase and commemorative token. It may confer some special benefits in the future. + > as a proof of purchase and commemorative token. </p> </div> diff --git a/src/routes/launch/ticket/+page.svelte b/src/routes/launch/ticket/+page.svelte index acf3b7a5..229c18f0 100644 --- a/src/routes/launch/ticket/+page.svelte +++ b/src/routes/launch/ticket/+page.svelte @@ -1,5 +1,4 @@ - - <img - src={`/tickets/${(ticket + 1).toString().padStart(2, '0')}.png`} - class="w-full max-w-[800px]" - /> +<img + src={`/tickets/${(ticket + 1).toString().padStart(2, '0')}.png`} + class="w-full max-w-[800px]" +/> diff --git a/src/routes/login/+page.server.js b/src/routes/login/+page.server.js index 94981ff7..aa8797f9 100644 --- a/src/routes/login/+page.server.js +++ b/src/routes/login/+page.server.js @@ -4,7 +4,7 @@ import { login } from '$lib/utils'; export const actions = { default: async ({ cookies, request }) => { let form = Object.fromEntries(await request.formData()); - let { username, password, redirect: r } = form; + let { username, password, loginRedirect } = form; let user = { username, password }; try { @@ -13,6 +13,6 @@ export const actions = { return invalid(400, { error: 'Login failed' }); } - throw redirect(303, r || `/${user.username}/dashboard`); + throw redirect(303, loginRedirect || `/${user.username}/dashboard`); } }; diff --git a/src/routes/register/+page.server.js b/src/routes/register/+page.server.js index bfe1a9b7..c5751d4c 100644 --- a/src/routes/register/+page.server.js +++ b/src/routes/register/+page.server.js @@ -4,7 +4,7 @@ import { post, login } from '$lib/utils'; export const actions = { default: async ({ cookies, request }) => { let form = Object.fromEntries(await request.formData()); - let { username, password, redirect: r } = form; + let { username, password, loginRedirect } = form; let user = { username, password }; let error; @@ -23,6 +23,6 @@ export const actions = { } if (error) return invalid(400, { error }); - throw redirect(307, r || `/${user.username}/dashboard`); + throw redirect(307, loginRedirect || `/${user.username}/dashboard`); } }; diff --git a/src/routes/register/+page.svelte b/src/routes/register/+page.svelte index aa0e66e0..fd9e4417 100644 --- a/src/routes/register/+page.svelte +++ b/src/routes/register/+page.svelte @@ -5,9 +5,7 @@ afterNavigate(async () => { try { - console.log('whoa'); await invalidateAll(); - console.log('no'); } catch (e) { console.log(e); } |
