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