Commit Graph
481 Commits
Author SHA1 Message Date
thePR0M3TH3AN dd9b9f1968 Defer login hydration loads 2026-01-28 15:15:52 -05:00
google-labs-jules[bot]andPR0M3TH3AN 90a74e7721 fix(perf): parallelize user data loading during NIP-07 login
Optimizes `handleAuthLogin` in `js/app.js` to run user data fetching (blocks, subscriptions, hashtag preferences) in the background instead of blocking the main UI render. This significantly improves perceived login speed, especially for users with large lists or slow NIP-07 extensions.

- Moves `userBlocks.seedWithNpubs` (which involves publishing) to background.
- Moves `subscriptions.ensureLoaded` and `hashtagPreferences.load` (which involve decryption) to background.
- Adds a race condition for `userBlocks.ensureLoaded` (read-only) with a short timeout to attempt early hydration without blocking indefinitely.
- Ensures the UI updates reactively when background data arrives via existing event listeners.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 18:02:37 +00:00
google-labs-jules[bot]andPR0M3TH3AN 64fa5d4cb3 Prioritize User Data Sync (Blocklists, DMs) over Video Feed
* Boost DM decryption priority to HIGH in `nostrClient` to match other critical user data.
* Enforce blocking in `handleAuthLogin` to await initial DM sync before refreshing the main video feed.
* This ensures users see their personal data (blocks, messages) correctly loaded before the public feed appears, improving the perception of consistency.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 17:23:13 +00:00
google-labs-jules[bot]andPR0M3TH3AN 5ae693acbd Prioritize user lists syncing during login
Prioritize fetching of block lists, subscriptions, and other user data before loading the main video feed during login.
- In `handleAuthLogin`, stop the existing video feed subscription immediately to free up bandwidth.
- Explicitly await `subscriptions.ensureLoaded(activePubkey)` alongside `userBlocks.seedWithNpubs` before triggering `refreshAllVideoGrids`.
This ensures user context is fully loaded before the heavy feed sync starts, addressing slow sync issues especially with NIP-07.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 16:20:34 +00:00
google-labs-jules[bot]andPR0M3TH3AN e5f24bf4b0 refactor(ai): extract handleRevertVideo from js/app.js (agent)
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-27 03:20:08 +00:00
thePR0M3TH3AN 50793430a8 Add btih extraction helper 2026-01-26 21:49:18 -05:00
thePR0M3TH3AN 802c70a0e3 Normalize block checks for author moderation 2026-01-26 08:01:40 -05:00
google-labs-jules[bot] 62dcc57e64 refactor(ai): extract EditModalController from js/app.js (agent) 2026-01-26 03:21:44 +00:00
thePR0M3TH3AN 4373bda877 Remove deprecated quick R2 upload 2026-01-25 21:35:50 -05:00
thePR0M3TH3AN b6260c1352 Merge pull request #1686 from PR0M3TH3AN/fix-storage-isolation-7292502268303926887
Fix storage credentials persistence on profile switch
2026-01-25 13:35:24 -05:00
google-labs-jules[bot] a718c65173 fix(ai): frontend console error — missing css & concurrent reqs (agent) 2026-01-25 18:33:19 +00:00
google-labs-jules[bot] 94cafc26ab Fix storage credentials persistence on profile switch
This change ensures that cloud storage credentials are not leaked between Nostr profiles when switching accounts in the UI.

Changes:
- Imported `storageService` in `js/app.js` to enable the `bitvid:auth-changed` event listener to correctly lock the previous profile's storage session.
- Updated `ProfileModalController.populateStoragePane` to explicitly clear the storage form before loading new data.
- Enhanced `ProfileModalController.handleClearStorage` to fully reset the form state, including the provider selection and visibility toggles.

Verified with a reproduction script (`reproduce_storage_isolation.mjs`) that `StorageService` correctly isolates data by pubkey at the backend level. The UI fixes address the frontend persistence issue.
2026-01-25 18:32:46 +00:00
google-labs-jules[bot] 4c93080baa refactor(ai): extract ShareNostrController from js/app.js (agent) 2026-01-25 03:34:10 +00:00
google-labs-jules[bot] ee0af68bfd fix: prevent SecurityError in pushState when playing video on local origin
When running the application locally (e.g., `127.0.0.1:5500`) but using a production configuration (`BITVID_WEBSITE_URL` pointing to `bitvid.network`), `playVideoByEventId` would attempt to `pushState` with the production URL. This triggers a browser `SecurityError` due to the origin mismatch, preventing the video modal from opening.

This change adds a check to normalize the `pushUrl`. If the target URL's origin differs from the current window's origin, it falls back to a relative path using `window.location.pathname` combined with the target's search parameters and hash. This ensures `pushState` always receives a safe, same-origin URL regardless of the environment configuration.
2026-01-25 02:33:30 +00:00
google-labs-jules[bot] 70dcfa3ef5 fix: update share menu state on pubkey change 2026-01-25 01:11:34 +00:00
google-labs-jules[bot] 9287f91fc1 fix: Embed player UI, stats loading, and share URL
- Remove black background from embed video to allow transparency
- Update "Watch on Bitvid" button to "Watch on" + white logo
- Fix share URL generation to point to main site instead of embed
- Ensure view counts and reactions are subscribed in embed mode
2026-01-24 23:02:33 +00:00
google-labs-jules[bot] 439265d9c0 Debug: forward embed logs to parent when embed_debug=1
This commit instruments the embed runtime to forward structured logs and lifecycle events
(Nostr, relay, pointer resolution, playback decision, WebTorrent) to the parent window
via `postMessage` when the `embed_debug=1` query parameter is present.

It also adds a defensive guard to `resetTorrentStats` in `js/app.js` to prevent TypeErrors.

Changes:
- Added `js/embedDiagnostics.js` module.
- Modified `js/embed.js` to initialize diagnostics and instrument startup.
- Modified `js/app.js` to instrument playback fallback and patch `resetTorrentStats`.
- Modified `js/webtorrent.js` to instrument peer probing and streaming.
2026-01-24 22:29:18 +00:00
google-labs-jules[bot] 981fac785a fix(embed): implement robust EmbedPlayerModal and guard resetTorrentStats
- Add `js/ui/components/EmbedPlayerModal.js` to implement the `VideoModal` interface for embed contexts (including `resetStats`).
- Update `js/ui/ModalManager.js` to detect embed mode and use `EmbedPlayerModal`.
- Clean up `js/embed.js` to remove local modal definition and add `postMessage` diagnostic logging.
- Update `js/app.js` `resetTorrentStats` log message and verify guard.
- Add unit tests for `EmbedPlayerModal` and `resetTorrentStats` logic.
- Add E2E reproduction script `tests/e2e/repro_issue.spec.ts`.
2026-01-24 22:09:03 +00:00
google-labs-jules[bot] 2943fbb9f7 Fix embed player crash and prevent duplicate initialization
- Fix `TypeError: this.videoModal.resetStats is not a function` by implementing `resetStats` (no-op) in `EmbedVideoModal` and adding a safety guard in `Application.resetTorrentStats`.
- Prevent duplicate `NostrClient` initialization within the same frame by adding idempotent guards in `js/embed.js` and `js/nostr/client.js`.
- Add documentation (`docs/embed-notes.md`) on embed architecture and recommendations for multi-frame resource sharing (SharedWorker).
- Add regression test `tests/embed_playback_check.spec.mjs`.
2026-01-24 21:42:37 +00:00
thePR0M3TH3AN 37f5083947 Merge branch 'unstable' into ai/debug-frontend-20260124-13275558127831455913 2026-01-24 14:36:28 -05:00
google-labs-jules[bot] 61c655836e fix(app): remove stale calls to teardownModalReactionSubscription
- Fixes a regression where `hideModal` and `cleanup` methods in `js/app.js` were calling a non-existent method `teardownModalReactionSubscription`.
- Updated these methods to call `this.reactionController.unsubscribe()` instead.
- Removed a duplicate `hideModal` method definition that was shadowing the correct `async hideModal`.
2026-01-24 19:16:37 +00:00
google-labs-jules[bot] f02bfc27bf fix(app): unsubscribe ReactionController on modal close
Addresses a regression where the video modal close action (back button) could leave active subscriptions or state. This change ensures `ReactionController.unsubscribe()` is called within `hideModal()`.
2026-01-24 19:09:31 +00:00
google-labs-jules[bot] f2ab7302ab fix(ai): frontend console error — double load and lint fixes (agent) 2026-01-24 18:29:26 +00:00
google-labs-jules[bot] 9fb07c6ce2 refactor(ai): extract reaction logic from js/app.js (agent)
Extracted video reaction logic (subscription, optimistic updates, and publishing) from `js/app.js` into a dedicated `ReactionController`.

*   Created `js/ui/reactionController.js`.
*   Refactored `js/app.js` to usage `ReactionController` and removed legacy methods.
*   Added unit tests in `tests/ui/reactionController.test.mjs`.
*   Ensured reaction subscription updates on user login/logout.

This follows the `AGENTS.md` guideline to move UI logic to controllers.
2026-01-24 03:21:14 +00:00
thePR0M3TH3AN ad26fe956d Merge pull request #1571 from PR0M3TH3AN/add-webseed-stream-test-13905203248074562453
Add E2E test for webseed stream fallback and fix app bug
2026-01-23 08:24:28 -05:00
google-labs-jules[bot] 4e834dd12b fix(app): fix reference error in playVideoWithoutEvent and add e2e test
This commit fixes a ReferenceError in `playVideoWithoutEvent` where `urlObj` was used before being defined.
It also adds a new E2E test `tests/e2e/webseed-playback.spec.ts` that verifies:
1. Direct CDN playback from an HTML link.
2. Fallback to WebTorrent using the HTML link as a webseed when the CDN is blocked.
2026-01-23 07:51:49 +00:00
google-labs-jules[bot] 986e4ef497 ui: move Kids link below Recently Added and add tags to Kids page 2026-01-23 07:40:44 +00:00
thePR0M3TH3AN 46ee5cd8b8 Add kids feed telemetry tracking 2026-01-23 02:22:19 -05:00
thePR0M3TH3AN f5ff3cc41c Enhance kids feed runtime 2026-01-23 02:15:44 -05:00
thePR0M3TH3AN 33cc5d23c7 Add kids feed view 2026-01-23 02:09:08 -05:00
thePR0M3TH3AN a36ea40288 Add kids feed registration and sorter 2026-01-23 01:59:57 -05:00
thePR0M3TH3AN 696957fbbf Merge pull request #1551 from PR0M3TH3AN/fix-share-nostr-preview-18161927469891676907
Fix author name display in Share on Nostr modal preview
2026-01-22 23:55:34 -05:00
google-labs-jules[bot] 6189f5ef41 Fix "Share on Nostr" modal preview to display author name
- Updated `js/app.js` to pass `authorName` from the video creator/author details to the modal payload.
- Updated `js/ui/components/ShareNostrModal.js` to display `authorName` if available, falling back to `pubkey`.
- Verified the fix with a local reproduction script and a frontend verification screenshot.
2026-01-23 04:49:50 +00:00
google-labs-jules[bot] ad3375ed09 fix: ensure access control lists are loaded before playback
Introduced `waitForReady` in `AccessControl` to block until moderation lists are fetched, and updated `playVideoByEventId` and `trustBootstrap` to use it, preventing false "not whitelisted" errors in private tabs.
2026-01-23 04:39:18 +00:00
thePR0M3TH3AN 20a4ed0386 Merge pull request #1549 from PR0M3TH3AN/fix-video-link-params-14223048263665822746
Fix video link redirect clearing URL params
2026-01-22 23:20:44 -05:00
google-labs-jules[bot] dbb6c0d2be Fix: Preserve ?v= parameter when auto-redirecting to For You feed
When a user visits a direct video link (e.g. `/?v=...`) while logged in,
the application auto-authenticates and redirects the view to `#view=for-you`.
Previously, `setHashView` unconditionally removed all query parameters, causing
the video modal to fail to open because the `v` parameter was lost before it could be read.

This change:
1.  Updates `setHashView` to accept an options object, allowing specific parameters to be preserved.
2.  Updates `handleAuthLogin` in `app.js` to detect if a `v` parameter is present and request its preservation during the view switch.
2026-01-23 04:19:40 +00:00
thePR0M3TH3AN e1cdb06784 Merge pull request #1544 from PR0M3TH3AN/ai/refactor-url-health-20241026-6939191548268161877
refactor: extract UrlHealthController from js/app.js
2026-01-22 23:09:18 -05:00
thePR0M3TH3AN 8e5b8b09ce Add Nostr share note publishing 2026-01-22 22:46:15 -05:00
thePR0M3TH3AN 012643ce12 Add share on Nostr modal 2026-01-22 22:36:56 -05:00
google-labs-jules[bot] babf73d777 refactor(ai): extract UrlHealthController from js/app.js (agent) 2026-01-23 03:32:28 +00:00
thePR0M3TH3AN b70d263eff Update share menu auth handling 2026-01-22 21:37:25 -05:00
google-labs-jules[bot] 7221ef0eaa Add hashtag helper bar to Explore tab and refactor ID
- Add `#videoListTags` container to `views/explore.html` to support the hashtag helper bar in the Explore view.
- Rename `#recentVideoTags` to `#videoListTags` in `views/most-recent-videos.html` for consistency across views.
- Update `js/ui/videoListViewController.js` and `js/app.js` to reference the new generic `#videoListTags` ID.
- Update `tests/ui/video-list-view-popular-tags.test.mjs` to reflect the ID change.

This enables the hashtag aggregation and interaction features (filtering, muting, following) on the Explore tab, reusing the existing `VideoListView` logic.
2026-01-23 02:20:13 +00:00
thePR0M3TH3AN 4e6ace408c Preserve explore feed ordering 2026-01-22 19:23:57 -05:00
thePR0M3TH3AN 7de539ed84 Add explore data service for tag summaries 2026-01-22 19:20:41 -05:00
thePR0M3TH3AN 4abe9f3d1e Add disinterest tag filter stage 2026-01-22 19:10:27 -05:00
thePR0M3TH3AN c3aa42f39c Add explore feed pipeline 2026-01-22 19:04:50 -05:00
thePR0M3TH3AN 52493c8815 Merge pull request #1488 from PR0M3TH3AN/share-menu-improvements-3209770599931229323
Refactor Video Modal Share Menu
2026-01-22 10:55:38 -05:00
google-labs-jules[bot] 0ec517d689 Refactor video modal Share button to use a popover menu
- Replaced direct copy-to-clipboard action with a Share menu.
- Added "Copy URL", "Share on Nostr", "Copy Magnet", and "Copy CDN Link" options.
- Moved "Copy Magnet" from the main modal interface to the menu.
- Updated `js/app.js` to handle `video:share-nostr` (placeholder), `video:copy-magnet`, and `video:copy-cdn` events.
- Removed deprecated `setCopyMagnetState` logic.
- Cleaned up `components/video-modal.html`.
2026-01-22 15:40:54 +00:00
google-labs-jules[bot] f75531d2db chore(ai): format sources and fix moderation bugs (agent)
- Format `css/tailwind.source.css` with Prettier.
- Add allowlist entry for `VideoCard.js` media query pixel value in `scripts/check-design-tokens.mjs`.
- Remove accidental artifact `js/ui/dm/jules_session_4520373547615093905.zip`.
- Fix bug in `js/app.js` and `js/services/moderationActionController.js` where blocked users' videos were not correctly hidden in the UI immediately after blocking.
- Fix bug in `tests/app/moderation-overrides.test.mjs` where `userBlocks` mocks were insufficient to reflect state changes.
2026-01-22 14:58:35 +00:00
google-labs-jules[bot] 1cccc323e2 Enable 'Explore' sidebar link for logged-in users
This change ensures the 'Explore' link is visible in the sidebar when the user is logged in, and hidden when logged out, consistent with other authenticated routes like 'For You' and 'Subscriptions'.

- Updated `js/app.js` to handle `exploreLink` visibility in `applyAuthenticatedUiState` and `applyLoggedOutUiState`.
- Initialized `exploreLink` property in `js/ui/applicationBootstrap.js`.
- Updated `tests/app/hydrate-sidebar-navigation.test.mjs` to verify the behavior.
2026-01-22 05:10:47 +00:00