aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-03-03 14:39:08 -0800
committerAdam Soltys <[email protected]>2026-03-03 14:39:08 -0800
commit6624b19b1d954dc69afbf1a9f6072e791771aff5 (patch)
treeb558d6673be563ee1038abf9c55b7b509097f1b7 /src
parent41c6636efee032a29c380ef0ee7ef73a99f64cd5 (diff)
downloadcoinos-ui-6624b19b1d954dc69afbf1a9f6072e791771aff5.tar.gz
coinos-ui-6624b19b1d954dc69afbf1a9f6072e791771aff5.zip
static page loads
Diffstat (limited to 'src')
-rw-r--r--src/components/Success.svelte2
-rw-r--r--src/locales/en.json3
-rw-r--r--src/routes/(app)/+layout.server.ts38
-rw-r--r--src/routes/(app)/invoice/[id]/paid/+page.svelte2
-rw-r--r--src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte59
-rw-r--r--src/routes/(static)/+layout.server.ts4
-rw-r--r--src/routes/(static)/login/+page.server.ts7
-rw-r--r--src/routes/(static)/register/+page.server.ts7
-rw-r--r--src/routes/(static)/register/auth/+page.server.ts7
-rw-r--r--src/routes/+layout.server.ts29
-rw-r--r--src/routes/+page.ts1
11 files changed, 69 insertions, 90 deletions
diff --git a/src/components/Success.svelte b/src/components/Success.svelte
index 71acfe7f..25ea7668 100644
--- a/src/components/Success.svelte
+++ b/src/components/Success.svelte
@@ -58,7 +58,7 @@
</div>
</div>
- <PhCheckFatFill width="160" class="text-green-400" />
+ <PhCheckFatFill width="160" class="text-green-400 mx-auto" />
{/if}
<h1 class="text-3xl md:text-4xl font-bold mb-6">{title}</h1>
<Amount {amount} {tip} {rate} {currency} {locale} />
diff --git a/src/locales/en.json b/src/locales/en.json
index 4249412a..7db19d3d 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -589,7 +589,10 @@
"fast": "Fast",
"ecashDesc": "Ecash tokens are funded with bitcoin. They may be redeemed in exchange for a lightning payment equal to their value or loaded back into a coinos account at any time. They can also be transferred to other ecash wallets either wholly or partially. You might use them to give bitcoin to someone who doesn't have a wallet by texting the token to them or sharing a link to it. Learn more at",
"ecashToken": "Ecash token",
+ "low": "Low",
"medium": "Medium",
+ "high": "High",
+ "priority": "Priority",
"maxFeeDesc": "Set an upper limit on the network routing fee. If set too low the payment may fail. You can set it higher and try again. We debit the full amount while attempting the payment but credit back any unused portion.",
"slow": "Slow",
"create": "Create",
diff --git a/src/routes/(app)/+layout.server.ts b/src/routes/(app)/+layout.server.ts
index 249c0451..f1cb4d24 100644
--- a/src/routes/(app)/+layout.server.ts
+++ b/src/routes/(app)/+layout.server.ts
@@ -1,18 +1,38 @@
-import { auth, get } from "$lib/utils";
+import { auth, get, isInvalidTokenError, sleep } from "$lib/utils";
import { error, redirect } from "@sveltejs/kit";
-export async function load({ cookies, request, url, params, parent }) {
+export async function load({ cookies, url, params }) {
const { pathname } = url;
const { id, username } = params;
const token = cookies.get("token");
- const { user } = await parent();
- const hasArk = token
- ? (await get("/accounts", auth(cookies))).some((a: any) => a.type === "ark")
- : false;
+ if (!token) redirect(307, "/login");
- let subject;
+ let user;
+ try {
+ user = await get("/me", auth(cookies));
+ } catch (e) {
+ const { message } = e as Error;
+ if (message.startsWith("Rate")) {
+ await sleep(3000);
+ try {
+ user = await get("/me", auth(cookies));
+ } catch (retryError) {
+ if (isInvalidTokenError(retryError) && pathname !== "/logout") {
+ redirect(307, "/logout");
+ }
+ throw retryError;
+ }
+ } else if (isInvalidTokenError(e) && pathname !== "/logout") {
+ redirect(307, "/logout");
+ } else {
+ throw e;
+ }
+ }
+
+ const hasArk = (await get("/accounts", auth(cookies))).some((a: any) => a.type === "ark");
+ let subject;
if (url.pathname.includes("/invoice") && id) {
try {
({ user: subject } = await get(`/invoice/${id}`));
@@ -31,10 +51,6 @@ export async function load({ cookies, request, url, params, parent }) {
redirect(307, "/migrate");
}
- if (user && ["/login", "/register"].includes(pathname) && request.method === "GET") {
- redirect(307, `/${user.username}`);
- }
-
const theme = cookies.get("theme") || "light";
return { user, token, subject, theme, hasArk };
diff --git a/src/routes/(app)/invoice/[id]/paid/+page.svelte b/src/routes/(app)/invoice/[id]/paid/+page.svelte
index d4a82652..0b49c146 100644
--- a/src/routes/(app)/invoice/[id]/paid/+page.svelte
+++ b/src/routes/(app)/invoice/[id]/paid/+page.svelte
@@ -15,7 +15,7 @@
<div class="container px-4 text-center mx-auto">
{#if pending}
- <PhClockBold width="160" class="text-warning" />
+ <PhClockBold width="160" class="text-warning mx-auto" />
<h1 class="text-3xl md:text-4xl font-bold mb-6">Payment detected</h1>
diff --git a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte
index fcae8598..d5eb0293 100644
--- a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte
+++ b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte
@@ -152,14 +152,10 @@
submit: any = $state(),
showSettings = $state();
- let customRate = $state("");
- let showCustom = $state(false);
-
let presets = $derived(fees ? [
- { label: $t("payments.economy"), rate: 0.1 },
+ { label: $t("payments.low"), rate: 0.1 },
{ label: $t("payments.medium"), rate: fees.hourFee },
- { label: $t("payments.fast"), rate: fees.halfHourFee },
- { label: $t("payments.fastest"), rate: fees.fastestFee },
+ { label: $t("payments.high"), rate: fees.fastestFee },
] : []);
let toggleSettings = () => (showSettings = !showSettings);
@@ -169,12 +165,11 @@
let pickRate = (r: number) => {
feeRate = r;
- showCustom = false;
setFee();
};
let applyCustom = () => {
- const r = parseFloat(customRate);
+ const r = parseFloat(String(feeRate));
if (r >= 0.1) {
feeRate = r;
setFee();
@@ -203,43 +198,35 @@
{#if fees}
<div class="text-center">
- <h2 class="text-secondary text-lg">{$t("payments.networkFee")}</h2>
-
- <div class="flex flex-wrap gap-2 justify-center mb-2">
+ <h2 class="text-secondary text-lg">{$t("payments.priority")}</h2>
+ <div class="flex gap-2 justify-center mb-2">
{#each presets as preset}
<button
type="button"
- class="btn btn-sm"
- class:btn-accent={feeRate == preset.rate && !showCustom}
+ class="btn btn-sm !w-auto"
+ class:btn-accent={feeRate == preset.rate}
onclick={() => pickRate(preset.rate)}
>
- {preset.label} ({preset.rate})
+ {preset.label}
</button>
{/each}
- <button
- type="button"
- class="btn btn-sm"
- class:btn-accent={showCustom}
- onclick={() => { showCustom = true; customRate = String(feeRate); }}
- >
- Custom
- </button>
</div>
- {#if showCustom}
- <div class="flex items-center justify-center gap-2 mb-2">
- <input
- type="number"
- min="0.1"
- step="0.1"
- class="input input-bordered w-24 text-center"
- bind:value={customRate}
- onblur={applyCustom}
- onkeydown={(e) => e.key === 'Enter' && applyCustom()}
- />
- <span class="text-secondary text-sm">sat/vB</span>
- </div>
- {/if}
+ <div class="flex items-center justify-center gap-2 mb-2">
+ <input
+ type="number"
+ min="0.1"
+ step="0.1"
+ class="input input-bordered w-24 text-center"
+ value={feeRate}
+ oninput={(e) => {
+ const r = parseFloat(e.currentTarget.value);
+ if (r >= 0.1) { feeRate = r; setFee(); }
+ }}
+ onkeydown={(e) => e.key === 'Enter' && applyCustom()}
+ />
+ <span class="text-secondary text-sm">sat/vB</span>
+ </div>
<Amount amount={fee} rate={$rate} {currency} {locale} />
</div>
diff --git a/src/routes/(static)/+layout.server.ts b/src/routes/(static)/+layout.server.ts
deleted file mode 100644
index a6c5a722..00000000
--- a/src/routes/(static)/+layout.server.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export async function load({ parent }) {
- const { user } = await parent();
- return { user };
-}
diff --git a/src/routes/(static)/login/+page.server.ts b/src/routes/(static)/login/+page.server.ts
index 480116b5..a59aa78c 100644
--- a/src/routes/(static)/login/+page.server.ts
+++ b/src/routes/(static)/login/+page.server.ts
@@ -2,9 +2,10 @@ import { PUBLIC_COINOS_URL } from "$env/static/public";
import { fd, get, login } from "$lib/utils";
import { fail, redirect } from "@sveltejs/kit";
-export const load = async ({ parent }) => {
- const { user } = await parent();
- if (user?.pubkey) redirect(307, `/${user.username}`);
+export const load = async ({ cookies }) => {
+ const token = cookies.get("token");
+ const username = cookies.get("username");
+ if (token && username) redirect(307, `/${username}`);
const { challenge } = await get("/challenge");
return { challenge };
};
diff --git a/src/routes/(static)/register/+page.server.ts b/src/routes/(static)/register/+page.server.ts
index e56f4e14..2a70517a 100644
--- a/src/routes/(static)/register/+page.server.ts
+++ b/src/routes/(static)/register/+page.server.ts
@@ -1,8 +1,9 @@
import { redirect } from "@sveltejs/kit";
-export const load = async ({ parent }) => {
- const { user } = await parent();
- if (user) redirect(307, `/${user.username}`);
+export const load = async ({ cookies }) => {
+ const token = cookies.get("token");
+ const username = cookies.get("username");
+ if (token && username) redirect(307, `/${username}`);
const index = Math.floor(Math.random() * 64) + 1;
diff --git a/src/routes/(static)/register/auth/+page.server.ts b/src/routes/(static)/register/auth/+page.server.ts
index 29e9a3f8..282081f9 100644
--- a/src/routes/(static)/register/auth/+page.server.ts
+++ b/src/routes/(static)/register/auth/+page.server.ts
@@ -1,9 +1,10 @@
import { fd, get, login, post } from "$lib/utils";
import { fail, redirect } from "@sveltejs/kit";
-export const load = async ({ parent, url }) => {
- const { user } = await parent();
- if (user) redirect(307, `/${user.username}`);
+export const load = async ({ cookies, url }) => {
+ const token = cookies.get("token");
+ const cookieUser = cookies.get("username");
+ if (token && cookieUser) redirect(307, `/${cookieUser}`);
const username = url.searchParams.get("username");
if (!username) redirect(307, "/register");
diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts
index 9f0c584d..61c46ea6 100644
--- a/src/routes/+layout.server.ts
+++ b/src/routes/+layout.server.ts
@@ -1,36 +1,10 @@
import { defaultLocale, loadTranslations, locales } from "$lib/translations/index";
-import { auth, get, isInvalidTokenError, sleep } from "$lib/utils";
-import { redirect } from "@sveltejs/kit";
export const load = async ({ cookies, request, url }) => {
const { pathname } = url;
- let user;
- const token = cookies.get("token");
- if (token) {
- try {
- user = await get("/me", auth(cookies));
- } catch (e) {
- const { message } = e as Error;
- if (message.startsWith("Rate")) {
- await sleep(3000);
- try {
- user = await get("/me", auth(cookies));
- } catch (retryError) {
- if (isInvalidTokenError(retryError) && pathname !== "/logout") {
- redirect(307, "/logout");
- }
- throw retryError;
- }
- } else if (isInvalidTokenError(e) && pathname !== "/logout") {
- redirect(307, "/logout");
- } else {
- throw e;
- }
- }
- }
// Try to get the locale from cookie
- let locale = user?.language || (cookies.get("lang") || "").toLowerCase();
+ let locale = (cookies.get("lang") || "").toLowerCase();
// Get user preferred locale
if (!locale) {
@@ -55,6 +29,5 @@ export const load = async ({ cookies, request, url }) => {
theme,
pathname,
i18n: { locale, route: pathname },
- user,
};
};
diff --git a/src/routes/+page.ts b/src/routes/+page.ts
new file mode 100644
index 00000000..189f71e2
--- /dev/null
+++ b/src/routes/+page.ts
@@ -0,0 +1 @@
+export const prerender = true;