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/lib | |
| 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/lib')
| -rw-r--r-- | src/lib/invoice.ts | 2 | ||||
| -rw-r--r-- | src/lib/locales.ts | 62 | ||||
| -rw-r--r-- | src/lib/parse.ts | 25 | ||||
| -rw-r--r-- | src/lib/random.ts | 20 | ||||
| -rw-r--r-- | src/lib/settings.ts | 2 | ||||
| -rw-r--r-- | src/lib/socket.ts | 3 | ||||
| -rw-r--r-- | src/lib/utils.ts | 32 |
7 files changed, 108 insertions, 38 deletions
diff --git a/src/lib/invoice.ts b/src/lib/invoice.ts index d7576e82..91a69d88 100644 --- a/src/lib/invoice.ts +++ b/src/lib/invoice.ts @@ -15,7 +15,7 @@ export default async ({ cookies, request }) => { items: JSON.parse(form.get("items")), memo: form.get("memo"), memoPrompt: form.get("memoPrompt"), - tip: parseInt(form.get("tip")) || 0, + tip: form.get("tip") ?? null, type: form.get("type"), prompt: form.get("prompt") === "true", rate: parseFloat(form.get("rate")) || rates[form.get("currency")], diff --git a/src/lib/locales.ts b/src/lib/locales.ts index b87ecc7a..68a28abd 100644 --- a/src/lib/locales.ts +++ b/src/lib/locales.ts @@ -1,23 +1,41 @@ -import { - de, - el, - enUS as en, - es, - faIR as fa, - fr, - ja, - pt, - ru, - zhCN as zh, - arSA as ar, - hiIN as hi, - bnBD as bn, - tr, - ko, - it, - nl, - th, - pl -} from "date-fns/locale/index.js"; +import de from "date-fns/locale/de"; +import el from "date-fns/locale/el"; +import en from "date-fns/locale/en-US"; +import es from "date-fns/locale/es"; +import fa from "date-fns/locale/fa-IR"; +import fr from "date-fns/locale/fr"; +import ja from "date-fns/locale/ja"; +import pt from "date-fns/locale/pt"; +import ru from "date-fns/locale/ru"; +import zh from "date-fns/locale/zh-CN"; +import ar from "date-fns/locale/ar-SA"; +import hi from "date-fns/locale/hi"; +import bn from "date-fns/locale/bn"; +import tr from "date-fns/locale/tr"; +import ko from "date-fns/locale/ko"; +import it from "date-fns/locale/it"; +import nl from "date-fns/locale/nl"; +import th from "date-fns/locale/th"; +import pl from "date-fns/locale/pl"; -export default { de, el, en, es, fa, fr, ja, pt, ru, zh, ar, hi, bn, tr, ko, it, nl, th, pl }; +export default { + de, + el, + en, + es, + fa, + fr, + ja, + pt, + ru, + zh, + ar, + hi, + bn, + tr, + ko, + it, + nl, + th, + pl +}; diff --git a/src/lib/parse.ts b/src/lib/parse.ts index ba264be7..9c18504a 100644 --- a/src/lib/parse.ts +++ b/src/lib/parse.ts @@ -8,11 +8,18 @@ export default async (s, host) => { if (!s) return; let t = s.trim(); let amount; + let invoice; let user; if (t.startsWith("http")) redirect(307, t); if (t.startsWith(host)) redirect(307, `http://${t}`); + if (t.includes("lightning=")) { + const url = new URL(t); + const params = new URLSearchParams(url.search); + t = params.get("lightning"); + } + if (t.startsWith("lightning:")) t = t.replace("lightning:", ""); if (t.endsWith(`@${PUBLIC_DOMAIN}`)) t = t.split("@")[0]; if (t.includes("@") && t.includes(".")) { @@ -51,16 +58,10 @@ export default async (s, host) => { if (t.toLowerCase().startsWith("lnurl")) redirect(307, `/ln/${t}`); if (t.includes(":")) t = t.split(":")[1]; - if (t.includes("lightning=")) { - const url = new URL(t); - const params = new URLSearchParams(url.search); - t = params.get("lightning"); - } - if (t.toLowerCase().startsWith("ln")) { try { - const inv = await get(`/invoice/${t}`); - if (inv.user.username === "mint") throw new Error("mint payment"); + invoice = await get(`/invoice/${t}`); + if (invoice.user.username === "mint") throw new Error("mint payment"); } catch (e) { if (t.toLowerCase().startsWith("lno")) { const { offer_amount_msat: a } = await get(`/decode/${t}`); @@ -70,6 +71,8 @@ export default async (s, host) => { } } + if (invoice) redirect(307, `/invoice/${invoice.id}`); + if (t.match(/^🥜([\uFE00-\uFE0F]|[\uE0100-\uE01EF]+)$/)) { t = Array.from(t) .slice(1) @@ -115,11 +118,9 @@ export default async (s, host) => { if (fund) redirect(307, `/send/fund/${t}`); - // invoice - let invoice; try { - invoice = await get(`/invoice/${t}`); + invoice ||= await get(`/invoice/${t}`); } catch (e) {} - if (invoice) redirect(307, `/send/invoice/${invoice.id}`); + if (invoice) redirect(307, `/invoice/${invoice.id}`); }; diff --git a/src/lib/random.ts b/src/lib/random.ts new file mode 100644 index 00000000..36dde0cc --- /dev/null +++ b/src/lib/random.ts @@ -0,0 +1,20 @@ +import { + NumberDictionary, + animals, + colors, + uniqueNamesGenerator, +} from "unique-names-generator"; + +export const randomName = () => + uniqueNamesGenerator({ + dictionaries: [animals, NumberDictionary.generate({ min: 10, max: 99 })], + length: 2, + separator: "", + }); + +export const randomPassword = () => + uniqueNamesGenerator({ + dictionaries: [colors, NumberDictionary.generate({ min: 100, max: 999 })], + length: 2, + separator: "", + }); diff --git a/src/lib/settings.ts b/src/lib/settings.ts index 53a25e18..6f4d3f62 100644 --- a/src/lib/settings.ts +++ b/src/lib/settings.ts @@ -8,7 +8,7 @@ type Error = { export default async ({ cookies, request }) => { const form = await fd(request); - if (form.tab === "preferences") { + if (form.tab === "account") { form.notify = form.notify === "on"; form.push = form.push === "on"; form.nip5 = form.nip5 === "on"; diff --git a/src/lib/socket.ts b/src/lib/socket.ts index 2bb0d4f2..b87cc165 100644 --- a/src/lib/socket.ts +++ b/src/lib/socket.ts @@ -57,8 +57,7 @@ export const messages = (data) => ({ pathname.includes("/receive") || pathname.includes("/invoice") ) { - await wait(() => !get(navigating)); - await goto(`/invoice/${iid}`); + if (!get(navigating)) goto(`/invoice/${iid}`); } else success(`${confirmed ? "Received" : "Detected"} ⚡️${s(amount)}!`); } }, diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 2e1bb840..28a219e1 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -3,6 +3,7 @@ import { goto } from "$app/navigation"; import { page } from "$app/stores"; import { PUBLIC_COINOS_NETWORK, PUBLIC_COINOS_URL } from "$env/static/public"; import { bytesToHex } from "@noble/hashes/utils"; +import { fail as svelteFail, redirect } from "@sveltejs/kit"; import { toast } from "@zerodevx/svelte-toast"; import { differenceInDays, @@ -456,3 +457,34 @@ export const ago = (t) => { const days = differenceInDays(now, date); return `${days}d`; }; + +export const register = async (user, ip, cookies, loginRedirect) => { + let error; + + 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 svelteFail(400, { error }); + redirect(303, loginRedirect || `/${user.username}`); +}; |
