DeletedEventProvider.tsx raw

   1  import { getReplaceableCoordinateFromEvent, isReplaceableEvent } from '@/lib/event'
   2  import { NostrEvent } from 'nostr-tools'
   3  import { createContext, useCallback, useContext, useState } from 'react'
   4  
   5  type TDeletedEventContext = {
   6    addDeletedEvent: (event: NostrEvent) => void
   7    isEventDeleted: (event: NostrEvent) => boolean
   8  }
   9  
  10  const DeletedEventContext = createContext<TDeletedEventContext | undefined>(undefined)
  11  
  12  export const useDeletedEvent = () => {
  13    const context = useContext(DeletedEventContext)
  14    if (!context) {
  15      throw new Error('useDeletedEvent must be used within a DeletedEventProvider')
  16    }
  17    return context
  18  }
  19  
  20  export function DeletedEventProvider({ children }: { children: React.ReactNode }) {
  21    const [deletedEventKeys, setDeletedEventKeys] = useState<Set<string>>(new Set())
  22  
  23    const isEventDeleted = useCallback(
  24      (event: NostrEvent) => {
  25        return deletedEventKeys.has(getKey(event))
  26      },
  27      [deletedEventKeys]
  28    )
  29  
  30    const addDeletedEvent = (event: NostrEvent) => {
  31      setDeletedEventKeys((prev) => new Set(prev).add(getKey(event)))
  32    }
  33  
  34    return (
  35      <DeletedEventContext.Provider value={{ addDeletedEvent, isEventDeleted }}>
  36        {children}
  37      </DeletedEventContext.Provider>
  38    )
  39  }
  40  
  41  function getKey(event: NostrEvent) {
  42    return isReplaceableEvent(event.kind) ? getReplaceableCoordinateFromEvent(event) : event.id
  43  }
  44