diff --git a/js/ui/components/RevertModal.js b/js/ui/components/RevertModal.js index f53ed0c0..ac7c5fdb 100644 --- a/js/ui/components/RevertModal.js +++ b/js/ui/components/RevertModal.js @@ -1,3 +1,4 @@ +import { getDTagValueFromTags } from "../../nostr/nip71.js"; import { Nip71FormManager } from "./nip71FormManager.js"; import { createModalAccessibility } from "./modalAccessibility.js"; import { getDTagValueFromTags } from "../../nostr/nip71.js"; @@ -595,6 +596,24 @@ export class RevertModal { return; } + const createdAt = typeof version.created_at === "number" ? version.created_at : 0; + const absolute = this.formatAbsoluteTimestamp + ? this.formatAbsoluteTimestamp(createdAt) + : ""; + const relative = this.formatTimeAgo ? this.formatTimeAgo(createdAt) : ""; + const description = + typeof version.description === "string" ? version.description : ""; + const thumbnail = + typeof version.thumbnail === "string" ? version.thumbnail.trim() : ""; + const url = typeof version.url === "string" ? version.url.trim() : ""; + const magnet = + typeof version.magnet === "string" ? version.magnet.trim() : ""; + const rawMagnet = + typeof version.rawMagnet === "string" ? version.rawMagnet.trim() : ""; + const displayMagnet = magnet || rawMagnet; + const isPrivate = version.isPrivate === true; + const dTagValue = getDTagValueFromTags(version.tags); + const nip71Metadata = this.buildNip71DisplayMetadata(version); const dTagValue = getDTagValueFromTags(version.tags); diff --git a/tests/nostr/nip71-d-tag.test.mjs b/tests/nostr/nip71-d-tag.test.mjs new file mode 100644 index 00000000..1e323690 --- /dev/null +++ b/tests/nostr/nip71-d-tag.test.mjs @@ -0,0 +1,47 @@ +import assert from 'node:assert/strict'; +import { test } from 'node:test'; +import { getDTagValueFromTags } from '../../js/nostr/nip71.js'; + +test('getDTagValueFromTags utility', async (t) => { + await t.test('returns empty string for invalid inputs', () => { + assert.equal(getDTagValueFromTags(null), ''); + assert.equal(getDTagValueFromTags(undefined), ''); + assert.equal(getDTagValueFromTags({}), ''); + assert.equal(getDTagValueFromTags(''), ''); + assert.equal(getDTagValueFromTags(123), ''); + }); + + await t.test('returns empty string if no d-tag present', () => { + const tags = [['p', 'pubkey'], ['e', 'event-id']]; + assert.equal(getDTagValueFromTags(tags), ''); + }); + + await t.test('returns correct value for single d-tag', () => { + const tags = [['d', 'test-value']]; + assert.equal(getDTagValueFromTags(tags), 'test-value'); + }); + + await t.test('returns first value for multiple d-tags', () => { + const tags = [['d', 'first'], ['d', 'second']]; + assert.equal(getDTagValueFromTags(tags), 'first'); + }); + + await t.test('skips invalid d-tags (malformed)', () => { + const tags = [ + ['d'], // missing value + ['d', 123], // value not string + ['d', null], // value not string + 'invalid', // tag not array + ['d', 'valid'], + ]; + assert.equal(getDTagValueFromTags(tags), 'valid'); + }); + + await t.test('handles empty d-tag value correctly', () => { + // nip71 implementation returns empty string if value is empty string, OR skips it? + // Implementation: if (typeof tag[1] === "string" && tag[1]) { return tag[1]; } + // So it skips empty strings. + const tags = [['d', ''], ['d', 'fallback']]; + assert.equal(getDTagValueFromTags(tags), 'fallback'); + }); +});