mkstack/src/hooks/useLoggedInAccounts.ts
2025-04-23 15:13:17 -05:00

56 lines
1.6 KiB
TypeScript

import { useNostr } from '@nostrify/react';
import { useNostrLogin } from '@nostrify/react/login';
import { useQuery } from '@tanstack/react-query';
import { NSchema as n, NostrEvent, NostrMetadata } from '@nostrify/nostrify';
export interface Account {
id: string;
pubkey: string;
event?: NostrEvent;
metadata: NostrMetadata;
}
export function useLoggedInAccounts() {
const { nostr } = useNostr();
const { logins, setLogin, removeLogin } = useNostrLogin();
const { data: authors = [] } = useQuery({
queryKey: ['logins', logins.map((l) => l.id).join(';')],
queryFn: async ({ signal }) => {
const events = await nostr.query(
[{ kinds: [0], authors: logins.map((l) => l.pubkey) }],
{ signal: AbortSignal.any([signal, AbortSignal.timeout(1500)]) },
);
return logins.map(({ id, pubkey }): Account => {
const event = events.find((e) => e.pubkey === pubkey);
try {
const metadata = n.json().pipe(n.metadata()).parse(event?.content);
return { id, pubkey, metadata, event };
} catch {
return { id, pubkey, metadata: {}, event };
}
});
},
retry: 3,
});
// Current user is the first login
const currentUser: Account | undefined = (() => {
const login = logins[0];
if (!login) return undefined;
const author = authors.find((a) => a.id === login.id);
return { metadata: {}, ...author, id: login.id, pubkey: login.pubkey };
})();
// Other users are all logins except the current one
const otherUsers = (authors || []).slice(1) as Account[];
return {
authors,
currentUser,
otherUsers,
setLogin,
removeLogin,
};
}