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:
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`}`}