You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

180 lines
5.5 KiB

import { defaults as user_defaults, type User } from "$lib/components/users/type";
import { NDKNip07Signer, NDKRelayList } from "@nostr-dev-kit/ndk";
import { get, writable, type Unsubscriber, type Writable } from "svelte/store"
import { ndk } from "./ndk";
export let users: { [hexpubkey: string]: Writable<User>; } = {};
export let ensureUser = (hexpubkey: string): Writable<User> => {
if (!users[hexpubkey]) {
let u = ndk.getUser({ hexpubkey });
let base: User = {
loading: false,
hexpubkey,
npub: u.npub,
};
users[hexpubkey] = writable(base);
getUserRelays(hexpubkey);
u.fetchProfile().then(
(p) => {
users[hexpubkey].update((u) => ({
...u,
loading: false,
profile: p === null ? undefined : p,
}));
},
() => {
users[hexpubkey].update((u) => ({
...u,
loading: false,
}));
}
);
}
return users[hexpubkey];
}
export let returnUser = async (hexpubkey: string): Promise<User> => {
return new Promise((r) => {
let unsubscriber = ensureUser(hexpubkey).subscribe((u) => {
if (!u.loading) {
unsubscriber();
r(u);
}
});
});
}
// nip07_plugin is set in Navbar component
export let nip07_plugin: Writable<undefined | boolean> = writable(undefined);
export let checkForNip07Plugin = () => {
if (window.nostr) {
nip07_plugin.set(true);
} else {
let timerId: NodeJS.Timeout;
const intervalId = setInterval(() => {
if (window.nostr) {
clearTimeout(timerId);
clearInterval(intervalId);
nip07_plugin.set(true);
}
}, 100);
timerId = setTimeout(() => {
clearInterval(intervalId);
nip07_plugin.set(false);
}, 5000);
}
};
let signer = new NDKNip07Signer(2000);
export let logged_in_user: Writable<undefined | User> = writable(undefined);
export let login = async (): Promise<void> => {
return new Promise(async (res, rej) => {
let user = get(logged_in_user);
if (user) return res();
if (get(nip07_plugin)) {
try {
let ndk_user = await signer.blockUntilReady();
logged_in_user.set({
...user_defaults,
hexpubkey: ndk_user.pubkey,
});
ndk.signer = signer;
ensureUser(ndk_user.pubkey).subscribe(user => {
logged_in_user.set({ ...user });
});
return res();
}
catch (e) {
alert(e);
rej();
}
}
else {
rej();
}
});
};
interface UserRelays {
loading: boolean;
ndk_relays: NDKRelayList | undefined;
}
export let user_relays: { [hexpubkey: string]: Writable<UserRelays>; } = {};
export let getUserRelays = async (hexpubkey: string): Promise<UserRelays> => {
return new Promise(async (res, rej) => {
if (user_relays[hexpubkey]) {
let unsubscriber: Unsubscriber;
unsubscriber = user_relays[hexpubkey].subscribe(querying_user_relays => {
if (querying_user_relays && !querying_user_relays.loading) {
res(querying_user_relays);
unsubscriber();
}
});
}
else {
user_relays[hexpubkey] = writable({
loading: true,
ndk_relays: undefined,
});
logged_in_user_relays.set({
loading: true,
ndk_relays: undefined,
});
let relay_list = await ndk.getUser({ hexpubkey }).relayList();
let querying_user_relays = {
loading: false,
ndk_relays: relay_list,
};
user_relays[hexpubkey].set({ ...querying_user_relays });
res(querying_user_relays);
}
});
};
export let logged_in_user_relays: Writable<undefined | UserRelays> = writable(undefined);
export let getLoggedInUserRelays = async (): Promise<UserRelays> => {
return new Promise(async (res, rej) => {
let user_relays = get(logged_in_user_relays);
if (user_relays) {
if (!user_relays.loading) return res(user_relays);
let unsubscriber = logged_in_user_relays.subscribe(user_relays => {
if (user_relays && !user_relays.loading) {
res(user_relays);
unsubscriber();
}
});
}
else {
let unsubscriber: Unsubscriber;
unsubscriber = logged_in_user.subscribe(async user => {
if (user) {
if (unsubscriber) unsubscriber();
logged_in_user_relays.set({
loading: true,
ndk_relays: undefined,
});
let relay_list = await ndk.getUser({ hexpubkey: user.hexpubkey }).relayList();
let user_relays = {
loading: false,
ndk_relays: relay_list,
};
logged_in_user_relays.set({ ...user_relays });
res(user_relays);
}
});
}
});
};