47 lines
1.1 KiB
JavaScript
47 lines
1.1 KiB
JavaScript
const { secure } = require("./api");
|
|
let cached;
|
|
let pending;
|
|
function loadBreeds(force = false) {
|
|
if (pending) return pending;
|
|
if (cached && !force) return Promise.resolve(cached);
|
|
pending = secure("/breeds")
|
|
.then((rows) => {
|
|
cached = rows;
|
|
return rows;
|
|
})
|
|
.finally(() => {
|
|
pending = null;
|
|
});
|
|
return pending;
|
|
}
|
|
function groupBreeds(rows, query = "") {
|
|
const q = query.trim().toLowerCase().replace(/\s/g, "");
|
|
const groups = new Map();
|
|
for (const row of rows) {
|
|
if (
|
|
q &&
|
|
![
|
|
row.name,
|
|
row.aliases,
|
|
row.english_name,
|
|
row.pinyin,
|
|
row.pinyin_initials,
|
|
].some((value) =>
|
|
(value || "").toLowerCase().replace(/\s/g, "").includes(q),
|
|
)
|
|
)
|
|
continue;
|
|
const letter = row.initial || "#";
|
|
if (!groups.has(letter)) groups.set(letter, []);
|
|
groups.get(letter).push(row);
|
|
}
|
|
return [...groups]
|
|
.sort(([a], [b]) => a.localeCompare(b))
|
|
.map(([letter, items]) => ({
|
|
letter,
|
|
anchor: letter === "#" ? "letter-other" : "letter-" + letter,
|
|
items,
|
|
}));
|
|
}
|
|
module.exports = { loadBreeds, groupBreeds };
|