diff --git a/src/lib/utils/unique-identifier.js b/src/lib/utils/unique-identifier.js index 0cfa141..d45493f 100644 --- a/src/lib/utils/unique-identifier.js +++ b/src/lib/utils/unique-identifier.js @@ -138,13 +138,13 @@ export function extractIdentifierFromUrl(url) { return null; } - // Match pattern /id/QCXXXXXXXX - const match = url.match(/\/id\/([A-Z0-9]{10})$/i); + // Match current profile IDs, with optional trailing slash, query, or hash. + const match = url.match(/\/id\/(qryptchat[0-9A-Z]{8})(?:[/?#]|$)/i); if (!match) { return null; } - const identifier = match[1].toUpperCase(); + const identifier = parseUniqueIdentifier(match[1]); return validateUniqueIdentifier(identifier) ? identifier : null; } @@ -172,4 +172,4 @@ export function identifiersMatch(id1, id2) { const parsed2 = parseUniqueIdentifier(id2); return Boolean(parsed1 && parsed2 && parsed1 === parsed2); -} \ No newline at end of file +} diff --git a/tests/unique-identifier-utils.test.js b/tests/unique-identifier-utils.test.js index 39ef3fe..5e452ea 100644 --- a/tests/unique-identifier-utils.test.js +++ b/tests/unique-identifier-utils.test.js @@ -6,7 +6,9 @@ import { generateUniqueIdentifier, validateUniqueIdentifier, formatUniqueIdentifier, - parseUniqueIdentifier + parseUniqueIdentifier, + generateShareableProfileUrl, + extractIdentifierFromUrl } from '../src/lib/utils/unique-identifier.js'; describe('Unique Identifier Utils', () => { @@ -129,5 +131,21 @@ describe('Unique Identifier Utils', () => { expect(parsed).to.equal(id); }); }); + + it('should round-trip generated profile URLs back to the identifier', () => { + const identifier = 'qryptchatA1B2C3D4'; + const url = generateShareableProfileUrl(identifier, 'https://qrypt.chat/'); + + expect(url).to.equal('https://qrypt.chat/id/qryptchatA1B2C3D4'); + expect(extractIdentifierFromUrl(url)).to.equal(identifier); + }); + + it('should extract identifiers from profile URLs with trailing delimiters', () => { + const identifier = 'qryptchatA1B2C3D4'; + + expect(extractIdentifierFromUrl(`https://qrypt.chat/id/${identifier}/`)).to.equal(identifier); + expect(extractIdentifierFromUrl(`https://qrypt.chat/id/${identifier}?action=chat`)).to.equal(identifier); + expect(extractIdentifierFromUrl(`https://qrypt.chat/id/${identifier}#profile`)).to.equal(identifier); + }); }); -}); \ No newline at end of file +});