Commit graph

1794 commits

Author SHA1 Message Date
Timothy Z.
fe1f13010d Merge branch 'development' of https://github.com/Stremio/stremio-web into feat/discord-rich-presence
# Conflicts:
#	src/App/App.js
#	src/routes/Player/Player.js
#	src/routes/Settings/General/General.tsx
#	src/services/index.js
2026-05-12 18:58:12 +02:00
Timothy Z.
2576d25a12 Fix Discord rich presence setting flow 2026-05-12 18:23:52 +02:00
Timothy Z.
86d716187a Merge remote-tracking branch 'origin/development' into pr-1260
# Conflicts:
#	src/common/Fullscreen/FullscreenProvider.tsx
2026-05-09 22:43:39 +03:00
Tim
3f0950df08 Merge branch 'development' of https://github.com/Stremio/stremio-web into refactor/player-volume-playback-speed-shortcuts 2026-05-08 16:05:54 +02:00
Tim
145a498101 Merge branch 'development' of https://github.com/Stremio/stremio-web into refactor/shortcuts-logic 2026-05-08 14:46:27 +02:00
Tim
20954f405d refactor: merge player volume and playback speed shortcuts 2026-05-08 14:43:40 +02:00
Tim
24cc613dc7 fix: player exit shortcut
Some checks are pending
Build / build (push) Waiting to run
2026-05-08 14:24:51 +02:00
Tim
6f8a318fa2 refactor: move shortcuts logic to provider 2026-05-08 11:36:20 +02:00
Timothy Z.
3592d0942c correctly recognize fullscreen video on safari 2026-05-06 22:03:09 +03:00
Timothy Z.
313df06166 Merge branch 'development' into feat/support-safari-fullscreen-video-mode 2026-05-06 21:55:51 +03:00
Timothy Z.
dc8c1dddfc
Merge pull request #1259 from Stremio/feat/improve-fullscreen-detection
Some checks are pending
Build / build (push) Waiting to run
App: Improve detection for fullscreen compatibility
2026-05-06 21:54:34 +03:00
Tim
c38ffc36b6 refactor: move file drop logic to provider 2026-05-06 09:10:45 +02:00
Tim
b08542199b Merge branch 'development' of https://github.com/Stremio/stremio-web into refactor/core-logic 2026-05-05 05:09:48 +02:00
Tim
8b9dfa5e82 refactor: core logic 2026-05-05 04:22:59 +02:00
Timothy Z.
06ce7410ed
Merge branch 'feat/improve-fullscreen-detection' into feat/support-safari-fullscreen-video-mode 2026-05-04 21:54:57 +03:00
Timothy Z.
671170a9da feat: fullscreen support on safari 2026-05-04 21:53:44 +03:00
Timothy Z.
0785fbfc51 feat: improve detection fullscreen compAtibility 2026-05-04 19:49:14 +03:00
Timothy Z.
c91b33fddd fix: guard shortcuts against interfering 2026-05-04 12:52:55 +03:00
Tim
efe685c61b Merge branch 'development' of https://github.com/Stremio/stremio-web into feat/shell-media-session 2026-05-04 08:52:05 +02:00
Timothy Z.
7644153978 correctly show backspace label for the back shortcut 2026-05-03 21:25:54 +03:00
Christopher Drosos
c2216e6981
Correct language names to use proper capitalization
all names now have the first character in cap
2026-05-02 14:02:04 +03:00
Tim
82484d032d feat(player): implement media session ipc 2026-05-02 05:46:22 +02:00
Timothy Z.
01e728bd84
Merge pull request #1230 from Sanjays2402/fix/lithuanian-iso-code
Some checks failed
Build / build (push) Has been cancelled
Dev: Fix correct Lithuanian ISO 639-2 code from 'ltu' to 'lit'
2026-05-01 19:53:07 +03:00
Timothy Z.
42579ce297 cleanup 2026-05-01 18:37:19 +03:00
AK
5686019587 fix(fullscreen): use settings hook for escape behavior
Wrap the fullscreen provider with the core suspender so it can read escExitFullscreen through useSettings instead of manually parsing core event payloads.
2026-04-30 15:29:56 -04:00
AK
fa3cd0f5b2 fix(fullscreen): ignore shortcut in editable fields 2026-04-30 12:23:15 -04:00
AK
dfe0d08a78 chore(fullscreen): drop inline rationale comments, bump copyright to 2026
Addresses review feedback: the explanatory block comments in
FullscreenProvider (source-of-truth rationale, CoreTransport typing
note) were noise — the same context already lives in the PR
description and commit history. Copyright headers on the four new
files were carried over from the template at 2023; bumped to 2026.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 17:20:54 -04:00
AK
b2eec31114 Merge branch 'development' into fix/fullscreen-state-desync-on-route-change
Resolves a conflict in src/App/App.js between the new GamepadProvider
(landed via #882 on development) and FullscreenProvider on this branch.
Both wrap parts of the app tree at the same point.

Resolution: nest as <GamepadProvider> > <ShortcutsProvider> >
<FullscreenProvider>. FullscreenProvider stays innermost so it remains
inside ShortcutsProvider — required for the onShortcut('fullscreen', ...)
subscription added in 35b100767. Both ShortcutsModal and GamepadModal
render as siblings inside FullscreenProvider. NavBar conflict
auto-merged cleanly (kept useFullscreen import, added gamepad-nav hook).

Lint and types clean on App.js, HorizontalNavBar.js, FullscreenProvider.tsx.
2026-04-29 09:45:59 -04:00
Timothy Z.
f95273b8ce feat: add controller guide 2026-04-28 22:31:33 +03:00
AK
35b100767f refactor(fullscreen): route F key through ShortcutsProvider
shortcuts.json already declares fullscreen -> F, but the provider was
listening for KeyF on its own keydown handler in parallel — both fired
on every F press, with the canonical shortcuts dispatch going nowhere.

Subscribe via onShortcut('fullscreen', toggleFullscreen, ...) and drop
the KeyF branch (plus the now-unused inputFocused check). Escape stays
local because its action is gated on the escExitFullscreen profile
setting; F11 stays local because it's shell-only and not in
shortcuts.json.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-28 09:15:31 -04:00
AK
d3d35bcb42 perf(fullscreen): subscribe to SettingsUpdated, not every ctx NewState
The previous NewState listener fired on every change to the ctx model —
notifications, search history, library sync, streaming-server URL — and
each fire triggered a getState('ctx') round-trip to the worker just to
re-read escExitFullscreen.

Switch to the CoreEvent / SettingsUpdated channel (same pattern App.js
uses for interfaceLanguage/quitOnClose), reading the new value straight
from the event payload. Initial seed still uses getState('ctx') once
on mount.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-28 01:26:42 -04:00
AK
90e2cbff15 chore(fullscreen): drop ts-expect-error, type ctx + NewState properly
useServices is already typed via src/services/ServicesContext/useServices.d.ts,
so the @ts-expect-error suppression on the import was unnecessary and
masked two real type holes that surfaced once it was removed:

- core.transport.getState('ctx') returns Promise<object>; cast to the
  ambient Ctx type so escExitFullscreen is read through a typed path.
- CoreTransport.on/off types listeners as () => void, but the 'NewState'
  event actually emits a string[]. Use a (...args: unknown[]) wrapper +
  Array.isArray narrowing so the call site stays type-safe without
  weakening the ambient transport signature.

No behavior change.

Made-with: Cursor
2026-04-28 00:57:53 -04:00
Timothy Z.
2730444445 correct throttle ms 2026-04-27 11:20:42 +03:00
Timothy Z.
5f6ff99cb6 Revert "Update Shortcuts.tsx"
This reverts commit 136b3b24d2.
2026-04-27 11:20:03 +03:00
Timothy Z.
e3be5a4108
Merge branch 'development' into feat/discord-rich-presence 2026-04-27 10:09:03 +02:00
Timothy Z.
136b3b24d2 Update Shortcuts.tsx 2026-04-27 10:36:26 +03:00
Timothy Z.
e805fef88c fix: throttle repeat actions 2026-04-27 10:27:57 +03:00
AK
2e13a60007 fix(fullscreen): read settings via core.transport, not useSettings
FullscreenProvider sits above the router, but useSettings() ->
useProfile() -> useModelState() requires CoreSuspenderContext which is
only provided by withCoreSuspender below the router. Mounting the
provider therefore crashed with "Cannot read properties of null
(reading 'getState')".

Switch the provider to read profile.settings.escExitFullscreen directly
from core.transport.getState('ctx') and refresh on the 'NewState' event
when 'ctx' changes. core is available via useServices(), whose provider
sits at the very top of the tree and is always reachable here.

Behavior is preserved: ESC still exits fullscreen iff the user has the
escExitFullscreen setting enabled, and updates to that setting from the
Settings tab take effect on the next ctx NewState push.

Made-with: Cursor
2026-04-27 01:56:02 -04:00
AK
b7f7a3d2ed fix(fullscreen): consume FullscreenProvider, remove per-instance state
useFullscreen is now a thin useContext consumer of FullscreenProvider,
so all callers share a single fullscreen state owned by the app root.

Why this fixes the desync bug:

stremio-router keeps multiple route layers mounted at once, and each
top-level route (Board, Discover, Library, Calendar, Addons, Settings,
Search) renders its own MainNavBars -> HorizontalNavBar -> useFullscreen.
The previous hook held local useState plus its own listeners, so each
route had an independent boolean. Entering fullscreen, then navigating
to another tab, mounted a fresh hook initialized to false; the icon
flipped back to "enter fullscreen" and clicking it re-requested
fullscreen on top of the existing one, leaving the UI unresponsive
until a route remount happened to coincide with reality.

With one provider above the router, state outlives route remounts and
listeners are attached exactly once. The hook's return tuple shape
([fullscreen, requestFullscreen, exitFullscreen, toggleFullscreen]) is
preserved, so all three call sites (HorizontalNavBar, NavMenuContent,
Player) keep working with no API change.

Also removes the legacy src/common/useFullscreen.ts and routes its
imports through stremio/common/Fullscreen (and the stremio/common
barrel for App.js / Player).

Note: MainNavBars is still rendered per-route. Lifting it to a single
app-level layout above the router is a worthwhile follow-up (eliminates
6+ duplicate mounts) but carries non-trivial CSS / useRouteFocused /
stacked-route risk and is out of scope for this PR; tracking separately.

Made-with: Cursor
2026-04-27 01:52:02 -04:00
AK
60df6860d7 feat(common): add FullscreenProvider + context module
Introduce a single, app-root-owned source of truth for fullscreen state,
mirroring the existing provider pattern (ToastProvider, FileDropProvider).
The provider centralizes the fullscreenchange / win-visibility-changed /
keydown listeners and exposes the same [fullscreen, requestFullscreen,
exitFullscreen, toggleFullscreen] tuple that consumers already destructure.

Not yet wired up - both the legacy src/common/useFullscreen hook and the
new module coexist. Subsequent commits mount the provider in App.js and
switch consumers over.

Made-with: Cursor
2026-04-27 01:50:14 -04:00
Sanjay
338fea48d4 fix: correct Lithuanian ISO 639-2 code from 'ltu' to 'lit'
'ltu' is not a valid ISO 639 code. The correct ISO 639-2/B code
for Lithuanian is 'lit'.

Fixes #1169
2026-04-23 23:54:13 -07:00
Timothy Z.
1f293b7cbc
Merge pull request #1180 from Stremio/feat/magnet-http-streams-handing
feat: handle http/magnets from search bar
2026-04-13 17:17:42 +03:00
Timothy Z.
117f932596 chore(shortcuts): add enabled param to onShortcut hook 2026-04-06 21:25:56 +03:00
Tim
3f5dedd072 feat(player): add transitions to menus 2026-04-02 09:53:20 +02:00
Tim
73409fff8c feat(player): sort subtitles menu languages by default language 2026-04-01 22:39:48 +02:00
Tim
c131d7f75e fix: normalize subtitles languages from player menu 2026-04-01 17:32:24 +02:00
Timothy Z.
e260e52322 refactor: change type to info 2026-03-31 13:45:08 +03:00
Timothy Z.
de32e3a765 fix: correct message for fail 2026-03-31 13:11:48 +03:00
Timothy Z.
6cb0c75555 feat: add loading state 2026-03-31 12:56:08 +03:00
Timothy Z.
e0961ec686 remove the try catch 2026-03-30 18:47:20 +03:00