From fa16e853a8992e7edc55ca2d0b6bb9ae9b52aa2d Mon Sep 17 00:00:00 2001 From: Abhay Singh Date: Wed, 22 Jul 2026 17:54:14 +0530 Subject: [PATCH] fix(extension): paginate Twitter bookmark-folder imports past the first page (#1269) --- .../browser-extension/utils/twitter-import.ts | 23 ++++++++----------- apps/browser-extension/utils/twitter-utils.ts | 13 +++++++++-- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/apps/browser-extension/utils/twitter-import.ts b/apps/browser-extension/utils/twitter-import.ts index 3c463370..a9ab243a 100644 --- a/apps/browser-extension/utils/twitter-import.ts +++ b/apps/browser-extension/utils/twitter-import.ts @@ -113,19 +113,14 @@ export class TwitterImporter { const headers = createTwitterAPIHeaders(tokens) // Build API request with pagination - const variables = - this.config.isFolderImport && this.config.bookmarkCollectionId - ? buildBookmarkCollectionVariables(this.config.bookmarkCollectionId) - : buildRequestVariables(cursor) - const urlWithCursor = cursor - ? `${ - this.config.isFolderImport && this.config.bookmarkCollectionId - ? `${BOOKMARK_COLLECTION_URL}&variables=${encodeURIComponent(JSON.stringify(variables))}` - : BOOKMARKS_URL - }&variables=${encodeURIComponent(JSON.stringify(variables))}` - : this.config.isFolderImport && this.config.bookmarkCollectionId - ? `${BOOKMARK_COLLECTION_URL}&variables=${encodeURIComponent(JSON.stringify(variables))}` - : `${BOOKMARKS_URL}&variables=${encodeURIComponent(JSON.stringify(variables))}` + const collectionId = this.config.isFolderImport + ? this.config.bookmarkCollectionId + : undefined + const variables = collectionId + ? buildBookmarkCollectionVariables(collectionId, cursor) + : buildRequestVariables(cursor) + const baseUrl = collectionId ? BOOKMARK_COLLECTION_URL : BOOKMARKS_URL + const urlWithCursor = `${baseUrl}&variables=${encodeURIComponent(JSON.stringify(variables))}` const response = await fetch(urlWithCursor, { method: "GET", @@ -199,7 +194,7 @@ export class TwitterImporter { [] const nextCursor = extractNextCursor(instructions) - if (nextCursor && tweets.length > 0 && !this.config.isFolderImport) { + if (nextCursor && tweets.length > 0) { await new Promise((resolve) => setTimeout(resolve, 1000)) // Rate limiting await this.batchImportAll(nextCursor, importedCount, uniqueGroupId) } else { diff --git a/apps/browser-extension/utils/twitter-utils.ts b/apps/browser-extension/utils/twitter-utils.ts index 0f498a23..8085bf3a 100644 --- a/apps/browser-extension/utils/twitter-utils.ts +++ b/apps/browser-extension/utils/twitter-utils.ts @@ -434,9 +434,18 @@ export function buildRequestVariables(cursor?: string, count = 100) { /** * Build Twitter API request variables for bookmark collection */ -export function buildBookmarkCollectionVariables(bookmarkCollectionId: string) { - return { +export function buildBookmarkCollectionVariables( + bookmarkCollectionId: string, + cursor?: string, +) { + const variables: Record = { bookmark_collection_id: bookmarkCollectionId, includePromotedContent: true, } + + if (cursor) { + variables.cursor = cursor + } + + return variables }