Public Access
feat(nav): simplify navigation and terms (#57)
One glossary (docs/GLOSSARY.md) for all de and en texts. Five nav items; phones get a bottom bar with labels. Community page with following, followers, player search and stats. The bell is the one place for notes, news and open questions. Settings in tabs; auto-save is silent and rolls back on error. Questions page explains itself; removed games are a library filter. Own profile: menu link, public chip, copy link, private hint. Points page starts with a short summary; stats use status colors.
This commit is contained in:
1 parent
45f5087227
commit
3712e3905f
80 files changed
+2237
-1189
No files matched your search
@@ -20,6 +20,12 @@ To Be Played is split into four repositories:
|
||||
|
||||
## Features
|
||||
|
||||
- **Navigation**: five items (Dashboard, Library, Play next, Stats, Community) in the header from `md` (icon and label);
|
||||
on a phone a bottom bar with the same five items (`BottomNav`, `src/components/navItems.js`) and a header with logo,
|
||||
points chip, bell and avatar. Search ("Find games"), the wishlist and the queue are reached from the Library. The avatar
|
||||
menu has "My public profile", settings, points, What's new and the role pages; an admin's pending count is amber.
|
||||
Tab pages (`/settings`, `/community`) use `?tab=` (`TabNav`, `tabOf`); an unknown tab shows the first one.
|
||||
- **Texts** follow one [glossary](docs/GLOSSARY.md): one name per idea in German and English (checked by `src/i18n.test.js`).
|
||||
- **Dashboard** with an edit mode ("Customize"): the user orders, hides and resizes the tiles (small = half width
|
||||
and less content, large = double width and more), and can add the stat groups of "Your stats" and a "Following" tile. Stored
|
||||
in Auth, so it follows the user to the phone; "Reset" goes back to the default. Tiles: most played games and games in progress (one call, `GET /api/library/dashboard-games`), "Pile of Shame" with backlog hours, its trend of the last 90
|
||||
@@ -30,15 +36,15 @@ To Be Played is split into four repositories:
|
||||
- **Coming games**: a game that is not released yet (and nobody played) shows a "Coming <date>" badge in the library, on
|
||||
the details page, in the stat game lists and on the public profile. The pile counts only the games Core sends in
|
||||
`pileGames`, so coming games are not on it; Core never picks them.
|
||||
- **What to play next** (`/play-next`): seven rows of up to 3 backlog games each: up next (your own backlog order),
|
||||
- **What to play next** (`/play-next`): seven rows of up to 3 backlog games each: queue (your own order),
|
||||
next in series (the next part of a series you played), because you played (a similar game for each of your 3 most
|
||||
played), same studio (a developer you played), from people you follow (a backlog game someone you follow finished or played 5 h or more), longest on your list, and mood picks. A time
|
||||
budget (up to 5 / 15 / 40 h or any) filters all rows; a mood (story, co-op, chill, action, scary from IGDB; speedrun
|
||||
from speedrun.com) only the mood row. Each row has its own reroll without repeats, and "Start playing" in one click.
|
||||
On a phone each row scrolls sideways.
|
||||
- **Backlog order** (`/backlog`, third library tab): all backlog games in your own order. Move a game by drag (pointer
|
||||
- **Queue** (`/backlog`, second library tab): all backlog games in your own order. Move a game by drag (pointer
|
||||
events, no library, so it works with touch), by the up and down buttons, or "move to top / bottom" in the menu. Each
|
||||
move saves the whole list. The "Up next" dashboard tile shows the first games; the picker's "Up next" row shows the first games.
|
||||
move saves the whole list. The "Queue" dashboard tile shows the first games; the "Play next" row "Queue" shows the first games.
|
||||
- **Your stats** (`/stats`): totals and statuses; the pile in hours, in weeks at your pace of the last 90 days and in
|
||||
years of full-time work, and its oldest unplayed game; most played and most loyal games; top genres and moods;
|
||||
trips to the moon, the longest gaming day, games started but under one hour; finished games per year; games per platform.
|
||||
@@ -48,7 +54,7 @@ To Be Played is split into four repositories:
|
||||
opens the games behind it in a dialog (a bottom sheet on phones), 40 per page with "Load more". In your own
|
||||
views the status counts and the pile link to the library with the filter instead. Not clickable: sums (playtime),
|
||||
averages, rates and the moon trips. The list always uses the same rules as the number.
|
||||
- **Pile Points** (`/points`): points for playing games off your pile (start, finish by time to beat, 100 %, month and
|
||||
- **Pile Points** (`/points`): a three-line summary on top (start +5, finish +30 to +80, 100 % +40; points buy looks), then the shop, then the detailed rules in a closed section and the history. Points for playing games off your pile (start, finish by time to beat, 100 %, month and
|
||||
streak bonuses; Core checks proof of play), spent in a small shop on an avatar border, a badge, a premium accent, a
|
||||
banner frame, an effect for 100 % games and an animated page or banner background (CSS and SVG in `effects.css`, two canvas engines in `EffectCanvas`; layers follow the mouse and the phone tilt, on iPhone after the switch in the settings),
|
||||
shown on the dashboard and the public profile. Twelve more items are unlock-only: they show locked with a progress bar
|
||||
@@ -94,7 +100,7 @@ flowchart LR
|
||||
- **Add a game by name** for games outside Steam (PlayStation, Switch, Xbox, physical): search IGDB, pick a hit,
|
||||
a platform and optional hours. Works without a Steam ID. Games already in ToBePlayed come first. Check several
|
||||
hits to add them at once through the import review.
|
||||
The **Search** page (`/search`, nav item "Search") finds games by name: results with cover, year, platforms and an
|
||||
The **Find games** page (`/search`, a button in the library toolbar; a library search without a hit links to it) finds games by name: results with cover, year, platforms and an
|
||||
"In library" badge; an own game opens its game page, any other hit opens a detail view with "Add".
|
||||
- **Import** (`/import`): a list (one title per line) or a CSV (title, platform, hours or minutes, status). Core
|
||||
matches the lines with IGDB and saves them in the background; the page shows the steps (queued with the imports
|
||||
@@ -142,10 +148,11 @@ flowchart LR
|
||||
the proved Steam ID, never a typed-in one. A Steam ID typed in before shows as "not verified" with a button to
|
||||
verify it; unlinking is possible. After a successful link the settings page opens the dashboard (success toast),
|
||||
where the first sync starts; the other outcomes (in use, cancelled, failed) stay on the settings page.
|
||||
- **Public profile** at `/u/<display name>`, opt-in in the settings, with perfect games and average completion.
|
||||
- **Public profile** at `/u/<display name>`, opt-in in the settings (tab "Profile & community"), with perfect games and average completion. The owner sees a "Public" chip and "Copy link" on it; a private own profile says so and links to the settings.
|
||||
The owner arranges it with the same edit mode on the profile page itself (the tiles, incl. the stat groups of
|
||||
"Your stats"), and sets its look in the settings: accent, corners, banner and background from own game art
|
||||
("Profile art" on a game's page). Visitors see the owner's look on that page only; light or dark mode stays theirs.
|
||||
- **Settings** (`/settings`) have tabs: Account & security, Appearance (with dark mode), Connections (Steam, PlayStation), Profile & community, About (build version). A switch or select saves at once, shows the new value right away, makes no success toast and goes back with an error toast when the save fails; a form with a Save button (name, password) keeps its success toast, and the name field asks before the user leaves with unsaved text.
|
||||
- **Appearance**: accent color, corner style, wide layout, reduce animations, page background and banner from your own game art.
|
||||
Saved in Auth, so it follows you to every device.
|
||||
- **Language**: kept in the browser and saved in Auth; after the login Auth's language wins when one is saved. Dark
|
||||
@@ -189,10 +196,13 @@ flowchart LR
|
||||
Admins turn each on or off on `/admin/hints`. Hint and news text may use `**bold**` and `[text](url)` (an app
|
||||
path or https; anything else stays plain text); `HintText` renders React elements, never HTML.
|
||||
- **Follow users** (#27): a logged-in visitor follows the owner of a public profile with "Follow" on `/u/<name>`; the
|
||||
settings page lists who you follow ("Unfollow") and who follows you ("Remove", a private follower shows as "Private
|
||||
user"). Core writes one inbox note per followed user and batch (new games, achievements, status changes, wishlist
|
||||
adds; what the profile hides is left out). `/inbox` (bell in the header, with the unread count) lists the newest 50 notes
|
||||
and marks them read; a digest note opens inline (click) and lists its games, achievements, status changes and wishlist
|
||||
Community page (`/community`) has the tabs "Following" ("Unfollow"), "Followers" ("Remove", a private follower shows as
|
||||
"Private user"), "Find users" (search public profiles by name, `GET /api/follows/players?q=` in Core, 30 searches per
|
||||
minute, only public profiles) and "Community stats" (the numbers of all users, also on the landing page). Core writes one inbox note per followed user and batch (new games, achievements, status changes, wishlist
|
||||
adds; what the profile hides is left out). `/inbox` (the bell in the header) is the one place for what is new: an "N open questions" row that links to `/questions`,
|
||||
the news the user has not seen (marked seen on open, "All news" links to `/whats-new`) and the newest 50 notes (marked
|
||||
read on open). The bell badge is the sum of unread notes, unseen news and open questions (`useNotifications`, loaded on
|
||||
every page change; 0 on `/inbox` itself, and open questions count again after the visit until answered); a digest note opens inline (click) and lists its games, achievements, status changes and wishlist
|
||||
items, while you still follow the person and the part is public (5 achievements per game, then "show all"); a user
|
||||
who goes private ends the follow with a note. Two more notes come from the user's own
|
||||
PlayStation link (`PSN_EXPIRING` about 2 days before it ends, `PSN_EXPIRED` when it has ended), with a link to the
|
||||
@@ -202,12 +212,11 @@ flowchart LR
|
||||
game above the tiles (`ProfileGameCard`: status, playtime, achievements, only what the profile shares; one message
|
||||
when it hides or does not have the game). A game you do not own opens a catalog view (`CatalogGameCard`, `GET
|
||||
/api/library/games/<appid>/preview`) with an "Add to my library" button that opens the add search with the name filled
|
||||
in. `/following` (nav item "Following", #51) lists the people you follow, newest feed message first, with an initial
|
||||
in. The "Following" tab (`/community?tab=following`, the old `/following` redirects there, #51) lists the people you follow, newest feed message first, with an initial
|
||||
letter instead of an avatar, and "Unfollow"; the "Following" dashboard tile (opt-in via "Customize") shows the first
|
||||
3, 5 or 10 of them and loads its own data.
|
||||
- **What's new**: a dialog on the dashboard shows the news entries the user has not seen yet, newest first. "Got it"
|
||||
marks them seen in Auth; closing the dialog any other way shows them again on the next dashboard visit. `/whats-new`
|
||||
(menu) lists all entries and marks them seen. Admins publish, preview, edit and delete entries on `/admin/news`.
|
||||
- **What's new**: unseen news entries show on `/inbox` (no dialog on the dashboard) and are marked seen in Auth when the
|
||||
inbox opens. `/whats-new` (avatar menu) is the archive: it lists all entries and marks them seen. Admins publish, preview, edit and delete entries on `/admin/news`.
|
||||
- **Broadcast mail**: admins write a mail in both languages on `/admin/broadcasts`, send it to all active users or to
|
||||
picked ones, send a test to themselves, confirm with the real recipient count, and see the history with the counts.
|
||||
- **Welcome page**: `/welcome` opens once after the first login (Auth `settings.welcomeSeenAt` is null; only the
|
||||
@@ -313,11 +322,12 @@ flowchart LR
|
||||
Dialog -->|"community row, login"| Owners["Core /api/stats/owners"]
|
||||
Landing["Landing user tiles, login"] --> Users["Auth /api/stats/users"]
|
||||
```
|
||||
- `/questions` (`QuestionsPage`, nav item with the open count; the badge is hidden on the page, whose title shows the
|
||||
live count) lists one card per game with an open question (Start it? / Finished? / Dropped? / Rate it?). Core decides
|
||||
- `/questions` (`QuestionsPage`, reached from the bell and the inbox row "N open questions"; the title shows the live
|
||||
count) starts with a short intro (where questions come from, what an answer gives, what "No" does) and lists one card per game with an open question (Start it? / Finished? / Dropped? / Rate it?). Core decides
|
||||
which question is open; `src/utils/questions.js` only loads the list and sends the answer. A yes to Finished? gets
|
||||
the Rate it? card back at once. `409` / `404` reload the list. `RatingStars` is shared with `GameHeroCard`.
|
||||
Below the cards, a closed "Removed games" section (`RemovedGamesSection`, `GET /api/library/removed-games`) has a
|
||||
Every card shows its points (+5 for a start, up to N or "by time to beat" for a finish, none for dropped and rate).
|
||||
Removed games are the library filter "Removed" (`/library?removed=true`, `RemovedGamesList`, `GET /api/library/removed-games`) with a
|
||||
Restore button per game (`POST /api/library/games/{appid}/restore`). The toast after "Remove from library" on a
|
||||
manual game has an Undo that restores it the same way.
|
||||
|
||||
@@ -350,10 +360,12 @@ flowchart LR
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
Header["AppHeader badge"] --> Count["Core /api/library/questions/count"]
|
||||
Header["Bell badge (useNotifications)"] --> Count["Core /api/library/questions/count"]
|
||||
Header --> Inbox["Core /api/inbox, Auth /api/news"]
|
||||
InboxPage["InboxPage"] --> Count
|
||||
Page["QuestionsPage"] --> List["Core /api/library/questions"]
|
||||
Page -->|"Yes / No / stars"| Answer["Core POST /api/library/questions/{appid}"]
|
||||
Page -->|"Removed games, Restore"| Removed["Core /api/library/removed-games, POST /games/{appid}/restore"]
|
||||
Library["Library filter Removed"] -->|"Restore"| Removed["Core /api/library/removed-games, POST /games/{appid}/restore"]
|
||||
```
|
||||
- Owner and user lists (`src/components/people/`, `src/utils/people.js`) need a login and show listed users by name
|
||||
(a link to `/u/<name>`), everyone else as "+N private", the viewer as "You". The setting "show me in owner lists" is
|
||||
|
||||
Reference in new issue
Block a user