- A URL mirror names the view again on every entry Back or Forward lands on, so a change made under a dialog, a drawer or a sub-view is not undone by the next reload. - A view pushed from the entry a reload under a dialog started from no longer inherits its overlay mark; a reload under two overlays closes onto the page in one step. - The linked player reopens over a live search, gives itself up when its list moves first, and plays alone over an emptied playlist; a capped Files list keeps the link it cannot resolve. - The Feed press over a channel ends the search; leaving a search ends its asked mark; Files and Playlists searches end with their page; the feed always names its view and debounces its search. - Search-box keys are declared per module and kept out of the client log below TRACE. - Writers outside lib/ go through codecs; the URL contract scans computed keys, overlay writers and two-line reads, and holds every page to a bookmark round trip (Config, Activity, Playlists and the Files sort and viewer added).
29 lines
1.2 KiB
TypeScript
29 lines
1.2 KiB
TypeScript
import { YouTubeIcon } from "../../lib/brandIcons";
|
|
import { lazyWithPreload, lazyWithPreloadAlongside } from "../../lib/lazyWithPreload";
|
|
import type { ModuleDef } from "../../lib/moduleDef";
|
|
import { FEED_KEYS } from "../../lib/urlState";
|
|
import { YT_SEARCH_KEYS } from "../../lib/ytSearchUrlState";
|
|
import { FeedStore } from "./FeedStore";
|
|
|
|
// The rail loads with the page (lazyWithPreloadAlongside), so it never arrives after it.
|
|
const Rail = lazyWithPreload(() => import("./Sidebar"));
|
|
|
|
// This page as the shell and the navigation know it (lib/moduleDef). Its page and rail load lazily.
|
|
export const feedModule: ModuleDef = {
|
|
id: "feed",
|
|
labelKey: "header.account.feed",
|
|
railKey: "nav.rail.feed",
|
|
icon: YouTubeIcon,
|
|
Rail,
|
|
Page: lazyWithPreloadAlongside(() => import("./FeedPage"), Rail),
|
|
Store: FeedStore,
|
|
// Its filters, and the live YouTube search shown in its place (lib/ytSearchUrlState).
|
|
urlKeys: [...FEED_KEYS, ...YT_SEARCH_KEYS],
|
|
typedUrlKeys: ["q", "yt"],
|
|
playsVideos: true,
|
|
};
|
|
|
|
// The channel page: a feed scoped to one channel, opened over any page (App renders it in place of the
|
|
// page). Lazy like a page, and preloaded with them.
|
|
export const ChannelPage = lazyWithPreload(() => import("./ChannelPage"));
|