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

docs: update decision graph after loading screen fix

byarielm.fyi c5adc150 46626f4a

verified
Changed files
+76 -16
docs
+32 -16
docs/git-history.json
··· 1 1 [ 2 2 { 3 - "hash": "0afa0ffafd9b05f12d7d52c50082a54f237e09d8", 4 - "short_hash": "0afa0ff", 3 + "hash": "46626f4a18eaaaaf42368361130bb1ddc7bd9677", 4 + "short_hash": "46626f4", 5 5 "author": "Ariel M. Lighty", 6 - "date": "2025-12-26T20:20:50-05:00", 7 - "message": "fix: sourceUser should be object {username, date} not string\n\nWas setting sourceUser to result.sourceUser.username (string)\nShould be result.sourceUser (SourceUser object)\n\nThis caused:\n- useSearch to call batch.map(r => r.sourceUser.username) on strings\n- .username on string returns undefined\n- batch-search-actors received null values\n- ValidationError: expected string, received null\n\nAlso caused localeCompare error when sorting undefined values.", 8 - "files_changed": 3 6 + "date": "2025-12-26T21:20:34-05:00", 7 + "message": "fix: show loading screen during extension upload search\n\nPreviously when loading an upload from extension that hadn't been searched yet,\nthe app would immediately navigate to the results page showing 'none' for all\nmatches, then update them as the search progressed.\n\nNow it behaves like the file upload flow:\n- Shows loading screen during search\n- Navigates to results only after search completes and results are saved\n- If upload already has matches, navigates to results immediately", 8 + "files_changed": 1 9 + }, 10 + { 11 + "hash": "212660a996d6b0f1db59f9532d2b3968c7113f10", 12 + "short_hash": "212660a", 13 + "author": "Ariel M. Lighty", 14 + "date": "2025-12-26T20:58:45-05:00", 15 + "message": "fix: pass final search results to onComplete callback\n\nFixes issue where results were displayed but not saved to database until\npage refresh. Root cause: onComplete callback accessed stale searchResults\nfrom closure instead of updated state.\n\nChanges:\n- useSearch.searchAllUsers: onComplete now receives SearchResult[] param\n- useSearch: uses setSearchResults updater to get current state\n- App.tsx: updated all 3 searchAllUsers calls to use finalResults\n- Removed setTimeout workarounds\n\nResult: Extension and file upload flows now save immediately after search.", 16 + "files_changed": 4 17 + }, 18 + { 19 + "hash": "212660a996d6b0f1db59f9532d2b3968c7113f10", 20 + "short_hash": "212660a", 21 + "author": "Ariel M. Lighty", 22 + "date": "2025-12-26T20:58:45-05:00", 23 + "message": "fix: pass final search results to onComplete callback\n\nFixes issue where results were displayed but not saved to database until\npage refresh. Root cause: onComplete callback accessed stale searchResults\nfrom closure instead of updated state.\n\nChanges:\n- useSearch.searchAllUsers: onComplete now receives SearchResult[] param\n- useSearch: uses setSearchResults updater to get current state\n- App.tsx: updated all 3 searchAllUsers calls to use finalResults\n- Removed setTimeout workarounds\n\nResult: Extension and file upload flows now save immediately after search.", 24 + "files_changed": 4 9 25 }, 10 26 { 11 27 "hash": "6ced3f0b015af1c9126559a393996576402cfd03", ··· 16 32 "files_changed": 5 17 33 }, 18 34 { 19 - "hash": "581ed00fec3c0c5f472c6ff92e00bf4ed5b27e9a", 20 - "short_hash": "581ed00", 35 + "hash": "6ced3f0b015af1c9126559a393996576402cfd03", 36 + "short_hash": "6ced3f0", 21 37 "author": "Ariel M. Lighty", 22 - "date": "2025-12-26T13:47:37-05:00", 23 - "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", 24 - "files_changed": 4 38 + "date": "2025-12-26T14:12:46-05:00", 39 + "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", 40 + "files_changed": 5 25 41 }, 26 42 { 27 43 "hash": "581ed00fec3c0c5f472c6ff92e00bf4ed5b27e9a", ··· 88 104 "files_changed": 3 89 105 }, 90 106 { 91 - "hash": "ba29fd68872913ba0a587aa7f29f97b3d373a732", 92 - "short_hash": "ba29fd6", 107 + "hash": "32cdee3aeac7ef986df47e0fff786b5f7471e55b", 108 + "short_hash": "32cdee3", 93 109 "author": "Ariel M. Lighty", 94 110 "date": "2025-12-25T13:22:32-05:00", 95 111 "message": "configure Netlify dev for monorepo with --filter flag\n\nFixed Netlify CLI monorepo detection issue by using --filter flag:\n- Updated root package.json scripts to use 'npx netlify-cli dev --filter @atlast/web'\n- Updated netlify.toml [dev] section to use npm with --prefix for framework command\n- Added monorepo development instructions to CLAUDE.md\n- Documented Windows Git Bash compatibility issue with netlify command\n\nSolution: Use 'npx netlify-cli dev --filter @atlast/web' to bypass monorepo\nproject selection prompt and specify which workspace package to run.\n\nDev server now runs successfully at http://localhost:8888 with all backend\nfunctions loaded.", 96 - "files_changed": 5 112 + "files_changed": 4 97 113 }, 98 114 { 99 - "hash": "32cdee3aeac7ef986df47e0fff786b5f7471e55b", 100 - "short_hash": "32cdee3", 115 + "hash": "ba29fd68872913ba0a587aa7f29f97b3d373a732", 116 + "short_hash": "ba29fd6", 101 117 "author": "Ariel M. Lighty", 102 118 "date": "2025-12-25T13:22:32-05:00", 103 119 "message": "configure Netlify dev for monorepo with --filter flag\n\nFixed Netlify CLI monorepo detection issue by using --filter flag:\n- Updated root package.json scripts to use 'npx netlify-cli dev --filter @atlast/web'\n- Updated netlify.toml [dev] section to use npm with --prefix for framework command\n- Added monorepo development instructions to CLAUDE.md\n- Documented Windows Git Bash compatibility issue with netlify command\n\nSolution: Use 'npx netlify-cli dev --filter @atlast/web' to bypass monorepo\nproject selection prompt and specify which workspace package to run.\n\nDev server now runs successfully at http://localhost:8888 with all backend\nfunctions loaded.", 104 - "files_changed": 4 120 + "files_changed": 5 105 121 }, 106 122 { 107 123 "hash": "c3e7afad396d130791d801a85cbfc9643bcd6309",
+44
docs/graph-data.json
··· 3552 3552 "created_at": "2025-12-26T20:55:36.922743800-05:00", 3553 3553 "updated_at": "2025-12-26T20:55:36.922743800-05:00", 3554 3554 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3555 + }, 3556 + { 3557 + "id": 324, 3558 + "change_id": "c941c916-0fcb-44d6-9786-dfd53447cebe", 3559 + "node_type": "outcome", 3560 + "title": "Committed stale closure fix - results now save immediately after search completes", 3561 + "description": null, 3562 + "status": "pending", 3563 + "created_at": "2025-12-26T20:58:48.266958800-05:00", 3564 + "updated_at": "2025-12-26T20:58:48.266958800-05:00", 3565 + "metadata_json": "{\"branch\":\"master\",\"commit\":\"212660a\",\"confidence\":95}" 3566 + }, 3567 + { 3568 + "id": 325, 3569 + "change_id": "e44f45f8-bac9-4a49-ac68-ac9d7d113226", 3570 + "node_type": "outcome", 3571 + "title": "Loading screen now shows during extension upload search", 3572 + "description": null, 3573 + "status": "pending", 3574 + "created_at": "2025-12-26T21:20:42.635515100-05:00", 3575 + "updated_at": "2025-12-26T21:20:42.635515100-05:00", 3576 + "metadata_json": "{\"branch\":\"master\",\"commit\":\"46626f4\",\"confidence\":95}" 3555 3577 } 3556 3578 ], 3557 3579 "edges": [ ··· 7008 7030 "weight": 1.0, 7009 7031 "rationale": "Implementation complete", 7010 7032 "created_at": "2025-12-26T20:55:40.014892600-05:00" 7033 + }, 7034 + { 7035 + "id": 315, 7036 + "from_node_id": 323, 7037 + "to_node_id": 324, 7038 + "from_change_id": "88fc65bc-c2da-4df7-b79e-ba80d93e5b77", 7039 + "to_change_id": "c941c916-0fcb-44d6-9786-dfd53447cebe", 7040 + "edge_type": "leads_to", 7041 + "weight": 1.0, 7042 + "rationale": "Committed to repository", 7043 + "created_at": "2025-12-26T20:58:50.561027500-05:00" 7044 + }, 7045 + { 7046 + "id": 316, 7047 + "from_node_id": 324, 7048 + "to_node_id": 325, 7049 + "from_change_id": "c941c916-0fcb-44d6-9786-dfd53447cebe", 7050 + "to_change_id": "e44f45f8-bac9-4a49-ac68-ac9d7d113226", 7051 + "edge_type": "leads_to", 7052 + "weight": 1.0, 7053 + "rationale": "User reported results showing 'none' before search completes - needed to keep user on loading screen", 7054 + "created_at": "2025-12-26T21:20:53.976836200-05:00" 7011 7055 } 7012 7056 ] 7013 7057 }