45 lines
1.1 KiB
TypeScript
45 lines
1.1 KiB
TypeScript
import { useSyncExternalStore } from "react";
|
|
import { HexKey, u256 } from "@snort/nostr";
|
|
|
|
import { InteractionCache } from "Cache/EventInteractionCache";
|
|
import { EventInteraction } from "Db";
|
|
import { sha256, unwrap } from "Util";
|
|
|
|
export function useInteractionCache(pubkey?: HexKey, event?: u256) {
|
|
const id = event && pubkey ? sha256(event + pubkey) : undefined;
|
|
const EmptyInteraction = {
|
|
id,
|
|
event,
|
|
by: pubkey,
|
|
} as EventInteraction;
|
|
const data =
|
|
useSyncExternalStore(
|
|
c => InteractionCache.hook(c, id),
|
|
() => InteractionCache.snapshot().find(a => a.id === id)
|
|
) || EmptyInteraction;
|
|
return {
|
|
data: data,
|
|
react: () =>
|
|
InteractionCache.set({
|
|
...data,
|
|
event: unwrap(event),
|
|
by: unwrap(pubkey),
|
|
reacted: true,
|
|
}),
|
|
zap: () =>
|
|
InteractionCache.set({
|
|
...data,
|
|
event: unwrap(event),
|
|
by: unwrap(pubkey),
|
|
zapped: true,
|
|
}),
|
|
repost: () =>
|
|
InteractionCache.set({
|
|
...data,
|
|
event: unwrap(event),
|
|
by: unwrap(pubkey),
|
|
reposted: true,
|
|
}),
|
|
};
|
|
}
|