diff --git a/apps/frontend/components/characters/professions/CharacterProfessionsProfessionSkillRanks.svelte b/apps/frontend/components/characters/professions/CharacterProfessionsProfessionSkillRanks.svelte index 27fdf6003..c1ec006a6 100644 --- a/apps/frontend/components/characters/professions/CharacterProfessionsProfessionSkillRanks.svelte +++ b/apps/frontend/components/characters/professions/CharacterProfessionsProfessionSkillRanks.svelte @@ -16,14 +16,12 @@ diff --git a/apps/frontend/components/tooltips/reputation-header/TooltipReputationHeaderEntry.svelte b/apps/frontend/components/tooltips/reputation-header/TooltipReputationHeaderEntry.svelte index 10876af9c..8b4403c90 100644 --- a/apps/frontend/components/tooltips/reputation-header/TooltipReputationHeaderEntry.svelte +++ b/apps/frontend/components/tooltips/reputation-header/TooltipReputationHeaderEntry.svelte @@ -4,6 +4,7 @@ import { RewardType } from '@/enums/reward-type'; import { rewardTypeIcons } from '@/shared/icons/mappings'; import { wowthingData } from '@/shared/stores/data'; + import { userState } from '@/user-home/state/user'; import type { Character } from '@/types'; import type { ManualDataReputationReputation, @@ -12,60 +13,68 @@ import IconifyWrapper from '@/shared/components/images/IconifyWrapper.svelte'; import WowthingImage from '@/shared/components/images/sources/WowthingImage.svelte'; - import { userState } from '@/user-home/state/user'; - - export let faction: Faction = Faction.Neutral; - export let reputation: ManualDataReputationReputation; - export let set: ManualDataReputationSet; - let rewards: { - id: number; - name: string; - type: RewardType; - have: boolean; - }[]; - let totalParagon = 0; - $: { - rewards = []; - if (set.paragon) { - totalParagon = userState.general.activeCharacters.reduce( - (a: number, b: Character) => a + (b.paragons?.[reputation.id]?.received ?? 0), - 0 - ); + type Props = { + reputation: ManualDataReputationReputation; + set: ManualDataReputationSet; + faction?: Faction; + }; + let { reputation, set, faction = Faction.Neutral }: Props = $props(); - if (reputation.rewards) { - for (const reward of reputation.rewards) { - let have = false; - let name: string; - if (reward.type === RewardType.Mount) { - have = userState.general.hasMountById.has(reward.id); - const mount = wowthingData.static.mountById.get(reward.id); - name = mount ? mount.name : `Mount #${reward.id}`; - } else if (reward.type === RewardType.Pet) { - have = userState.general.hasPetById.has(reward.id); - const pet = wowthingData.static.petById.get(reward.id); - name = pet ? pet.name : `Pet #${reward.id}`; - } else if (reward.type === RewardType.Toy) { - have = userState.general.hasToyById.has(reward.id); - const toy = wowthingData.static.toyById.get(reward.id); - name = toy ? toy.name : `Toy #${reward.id}`; - } else if (reward.type === RewardType.Transmog) { - const item = wowthingData.items.items[reward.id]; - have = userState.general.hasAppearanceById.has( - item?.appearances[0]?.appearanceId || 0 - ); - name = item?.name || `Item #${reward.id}`; - } + let totalParagon = $derived( + !set.paragon + ? 0 + : userState.general.activeCharacters.reduce( + (a: number, b: Character) => a + (b.paragons?.[reputation.id]?.received ?? 0), + 0 + ) + ); + let rewards = $derived.by(() => { + const ret: { + id: number; + name: string; + type: RewardType; + have: boolean; + }[] = []; - rewards.push({ - ...reward, - have, - name, - }); + if (set.paragon && reputation.rewards) { + for (const reward of reputation.rewards) { + let have = false; + let name: string; + if (reward.type === RewardType.Mount) { + have = userState.general.hasMountById.has(reward.id); + const mount = wowthingData.static.mountById.get(reward.id); + name = mount ? mount.name : `Mount #${reward.id}`; + } else if (reward.type === RewardType.Pet) { + have = userState.general.hasPetById.has(reward.id); + const pet = wowthingData.static.petById.get(reward.id); + name = pet ? pet.name : `Pet #${reward.id}`; + } else if (reward.type === RewardType.Toy) { + have = + userState.general.hasToyById.has(reward.id) || + userState.general.hasToyByItemId.has(reward.id); + const toy = + wowthingData.static.toyById.get(reward.id) || + wowthingData.static.toyByItemId.get(reward.id); + name = toy ? toy.name : `Toy #${reward.id}`; + } else if (reward.type === RewardType.Transmog) { + const item = wowthingData.items.items[reward.id]; + have = userState.general.hasAppearanceById.has( + item?.appearances[0]?.appearanceId || 0 + ); + name = item?.name || `Item #${reward.id}`; } + + ret.push({ + ...reward, + have, + name, + }); } } - } + + return ret; + }); -
Which specific characters to use when checking if a recipe has been collected. Any secondary diff --git a/apps/frontend/utils/get-progress.ts b/apps/frontend/utils/get-progress.ts index ba69e5459..2a06ab68f 100644 --- a/apps/frontend/utils/get-progress.ts +++ b/apps/frontend/utils/get-progress.ts @@ -7,7 +7,7 @@ import { ProgressDataType } from '@/enums/progress-data-type'; import { QuestStatus } from '@/enums/quest-status'; import { wowthingData } from '@/shared/stores/data'; import { userState } from '@/user-home/state/user'; -import { toNiceNumber } from '@/utils/formatting'; +import { leftPad, toNiceNumber } from '@/utils/formatting'; import type { Character, CharacterShadowlandsCovenant, @@ -25,7 +25,7 @@ export default function getProgress( group: ManualDataProgressGroup, countAccountWide = true ): ProgressInfo { - let have: number; + let have: number = 0; let missingRequired = false; let showCurrency = 0; let total = 0; @@ -298,6 +298,42 @@ export default function getProgress( break; } + case ProgressDataType.Quests: { + const haveQuests = data.ids.map((questId) => + checkCharacterQuestIds(character.id, [questId]) + ); + const haveCount = haveQuests.filter((have) => have).length; + const questName = + wowthingData.static.questNameById.get(data.ids[0]) || + data.name || + `Quest #${data.ids[0]}`; + + haveThis = haveQuests.at(-1); + nameOverride[dataIndex] = + `[${leftPad(haveCount, 2, '0')}/${leftPad(haveQuests.length, 2, '0')}] ${questName}`; + + break; + } + + case ProgressDataType.QuestLine: { + const questLine = wowthingData.static.questLineById.get(data.ids[0]); + if (!questLine) { + console.warn('bad questLine?', data.ids); + break; + } + + const haveQuests = questLine.questIds.map((questId) => + checkCharacterQuestIds(character.id, [questId]) + ); + const haveCount = haveQuests.filter((have) => have).length; + + haveThis = haveQuests.at(-1); + nameOverride[dataIndex] = + `[${leftPad(haveCount, 2, '0')}/${leftPad(haveQuests.length, 2, '0')}] ${questLine.name}`; + + break; + } + case ProgressDataType.AccountQuest: { haveThis = checkAccountQuestIds(data.ids); nameOverride[dataIndex] = diff --git a/packages/csharp-lib/Enums/Progress.cs b/packages/csharp-lib/Enums/Progress.cs index 983a89e99..26e045564 100644 --- a/packages/csharp-lib/Enums/Progress.cs +++ b/packages/csharp-lib/Enums/Progress.cs @@ -16,4 +16,6 @@ public enum ProgressDataType AccountQuest, Item, SpellKnown, + QuestLine, + Quests, }