feat(ui): About dialog, Release Notes, and new-version banner
About (in the account menu) shows frontend/backend/database versions + build. Release Notes renders per-version highlights with a commit-SHA reference; a dismissible banner appears once after the running build's version changes and links into the notes. Adds a reusable Modal shell and the release-notes data (detailed v0.1.0).
This commit is contained in:
parent
a93ab30fb2
commit
82f0936ca7
9 changed files with 347 additions and 1 deletions
|
|
@ -86,6 +86,13 @@ export interface FeedFilters {
|
|||
dateTo?: string;
|
||||
}
|
||||
|
||||
export interface VersionInfo {
|
||||
app_version: string;
|
||||
git_sha: string;
|
||||
build_date: string | null;
|
||||
db_revision: string | null;
|
||||
}
|
||||
|
||||
class HttpError extends Error {
|
||||
status: number;
|
||||
constructor(status: number) {
|
||||
|
|
@ -221,6 +228,7 @@ export interface ManagedChannel {
|
|||
|
||||
export const api = {
|
||||
me: (): Promise<Me> => req("/api/me"),
|
||||
version: (): Promise<VersionInfo> => req("/api/version"),
|
||||
tags: (): Promise<Tag[]> => req("/api/tags"),
|
||||
status: (): Promise<SyncStatus> => req("/api/sync/status"),
|
||||
feed: (f: FeedFilters, offset: number, limit: number): Promise<FeedResponse> =>
|
||||
|
|
|
|||
45
frontend/src/lib/releaseNotes.ts
Normal file
45
frontend/src/lib/releaseNotes.ts
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
// User-facing release notes. One entry per released version, newest first. The end-of-line
|
||||
// `sha` is the repo commit the release was cut from (our stand-in for an issue/ticket ref);
|
||||
// it's attached when the version is tagged. `chores` are internal and hidden from the public
|
||||
// Release Notes dialog by default.
|
||||
|
||||
export interface ReleaseEntry {
|
||||
version: string;
|
||||
date: string; // ISO date (YYYY-MM-DD)
|
||||
sha?: string; // short commit the release was tagged from
|
||||
summary?: string;
|
||||
features?: string[];
|
||||
fixes?: string[];
|
||||
chores?: string[];
|
||||
}
|
||||
|
||||
export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.1.0",
|
||||
date: "2026-06-15",
|
||||
// sha filled in when v0.1.0 is tagged at release time.
|
||||
summary:
|
||||
"First release: a self-hosted, multi-user reader for your own YouTube subscriptions — " +
|
||||
"fast local-first feed with rich filtering, in-app playback with resume, and channel management.",
|
||||
features: [
|
||||
"Multi-user feed of your own YouTube subscriptions: invite-only Google sign-in, per-user watch/save/hide state, encrypted token storage.",
|
||||
"Ingest: subscription import, free RSS new-video detection, recent-first and full-history backfill, metadata enrichment (duration, views, category, Shorts & livestream classification), a shared daily API-quota guard, and a background scheduler.",
|
||||
"Automatic tagging: system tags for channel language and topic (your own tags are never overwritten).",
|
||||
"Reader UI: grid/list feed scoped to your subscriptions; faceted tag filters, content-type toggles (Normal / Shorts / Live), date range, search and sort; four colour schemes (dark/light) with adjustable text size.",
|
||||
"In-app player: a modal YouTube player that resumes where you left off, auto-marks watched near the end, and turns description timestamps and links into clickable seeks.",
|
||||
"Watch progress: a resume progress bar on video cards, Continue / Restart buttons, and an “In progress” feed filter — your position is saved server-side, so it follows you across devices.",
|
||||
"Channel manager: per-channel priority, hide, personal tags, sync badges, and per-channel full-history opt-in.",
|
||||
"Header status: your video count vs. the whole catalogue, sync progress, and (for admins) a pause control; onboarding wizard; notification centre; admin usage & quota stats.",
|
||||
"About dialog and this Release Notes view, with a heads-up banner when a new version ships.",
|
||||
],
|
||||
fixes: [
|
||||
"Backfill no longer skips the band of videos sitting on the 365-day boundary page.",
|
||||
"A channel whose full catalogue is already stored is no longer stuck showing “needs full history”.",
|
||||
],
|
||||
chores: [
|
||||
"Public-readiness repo hygiene: internal planning/infra details removed, build stamped with version/commit.",
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export const CURRENT_VERSION = RELEASE_NOTES[0]?.version ?? "dev";
|
||||
10
frontend/src/lib/version.ts
Normal file
10
frontend/src/lib/version.ts
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
// Build info baked into the SPA at build time (Vite inlines VITE_*-prefixed env).
|
||||
// Injected via Docker build-args (see Dockerfile); falls back to "dev" for un-stamped builds.
|
||||
const env = (import.meta as unknown as { env: Record<string, string | undefined> }).env;
|
||||
|
||||
export const FRONTEND_VERSION = env.VITE_APP_VERSION || "dev";
|
||||
export const FRONTEND_SHA = env.VITE_GIT_SHA || "unknown";
|
||||
export const FRONTEND_BUILD_DATE = env.VITE_BUILD_DATE || "";
|
||||
|
||||
// Key for the "last version the user has seen release notes for" (drives the banner).
|
||||
export const SEEN_VERSION_KEY = "siftlode.seenVersion";
|
||||
Loading…
Add table
Add a link
Reference in a new issue