web_lib

Common web application libraries
git clone https://radroots.dev/git/web_lib.git
Log | Files | Refs | LICENSE

commit 1db956daa4a39f9d11f916f4953d4224587144fe
parent 8ea17c085c41fdb59104de165ba9e7ab62362b82
Author: triesap <137732411+triesap@users.noreply.github.com>
Date:   Fri, 30 Aug 2024 10:34:30 +0000

apps-lib: add stores for ndk, add utils for ndk

Diffstat:
Mapps-lib/package.json | 9++++++---
Mapps-lib/src/lib/index.ts | 2++
Aapps-lib/src/lib/stores/ndk.ts | 16++++++++++++++++
Mapps-lib/src/lib/utils/client.ts | 16++++++++++------
Aapps-lib/src/lib/utils/ndk.ts | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 86 insertions(+), 9 deletions(-)

diff --git a/apps-lib/package.json b/apps-lib/package.json @@ -41,10 +41,13 @@ "vite": "^5.0.11" }, "dependencies": { - "@sveltekit-i18n/base": "^1.3.7", - "@sveltekit-i18n/parser-icu": "^1.0.8", + "@nostr-dev-kit/ndk": "^2.10.0", + "@nostr-dev-kit/ndk-cache-dexie": "^2.5.1", + "@nostr-dev-kit/ndk-svelte": "^2.2.18", "@radroots/sveltekit-search-params": "workspace:*", - "@radroots/theme": "workspace:*" + "@radroots/theme": "workspace:*", + "@sveltekit-i18n/base": "^1.3.7", + "@sveltekit-i18n/parser-icu": "^1.0.8" }, "publishConfig": { "access": "public" diff --git a/apps-lib/src/lib/index.ts b/apps-lib/src/lib/index.ts @@ -9,6 +9,7 @@ export { default as trellis_row_label } from "./components/trellis_row_label.sve export { default as trellis_title } from "./components/trellis_title.svelte" export { default as trellis_touch } from "./components/trellis_touch.svelte" export * from "./stores/client" +export * from "./stores/ndk" export * from "./types/client" export * from "./types/components" export * from "./types/trellis" @@ -18,3 +19,4 @@ export { default as fill } from "./ui/fill.svelte" export { default as glyph } from "./ui/glyph.svelte" export * from "./utils/client" export * from "./utils/dom" +export * from "./utils/ndk" diff --git a/apps-lib/src/lib/stores/ndk.ts b/apps-lib/src/lib/stores/ndk.ts @@ -0,0 +1,16 @@ +import type { NDKCacheAdapter } from "@nostr-dev-kit/ndk"; +import { type NDKUser } from "@nostr-dev-kit/ndk"; +import NDKCacheAdapterDexie from "@nostr-dev-kit/ndk-cache-dexie"; +import NDKSvelte from "@nostr-dev-kit/ndk-svelte"; +import { writable } from "svelte/store"; + +let cacheAdapter: NDKCacheAdapter | undefined; +if (typeof window !== `undefined`) cacheAdapter = new NDKCacheAdapterDexie({ dbName: "-radroots-app-ndk" }); + +const _ndk = new NDKSvelte({ + cacheAdapter, + clientName: "Radroots", +}); + +export const ndk = writable<NDKSvelte>(_ndk); +export const ndk_user = writable<NDKUser>(); diff --git a/apps-lib/src/lib/utils/client.ts b/apps-lib/src/lib/utils/client.ts @@ -20,7 +20,7 @@ export const fmt_cl = (classes?: string): string => { export function get_label_classes(layer: ThemeLayer, label_kind: LabelFieldKind | undefined, hide_active: boolean): string { return `text-layer-${layer}-glyph${label_kind ? `-${label_kind}` : ``} ${hide_active ? `` : `group-active:text-layer-${layer}-glyph${label_kind ? `-${label_kind}_a` : `_a`}`}` -} +}; export function parse_layer(layer?: number): ThemeLayer { switch (layer) { @@ -30,7 +30,7 @@ export function parse_layer(layer?: number): ThemeLayer { return layer; default: return 0; - } + }; }; export function fmt_trellis(hide_border_t: boolean, hide_border_b: boolean): string { @@ -43,7 +43,7 @@ export function encode_qp(params_list?: NavigationParamTuple[]): string { let urlp = ``; if (params_list.length) for (const [i, [k, v]] of params.entries()) urlp += `${i === 0 ? `?` : ``}&${k.trim()}=${encodeURI(v.trim())}`.trim(); return urlp; -} +}; export const decode_qp = (query_param: string): AnchorRoute => { const route = decodeURI(query_param).replaceAll(`//`, `/`); @@ -58,5 +58,9 @@ export function parse_qp(param: string): NavigationRouteParamKey | undefined { return param; default: return undefined; - } -} -\ No newline at end of file + }; +}; + +export function time_now_ms(): number { + return Math.floor(new Date().getTime() / 1000); +}; +\ No newline at end of file diff --git a/apps-lib/src/lib/utils/ndk.ts b/apps-lib/src/lib/utils/ndk.ts @@ -0,0 +1,52 @@ +import { NDKEvent, NDKPrivateKeySigner, NDKUser } from '@nostr-dev-kit/ndk'; +import NDKSvelte from "@nostr-dev-kit/ndk-svelte"; +import { time_now_ms } from "./client"; + +export async function ndk_setup_privkey(opts: { + $ndk: NDKSvelte; + private_key: string; +}): Promise<NDKUser | undefined> { + try { + const { $ndk: ndk, private_key } = opts; + const signer = new NDKPrivateKeySigner(private_key); + ndk.signer = signer; + + const user = await signer.user(); + if (user) { + user.ndk = ndk; + return user; + } + } catch (e) { } +}; + +export async function ndk_event(opts: { + $ndk: NDKSvelte; + $ndk_user: NDKUser; + basis: { + kind: number; + content: string; + tags?: string[][]; + } +}): Promise<NDKEvent | undefined> { + try { + const { $ndk: ndk, $ndk_user: ndk_user, basis } = opts; + const time_now = time_now_ms(); + + const tags: string[][] = [ + ['published_at', time_now.toString()], + ]; + + for (const tag of basis.tags || []) { + tags.push(tag); + }; + + const event: NDKEvent = new NDKEvent(ndk, { + kind: basis.kind, + pubkey: ndk_user.pubkey, + content: basis.content, + created_at: time_now, + tags + }); + return event; + } catch (e) { }; +};