From 13f9ef7f26fff64c2bd54c8f9aa14e6ffac67121 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Wed, 11 Feb 2026 23:23:32 -0800 Subject: fix svelte errors --- src/app.d.ts | 6 ++++ src/components/404.svelte | 2 +- src/components/Account.svelte | 2 +- src/components/AmountField.svelte | 2 +- src/components/Event.svelte | 2 +- src/components/InvoiceTypes.svelte | 2 +- src/components/LandingInfoCard.svelte | 3 +- src/components/Lnurlp.svelte | 9 ++++-- src/components/Lnurlw.svelte | 10 +++++-- src/components/Qr.svelte | 2 +- src/components/WalletPass.svelte | 1 + src/lib/nip11.ts | 2 +- src/lib/nip40.ts | 4 +-- src/lib/nip44.ts | 6 ++-- src/lib/nostr.ts | 11 ++++---- src/lib/parse.ts | 6 ++-- src/lib/store.ts | 4 +-- src/lib/utils.ts | 4 +-- src/routes/(app)/+error.svelte | 4 +-- src/routes/(app)/+layout.svelte | 12 +++++--- .../(app)/[username]/(profile)/+layout.svelte | 5 ++-- src/routes/(app)/[username]/(profile)/+page.svelte | 6 ++-- .../[username]/(profile)/notes/new/+page.svelte | 2 +- src/routes/(app)/[username]/+layout.svelte | 4 ++- .../(app)/[username]/accepted/create/+page.svelte | 12 +++++--- src/routes/(app)/account/[id]/+page.svelte | 17 ++++++------ src/routes/(app)/account/ark/+page.svelte | 2 +- src/routes/(app)/account/import/+page.svelte | 6 ++-- src/routes/(app)/account/pass/+page.svelte | 2 +- src/routes/(app)/account/seed/+page.svelte | 2 +- src/routes/(app)/admin/+layout.svelte | 2 +- src/routes/(app)/admin/+page.svelte | 2 +- src/routes/(app)/apps/new/+page.server.ts | 4 +-- src/routes/(app)/apps/new/+page.svelte | 2 +- src/routes/(app)/dm/+page.svelte | 16 +++++------ .../ecash/[id]/[...version]/+layout.server.ts | 6 ++-- .../(app)/ecash/[id]/[...version]/+layout.svelte | 15 +++++++--- .../(app)/ecash/[id]/[...version]/+page.svelte | 8 +++--- src/routes/(app)/firehose/+page.svelte | 2 +- src/routes/(app)/fund/[id]/+page.server.ts | 2 +- src/routes/(app)/fund/[id]/+page.svelte | 8 ++++-- .../[id]/authorize/[...amount]/+page.server.ts | 2 +- .../fund/[id]/authorize/[...amount]/+page.svelte | 7 ++++- .../fund/[id]/sweep/[...amount]/+page.server.ts | 5 ++-- .../(app)/fund/[id]/sweep/[...amount]/+page.svelte | 8 +++++- src/routes/(app)/fund/[id]/withdraw/+page.svelte | 14 ++++++---- src/routes/(app)/funder/+page.svelte | 25 ++++++++--------- src/routes/(app)/invoice/+page.server.ts | 2 +- src/routes/(app)/invoice/[id]/tip/+page.svelte | 32 +++++++++++----------- src/routes/(app)/invoice/sent/+page.svelte | 4 +-- src/routes/(app)/items/[id]/+page.svelte | 3 +- src/routes/(app)/items/create/+page.svelte | 2 +- src/routes/(app)/ln/[lnurl]/+page.server.ts | 2 +- src/routes/(app)/ln/[lnurl]/+page.svelte | 8 +++--- src/routes/(app)/ln/withdrawal/sent/+page.svelte | 2 +- src/routes/(app)/messages/+page.server.ts | 7 +++-- src/routes/(app)/messages/+page.svelte | 10 +++++-- .../(app)/messages/[recipient]/+page.server.ts | 4 +-- src/routes/(app)/messages/[recipient]/+page.svelte | 8 ++++-- .../pay/[username]/[...amount]/+page.server.ts | 2 +- .../(app)/pay/[username]/[...amount]/+page.svelte | 8 +++--- src/routes/(app)/payment/[id]/+page.svelte | 9 +++--- src/routes/(app)/payment/[id]/plain/+page.svelte | 22 ++++++++++----- src/routes/(app)/payments/[...page]/+page.svelte | 20 +++++++------- src/routes/(app)/pos/+page.svelte | 2 +- src/routes/(app)/printer/+page.svelte | 8 +++--- src/routes/(app)/qr/[text]/[icon]/+server.ts | 2 +- src/routes/(app)/qr/create/+page.svelte | 7 +++-- src/routes/(app)/receive/[...token]/+page.svelte | 6 ++-- src/routes/(app)/reset/[code]/+page.server.ts | 2 +- src/routes/(app)/reset/[code]/+page.svelte | 8 +++--- src/routes/(app)/send/+layout.svelte | 2 +- src/routes/(app)/send/ark/[address]/+page.svelte | 16 ++++++----- .../[address]/[amount]/[...feeRate]/+page.svelte | 7 +++-- .../(app)/send/bitcoin/[address]/+page.svelte | 18 ++++++------ .../[address]/[amount]/[...feeRate]/+page.svelte | 5 ++-- .../send/fund/[...name]/[...amount]/+page.svelte | 20 ++++++++------ src/routes/(app)/send/invoice/[id]/+page.svelte | 13 +++++++-- src/routes/(app)/sent/[id]/+page.svelte | 9 ++++-- src/routes/(app)/settings/+layout.server.ts | 1 - src/routes/(app)/settings/account/+page.svelte | 6 ++-- src/routes/(app)/sign/+page.svelte | 2 +- src/routes/(app)/verify/[code]/+page.svelte | 3 +- src/routes/(static)/bounties/+page.server.ts | 8 +++++- src/routes/(static)/bounties/+page.svelte | 2 +- src/routes/(static)/docs/+page.svelte | 8 ++++-- src/routes/(static)/login/+page.server.ts | 8 +++--- src/routes/(static)/register/+page.svelte | 2 +- src/routes/+error.svelte | 4 +-- src/routes/+layout.svelte | 13 +++++---- src/routes/+layout.ts | 2 +- src/routes/+page.svelte | 2 +- 92 files changed, 357 insertions(+), 254 deletions(-) (limited to 'src') diff --git a/src/app.d.ts b/src/app.d.ts index 3673ad85..a6cb4324 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -23,4 +23,10 @@ interface Window { }; }; maplibregl?: any; + AndroidNotch?: { + getInsetTop(success: (px: number) => void, error: (err: any) => void): void; + getInsetBottom(success: (px: number) => void, error: (err: any) => void): void; + getInsetRight(success: (px: number) => void, error: (err: any) => void): void; + getInsetLeft(success: (px: number) => void, error: (err: any) => void): void; + }; } diff --git a/src/components/404.svelte b/src/components/404.svelte index 5a7ba663..317ff968 100644 --- a/src/components/404.svelte +++ b/src/components/404.svelte @@ -4,7 +4,7 @@
- + diff --git a/src/components/Account.svelte b/src/components/Account.svelte index 55766512..5641226f 100644 --- a/src/components/Account.svelte +++ b/src/components/Account.svelte @@ -144,7 +144,7 @@ {:else if seed || (user.seed && fingerprint)} {:else} - + Coinos {/if} {displayName} diff --git a/src/components/AmountField.svelte b/src/components/AmountField.svelte index 56b98d49..810e36f1 100644 --- a/src/components/AmountField.svelte +++ b/src/components/AmountField.svelte @@ -26,7 +26,7 @@ await tick(); numpad.focus(); }; - let numpad = $state(); + let numpad: HTMLDivElement = $state() as HTMLDivElement;
diff --git a/src/components/Event.svelte b/src/components/Event.svelte index 03b93695..7a9c75d4 100644 --- a/src/components/Event.svelte +++ b/src/components/Event.svelte @@ -11,7 +11,7 @@ let amount = 21; let { event, minimal = false, last = true, user = undefined }: any = $props(); let { author, parts, zaps, names, created_at, pubkey } = $derived(event); - let { id } = event; + let id = $derived(event.id); let zapping = $state(); let zap = async () => { diff --git a/src/components/InvoiceTypes.svelte b/src/components/InvoiceTypes.svelte index b3c430a2..5845f699 100644 --- a/src/components/InvoiceTypes.svelte +++ b/src/components/InvoiceTypes.svelte @@ -10,7 +10,7 @@ toggleType, setAmount, setType, - activeOnly, + activeOnly = false, } = $props(); let { aid, address_type, type } = $derived(invoice); diff --git a/src/components/LandingInfoCard.svelte b/src/components/LandingInfoCard.svelte index 6052b0c5..707cae2f 100644 --- a/src/components/LandingInfoCard.svelte +++ b/src/components/LandingInfoCard.svelte @@ -1,7 +1,8 @@
diff --git a/src/components/Lnurlp.svelte b/src/components/Lnurlp.svelte index adb1a781..cde26d86 100644 --- a/src/components/Lnurlp.svelte +++ b/src/components/Lnurlp.svelte @@ -8,8 +8,13 @@ import { pin } from "$lib/store"; let { data, form, send = $bindable(), comment = $bindable() } = $props(); - let { currency } = data.user; - let { minSendable, maxSendable, commentAllowed, callback, metadata, rate } = data; + let currency = $derived(data.user.currency); + let minSendable = $derived(data.minSendable); + let maxSendable = $derived(data.maxSendable); + let commentAllowed = $derived(data.commentAllowed); + let callback = $derived(data.callback); + let metadata = $derived(data.metadata); + let rate = $derived(data.rate); let amount = $state(Math.round(minSendable / 1000)), loading = $state(); diff --git a/src/components/Lnurlw.svelte b/src/components/Lnurlw.svelte index 38d103bd..e51a247a 100644 --- a/src/components/Lnurlw.svelte +++ b/src/components/Lnurlw.svelte @@ -10,8 +10,14 @@ let { data, form } = $props(); - let { currency, username } = data.user; - let { defaultDescription, minWithdrawable, maxWithdrawable, k1, callback, rate } = data; + let currency = $derived(data.user.currency); + let username = $derived(data.user.username); + let defaultDescription = $derived(data.defaultDescription); + let minWithdrawable = $derived(data.minWithdrawable); + let maxWithdrawable = $derived(data.maxWithdrawable); + let k1 = $derived(data.k1); + let callback = $derived(data.callback); + let rate = $derived(data.rate); let amount = $state(Math.round(minWithdrawable / 1000)); let amountFiat = $derived(parseFloat(((amount * rate) / sats).toFixed(2))); diff --git a/src/components/Qr.svelte b/src/components/Qr.svelte index c2014348..d5dbfc41 100644 --- a/src/components/Qr.svelte +++ b/src/components/Qr.svelte @@ -10,7 +10,7 @@ screenfull = (await import("screenfull")).default; }); - let src = $derived(() => { + let src = $derived.by(() => { let url = `/qr/${encodeURIComponent(text)}`; if (icon) url += `/${icon}`; else url += "/raw"; diff --git a/src/components/WalletPass.svelte b/src/components/WalletPass.svelte index 0d1b014a..052f9fd0 100644 --- a/src/components/WalletPass.svelte +++ b/src/components/WalletPass.svelte @@ -53,6 +53,7 @@ type="button" onclick={() => (revealPassword = !revealPassword)} class="absolute right-5 top-1/2" + aria-label={revealPassword ? "Hide password" : "Show password"} > { - let supportingRelays = []; + let supportingRelays: string[] = []; for (const relay of relays) { const relayInfo = await fetchRelayInformation(relay); diff --git a/src/lib/nip40.ts b/src/lib/nip40.ts index 760a6680..e384b565 100644 --- a/src/lib/nip40.ts +++ b/src/lib/nip40.ts @@ -1,12 +1,12 @@ // Returns true if the message has an expiration in the past, false otherwise. -export const expired = (event: object): boolean => { +export const expired = (event: { tags: string[][] }): boolean => { const expiryTime = expiration(event); return expiryTime !== null && Date.now() / 1000 >= expiryTime; }; // Returns the provided event's expiration time, as a Unix ms integer. // If it has none, returns null. -export const expiration = (event: object): number | null => { +export const expiration = (event: { tags: string[][] }): number | null => { for (const tag of event.tags) { if (tag[0] == "expiration") { return parseInt(tag[1]); diff --git a/src/lib/nip44.ts b/src/lib/nip44.ts index f1f872b5..6025a54f 100644 --- a/src/lib/nip44.ts +++ b/src/lib/nip44.ts @@ -8,7 +8,7 @@ import { secp256k1 } from "@noble/curves/secp256k1.js"; import { extract as hkdf_extract, expand as hkdf_expand } from "@noble/hashes/hkdf.js"; import { hmac } from "@noble/hashes/hmac.js"; import { sha256 } from "@noble/hashes/sha2.js"; -import { concatBytes, randomBytes, utf8ToBytes } from "@noble/hashes/utils.js"; +import { concatBytes, hexToBytes, randomBytes, utf8ToBytes } from "@noble/hashes/utils.js"; import { base64 } from "@scure/base"; declare const TextDecoder: any; @@ -24,8 +24,8 @@ export const u = { }, getConversationKey(privkeyA: string, pubkeyB: string): Uint8Array { - const sharedX = secp256k1.getSharedSecret(privkeyA, "02" + pubkeyB).subarray(1, 33); - return hkdf_extract(sha256, sharedX, "nip44-v2"); + const sharedX = secp256k1.getSharedSecret(hexToBytes(privkeyA), hexToBytes("02" + pubkeyB)).subarray(1, 33); + return hkdf_extract(sha256, sharedX, utf8ToBytes("nip44-v2")); }, getMessageKeys(conversationKey: Uint8Array, nonce: Uint8Array) { diff --git a/src/lib/nostr.ts b/src/lib/nostr.ts index 2a8975ec..d2e95a6d 100644 --- a/src/lib/nostr.ts +++ b/src/lib/nostr.ts @@ -63,7 +63,7 @@ export const getPrivateKey = async (user: User): Promise => { k = localStorage.getItem("nsec"); if (k) { const { nip19 } = await loadNostrTools(); - return nip19.decode(k).data as Uint8Array; + return nip19.decode(k).data as unknown as Uint8Array; } } @@ -118,8 +118,8 @@ export const sign = async (event: any, user?: any) => { } eventToSign.set(event); - let unsubscribe; - const { method, params } = await new Promise((r, j) => { + let unsubscribe: (() => void) | undefined; + const { method, params } = await new Promise<{ method: string; params: any }>((r, j) => { unsubscribe = $signer.subscribe((v) => { if (v === "cancel") { j("cancelled"); @@ -128,7 +128,7 @@ export const sign = async (event: any, user?: any) => { v?.ready && r(v); }); }); - await unsubscribe(); + await unsubscribe?.(); const signedEvent = await signingMethods[method](event, params); eventToSign.set(signedEvent); setTimeout(() => eventToSign.set(null), 1000); @@ -163,10 +163,9 @@ const signingMethods: Record Promise> { created_at: Math.round(Date.now() / 1000), kind: 24133, - pubkey, content, tags: [["p", pk]], - }, + } as EventTemplate, sk, ); diff --git a/src/lib/parse.ts b/src/lib/parse.ts index 2af661a3..48541728 100644 --- a/src/lib/parse.ts +++ b/src/lib/parse.ts @@ -80,10 +80,10 @@ export default async (s, host, cookies) => { if (invoice) redirect(307, `/invoice/${invoice.id}`); if (t.match(/^🥜([\uFE00-\uFE0F]|[\uE0100-\uE01EF]+)$/)) { - t = Array.from(t) + t = (Array.from(t) as string[]) .slice(1) - .map((char) => { - const codePoint = char.codePointAt(0); + .map((char: string) => { + const codePoint = char.codePointAt(0)!; // Handle Variation Selectors (VS1-VS16): U+FE00 to U+FE0F if (codePoint >= 0xfe00 && codePoint <= 0xfe0f) { diff --git a/src/lib/store.ts b/src/lib/store.ts index 3d688535..7499e148 100644 --- a/src/lib/store.ts +++ b/src/lib/store.ts @@ -1,5 +1,5 @@ import { browser } from "$app/environment"; -import { writable } from "svelte/store"; +import { writable, type Writable } from "svelte/store"; export const persistSession = (key, defaultValue = undefined) => { const s = writable( @@ -72,7 +72,7 @@ export const banner = writable(); export const event = writable(); export const events = writable({}); export const fiat = persistLocalValue("fiat", true); -export const installPrompt = writable(); +export const installPrompt: Writable = writable(); export const invoice = writable(); export const last = writable(); export const loginRedirect = writable(); diff --git a/src/lib/utils.ts b/src/lib/utils.ts index c1514d6b..a96db03d 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -331,7 +331,7 @@ export const f = ( minimumFractionDigits = 2, maximumFractionDigits = 2, ) => { - const l = typeof locale === "function" ? locale() : locale || "en-US"; + const l = typeof locale === "function" ? (locale as () => string)() : locale || "en-US"; const cur = currency || "USD"; const region = l.length >= 2 ? l.slice(-2) : ""; const currencyDisplay = region && cur.startsWith(region) ? "narrowSymbol" : "symbol"; @@ -345,7 +345,7 @@ export const f = ( }; export const s = (s: number, locale = "en-US"): string => { - const l = typeof locale === "function" ? locale() : locale || "en-US"; + const l = typeof locale === "function" ? (locale as () => string)() : locale || "en-US"; return new Intl.NumberFormat(l, { maximumFractionDigits: 0 }).format(s); }; diff --git a/src/routes/(app)/+error.svelte b/src/routes/(app)/+error.svelte index 0e31333c..d94eed63 100644 --- a/src/routes/(app)/+error.svelte +++ b/src/routes/(app)/+error.svelte @@ -9,7 +9,7 @@
@@ -20,7 +20,7 @@

Error

Something went wrong

-

{$page.error.message}

+

{$page.error?.message}

diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index 6ac9bed5..54ae72b5 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -33,8 +33,12 @@ let token = $derived(data.token); let theme = $derived(data.theme); - $effect(() => ($themeStore = theme)); - $effect(() => (theme = $themeStore)); + $effect(() => { + $themeStore = theme; + }); + $effect(() => { + theme = $themeStore; + }); afterNavigate(() => { document.cookie = `pathname=${$page.url.pathname}; path=/; max-age=86400`; @@ -58,7 +62,7 @@ if (result?.received > 0) { if ($fiat && $rateStore && user?.currency) { - success(`Received ${f(toFiat(result.received, $rateStore), user.currency)}!`); + success(`Received ${f(toFiat(result.received, $rateStore as number), user.currency)}!`); } else { success(`Received ⚡️${s(result.received)}!`); } @@ -125,7 +129,7 @@ let checkSocket = () => { counter++; - let lost = socket?.readyState !== 1 || !$last || Date.now() - $last > 30000; + let lost = socket?.readyState !== 1 || !$last || Date.now() - ($last as number) > 30000; if (lost) connect(token); if (counter > 5) { send("heartbeat", token); diff --git a/src/routes/(app)/[username]/(profile)/+layout.svelte b/src/routes/(app)/[username]/(profile)/+layout.svelte index a0d45f22..c1a3e09d 100644 --- a/src/routes/(app)/[username]/(profile)/+layout.svelte +++ b/src/routes/(app)/[username]/(profile)/+layout.svelte @@ -9,9 +9,10 @@ let { data, children } = $props(); let { encode, toWords } = bech32; - let satsPerCurrency = $derived((1 * sats) / rate); - let { events, rate, user, subject, src, text } = $derived(data); + let { rate, user, subject } = $derived(data); + let { events, src, text } = $derived(data as any); + let satsPerCurrency = $derived((1 * sats) / rate); let { currency, npub, username: n, display } = $derived(subject); let locale = $derived(loc(user)); diff --git a/src/routes/(app)/[username]/(profile)/+page.svelte b/src/routes/(app)/[username]/(profile)/+page.svelte index 21d0abdb..60af01c8 100644 --- a/src/routes/(app)/[username]/(profile)/+page.svelte +++ b/src/routes/(app)/[username]/(profile)/+page.svelte @@ -5,7 +5,7 @@ import Balance from "$comp/Balance.svelte"; import { t } from "$lib/translations"; import { installPrompt, password } from "$lib/store"; - import { afterNavigate } from "$app/navigation"; + import { afterNavigate, preloadData } from "$app/navigation"; import { page } from "$app/stores"; let { data } = $props(); @@ -15,7 +15,7 @@ preloadData("/send"); }); - let { accounts, subject, rate, user } = $derived(data); + let { accounts, subject, rate, user } = $derived(data as any); let { locked } = $derived(user); let install = async () => { @@ -65,7 +65,7 @@ {/each}
- + @@ -115,5 +116,5 @@
{#if passwordPrompt} - + {/if} diff --git a/src/routes/(app)/account/ark/+page.svelte b/src/routes/(app)/account/ark/+page.svelte index 79df4752..ce843e11 100644 --- a/src/routes/(app)/account/ark/+page.svelte +++ b/src/routes/(app)/account/ark/+page.svelte @@ -20,7 +20,7 @@ } from "$lib/passwordCache"; let { data } = $props(); - let { user } = data; + let user = $derived(data.user); let hasMasterSeed = $derived(!!user.seed); diff --git a/src/routes/(app)/account/import/+page.svelte b/src/routes/(app)/account/import/+page.svelte index 93616a92..1ae0a932 100644 --- a/src/routes/(app)/account/import/+page.svelte +++ b/src/routes/(app)/account/import/+page.svelte @@ -9,9 +9,9 @@ import { validateMnemonic } from "@scure/bip39"; import { wordlist } from "@scure/bip39/wordlists/english.js"; - let el = $state(), + let el: HTMLButtonElement | undefined = $state(), pasted = $state(), - text = $state(); + text: string = $state(""); let paste = async () => { text = await navigator.clipboard.readText(); @@ -30,7 +30,7 @@ }; run(() => { - if (browser && pasted && text) form.submit() && (pasted = false); + if (browser && pasted && text) el?.click() && (pasted = false); }); diff --git a/src/routes/(app)/account/pass/+page.svelte b/src/routes/(app)/account/pass/+page.svelte index 5a177ded..348e7538 100644 --- a/src/routes/(app)/account/pass/+page.svelte +++ b/src/routes/(app)/account/pass/+page.svelte @@ -19,7 +19,7 @@ let { data }: any = $props(); - let { user } = data; + let user = $derived(data.user); let submitting = $state(false); let confirm: string = $state(""), diff --git a/src/routes/(app)/account/seed/+page.svelte b/src/routes/(app)/account/seed/+page.svelte index 69cfc1b6..76d457f6 100644 --- a/src/routes/(app)/account/seed/+page.svelte +++ b/src/routes/(app)/account/seed/+page.svelte @@ -9,7 +9,7 @@ import { wordlist } from "@scure/bip39/wordlists/english.js"; let { data } = $props(); - let { user } = data; + let user = $derived(data.user); onMount(async () => { if (!browser) return; diff --git a/src/routes/(app)/admin/+layout.svelte b/src/routes/(app)/admin/+layout.svelte index 6c564dac..28e8b7d0 100644 --- a/src/routes/(app)/admin/+layout.svelte +++ b/src/routes/(app)/admin/+layout.svelte @@ -1,7 +1,7 @@ diff --git a/src/routes/(app)/admin/+page.svelte b/src/routes/(app)/admin/+page.svelte index 5604d01b..2569b9db 100644 --- a/src/routes/(app)/admin/+page.svelte +++ b/src/routes/(app)/admin/+page.svelte @@ -2,7 +2,7 @@ import { post } from "$lib/utils"; let { data } = $props(); let reset = (username) => post(`/reset`, { password }); - let { users } = data; + let users = $derived(data.users); let password = $state(); diff --git a/src/routes/(app)/apps/new/+page.server.ts b/src/routes/(app)/apps/new/+page.server.ts index c221cef9..88c9c81c 100644 --- a/src/routes/(app)/apps/new/+page.server.ts +++ b/src/routes/(app)/apps/new/+page.server.ts @@ -7,8 +7,8 @@ export const load = async ({ parent, url }) => { if (!user) redirect(307, `/login?redirect=${encodeURIComponent(url.pathname + url.search)}`); - let max_amount = url.searchParams.get("max_amount"); - max_amount = max_amount ? Math.round(Number(max_amount) / 1000) : undefined; + const max_amount_param = url.searchParams.get("max_amount"); + const max_amount = max_amount_param ? String(Math.round(Number(max_amount_param) / 1000)) : null; const app = { name: url.searchParams.get("name"), diff --git a/src/routes/(app)/apps/new/+page.svelte b/src/routes/(app)/apps/new/+page.svelte index 8268ef29..da929f01 100644 --- a/src/routes/(app)/apps/new/+page.svelte +++ b/src/routes/(app)/apps/new/+page.svelte @@ -13,5 +13,5 @@
{form.error}
{/if} - +
diff --git a/src/routes/(app)/dm/+page.svelte b/src/routes/(app)/dm/+page.svelte index cc30e84f..53784094 100644 --- a/src/routes/(app)/dm/+page.svelte +++ b/src/routes/(app)/dm/+page.svelte @@ -15,7 +15,7 @@ import { theme } from "$lib/store"; let { data } = $props(); - const { user } = data; + const user = $derived(data.user); if (!user) { window.location.replace("/login"); @@ -299,7 +299,7 @@ class={"chat-btn push-right " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn") + (creatingNewChat ? ($theme === "light" ? " light-selected" : " dark-selected") : "")} - on:click={() => { + onclick={() => { creatingNewChat = !creatingNewChat; selectedChat = null; }} @@ -326,7 +326,7 @@ ? " light-selected" : " dark-selected" : "")} - on:click={() => selectChat(c)} + onclick={() => selectChat(c)} > {name(c)} @@ -338,14 +338,14 @@ {:else if searchQuery !== ""} {#if searchQuery.includes(".")} @@ -353,7 +353,7 @@ {#if searchQuery.length === 64 || searchQuery.slice(0, 4) === "npub"} @@ -383,7 +383,7 @@ @@ -436,7 +436,7 @@ value={canSend ? $t("dm.sendMessage") : $t("dm.relaysNotFound").replace("[R]", name(selectedChat))} - on:click={async () => sendMessage(text)} + onclick={async () => sendMessage(text)} /> {/if} diff --git a/src/routes/(app)/ecash/[id]/[...version]/+layout.server.ts b/src/routes/(app)/ecash/[id]/[...version]/+layout.server.ts index 2093e8ec..c96f874d 100644 --- a/src/routes/(app)/ecash/[id]/[...version]/+layout.server.ts +++ b/src/routes/(app)/ecash/[id]/[...version]/+layout.server.ts @@ -4,9 +4,9 @@ import { get } from "$lib/utils"; export async function load({ params, parent }) { const { user } = await parent(); const rates = await getRates(); - let { id, version } = params; - version ||= 4; - version = parseInt(version); + const { id } = params; + let version: string | number = params.version || "4"; + version = parseInt(String(version)); const { token, status } = await get(`/cash/${id}/${version}`); const { spent, total, mint, external } = status; diff --git a/src/routes/(app)/ecash/[id]/[...version]/+layout.svelte b/src/routes/(app)/ecash/[id]/[...version]/+layout.svelte index a4cfd805..5da0c1c3 100644 --- a/src/routes/(app)/ecash/[id]/[...version]/+layout.svelte +++ b/src/routes/(app)/ecash/[id]/[...version]/+layout.svelte @@ -4,10 +4,17 @@ import { fiat } from "$lib/store"; let { data, children } = $props(); - let { id, user, token, total, spent, external, mint, rate } = data; - let currency = user?.currency || "USD"; - - let amount = total - spent; + let id = $derived(data.id); + let user = $derived(data.user); + let token = $derived(data.token); + let total = $derived(data.total); + let spent = $derived(data.spent); + let external = $derived(data.external); + let mint = $derived(data.mint); + let rate = $derived(data.rate); + let currency = $derived(user?.currency || "USD"); + + let amount = $derived(total - spent); let amountFiat = $derived(parseFloat(((amount * rate) / sats).toFixed(2))); let spentFiat = $derived(parseFloat(((spent * rate) / sats).toFixed(2))); diff --git a/src/routes/(app)/ecash/[id]/[...version]/+page.svelte b/src/routes/(app)/ecash/[id]/[...version]/+page.svelte index 0702dcb0..8367273f 100644 --- a/src/routes/(app)/ecash/[id]/[...version]/+page.svelte +++ b/src/routes/(app)/ecash/[id]/[...version]/+page.svelte @@ -7,12 +7,12 @@ let { data, form } = $props(); let link = $page.url.href; - let { id, total, token, external, spent } = $state(data); + let { id, total, token, external, spent } = $derived(data); let peanut = $derived( "🥜" + - Array.from(token) - .map((char) => { + Array.from(token as string) + .map((char: string) => { const byteValue = char.charCodeAt(0); // For byte values 0-15, use Variation Selectors (VS1-VS16): U+FE00 to U+FE0F if (byteValue >= 0 && byteValue <= 15) { @@ -58,7 +58,7 @@ {:else}
- + @@ -168,7 +170,7 @@ aria-label="Message" tabindex="0" >
- diff --git a/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts b/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts index 23918cb3..f1e5a073 100644 --- a/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts +++ b/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts @@ -16,7 +16,7 @@ export async function load({ cookies, params, parent }) { if (currency && !rate) error(500, "Invalid currency symbol"); if (amount) { - if (currency) amount = (amount * sats) / rate; + if (currency) amount = String((Number(amount) * sats) / rate); const { id } = await post( "/invoice", diff --git a/src/routes/(app)/pay/[username]/[...amount]/+page.svelte b/src/routes/(app)/pay/[username]/[...amount]/+page.svelte index aa46cfd5..25e03e8f 100644 --- a/src/routes/(app)/pay/[username]/[...amount]/+page.svelte +++ b/src/routes/(app)/pay/[username]/[...amount]/+page.svelte @@ -18,10 +18,10 @@ let locale = $derived(loc(subject)); let next = $state(); - let initialAmount = $derived(form?.amount || data.amount); + let initialAmount = $derived((form as any)?.amount || data.amount); let amount = $state(); let fiat = $state(); - let formElement = $state(); + let formElement: HTMLFormElement | undefined = $state(); $effect(() => { if (typeof amount === "undefined") amount = initialAmount; @@ -31,10 +31,10 @@ let setMax = async (e) => { e.preventDefault(); let body = new FormData(formElement); - body.set("fiat", false); + body.set("fiat", String(false)); body.set("amount", user.balance); - const response = await fetch(formElement.action, { + const response = await fetch(formElement!.action, { method: "POST", body, }); diff --git a/src/routes/(app)/payment/[id]/+page.svelte b/src/routes/(app)/payment/[id]/+page.svelte index 643ce1ae..657f0c95 100644 --- a/src/routes/(app)/payment/[id]/+page.svelte +++ b/src/routes/(app)/payment/[id]/+page.svelte @@ -17,8 +17,9 @@ import { goto } from "$app/navigation"; let { data } = $props(); - let { user, payment: p } = $state(data); - let locale = user ? locales[user.language] : locales["en"]; + let user = $derived(data.user); + let p = $derived(data.payment); + let locale = $derived(user ? locales[user.language] : locales["en"]); let userLocale = $derived(loc(user)); let { @@ -201,7 +202,7 @@ {txid}
-
@@ -212,7 +213,7 @@ Path
{path}
-
diff --git a/src/routes/(app)/payment/[id]/plain/+page.svelte b/src/routes/(app)/payment/[id]/plain/+page.svelte index ad582c02..41cdd25b 100644 --- a/src/routes/(app)/payment/[id]/plain/+page.svelte +++ b/src/routes/(app)/payment/[id]/plain/+page.svelte @@ -10,22 +10,30 @@ import { PUBLIC_EXPLORER as expl } from "$env/static/public"; let { data } = $props(); - let { user, payment: p } = data; + let user = $derived(data.user); + let p = $derived(data.payment); - let { username } = user; - let { id, amount, created, rate, type, ref, tip, ourfee, fee, currency } = p; - let a = Math.abs(amount); + let username = $derived(user.username); + let id = $derived(p.id); + let amount = $derived(p.amount); + let created = $derived(p.created); + let rate = $derived(p.rate); + let type = $derived(p.type); + let ref = $derived(p.ref); + let tip = $derived(p.tip); + let ourfee = $derived(p.ourfee); + let fee = $derived(p.fee || 0); + let currency = $derived(p.currency); + let a = $derived(Math.abs(amount)); onMount(() => { if (browser) { let main = document.querySelector("main"); - main.style.paddingBottom = "0"; + if (main) main.style.paddingBottom = "0"; window.onfocus = () => goto(`/payment/${id}`); window.print(); } }); - - fee = fee || 0;
diff --git a/src/routes/(app)/payments/[...page]/+page.svelte b/src/routes/(app)/payments/[...page]/+page.svelte index 4d20f8ef..bc207aad 100644 --- a/src/routes/(app)/payments/[...page]/+page.svelte +++ b/src/routes/(app)/payments/[...page]/+page.svelte @@ -111,8 +111,8 @@ let filename = "payments.csv"; let blob = new Blob([csv], { type: "text/csv;charset=utf-8;" }); - if (navigator.msSaveBlob) { - navigator.msSaveBlob(blob, filename); + if ((navigator as any).msSaveBlob) { + (navigator as any).msSaveBlob(blob, filename); } else { let link = document.createElement("a"); if (link.download !== undefined) { @@ -183,6 +183,14 @@
{#each Object.keys(incoming) as c} + {@const totalIn = incoming[c]?.fiat || 0} + {@const tipsIn = incoming[c]?.fiatTips || 0} + {@const subtotalIn = totalIn - tipsIn} + + {@const totalOut = -outgoing[c]?.fiat || 0} + {@const tipsOut = outgoing[c]?.fiatTips || 0} + {@const subtotalOut = totalOut - tipsOut} + @@ -192,14 +200,6 @@ {$t("payments.total")} - {@const totalIn = incoming[c]?.fiat || 0} - {@const tipsIn = incoming[c]?.fiatTips || 0} - {@const subtotalIn = totalIn - tipsIn} - - {@const totalOut = -outgoing[c]?.fiat || 0} - {@const tipsOut = outgoing[c]?.fiatTips || 0} - {@const subtotalOut = totalOut - tipsOut} - {#if totalIn > 0} {$t("payments.income")} diff --git a/src/routes/(app)/pos/+page.svelte b/src/routes/(app)/pos/+page.svelte index 81758c56..6bcdd4d8 100644 --- a/src/routes/(app)/pos/+page.svelte +++ b/src/routes/(app)/pos/+page.svelte @@ -14,7 +14,7 @@ } let { data, form }: any = $props(); - let { token } = $state(data); + let token = $state(data.token); // --- Defaults --- const LITTLEFS_ADDRESS_DEFAULT = 0x3d0000; // your existing LittleFS offset diff --git a/src/routes/(app)/printer/+page.svelte b/src/routes/(app)/printer/+page.svelte index c55f0abf..d370e224 100644 --- a/src/routes/(app)/printer/+page.svelte +++ b/src/routes/(app)/printer/+page.svelte @@ -36,7 +36,7 @@ if (!ESPLoader || !Transport) { ({ ESPLoader, Transport } = await import("esptool-js")); } - let device = await navigator.serial.requestPort({}); + let device = await (navigator as any).serial.requestPort({}); transport = new Transport(device, true); esploader = new ESPLoader({ @@ -44,7 +44,7 @@ baudrate, }); - chip = await esploader.main(); + chip = await (esploader as any).main(); } catch (e) { console.log(e); } @@ -60,11 +60,11 @@ eraseAll: false, compress: true, reportProgress: (fileIndex, written, total) => { - progress = parseInt((written / total) * 100); + progress = parseInt(String((written / total) * 100)); }, }; - await esploader.writeFlash(flashOptions); + await (esploader as any).writeFlash(flashOptions); }; diff --git a/src/routes/(app)/qr/[text]/[icon]/+server.ts b/src/routes/(app)/qr/[text]/[icon]/+server.ts index 85311a8f..91c2b73c 100644 --- a/src/routes/(app)/qr/[text]/[icon]/+server.ts +++ b/src/routes/(app)/qr/[text]/[icon]/+server.ts @@ -18,7 +18,7 @@ export async function GET({ params }) { ctx.drawImage(logo, (size - logoSize) / 2, (size - logoSize) / 2, logoSize, logoSize); const buffer = canvas.toBuffer("image/png"); - return new Response(buffer, { + return new Response(new Uint8Array(buffer), { headers: { "Content-Type": "image/png", "Cache-Control": "public, max-age=31536000, immutable", diff --git a/src/routes/(app)/qr/create/+page.svelte b/src/routes/(app)/qr/create/+page.svelte index 3a17bcc0..e86cac68 100644 --- a/src/routes/(app)/qr/create/+page.svelte +++ b/src/routes/(app)/qr/create/+page.svelte @@ -4,21 +4,22 @@ import { goto } from "$app/navigation"; import { browser } from "$app/environment"; import { t } from "$lib/translations"; + import { focus } from "$lib/utils"; let el = $state(), text = $state(), pasted = $state(); - let keypress = (e) => (e.key === "Enter" ? e.preventDefault() || el.click() : (pasted = false)); + let keypress = (e: KeyboardEvent) => { if (e.key === "Enter") { e.preventDefault(); (el as HTMLElement).click(); } else { pasted = false; } }; let paste = async () => { text = await navigator.clipboard.readText(); pasted = true; }; - let submit = () => goto(`/qr/${encodeURIComponent(text)}`); + let submit = () => goto(`/qr/${encodeURIComponent(text as string)}`); run(() => { - if (browser && pasted && text) el.click() && (pasted = false); + if (browser && pasted && text) { (el as HTMLElement).click(); pasted = false; } }); diff --git a/src/routes/(app)/receive/[...token]/+page.svelte b/src/routes/(app)/receive/[...token]/+page.svelte index 63f34fb4..ac714005 100644 --- a/src/routes/(app)/receive/[...token]/+page.svelte +++ b/src/routes/(app)/receive/[...token]/+page.svelte @@ -19,16 +19,16 @@ let el = $state(), text = $state(), pasted = $state(), - w = $state(); + w: number | undefined = $state(); - let keypress = (e) => e.key === "Enter" && (e.preventDefault() || el.click()); + let keypress = (e: KeyboardEvent) => { if (e.key === "Enter") { e.preventDefault(); (el as HTMLElement).click(); } }; let paste = async () => { text = await navigator.clipboard.readText(); }; run(() => { - if (browser && pasted && text) el.click() && (pasted = false); + if (browser && pasted && text) { (el as HTMLElement).click(); pasted = false; } }); diff --git a/src/routes/(app)/reset/[code]/+page.server.ts b/src/routes/(app)/reset/[code]/+page.server.ts index dc5b58f0..60f1aa81 100644 --- a/src/routes/(app)/reset/[code]/+page.server.ts +++ b/src/routes/(app)/reset/[code]/+page.server.ts @@ -15,7 +15,7 @@ export const actions = { user.recaptcha = recaptcha; try { - await login(user, cookies, ip); + await login(user, cookies, ip ?? ""); error = null; } catch (e: any) { error ||= e.message; diff --git a/src/routes/(app)/reset/[code]/+page.svelte b/src/routes/(app)/reset/[code]/+page.svelte index a2b13a30..036f3e8f 100644 --- a/src/routes/(app)/reset/[code]/+page.svelte +++ b/src/routes/(app)/reset/[code]/+page.svelte @@ -37,10 +37,10 @@ e.preventDefault(); loading = true; try { - recaptchaToken = await getRecaptchaToken(); + recaptchaToken = (await getRecaptchaToken()) as string; await tick(); e.currentTarget.submit(); - } catch (err) { + } catch (err: any) { fail(err.message || "captcha failed"); loading = false; } @@ -50,7 +50,7 @@ if (!browser) return; const nodeBadge = document.querySelector(".grecaptcha-badge"); if (nodeBadge) { - document.body.removeChild(nodeBadge.parentNode); + document.body.removeChild(nodeBadge.parentNode!); } const scriptSelector = @@ -64,7 +64,7 @@
diff --git a/src/routes/(app)/send/+layout.svelte b/src/routes/(app)/send/+layout.svelte index 29fa85d0..1475e4cf 100644 --- a/src/routes/(app)/send/+layout.svelte +++ b/src/routes/(app)/send/+layout.svelte @@ -6,7 +6,7 @@ let { data, children } = $props(); let user = $derived(data.user); - let cancel = () => goto(`/${user.username}`); + let cancel: any = () => goto(`/${user.username}`); {#if user?.haspin && (!$pin || $pin?.length !== 6)} diff --git a/src/routes/(app)/send/ark/[address]/+page.svelte b/src/routes/(app)/send/ark/[address]/+page.svelte index 705d73f7..631f6689 100644 --- a/src/routes/(app)/send/ark/[address]/+page.svelte +++ b/src/routes/(app)/send/ark/[address]/+page.svelte @@ -7,25 +7,27 @@ import { loc, fail, s, f, sats } from "$lib/utils"; let { data } = $props(); - let { balance, user } = data; + let balance = $derived(data.balance); + let user = $derived(data.user); let { address } = $page.params; - let { currency, username } = user; + let currency = $derived(user.currency); + let username = $derived(user.username); let locale = $derived(loc(user)); let amount = $state(0); let a = $state(0); - let submit = $state(), + let submit: HTMLButtonElement | undefined = $state(), fiat = $state(); - $effect(() => ($rate = data.rate)); - $effect(() => (amount = a)); + $effect(() => void ($rate = data.rate)); + $effect(() => void (amount = a)); let setMax = async (e) => { e.preventDefault(); fiat = false; amount = balance; await tick(); - submit.click(); + submit?.click(); }; @@ -39,7 +41,7 @@