fix(player): related marks survive, Restart restarts, and refused pages offer nothing to click
- Every state and Watch-later write goes through features/video/videoWrites, which marks the never-refetched lists (related lists, live searches) once the server has it; a contract test holds it. The Notification Center's undo, the feed's reset and the Watch-later toggles skipped it before. - Confirmed marks are also kept apart (qk.videoMarks) and laid over the related rows: a Show more page landing later rebuilt them from the pages it read when it started, and dropped a mark made meanwhile. - Restart on a related video starts at 0 (the session's stored position won before), and on the one already playing it seeks. - The watched toggle remembers each video's mark: Back showed the opened video's launch-time state after a related one was marked. - The help sheet leaves out the player's keys while a layer above it has them waiting. - After a refusal a retry cannot answer, neither Show more (related) nor Load more (live search) is offered; a failed live-search page keeps the results already read and says why under them. - The related cap message counts requests, as the cap does.
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
import type { QueryClient } from "@tanstack/react-query";
|
||||
|
||||
import { api, type VideoStatus } from "../../lib/api";
|
||||
import { markVideo } from "../../lib/progressCache";
|
||||
|
||||
// A video's user state and its Watch-later mark, written to the server and — once it has the
|
||||
// change — into the lists that are never refetched (`markVideo`: every related list, every live
|
||||
// search). These are the ONE way to make those writes, and `videoWrites.contract.test.ts` holds it:
|
||||
// four writes that called the api directly (the Notification Center's undo, the feed's reset, the
|
||||
// feed's and Home's Watch-later toggles) left a related list hiding a video the user had un-hidden,
|
||||
// or showing it unsaved after a save. Each returns the server's answer, so a caller keeps its own
|
||||
// optimistic layer, notices and rollback.
|
||||
|
||||
export function writeVideoState(qc: QueryClient, id: string, status: VideoStatus) {
|
||||
return api.setState(id, status).then((r) => {
|
||||
markVideo(qc, id, { status });
|
||||
return r;
|
||||
});
|
||||
}
|
||||
|
||||
/** Back to pristine: the state row and its resume position both go. */
|
||||
export function resetVideoState(qc: QueryClient, id: string) {
|
||||
return api.clearState(id).then((r) => {
|
||||
markVideo(qc, id, { status: "new", position_seconds: 0 });
|
||||
return r;
|
||||
});
|
||||
}
|
||||
|
||||
export function writeWatchLater(qc: QueryClient, id: string, saved: boolean) {
|
||||
return (saved ? api.watchLaterAdd(id) : api.watchLaterRemove(id)).then((r) => {
|
||||
markVideo(qc, id, { saved });
|
||||
return r;
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user