import { ExternalStore } from "@snort/shared"; import { NostrEvent, TaggedNostrEvent } from "@snort/system"; import { useSyncExternalStoreWithSelector } from "use-sync-external-store/with-selector"; import { ZapTarget } from "@/Utils/Zapper"; interface NoteCreatorDataSnapshot { show: boolean; note: string; error: string; active: boolean; advanced: boolean; preview?: NostrEvent; replyTo?: TaggedNostrEvent; quote?: TaggedNostrEvent; selectedCustomRelays?: Array; zapSplits?: Array; sensitive?: string; pollOptions?: Array; otherEvents?: Array; extraTags?: Array>; sending?: Array; sendStarted: boolean; hashTags: Array; reset: () => void; update: (fn: (v: NoteCreatorDataSnapshot) => void) => void; } class NoteCreatorStore extends ExternalStore { #data: NoteCreatorDataSnapshot; constructor() { super(); this.#data = { show: false, note: "", error: "", active: false, advanced: false, sendStarted: false, hashTags: [], reset: () => { this.#reset(this.#data); this.notifyChange(this.#data); }, update: (fn: (v: NoteCreatorDataSnapshot) => void) => { fn(this.#data); this.notifyChange(this.#data); }, }; } #reset(d: NoteCreatorDataSnapshot) { d.show = false; d.note = ""; d.error = ""; d.active = false; d.advanced = false; d.sendStarted = false; d.preview = undefined; d.replyTo = undefined; d.quote = undefined; d.selectedCustomRelays = undefined; d.zapSplits = undefined; d.sensitive = undefined; d.pollOptions = undefined; d.otherEvents = undefined; d.sending = undefined; d.extraTags = undefined; d.hashTags = []; } takeSnapshot(): NoteCreatorDataSnapshot { const sn = { ...this.#data, reset: () => { this.#reset(this.#data); }, update: (fn: (v: NoteCreatorDataSnapshot) => void) => { fn(this.#data); this.notifyChange(this.#data); }, } as NoteCreatorDataSnapshot; return sn; } } const NoteCreatorState = new NoteCreatorStore(); export function useNoteCreator( selector?: (v: NoteCreatorDataSnapshot) => T, ) { const defaultSelector = (v: NoteCreatorDataSnapshot) => v as unknown as T; return useSyncExternalStoreWithSelector( c => NoteCreatorState.hook(c), () => NoteCreatorState.snapshot(), undefined, selector || defaultSelector, ); }