v0.4.0: Cloudflare Pages deploy tooling, items search in URL, spirit bear patch lookup

This commit is contained in:
voson
2026-07-27 16:28:31 +08:00
parent 1d0428b4a3
commit adb8f303c2
13 changed files with 674 additions and 27 deletions
+12 -5
View File
@@ -8,7 +8,7 @@
* - hero: selected hero key + detail sub-tab (skills|core|fears|patches)
* - item: selected shop item key (items page)
* - patch: selected version string (patches page; latest when absent)
* - query params (heroes page only): tags=csv, q=search text
* - query params: tags=csv (heroes), q=search text (heroes + items)
*
* Two-way binding without feedback loops:
* - App calls syncStateToUrl() after each state mutation. We use
@@ -48,6 +48,7 @@ function parseHash(hash) {
patchVersion: null,
tags: null,
query: null,
itemQuery: null,
};
let raw = hash || "";
if (raw.startsWith("#")) raw = raw.slice(1);
@@ -76,7 +77,10 @@ function parseHash(hash) {
);
}
const qParam = params.get("q");
if (qParam != null) out.query = qParam;
if (qParam != null) {
if (page === "items") out.itemQuery = qParam;
else out.query = qParam;
}
return out;
}
@@ -91,7 +95,7 @@ function safeDecode(s) {
/** Serialize current app state into a hash string (with leading '#'). */
function serializeHash(state) {
if (!state || !VALID_PAGES.includes(state.page)) return ROUTE_DEFAULT;
let hash = "#" + state.page;
let hash = "#/" + state.page;
if (state.page === "heroes") {
if (state.selectedKey) {
hash += "/" + encodeURIComponent(state.selectedKey);
@@ -117,13 +121,16 @@ function serializeHash(state) {
if (state.page === "heroes") {
const qs = new URLSearchParams();
if (state.tagFilters && state.tagFilters.size) {
// URLSearchParams.set already percent-encodes the value, so join raw
// tag names with "," — do NOT pre-encodeURIComponent (double encoding).
qs.set("tags", Array.from(state.tagFilters).join(","));
}
if (state.query) qs.set("q", state.query);
const s = qs.toString();
if (s) hash += "?" + s;
} else if (state.page === "items") {
const qs = new URLSearchParams();
if (state.itemQuery) qs.set("q", state.itemQuery);
const s = qs.toString();
if (s) hash += "?" + s;
}
return hash;
}