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:
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) { };
+};