web_lib

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

commit 94fe0c8a8d8836c1e2a01f537857b65765e108fc
parent a8b6004579321e0a42f40bb5277789d21e39052b
Author: triesap <137732411+triesap@users.noreply.github.com>
Date:   Fri,  7 Mar 2025 13:47:14 +0000

apps-lib: add nostr sync service. edit profile view

Diffstat:
Mapps-lib/package.json | 1+
Mapps-lib/src/lib/index.ts | 1+
Mapps-lib/src/lib/types/view.ts | 3+++
Aapps-lib/src/lib/util/service/nostr-sync.ts | 41+++++++++++++++++++++++++++++++++++++++++
Mapps-lib/src/lib/view/profile.svelte | 34+++++++++++++++++++++-------------
5 files changed, 67 insertions(+), 13 deletions(-)

diff --git a/apps-lib/package.json b/apps-lib/package.json @@ -50,6 +50,7 @@ "@nostr-dev-kit/ndk": "^2.11.0", "@nostr-dev-kit/ndk-cache-dexie": "^2.5.9", "@nostr-dev-kit/ndk-svelte": "^2.4.0", + "@radroots/nostr-util": "workspace:*", "@radroots/locales": "workspace:*", "@radroots/theme": "workspace:*", "@radroots/util": "workspace:*", diff --git a/apps-lib/src/lib/index.ts b/apps-lib/src/lib/index.ts @@ -100,6 +100,7 @@ export * from "./util/carousel.js" export * from "./util/casl.js" export * from "./util/idb.js" export * from "./util/lib.js" +export * from "./util/service/nostr-sync.js" export { default as FarmsAdd } from "./view/farms-add.svelte" export { default as FarmsProductsAdd } from "./view/farms-products-add.svelte" export { default as FarmsProductsView } from "./view/farms-products-view.svelte" diff --git a/apps-lib/src/lib/types/view.ts b/apps-lib/src/lib/types/view.ts @@ -8,3 +8,5 @@ export type IViewProfileData = { primary: boolean; }[]; }; + +export type ViewProfileEditFieldKey = `name` | `display_name` | `about`; +\ No newline at end of file diff --git a/apps-lib/src/lib/util/service/nostr-sync.ts b/apps-lib/src/lib/util/service/nostr-sync.ts @@ -0,0 +1,40 @@ +import { get_store, handle_err, ndk, ndk_user } from "$root"; +import type { NDKEvent, NDKUser } from "@nostr-dev-kit/ndk"; +import type NDKSvelte from "@nostr-dev-kit/ndk-svelte"; +import { ndk_event_metadata, type NostrMetadata } from "@radroots/nostr-util"; +import { err_msg, type ErrorMessage } from "@radroots/util"; + +export type INostrSyncServiceMetadata = { + metadata: NostrMetadata; +}; + +export type INostrSyncService = { + metadata: (opts: INostrSyncServiceMetadata) => Promise<NDKEvent | ErrorMessage<string>>; +}; + +export class NostrSyncService implements INostrSyncService { + constructor() { } + + private config = (): { $ndk: NDKSvelte; $ndk_user: NDKUser } => { + const $ndk = get_store(ndk); + const $ndk_user = get_store(ndk_user); + return { $ndk, $ndk_user }; + } + + public metadata = async (opts: INostrSyncServiceMetadata): Promise<NDKEvent | ErrorMessage<string>> => { + try { + const { $ndk, $ndk_user } = this.config(); + const { metadata } = opts; + const ev = await ndk_event_metadata({ + $ndk, + $ndk_user, + metadata, + }); + if (ev) return ev; + return err_msg(`*-ev`); + } catch (e) { + await handle_err(e, `metadata`); + return err_msg(`*`); + } + } +} +\ No newline at end of file diff --git a/apps-lib/src/lib/view/profile.svelte b/apps-lib/src/lib/view/profile.svelte @@ -9,12 +9,13 @@ ImageUploadAddPhoto, NavigationTabs, type IViewProfileData, + type ViewProfileEditFieldKey, } from "$root"; import { ascii, type CallbackPromise, type CallbackPromiseFull, - type CallbackPromiseReturn, + type CallbackPromiseGeneric, type I18nTranslateFunction, type IViewBasis, type LcPhotoAddCallback, @@ -33,10 +34,12 @@ lc_handle_photo_add: LcPhotoAddCallback; lc_handle_photo_options: CallbackPromise; lc_fs_read_bin: CallbackPromiseFull<string, Uint8Array | undefined>; - lc_handle_edit_profile_name: CallbackPromise; - lc_handle_edit_profile_name_confirm: CallbackPromiseReturn<boolean>; - lc_handle_edit_profile_display_name: CallbackPromise; - lc_handle_edit_profile_about: CallbackPromise; + lc_handle_edit_profile_field: CallbackPromiseGeneric<{ + field: ViewProfileEditFieldKey; + }>; + //lc_handle_edit_profile_name_confirm: CallbackPromiseReturn<boolean>; + //lc_handle_edit_profile_display_name: CallbackPromise; + //lc_handle_edit_profile_about: CallbackPromise; }>; ls: I18nTranslateFunction; photo_path_opt: string; @@ -123,7 +126,11 @@ <div class={`flex flex-row h-10 w-full justify-start items-center`}> <button class={`group flex flex-row justify-center items-center`} - onclick={basis.lc_handle_edit_profile_display_name} + onclick={async () => { + await basis.lc_handle_edit_profile_field({ + field: `display_name`, + }); + }} > <p class={`font-sansd font-[600] text-[2rem] ${classes_photo_overlay_glyph} ${basis.data?.name ? `` : `capitalize opacity-active`} el-re`} @@ -144,12 +151,9 @@ <button class={`group flex flex-row justify-center items-center`} onclick={async () => { - if (basis.data?.name) { - const confirm = - basis.lc_handle_edit_profile_name_confirm(); - if (!confirm) return; - } - await basis.lc_handle_edit_profile_name(); + await basis.lc_handle_edit_profile_field({ + field: `name`, + }); }} > <p @@ -186,7 +190,11 @@ <div class={`flex flex-row w-full justify-start items-center`}> <button class={`group flex flex-row justify-center items-center`} - onclick={basis.lc_handle_edit_profile_about} + onclick={async () => { + await basis.lc_handle_edit_profile_field({ + field: `about`, + }); + }} > <p class={`font-sansd font-[400] text-[1.1rem] ${classes_photo_overlay_glyph} ${basis.data?.about ? `` : `capitalize opacity-active`}`}