Skip to content

Commit

Permalink
refactor: ⚡ better filtering for card and music lists
Browse files Browse the repository at this point in the history
  • Loading branch information
dnaroma committed Apr 24, 2024
1 parent 26b25b3 commit b6cefa7
Show file tree
Hide file tree
Showing 2 changed files with 147 additions and 169 deletions.
127 changes: 62 additions & 65 deletions src/pages/card/CardList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -277,35 +277,36 @@ const CardList: React.FC<unknown> = observer(() => {
episodes?.length &&
skills?.length
) {
let result = [...cardsCache];
// do filter
if (result.length && !isShowSpoiler) {
result = result.filter(
(c) =>
(c.releaseAt || c.archivePublishedAt || 0) <= new Date().getTime()
);
}
if (result.length && characterSelected.length) {
result = result.filter((c) =>
characterSelected.includes(c.characterId)
);
}
if (result.length && attrSelected.length) {
result = result.filter((c) => attrSelected.includes(c.attr));
}
if (result.length && supportUnitSelected.length) {
result = result.filter(
(c) =>
c.supportUnit === "none" ||
supportUnitSelected.includes(c.supportUnit)
);
}
if (result.length && raritySelected.length) {
const rarityFilter = raritySelected.map((rs) => rs.cardRarityType);
result = result.filter((c) => rarityFilter.includes(c.cardRarityType!));
}
if (result.length && skillSelected.length) {
result = result.filter((c) => {
const result = cardsCache.filter((c) => {
if (
!isShowSpoiler &&
(c.releaseAt || c.archivePublishedAt || 0) > new Date().getTime()
) {
return false;
}
if (
characterSelected.length &&
!characterSelected.includes(c.characterId)
) {
return false;
}
if (attrSelected.length && !attrSelected.includes(c.attr)) {
return false;
}
if (
supportUnitSelected.length &&
c.supportUnit !== "none" &&
!supportUnitSelected.includes(c.supportUnit)
) {
return false;
}
if (raritySelected.length) {
const rarityFilter = raritySelected.map((rs) => rs.cardRarityType);
if (!rarityFilter.includes(c.cardRarityType!)) {
return false;
}
}
if (skillSelected.length) {
const skill = skills.find((s) => c.skillId === s.id);
if (skill) {
let descriptionSpriteName = skill.descriptionSpriteName;
Expand All @@ -316,45 +317,41 @@ const CardList: React.FC<unknown> = observer(() => {
"score_up_condition_life"
)
descriptionSpriteName = "life_score_up";
return skillSelected.includes(descriptionSpriteName);
if (!skillSelected.includes(descriptionSpriteName)) {
return false;
}
}
return true;
});
}
// temporarily sort cards cache
switch (sortBy) {
case "id":
case "releaseAt": {
let sortKey: "id" | "releaseAt" | "archivePublishedAt" = sortBy;
if (sortKey === "releaseAt" && ["tw", "kr"].includes(region)) {
sortKey = "archivePublishedAt";
}
return true;
});

// sort cards
result.sort((a, b) => {
let compare = 0;
switch (sortBy) {
case "id":
case "releaseAt": {
let sortKey: "id" | "releaseAt" | "archivePublishedAt" = sortBy;
if (sortKey === "releaseAt" && ["tw", "kr"].includes(region)) {
sortKey = "archivePublishedAt";
}
compare = (a[sortKey] || 0) - (b[sortKey] || 0);
break;
}
result = result.sort((a, b) =>
sortType === "asc"
? (a[sortKey] || 0) - (b[sortKey] || 0)
: (b[sortKey] || 0) - (a[sortKey] || 0)
);
break;
case "rarity":
compare =
cardRarityTypeToRarity[a.cardRarityType] -
cardRarityTypeToRarity[b.cardRarityType];
break;
case "power":
compare =
getMaxParam(a, rarities, episodes) -
getMaxParam(b, rarities, episodes);
break;
}
case "rarity":
result = result.sort((a, b) =>
sortType === "asc"
? cardRarityTypeToRarity[a.cardRarityType] -
cardRarityTypeToRarity[b.cardRarityType]
: cardRarityTypeToRarity[b.cardRarityType] -
cardRarityTypeToRarity[a.cardRarityType]
);
break;
case "power":
result = result.sort((a, b) =>
sortType === "asc"
? getMaxParam(a, rarities, episodes) -
getMaxParam(b, rarities, episodes)
: getMaxParam(b, rarities, episodes) -
getMaxParam(a, rarities, episodes)
);
break;
}
return sortType === "asc" ? compare : -compare;
});

setSortedCache(result);
setCards([]);
setPage(0);
Expand Down
189 changes: 85 additions & 104 deletions src/pages/music/MusicList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -160,130 +160,111 @@ const MusicList: React.FC<unknown> = observer(() => {
musicTags?.length,
musicVocals?.length,
musicsCache?.length,
setIsReady,
]);

const doFilter = useCallback(() => {
if (musicsCache && musicTags && musicVocals && musicDiffis) {
let result = [...musicsCache];
// do filter
if (!isShowSpoiler) {
result = result.filter((m) => m.publishedAt <= new Date().getTime());
}
if (musicTag) {
result = result.filter((m) =>
musicTags
.filter((mt) => mt.musicId === m.id)!
.some((mt) => musicTag === mt.musicTag)
);
}
if (musicMVTypes.length) {
result = result.filter((m) => {
const cats = m.categories.map((c) =>
typeof c === "string" ? c : c.musicCategoryName
);
return musicMVTypes.every((type) => cats.includes(type));
});
}
if (characterSelected.length || outsideCharacterSelected.length) {
result = result.filter((m) =>
musicVocals
.filter((mv) => mv.musicId === m.id)
.some(
(mv) =>
characterSelected.every((chara) =>
mv.characters
.filter((c) => c.characterType === "game_character")
.map((c) => c.characterId)
.includes(chara)
) &&
outsideCharacterSelected.every((chara) =>
mv.characters
.filter((c) => c.characterType === "outside_character")
.map((c) => c.characterId)
.includes(chara)
)
)
);
}
if (composer) {
result = result.filter((m) => m.composer === composer);
}
if (arranger) {
result = result.filter((m) => m.arranger === arranger);
}
if (lyricist) {
result = result.filter((m) => m.lyricist === lyricist);
}
const result = musicsCache.filter((m) => {
if (!isShowSpoiler && m.publishedAt > new Date().getTime()) {
return false;
}
if (
musicTag &&
!musicTags.some(
(mt) => mt.musicId === m.id && musicTag === mt.musicTag
)
) {
return false;
}
if (
musicMVTypes.length &&
!musicMVTypes.every((type) =>
m.categories
.map((cat) =>
typeof cat === "string" ? cat : cat.musicCategoryName
)
.includes(type)
)
) {
return false;
}
if (
(characterSelected.length || outsideCharacterSelected.length) &&
!musicVocals.some(
(mv) =>
mv.musicId === m.id &&
characterSelected.every((chara) =>
mv.characters
.filter((c) => c.characterType === "game_character")
.map((c) => c.characterId)
.includes(chara)
) &&
outsideCharacterSelected.every((chara) =>
mv.characters
.filter((c) => c.characterType === "outside_character")
.map((c) => c.characterId)
.includes(chara)
)
)
) {
return false;
}
if (composer && m.composer !== composer) {
return false;
}
if (arranger && m.arranger !== arranger) {
return false;
}
if (lyricist && m.lyricist !== lyricist) {
return false;
}
return true;
});

// sort musics cache
switch (sortBy) {
case "id":
case "publishedAt":
result = result.sort((a, b) =>
sortType === "asc" ? a[sortBy] - b[sortBy] : b[sortBy] - a[sortBy]
);
break;
case "difficultyMaster":
result = result.sort((a, b) => {
const levelA =
musicDiffis.find(
(md) => md.musicId === a.id && md.musicDifficulty === "master"
)?.playLevel || -1;
const levelB =
musicDiffis.find(
(md) => md.musicId === b.id && md.musicDifficulty === "master"
)?.playLevel || -1;
return sortType === "asc" ? levelA - levelB : levelB - levelA;
});
break;
case "difficultyExpert":
result = result.sort((a, b) => {
result.sort((a, b) => {
let compare = 0;
switch (sortBy) {
case "id":
case "publishedAt":
compare = a[sortBy] - b[sortBy];
break;
case "difficultyMaster":
case "difficultyExpert":
case "difficultyAppend":
const levelA =
musicDiffis.find(
(md) => md.musicId === a.id && md.musicDifficulty === "expert"
(md) => md.musicId === a.id && md.musicDifficulty === sortBy
)?.playLevel || -1;
const levelB =
musicDiffis.find(
(md) => md.musicId === b.id && md.musicDifficulty === "expert"
(md) => md.musicId === b.id && md.musicDifficulty === sortBy
)?.playLevel || -1;
return sortType === "asc" ? levelA - levelB : levelB - levelA;
});
break;
case "difficultyAppend":
result = result.sort((a, b) => {
const levelA =
musicDiffis.find(
(md) => md.musicId === a.id && md.musicDifficulty === "append"
)?.playLevel || -1;
const levelB =
musicDiffis.find(
(md) => md.musicId === b.id && md.musicDifficulty === "append"
)?.playLevel || -1;
return sortType === "asc" ? levelA - levelB : levelB - levelA;
});
break;
}
compare = levelA - levelB;
break;
}
return sortType === "asc" ? compare : -compare;
});

setSortedCache(result);
setMusics([]);
setPage(0);
}
}, [
musicsCache,
sortBy,
sortType,
setPage,
setSortedCache,
musicTags,
musicTag,
musicMVTypes,
isShowSpoiler,
composer,
arranger,
characterSelected,
composer,
isShowSpoiler,
lyricist,
musicDiffis,
musicMVTypes,
musicTag,
musicTags,
musicVocals,
characterSelected,
musicsCache,
outsideCharacterSelected,
musicDiffis,
sortBy,
sortType,
]);

useEffect(() => {
Expand Down

0 comments on commit b6cefa7

Please sign in to comment.