ATlast — you'll never need to find your favorites on another platform again. Find your favs in the ATmosphere.
atproto

fix: pass onProgressUpdate and onComplete callbacks to searchAllUsers

byarielm.fyi a90f3a81 6ced3f0b

verified
Changed files
+134 -21
docs
packages
web
src
+21 -13
docs/git-history.json
··· 1 1 [ 2 2 { 3 - "hash": "581ed00fec3c0c5f472c6ff92e00bf4ed5b27e9a", 4 - "short_hash": "581ed00", 3 + "hash": "6ced3f0b015af1c9126559a393996576402cfd03", 4 + "short_hash": "6ced3f0", 5 5 "author": "Ariel M. Lighty", 6 - "date": "2025-12-26T13:47:37-05:00", 7 - "message": "fix extension import: use bulkCreate and handle uploadId param\n\nBackend fixes:\n- Use SourceAccountRepository.bulkCreate() instead of non-existent upsertSourceAccount()\n- Change redirectUrl from /results?uploadId= to /?uploadId=\n- More efficient bulk insert instead of loop\n\nFrontend fixes:\n- Add useEffect to load results when uploadId param present\n- Calls loadUploadResults(uploadId) automatically on page load\n- Cleans up URL param after loading\n\nResolves:\n- \"sourceAccountRepo.upsertSourceAccount is not a function\" error\n- \"No routes matched location /results?uploadId=...\" routing error", 8 - "files_changed": 4 6 + "date": "2025-12-26T14:12:46-05:00", 7 + "message": "fix extension flow: create user_source_follows, auto-search, time display\n\nBackend (extension-import.ts):\n- Now creates user_source_follows entries linking upload to source accounts\n- Without these, get-upload-details returned empty (queries FROM user_source_follows)\n- Uses bulkCreate return value (Map<username, id>) to create links\n\nFrontend (App.tsx):\n- handleLoadUpload now detects if upload has no matches yet\n- Sets isSearching: true for new uploads\n- Automatically triggers searchAllUsers for new uploads\n- Saves results after search completes\n- Changed platform from hardcoded \"tiktok\" to \"twitter\"\n\nFrontend (HistoryTab.tsx):\n- Fixed time display: removed \"Uploaded\" prefix\n- Now shows \"about 5 hours ago\" instead of \"Uploaded in about 5 hours\"\n- formatRelativeTime with addSuffix already provides complete sentence\n\nResolves:\n- Empty results on page load\n- No automatic searching\n- History navigation not working (will work after search)\n- Grammatically incorrect time display", 8 + "files_changed": 5 9 + }, 10 + { 11 + "hash": "b6b8c3968bbe1d71e38d2acbea3f31c77f08656a", 12 + "short_hash": "b6b8c39", 13 + "author": "Ariel M. Lighty", 14 + "date": "2025-12-26T13:52:59-05:00", 15 + "message": "fix: correct function name to handleLoadUpload in uploadId useEffect", 16 + "files_changed": 3 9 17 }, 10 18 { 11 19 "hash": "581ed00fec3c0c5f472c6ff92e00bf4ed5b27e9a", ··· 32 40 "files_changed": 2 33 41 }, 34 42 { 43 + "hash": "a203bc343b1768cd51e08b51ed296eddb51d21b7", 44 + "short_hash": "a203bc3", 45 + "author": "Ariel M. Lighty", 46 + "date": "2025-12-26T00:50:44-05:00", 47 + "message": "update documentation with current debugging status\n\nPLAN.md updates:\n- Added current status section with recent fixes and active work\n- Marked Phase 0 as complete\n- Marked Phase 1 as in progress (debugging)\n- Updated changelog with 2025-12-26 progress\n- Updated decision graph count to 288 nodes\n\nEXTENSION_STATUS.md updates:\n- Changed state from READY FOR TESTING to DEBUGGING\n- Added fixed issues section (NaN bug, database init)\n- Added active debugging section\n- Updated decision graph summary to 288 nodes\n- Added node references for recent fixes (#287-288)\n\nDecision graph:\n- Synced with latest nodes (288 total, 276 edges)\n- Tracked database initialization outcome", 48 + "files_changed": 4 49 + }, 50 + { 35 51 "hash": "34bd9dcd1237971a87627b148c0452b8484e4871", 36 52 "short_hash": "34bd9dc", 37 53 "author": "Ariel M. Lighty", ··· 46 62 "date": "2025-12-26T00:33:21-05:00", 47 63 "message": "fix extension-import: add missing matchedUsers parameter to createUpload\n\nThe createUpload method expects 5 parameters but we were only passing 4,\ncausing NaN to be inserted for unmatched_users calculation. Now passing 0\nfor matchedUsers (will be updated after search is performed).", 48 64 "files_changed": 1 49 - }, 50 - { 51 - "hash": "a8a4b0a819297dec7b92d02036699cc86b2523ce", 52 - "short_hash": "a8a4b0a", 53 - "author": "Ariel M. Lighty", 54 - "date": "2025-12-26T00:33:21-05:00", 55 - "message": "fix extension-import: add missing matchedUsers parameter to createUpload\n\nThe createUpload method expects 5 parameters but we were only passing 4,\ncausing NaN to be inserted for unmatched_users calculation. Now passing 0\nfor matchedUsers (will be updated after search is performed).", 56 - "files_changed": 3 57 65 }, 58 66 { 59 67 "hash": "d0bcf337b6d223a86443f6f67767e87b74e4dd7d",
+99
docs/graph-data.json
··· 3398 3398 "created_at": "2025-12-26T14:11:09.055850200-05:00", 3399 3399 "updated_at": "2025-12-26T14:11:09.055850200-05:00", 3400 3400 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3401 + }, 3402 + { 3403 + "id": 310, 3404 + "change_id": "51369a2c-17ec-4be3-ba4f-240b770d7211", 3405 + "node_type": "outcome", 3406 + "title": "Committed all extension flow fixes", 3407 + "description": null, 3408 + "status": "pending", 3409 + "created_at": "2025-12-26T14:16:08.387214900-05:00", 3410 + "updated_at": "2025-12-26T14:16:08.387214900-05:00", 3411 + "metadata_json": "{\"branch\":\"master\",\"commit\":\"6ced3f0\",\"confidence\":95}" 3412 + }, 3413 + { 3414 + "id": 311, 3415 + "change_id": "91d7bad2-a8a3-47c3-8fad-558919b207b0", 3416 + "node_type": "observation", 3417 + "title": "searchAllUsers called with wrong parameters - missing onProgressUpdate callback", 3418 + "description": null, 3419 + "status": "pending", 3420 + "created_at": "2025-12-26T16:07:21.838974100-05:00", 3421 + "updated_at": "2025-12-26T16:07:21.838974100-05:00", 3422 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3423 + }, 3424 + { 3425 + "id": 312, 3426 + "change_id": "9a95c7e6-6339-475f-9b20-5fa3057e0a9f", 3427 + "node_type": "action", 3428 + "title": "Fix searchAllUsers call with correct parameters and callbacks", 3429 + "description": null, 3430 + "status": "pending", 3431 + "created_at": "2025-12-26T16:08:18.523845400-05:00", 3432 + "updated_at": "2025-12-26T16:08:18.523845400-05:00", 3433 + "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3434 + }, 3435 + { 3436 + "id": 313, 3437 + "change_id": "5fae9da8-2a31-4f99-9686-7bfb28c443e8", 3438 + "node_type": "outcome", 3439 + "title": "Fixed searchAllUsers call - now passes onProgressUpdate and onComplete callbacks", 3440 + "description": null, 3441 + "status": "pending", 3442 + "created_at": "2025-12-26T16:08:24.248208800-05:00", 3443 + "updated_at": "2025-12-26T16:08:24.248208800-05:00", 3444 + "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3401 3445 } 3402 3446 ], 3403 3447 "edges": [ ··· 6678 6722 "weight": 1.0, 6679 6723 "rationale": "Implementation complete", 6680 6724 "created_at": "2025-12-26T14:11:11.543447500-05:00" 6725 + }, 6726 + { 6727 + "id": 299, 6728 + "from_node_id": 309, 6729 + "to_node_id": 310, 6730 + "from_change_id": "cd9b88e7-fe8d-4ee0-a187-e99eef0b7e64", 6731 + "to_change_id": "51369a2c-17ec-4be3-ba4f-240b770d7211", 6732 + "edge_type": "leads_to", 6733 + "weight": 1.0, 6734 + "rationale": "Committed to repository", 6735 + "created_at": "2025-12-26T14:16:10.702697200-05:00" 6736 + }, 6737 + { 6738 + "id": 300, 6739 + "from_node_id": 305, 6740 + "to_node_id": 310, 6741 + "from_change_id": "8ad6ef53-29a2-442e-b88f-9e0541634950", 6742 + "to_change_id": "51369a2c-17ec-4be3-ba4f-240b770d7211", 6743 + "edge_type": "leads_to", 6744 + "weight": 1.0, 6745 + "rationale": "All goals achieved", 6746 + "created_at": "2025-12-26T14:16:12.935280500-05:00" 6747 + }, 6748 + { 6749 + "id": 301, 6750 + "from_node_id": 310, 6751 + "to_node_id": 311, 6752 + "from_change_id": "51369a2c-17ec-4be3-ba4f-240b770d7211", 6753 + "to_change_id": "91d7bad2-a8a3-47c3-8fad-558919b207b0", 6754 + "edge_type": "leads_to", 6755 + "weight": 1.0, 6756 + "rationale": "New error found", 6757 + "created_at": "2025-12-26T16:07:24.117669300-05:00" 6758 + }, 6759 + { 6760 + "id": 302, 6761 + "from_node_id": 311, 6762 + "to_node_id": 312, 6763 + "from_change_id": "91d7bad2-a8a3-47c3-8fad-558919b207b0", 6764 + "to_change_id": "9a95c7e6-6339-475f-9b20-5fa3057e0a9f", 6765 + "edge_type": "leads_to", 6766 + "weight": 1.0, 6767 + "rationale": "Fix applied", 6768 + "created_at": "2025-12-26T16:08:21.431326200-05:00" 6769 + }, 6770 + { 6771 + "id": 303, 6772 + "from_node_id": 312, 6773 + "to_node_id": 313, 6774 + "from_change_id": "9a95c7e6-6339-475f-9b20-5fa3057e0a9f", 6775 + "to_change_id": "5fae9da8-2a31-4f99-9686-7bfb28c443e8", 6776 + "edge_type": "leads_to", 6777 + "weight": 1.0, 6778 + "rationale": "Implementation complete", 6779 + "created_at": "2025-12-26T16:08:26.942822600-05:00" 6681 6780 } 6682 6781 ] 6683 6782 }
+14 -8
packages/web/src/App.tsx
··· 206 206 207 207 // If no matches yet, trigger search 208 208 if (!hasMatches) { 209 - setStatusMessage("Starting search for matches..."); 210 209 const followLexicon = ATPROTO_APPS[currentDestinationAppId]?.followLexicon; 211 - await searchAllUsers(loadedResults, followLexicon); 212 210 213 - // Save results after search completes 214 - const updatedResults = loadedResults.filter(r => !r.isSearching); 215 - if (updatedResults.length > 0) { 216 - await saveResults(uploadId, platform, updatedResults); 217 - } 211 + await searchAllUsers( 212 + loadedResults, 213 + (message) => setStatusMessage(message), 214 + async () => { 215 + // Search complete - save results 216 + // Use current searchResults state which has been updated by searchAllUsers 217 + const currentResults = searchResults.filter(r => !r.isSearching); 218 + if (currentResults.length > 0) { 219 + await saveResults(uploadId, platform, currentResults); 220 + } 221 + }, 222 + followLexicon 223 + ); 218 224 } 219 225 220 226 // Announce to screen readers only - visual feedback is navigation to results page ··· 227 233 setCurrentStep("home"); 228 234 } 229 235 }, 230 - [setStatusMessage, setCurrentStep, setSearchResults, setAriaAnnouncement, error, currentDestinationAppId, searchAllUsers, saveResults], 236 + [setStatusMessage, setCurrentStep, setSearchResults, setAriaAnnouncement, error, currentDestinationAppId, searchAllUsers, saveResults, searchResults], 231 237 ); 232 238 233 239 // Login handler