@@ -80,10 +80,11 @@ function createReactionStore() {
8080 /**
8181 * Convert NostrEvent to NDKEvent
8282 */
83- function nostrEventToNDK ( event : NostrEvent ) : NDKEvent {
83+ function nostrEventToNDK ( event : NostrEvent ) : NDKEvent | null {
8484 const ndkInstance = ndk ( ) ;
8585 if ( ! ndkInstance ) {
86- throw new Error ( 'NDK not initialized' ) ;
86+ console . debug ( '[Reactions] NDK not initialized, skipping event conversion' ) ;
87+ return null ;
8788 }
8889
8990 const ndkEvent = new NDKEvent ( ndkInstance ) ;
@@ -149,7 +150,9 @@ function createReactionStore() {
149150
150151 if ( ! isDuplicate ) {
151152 const updated = [ ...existing , reactionData ] ;
152- state . reactionsByMessage . set ( reactionData . eventId , updated ) ;
153+ const reactionsByMessage = new Map ( state . reactionsByMessage ) ;
154+ reactionsByMessage . set ( reactionData . eventId , updated ) ;
155+ return { ...state , reactionsByMessage, loading : false } ;
153156 }
154157
155158 return { ...state , loading : false } ;
@@ -198,10 +201,12 @@ function createReactionStore() {
198201 r => r . reactorPubkey !== optimisticReaction . reactorPubkey
199202 ) ;
200203
201- state . reactionsByMessage . set ( messageId , [ ...filtered , optimisticReaction ] ) ;
202- state . optimisticReactions . set ( optimisticId , optimisticReaction ) ;
204+ const reactionsByMessage = new Map ( state . reactionsByMessage ) ;
205+ reactionsByMessage . set ( messageId , [ ...filtered , optimisticReaction ] ) ;
206+ const optimisticReactions = new Map ( state . optimisticReactions ) ;
207+ optimisticReactions . set ( optimisticId , optimisticReaction ) ;
203208
204- return { ...state } ;
209+ return { ...state , reactionsByMessage , optimisticReactions } ;
205210 } ) ;
206211
207212 try {
@@ -214,6 +219,9 @@ function createReactionStore() {
214219 ) ;
215220
216221 const ndkEvent = nostrEventToNDK ( event ) ;
222+ if ( ! ndkEvent ) {
223+ throw new Error ( 'NDK not connected' ) ;
224+ }
217225 await publishEvent ( ndkEvent ) ;
218226
219227 // Replace optimistic with real reaction
@@ -228,10 +236,12 @@ function createReactionStore() {
228236 r => r . reactionEventId !== optimisticId
229237 ) ;
230238
231- state . reactionsByMessage . set ( messageId , [ ...withoutOptimistic , realReaction ] ) ;
232- state . optimisticReactions . delete ( optimisticId ) ;
239+ const reactionsByMessage = new Map ( state . reactionsByMessage ) ;
240+ reactionsByMessage . set ( messageId , [ ...withoutOptimistic , realReaction ] ) ;
241+ const optimisticReactions = new Map ( state . optimisticReactions ) ;
242+ optimisticReactions . delete ( optimisticId ) ;
233243
234- return { ...state } ;
244+ return { ...state , reactionsByMessage , optimisticReactions } ;
235245 } ) ;
236246
237247 } catch ( error ) {
@@ -240,11 +250,15 @@ function createReactionStore() {
240250 const existing = state . reactionsByMessage . get ( messageId ) || [ ] ;
241251 const filtered = existing . filter ( r => r . reactionEventId !== optimisticId ) ;
242252
243- state . reactionsByMessage . set ( messageId , filtered ) ;
244- state . optimisticReactions . delete ( optimisticId ) ;
253+ const reactionsByMessage = new Map ( state . reactionsByMessage ) ;
254+ reactionsByMessage . set ( messageId , filtered ) ;
255+ const optimisticReactions = new Map ( state . optimisticReactions ) ;
256+ optimisticReactions . delete ( optimisticId ) ;
245257
246258 return {
247259 ...state ,
260+ reactionsByMessage,
261+ optimisticReactions,
248262 error : error instanceof Error ? error . message : 'Failed to add reaction'
249263 } ;
250264 } ) ;
@@ -269,9 +283,10 @@ function createReactionStore() {
269283 const existing = state . reactionsByMessage . get ( messageId ) || [ ] ;
270284 const filtered = existing . filter ( r => r . reactorPubkey !== auth . publicKey ) ;
271285
272- state . reactionsByMessage . set ( messageId , filtered ) ;
286+ const reactionsByMessage = new Map ( state . reactionsByMessage ) ;
287+ reactionsByMessage . set ( messageId , filtered ) ;
273288
274- return { ...state } ;
289+ return { ...state , reactionsByMessage } ;
275290 } ) ;
276291
277292 // Note: NIP-25 doesn't specify reaction deletion
@@ -313,7 +328,9 @@ function createReactionStore() {
313328
314329 if ( ! isDuplicate ) {
315330 const updated = [ ...existing , reactionData ] ;
316- state . reactionsByMessage . set ( reactionData . eventId , updated ) ;
331+ const reactionsByMessage = new Map ( state . reactionsByMessage ) ;
332+ reactionsByMessage . set ( reactionData . eventId , updated ) ;
333+ return { ...state , reactionsByMessage } ;
317334 }
318335
319336 return { ...state } ;
@@ -323,11 +340,12 @@ function createReactionStore() {
323340 // Track subscription
324341 update ( state => {
325342 const subs = state . activeSubscriptions . get ( relayUrl ) || [ ] ;
326- state . activeSubscriptions . set ( relayUrl , [
343+ const activeSubscriptions = new Map ( state . activeSubscriptions ) ;
344+ activeSubscriptions . set ( relayUrl , [
327345 ...subs ,
328346 { subId, subscription }
329347 ] ) ;
330- return { ...state } ;
348+ return { ...state , activeSubscriptions } ;
331349 } ) ;
332350 } ,
333351
@@ -344,8 +362,9 @@ function createReactionStore() {
344362 } ) ;
345363
346364 update ( s => {
347- s . activeSubscriptions . delete ( relayUrl ) ;
348- return { ...s } ;
365+ const activeSubscriptions = new Map ( s . activeSubscriptions ) ;
366+ activeSubscriptions . delete ( relayUrl ) ;
367+ return { ...s , activeSubscriptions } ;
349368 } ) ;
350369 }
351370 } ,
@@ -408,8 +427,7 @@ function createReactionStore() {
408427 } ) ;
409428
410429 update ( s => {
411- s . activeSubscriptions . clear ( ) ;
412- return { ...s } ;
430+ return { ...s , activeSubscriptions : new Map ( ) } ;
413431 } ) ;
414432 }
415433 } ;
0 commit comments