diff --git a/lib/shared/thread-utils.js b/lib/shared/thread-utils.js --- a/lib/shared/thread-utils.js +++ b/lib/shared/thread-utils.js @@ -394,9 +394,15 @@ memberIDs: $ReadOnlyArray, sourceMessageID: ?string, ): string { - const pendingThreadKey = sourceMessageID - ? `sidebar/${sourceMessageID}` - : [...memberIDs].sort().join('+'); + let pendingThreadKey; + if (sourceMessageID && threadTypeIsThick(threadType)) { + pendingThreadKey = `thick_sidebar/${sourceMessageID}`; + } else if (sourceMessageID) { + pendingThreadKey = `sidebar/${sourceMessageID}`; + } else { + pendingThreadKey = [...memberIDs].sort().join('+'); + } + const pendingThreadTypeString = sourceMessageID ? '' : `type${threadType}/`; return `pending/${pendingThreadTypeString}${pendingThreadKey}`; } @@ -415,13 +421,21 @@ if (!pendingThreadIDMatches) { return null; } + const [threadTypeString, threadKey] = pendingThreadIDMatches[1].split('/'); - const threadType = - threadTypeString === 'sidebar' - ? threadTypes.SIDEBAR - : assertThreadType(Number(threadTypeString.replace('type', ''))); - const memberIDs = threadTypeString === 'sidebar' ? [] : threadKey.split('+'); - const sourceMessageID = threadTypeString === 'sidebar' ? threadKey : null; + let threadType; + if (threadTypeString === 'thick_sidebar') { + threadType = threadTypes.THICK_SIDEBAR; + } else if (threadTypeString === 'sidebar') { + threadType = threadTypes.SIDEBAR; + } else { + threadType = assertThreadType(Number(threadTypeString.replace('type', ''))); + } + + const threadTypeStringIsSidebar = + threadTypeString === 'sidebar' || threadTypeString === 'thick_sidebar'; + const memberIDs = threadTypeStringIsSidebar ? [] : threadKey.split('+'); + const sourceMessageID = threadTypeStringIsSidebar ? threadKey : null; return { threadType, memberIDs, diff --git a/lib/shared/thread-utils.test.js b/lib/shared/thread-utils.test.js --- a/lib/shared/thread-utils.test.js +++ b/lib/shared/thread-utils.test.js @@ -3,6 +3,7 @@ import { parsePendingThreadID, threadInfoFromRawThreadInfo, + getPendingThreadID, } from './thread-utils.js'; import { threadInfoValidator } from '../permissions/minimally-encoded-thread-permissions-validators.js'; import type { RawThreadInfo } from '../types/minimally-encoded-thread-permissions-types.js'; @@ -30,6 +31,15 @@ ); }); + const thickSidebarResult = { + threadType: threadTypes.THICK_SIDEBAR, + memberIDs: [], + sourceMessageID: '12345', + }; + expect(parsePendingThreadID('pending/thick_sidebar/12345')).toStrictEqual( + thickSidebarResult, + ); + it('should return correct data for real pending sidebar ID', () => { const pendingPersonalResult = { threadType: threadTypes.GENESIS_PERSONAL, @@ -195,3 +205,11 @@ expect(threadInfoValidator.is(threadInfo)).toBe(true); }); }); + +describe('getPendingThreadID', () => { + it('should return correct ID from thick sidebar input', () => { + expect( + getPendingThreadID(threadTypes.THICK_SIDEBAR, [], '12345'), + ).toStrictEqual('pending/thick_sidebar/12345'); + }); +}); diff --git a/lib/utils/validation-utils.js b/lib/utils/validation-utils.js --- a/lib/utils/validation-utils.js +++ b/lib/utils/validation-utils.js @@ -112,7 +112,7 @@ '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'; const idSchemaRegex = `(?:(?:[0-9]+|${uuidRegex})\\|)?(?:[0-9]+|${uuidRegex})`; -const pendingThreadIDRegex = `pending/(type[0-9]+/[0-9]+(\\+[0-9]+)*|sidebar/${idSchemaRegex})`; +const pendingThreadIDRegex = `pending/(type[0-9]+/[0-9]+(\\+[0-9]+)*|(sidebar|thick_sidebar)/${idSchemaRegex})`; const thickThreadIDRegex: RegExp = new RegExp(`^${uuidRegex}$`); const chatNameMaxLength = 191;