# Portal Detail Navigation

This document records the current navigation contract for Xtream and Stalker detail flows, especially for favorites, recently viewed, search, and category content.

Related:

- [Embedded Inline Playback](./embedded-inline-playback.md)

## Summary

- Xtream category browsing uses a route-first detail model.
- Stalker uses an inline/store-state detail model.
- Favorites and recently viewed collections now use collection-owned inline detail
  for non-live Xtream and Stalker items.
- Provider-scoped collection routes fall back to the matching global collection
  route when `All playlists` shows a non-live item from the other portal type,
  so the correct detail host still opens without switching playlist context.
- Dashboard `Global Favorites` and `Recently Watched` widgets hand off Xtream and
  Stalker movies/series into the matching global collection route with detail
  pre-opened.
- Do not force both portals into the same browse/detail behavior unless the full
  portal detail architecture is being changed.

## Xtream

Xtream category and search details are represented by canonical routes.

Examples:

- `/xtreams/:id/vod/:categoryId/:vodId`
- `/xtreams/:id/series/:categoryId/:serialId`

Implication:

- Category browsing and search can still redirect to the original Xtream content
  route and item route.
- This keeps the URL, browser history, and detail rendering model aligned with
  normal Xtream browsing.

Current code paths:

- `libs/portal/xtream/feature/src/lib/favorites/favorites.component.ts`
- `libs/portal/xtream/feature/src/lib/search-results/search-results.component.ts`
- `libs/portal/catalog/feature/src/lib/category-content-view/category-content-view.component.ts`

Collection behavior to preserve:

- Selecting a non-live Xtream item from favorites/recent should keep the current
  collection route and open inline detail inside the collection pane when the
  current collection host is already Xtream-aware.
- If a Stalker or M3U collection route is showing `All playlists` and the user
  selects an Xtream movie/series item, route into `/workspace/global-favorites`
  or `/workspace/global-recent` with detail pre-opened instead of trying to
  render Xtream detail inside the wrong host.
- The current playlist context must stay unchanged even when the selected item
  belongs to a different Xtream source playlist.
- The workspace/sidebar category panel should stay hidden for these collection
  detail opens.
- Back from a collection-owned detail should restore the previous collection
  view state, including the active content tab and playlist/all-playlists
  scope.
- Live streams can still open through the player path rather than a detail
  route.

Dashboard behavior to preserve:

- Dashboard `Global Favorites` and `Recently Watched` widgets should route
  Xtream movie/series items into `/workspace/global-favorites` or
  `/workspace/global-recent` with collection detail pre-opened from navigation
  state.
- Back from the collection detail should return to the dashboard handoff state,
  not switch the active playlist.

Search behavior to preserve:

- Selecting an Xtream item from search should still navigate to the canonical
  Xtream content type/category/item route when the item is not a live stream.

## Stalker

Stalker details are represented by store state and inline detail rendering on the current screen.

Examples:

- Category content sets `selectedItem` and renders details inline.
- Search sets `selectedItem` and stays on the search view.
- Favorites and recently viewed stay on their current collection screen and open
  inline detail when the current collection host is already Stalker-aware.

Implication:

- Favorites, recently viewed, and search should remain in the current Stalker view when opening VOD/series details.
- This keeps Stalker behavior aligned with its normal category-content and search flow.

Current code paths:

- `libs/portal/stalker/feature/src/lib/stalker-favorites/stalker-favorites.component.ts`
- `libs/portal/stalker/feature/src/lib/recently-viewed/recently-viewed.component.ts`
- `libs/portal/stalker/feature/src/lib/stalker-search/stalker-search.component.ts`
- `libs/portal/catalog/feature/src/lib/category-content-view/category-content-view.component.ts` (Stalker branch)

Behavior to preserve:

- Favorites/recent/search should not navigate away to a canonical Stalker detail route because Stalker does not currently use one.
- If an Xtream or M3U collection route is showing `All playlists` and the user
  selects a Stalker VOD/series item, route into `/workspace/global-favorites`
  or `/workspace/global-recent` with detail pre-opened so the Stalker inline
  detail host still renders on a compatible screen.
- ITV/live items can still trigger playback immediately.
- Stalker VOD items that are displayed as series because of `is_series=1`
  remain VOD-backed when opened from favorites/recent/global collections; the
  collection host must not convert them into regular `/series` detail mode.
- Dashboard `Global Favorites` and `Recently Watched` widgets should route
  Stalker movie/series items into `/workspace/global-favorites` or
  `/workspace/global-recent` with detail pre-opened inline, again without
  switching playlist context or showing the workspace category sidebar.
- Back from the collection-owned detail should restore the previous collection
  tab and scope instead of resetting the collection screen to its defaults.

## Decision Rule For Future Changes

When deciding how a favorites/recent/search click should behave:

1. Follow the portal's canonical detail model.
2. Prefer local consistency within the portal over cross-portal sameness.
3. Only unify Xtream and Stalker behavior if the full detail architecture is being unified as well.

That means:

- Xtream browse/search: navigate to the canonical route.
- Xtream favorites/recent/global collection widgets: open collection-owned
  detail without switching playlist context. Use the current route when it can
  host Xtream detail, otherwise fall back to the matching global collection
  route.
- Stalker non-live items: open collection-owned detail without switching
  playlist context. Use the current route when it can host Stalker detail,
  otherwise fall back to the matching global collection route.

## Refactor Guidance

If a future change proposes that Stalker favorites/recent should deep-link into category routes:

- also update Stalker category-content and search behavior
- define a canonical Stalker detail route model first
- update architecture docs and portal skills together

If a future change proposes that Xtream favorites/recent should stay inline:

- keep the existing route-based detail pages reusable from the collection-owned
  detail host
- verify history/back behavior, playlist preservation, and dashboard handoff
  behavior still make sense
