58 lines
1.3 KiB
JavaScript
58 lines
1.3 KiB
JavaScript
import { useEffect, useReducer } from "react";
|
|
import { System } from "..";
|
|
import { Subscriptions } from "../nostr/Subscriptions";
|
|
|
|
function notesReducer(state, ev) {
|
|
if (state.notes.some(a => a.id === ev.id)) {
|
|
return state;
|
|
}
|
|
|
|
return {
|
|
notes: [
|
|
...state.notes,
|
|
ev
|
|
]
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {Subscriptions} sub
|
|
* @param {any} opt
|
|
* @returns
|
|
*/
|
|
export default function useSubscription(sub, opt) {
|
|
const [state, dispatch] = useReducer(notesReducer, { notes: [] });
|
|
|
|
const options = {
|
|
leaveOpen: false,
|
|
...opt
|
|
};
|
|
|
|
useEffect(() => {
|
|
if (sub) {
|
|
sub.OnEvent = (e) => {
|
|
dispatch(e);
|
|
};
|
|
|
|
if (!options.leaveOpen) {
|
|
sub.OnEnd = (c) => {
|
|
sub.OnEvent = () => {};
|
|
c.RemoveSubscription(sub.Id);
|
|
if (sub.IsFinished()) {
|
|
System.RemoveSubscription(sub.Id);
|
|
}
|
|
};
|
|
}
|
|
|
|
console.debug("Adding sub: ", sub.ToObject());
|
|
System.AddSubscription(sub);
|
|
return () => {
|
|
console.debug("Adding sub: ", sub.ToObject());
|
|
System.RemoveSubscription(sub.Id);
|
|
};
|
|
}
|
|
}, [sub]);
|
|
|
|
return state;
|
|
} |