WarpEngine Client: the whole catalog, and a build that can point elsewhere
**The app is called WarpEngine Client.** "Store" named the thing it opens rather than the
thing you run, and the store is a catalog on a site, not a window on your machine. The
window title, the bundle, the packages and the menu entry follow; the repository already
did. The store being driven is named in the side menu, so the bar stopped repeating it as
a badge — the element stays in the page, hidden, because the window check reads it.
**Every title is listed, including the ones this machine cannot install.** They arrive
from the engine with `installable: false` and a reason, and they are drawn dimmed, with an
*unsupported platform* or *no build for this machine* badge, the engine's own sentence
underneath, and nothing to press: a disabled Install would invite a click that can never
work. They get a category of their own — *Not for this machine* — and they are kept out of
the native/hosted categories and counts, because a title with no build has no mode to be
counted under. An engine older than desktop 1.2.0 is unaffected: a missing `installable`
field reads as installable, which is what those engines mean.
**A build can be pointed at another site's registry:**
make dist STORES_API=https://games.example.org/api/stores
BuildConfiguration reads the packaged package.json, where electron-builder's
extraMetadata writes that address, so a client for somebody else's catalog needs no source
change and nothing set on the user's machine. Precedence is runtime environment, then
build, then ours — three audiences, most specific first.
Also: the scrollbars are the window's own, because the platform's light track down the
side menu of a dark window looked like a mistake.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -167,9 +167,22 @@ class SmokeTest {
|
||||
}
|
||||
|
||||
private reportListing (games: readonly GameDto[]): void {
|
||||
const native = games.filter((game: GameDto): boolean => game.mode === 'app').length
|
||||
const hosted = games.length - native
|
||||
this.reportOk('list', `${String(games.length)} titles (app:${String(native)}, web:${String(hosted)})`)
|
||||
const installable = games.filter((game: GameDto): boolean => game.installable)
|
||||
const native = installable.filter((game: GameDto): boolean => game.mode === 'app').length
|
||||
const hosted = installable.length - native
|
||||
this.reportOk('list', `${String(games.length)} titles ` +
|
||||
`(app:${String(native)}, web:${String(hosted)}, unavailable:${String(games.length - installable.length)})`)
|
||||
|
||||
// The listing is supposed to carry what it cannot install, with a reason on each.
|
||||
const unavailable = games.filter((game: GameDto): boolean => !game.installable)
|
||||
const unexplained = unavailable.filter((game: GameDto): boolean => game.unavailableReason === null)
|
||||
if (unexplained.length > 0) this.reportBad('unavailable', `${String(unexplained.length)} have no reason`)
|
||||
else if (unavailable.length > 0) {
|
||||
const first = unavailable[0]
|
||||
if (first !== undefined) {
|
||||
this.reportOk('unavailable', `${String(unavailable.length)}, e.g. ${first.name}: ${first.unavailableReason ?? ''}`)
|
||||
}
|
||||
}
|
||||
|
||||
const withoutTitle = games.filter((game: GameDto): boolean =>
|
||||
game.name.length === 0 || game.title.length === 0 || game.platform.length === 0)
|
||||
|
||||
Reference in New Issue
Block a user