diff options
| author | Jurjen de Vries <[email protected]> | 2025-09-11 00:48:15 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-09-11 00:48:15 +0200 |
| commit | 0c69c9848c6b98c92609d209103efc60003c9723 (patch) | |
| tree | 445121def885f13d0f80c06864ad2ff4d5ef95a1 /src/routes/(static) | |
| parent | 2abcf6e435fca5d86960f3ba4228002bfb0a19e6 (diff) | |
| parent | 9277b2921e09ee9dd5f39cf4af30a2330f4d95d1 (diff) | |
| download | coinos-ui-0c69c9848c6b98c92609d209103efc60003c9723.tar.gz coinos-ui-0c69c9848c6b98c92609d209103efc60003c9723.zip | |
Merge branch 'coinos:master' into master
Diffstat (limited to 'src/routes/(static)')
| -rw-r--r-- | src/routes/(static)/bounties/+page.server.ts | 18 | ||||
| -rw-r--r-- | src/routes/(static)/bounties/+page.svelte | 233 | ||||
| -rw-r--r-- | src/routes/(static)/docs/+page.svelte | 16 | ||||
| -rw-r--r-- | src/routes/(static)/login/+page.server.ts | 1 | ||||
| -rw-r--r-- | src/routes/(static)/login/+page.svelte | 2 | ||||
| -rw-r--r-- | src/routes/(static)/login/[token]/+page.server.ts | 13 | ||||
| -rw-r--r-- | src/routes/(static)/register/+page.server.ts | 39 | ||||
| -rw-r--r-- | src/routes/(static)/register/+page.svelte | 7 |
8 files changed, 207 insertions, 122 deletions
diff --git a/src/routes/(static)/bounties/+page.server.ts b/src/routes/(static)/bounties/+page.server.ts new file mode 100644 index 00000000..c9d872b0 --- /dev/null +++ b/src/routes/(static)/bounties/+page.server.ts @@ -0,0 +1,18 @@ +import { get } from "$lib/utils"; +export const load = async () => { + const users = [ + { username: "fustler", merchant: "rrdrive", type: "Bakery" }, + { username: "laluna", merchant: "butchersguild", type: "Butcher Shop" }, + { username: "ica547", merchant: "vanlove", type: "Sushi Restaurant" }, + { username: "reverendhodl", merchant: "laughingbean", type: "Cafe" }, + ]; + + for (const user of users) { + const { username, merchant } = user; + console.log(username, merchant); + user.user = await get(`/users/${username}`); + user.merchant = await get(`/users/${merchant}`); + } + + return { users }; +}; diff --git a/src/routes/(static)/bounties/+page.svelte b/src/routes/(static)/bounties/+page.svelte index b53dc85d..db7a012b 100644 --- a/src/routes/(static)/bounties/+page.svelte +++ b/src/routes/(static)/bounties/+page.svelte @@ -1,96 +1,174 @@ -<div class="space-y-5"> - <h1 class="text-3xl mb-6 pt-28 md:pt-12">Bounties</h1> +<script> + import Avatar from "$comp/Avatar.svelte"; + import { s } from "$lib/utils"; + import Amount from "$comp/Amount.svelte"; - <p> - We're offering ⚡️1,000,000 to the first 10 people that help us onboard - these businesses in Vancouver to take bitcoin payments. - </p> + let { data } = $props(); + let { users } = data; - <ul class="text-center text-lg space-y-3"> - <li>Grocery / Produce Store</li> - <li class="leading-3"> - <span class="line-through">Cafe</span><br /> - <span class="text-xs" - ><a href="/reverendhodl">ReverendHodl</a> for - <a href="/laughingbean">Laughing Bean Coffee Co.</a></span - > - </li> - <li>Bakery</li> - <li class="leading-3"> - <span class="line-through">Butcher Shop</span><br /> - <span class="text-xs" - ><a href="/danielle">danielle</a> for - <a href="/butchersguild">All Natural & Exotic Meats</a></span - > - </li> - <li>Laundromat / Dry Cleaner</li> - <li>Dollar Store / Book Store / Gift Shop</li> - <li class="leading-3"> - <span class="line-through">Sushi Restaurant</span><br /> - <span class="text-xs" - ><a href="/ica547">ica547</a> for - <a href="/metallmash">VanLove Sushi</a></span + let bounties = [ + "Clothing Store", + "Hardware Store", + "Gas Station", + "Shoe Repair", + "Dollar Store", + "Book Store", + "Gift Shop", + "Game or Toy Store", + "Pet Store", + "Pharmacy", + ]; + + let small = [ + { + type: "Restaurant", + amount: 50000, + }, + { type: "Cafe", amount: 30000 }, + { type: "Tradesperson or Professional", amount: 25000 }, + { type: "Food Truck", amount: 20000 }, + { type: "Farmer's Market Vendor", amount: 20000 }, + ]; +</script> + +<div class="space-y-5 pb-20"> + <h1 class="text-3xl mb-6 md:pt-12 font-bold">Coinos Bounties</h1> + + <p>Earn sats by referring us to local businesses in Vancouver!</p> + + <h2 class="text-2xl font-bold">Currently Available</h2> + + <div class="space-y-0"> + {#each bounties as b} + <div class="flex max-w-xs sm:max-w-xl"> + <div>First {b}</div> + + <iconify-icon + noobserver + icon="ph:lightning-fill" + class="text-yellow-300 ml-auto" + ></iconify-icon>{s(100000, "en-CA")} + </div> + {/each} + </div> + + <hr /> + + <div class="space-y-0"> + {#each small as b} + <div class="flex max-w-xs sm:max-w-xl"> + <div>{b.type}</div> + + <iconify-icon + noobserver + icon="ph:lightning-fill" + class="text-yellow-300 ml-auto" + ></iconify-icon>{s(b.amount, "en-CA")} + </div> + {/each} + </div> + + <h2 class="text-2xl font-bold">Previously Awarded</h2> + + <div class="flex flex-col gap-4"> + {#each users as { user, merchant, type }} + <article + class="rounded-2xl border border-neutral-200 bg-white/70 p-4 shadow-sm transition hover:shadow-md dark:border-neutral-800 dark:bg-neutral-900/60 sm:max-w-xl" > - </li> - <li>Pizza by the Slice</li> - <li>Liquor Store / Gas Station</li> - <li>Bubble Tea / Ice Cream Parlour</li> - </ul> + <div class="flex items-start gap-3 min-w-0 flex-wrap sm:flex-nowrap"> + <div> + <div class="flex"> + <div class="shrink-0"> + <Avatar user={merchant} size={12} /> + </div> - <p>Eligible businesses:</p> + <div class="flex items-center gap-2 min-w-0"> + <h3 + class="whitespace-wrap text-base font-semibold max-w-[150px] truncate sm:max-w-full" + title={merchant.display || merchant.username} + > + <a href={`/${merchant.username}`} + >{merchant.display || merchant.username}</a + > + </h3> - <ul class="text-sm ml-4 space-y-2"> - <li> - Have a physical location in Vancouver, North Vancouver, West Vancouver, - Burnaby, New Westminster, or Richmond - </li> - <li>Take walk-in customers</li> - <li>Have regular hours and a website with contact info</li> - <li>Have a 3 star or better rating on Google</li> - <li> - Accept bitcoin during their posted hours without needing to make any - special arrangements - </li> - <li>Use Coinos</li> - </ul> + <span + class="shrink-0 rounded-full border border-neutral-200 px-2 py-0.5 text-xs font-medium text-neutral-600 dark:border-neutral-700 dark:text-neutral-300" + > + {type} + </span> + </div> + </div> + + <div + class="mt-2 flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-300 min-w-0" + > + <Avatar {user} size={8} class="shrink-0" /> + <span class="truncate max-w-full" + >Referred by @{user.username}</span + > + </div> + </div> + + <div class="ml-auto flex shrink-0 items-center gap-1 whitespace"> + <iconify-icon + noobserver + icon="ph:lightning-fill" + class="text-yellow-300" + /> + <span class="text-sm font-semibold tabular-nums"> + {s(1000000, "en-CA")} + </span> + </div> + </div> + </article> + {/each} + </div> + + <h2 class="text-2xl font-bold">Terms and Conditions</h2> - <p>Each business category can be claimed only once</p> <p>One bounty per person</p> - <p> - The businesses can expect free ongoing support and promotion from us and our - community. - </p> + <div>Eligible businesses should:</div> + + <ul class="ml-4 space-y-0 list-disc"> + <li>Have a physical location in Greater Vancouver</li> + <li>Take walk-ins without appointments</li> + <li>Have a website with contact info</li> + <li>Have at least a 3-star rating on Google</li> + </ul> - <p>The prize money will be offered to the person who makes the referral.</p> + <div>They will be expected to:</div> + + <ul class="ml-4 space-y-0 list-disc"> + <li>Display a window sticker and QR</li> + <li>Train staff on Bitcoin procedures</li> + <li>Accept Bitcoin during posted business hours</li> + </ul> <p> - <b>⚡️250,000</b> will be awarded once the business has met with us and is ready - to take payments + 25% of the bounty will be awarded once the business is ready to take + payments and has been announced </p> + <p> - <b>⚡️750,000</b> will be awarded once the merchant has accepted bitcoin for - 6 months. We'll be sending - <a - href="https://btcmap.org/leaderboard" - class="text-black hover:underline" - target="_blank" - rel="noreferrer">shadowy supertaggers</a - > to check up on them periodically. + The rest will be awarded once they've been accepting Bitcoin for 6 months </p> + <p>Bounties will be awarded at our discretion</p> + <p> - Bounties will be awarded solely at our discretion and we reserve the right - to refuse any applicants without cause + We reserve the right to refuse applicants and change these terms without + cause or notice </p> - <h2 class="text-xl">Ready to begin!?</h2> + <h2 class="text-2xl font-bold">Get Started!</h2> <p> - To make a referral, reach out on one of our socials or email us at <a + Reach out to <a href="mailto:[email protected]" - class="text-black hover:underline">[email protected]</a - > and we'll set up an appointment with you and the business owner to get started. + class="text-blue-600 hover:underline">[email protected]</a + > and let us know who we should contact </p> <p> @@ -98,11 +176,10 @@ which ones are still available. </p> + <p> + Have a lead or idea for something that's not on the list? Reach out! We + offer sats for all sorts of referrals! + </p> + <p>Thanks for participating and helping to orange pill Vancouver!</p> </div> - -<style> - a { - @apply text-blue-400; - } -</style> diff --git a/src/routes/(static)/docs/+page.svelte b/src/routes/(static)/docs/+page.svelte index 7ac6e013..f53787e5 100644 --- a/src/routes/(static)/docs/+page.svelte +++ b/src/routes/(static)/docs/+page.svelte @@ -105,16 +105,18 @@ <div class="text-secondary"> <div>Request params</div> <div class="grid grid-cols-3 ml-2"> - <div class="font-bold">type</div> + <div class="font-bold">type (string, default: lightning)</div> <div class="col-span-2">bitcoin or lightning</div> - <div class="font-bold">amount</div> - <div class="col-span-2">amount in satoshis</div> - <div class="font-bold">webhook</div> + <div class="font-bold">fiat (boolean, default: false)</div> + <div class="col-span-2">whether the amount is denominated in satoshis or local currency</div> + <div class="font-bold">amount (numeric)</div> + <div class="col-span-2">amount to be paid</div> + <div class="font-bold">webhook (string, optional)</div> <div class="col-span-2"> - (optional) endpoint to hit when the invoice is paid + remote endpoint to call when the invoice is paid </div> - <div class="font-bold">secret</div> - <div class="col-span-2">a secret for the webhook to check</div> + <div class="font-bold">secret (string, optional)</div> + <div class="col-span-2">a secret value passed to the webhook to authenticate the request</div> </div> </div> diff --git a/src/routes/(static)/login/+page.server.ts b/src/routes/(static)/login/+page.server.ts index a24abd07..ffe6335d 100644 --- a/src/routes/(static)/login/+page.server.ts +++ b/src/routes/(static)/login/+page.server.ts @@ -11,6 +11,7 @@ export const load = async ({ parent }) => { export const actions = { login: async ({ cookies, request }) => { + console.log(request.headers.get('referer')); const form = await fd(request); let { username, password, token, loginRedirect } = form; const user = { username, password, token }; diff --git a/src/routes/(static)/login/+page.svelte b/src/routes/(static)/login/+page.svelte index 1a1f745c..825f6a88 100644 --- a/src/routes/(static)/login/+page.svelte +++ b/src/routes/(static)/login/+page.svelte @@ -124,7 +124,7 @@ </script> <div - class="mx-auto md:shadow-xl rounded-3xl max-w-xl w-full md:w-[480px] md:p-8 mb-20" + class="mx-auto md:shadow-xl rounded-3xl max-w-xl w-full md:w-[480px] md:p-8 mb-20 space-y-5" > <h1 class="text-2xl font-bold text-center">{$t("login.signIn")}</h1> {#if form?.error && !form?.message.includes("2fa")} diff --git a/src/routes/(static)/login/[token]/+page.server.ts b/src/routes/(static)/login/[token]/+page.server.ts new file mode 100644 index 00000000..8fe49578 --- /dev/null +++ b/src/routes/(static)/login/[token]/+page.server.ts @@ -0,0 +1,13 @@ +import { redirect } from "@sveltejs/kit"; + +export const load = async ({ cookies, params }) => { + const { token } = params; + const maxAge = 380 * 24 * 60 * 60; + + const expires = new Date(); + expires.setSeconds(expires.getSeconds() + maxAge); + + const opts = { path: "/", expires }; + cookies.set("token", token, opts); + redirect(307, "/login"); +}; diff --git a/src/routes/(static)/register/+page.server.ts b/src/routes/(static)/register/+page.server.ts index 2c2807bd..cddd97ea 100644 --- a/src/routes/(static)/register/+page.server.ts +++ b/src/routes/(static)/register/+page.server.ts @@ -1,5 +1,5 @@ -import { fd, get, login, post } from "$lib/utils"; -import { fail, redirect } from "@sveltejs/kit"; +import { fd, get, register } from "$lib/utils"; +import { redirect } from "@sveltejs/kit"; export const load = async ({ parent }) => { const { user } = await parent(); @@ -14,39 +14,12 @@ export const load = async ({ parent }) => { export const actions = { default: async ({ cookies, request }) => { const ip = request.headers.get("cf-connecting-ip"); - const form = await fd(request); - let { picture, username, password, pubkey, loginRedirect } = form; - const user = { picture, username, password, pubkey }; - let error; - + const { picture, username, password } = form; + let { loginRedirect } = form; if (loginRedirect === "undefined") loginRedirect = undefined; - let sk; - try { - ({ sk } = await post("/register", { user }, { "cf-connecting-ip": ip })); - } catch (e) { - ({ message: error } = e as Error); - } - - try { - await login(user, cookies, ip); - error = null; - } catch (e) { - const { message } = e as Error; - error ||= message; - } - - const expires = new Date(); - expires.setSeconds(expires.getSeconds() + 21000000); - cookies.set("sk", sk, { - path: "/", - expires, - httpOnly: false, - sameSite: "lax", - }); - - if (error) return fail(400, { error }); - redirect(303, loginRedirect || `/${user.username}`); + const user = { picture, username, password }; + return register(user, ip, cookies, loginRedirect); }, }; diff --git a/src/routes/(static)/register/+page.svelte b/src/routes/(static)/register/+page.svelte index 43cafe6e..b0368d47 100644 --- a/src/routes/(static)/register/+page.svelte +++ b/src/routes/(static)/register/+page.svelte @@ -222,7 +222,7 @@ <h1 class="text-2xl font-bold text-center">{$t("login.createAccount")}</h1> <input type="file" - class="hidden" + class="hidden!" bind:this={avatarInput} onchange={(e) => handleFile(e, "picture")} /> @@ -263,9 +263,10 @@ </button> </div> - {#if form?.error} + {#if form?.error || form?.message} <div class="text-red-600 text-center" in:fly> - {form.error} + {form?.message} + {form?.error} </div> {/if} |
