You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.5 KiB
45 lines
1.5 KiB
import { normalizeReplaceableCoordinateString } from '@/lib/event' |
|
import { nip19 } from 'nostr-tools' |
|
|
|
/** Decoded target for one bookmark/pin list entry (NIP-19 nevent/note or naddr). */ |
|
export type TPersonalListBech32Ref = { eIdLower?: string; aCoordLower?: string } |
|
|
|
export function decodePersonalListBech32Ref(bech32Id: string): TPersonalListBech32Ref | null { |
|
try { |
|
const dec = nip19.decode(bech32Id.trim()) |
|
if (dec.type === 'nevent') { |
|
return { eIdLower: dec.data.id.toLowerCase() } |
|
} |
|
if (dec.type === 'note') { |
|
return { eIdLower: dec.data.toLowerCase() } |
|
} |
|
if (dec.type === 'naddr') { |
|
const { kind, pubkey, identifier } = dec.data |
|
return { aCoordLower: `${kind}:${pubkey}:${identifier}`.toLowerCase() } |
|
} |
|
} catch { |
|
return null |
|
} |
|
return null |
|
} |
|
|
|
/** |
|
* Next bookmark list (kind 10003) tags after dropping one `e` or `a` ref. |
|
* Returns null if nothing matched (list unchanged). |
|
*/ |
|
export function bookmarkListTagsAfterRemovingRef( |
|
tags: string[][], |
|
ref: TPersonalListBech32Ref |
|
): string[][] | null { |
|
if (!ref.eIdLower && !ref.aCoordLower) return null |
|
const next = tags.filter((tag) => { |
|
const k = tag[0] |
|
if (ref.eIdLower && (k === 'e' || k === 'E') && tag[1]?.toLowerCase() === ref.eIdLower) return false |
|
if (ref.aCoordLower && (k === 'a' || k === 'A') && tag[1]) { |
|
const n = normalizeReplaceableCoordinateString(tag[1]) |
|
if (n === ref.aCoordLower) return false |
|
} |
|
return true |
|
}) |
|
return next.length === tags.length ? null : next |
|
}
|
|
|