Skip to content
Merged

Deploy #1739

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@
import sortBy from 'lodash/sortBy';

import { Constants } from '@/data/constants';
import { imageStrings } from '@/data/icons';
import { expansionProfessionConcentration } from '@/data/professions/cooldowns';
import { settingsState } from '@/shared/state/settings.svelte';
import { wowthingData } from '@/shared/stores/data';
import { timeStore } from '@/shared/stores/time';
import { getCurrencyData } from '@/utils/characters/get-currency-data';
import { getProfessionSortKey } from '@/utils/professions';
import type { CharacterProps } from '@/types/props';

import WowthingImage from '@/shared/components/images/sources/WowthingImage.svelte';
import Currency from '@/shared/components/currencies/Currency.svelte';

type Props = CharacterProps & { expansion: number };
let { character, expansion }: Props = $props();
Expand All @@ -33,18 +30,6 @@
(prof) => getProfessionSortKey(prof)
)
);

function statusClass(fullIsBad: boolean, percent: number) {
if (percent >= 100) {
return fullIsBad ? 'status-fail' : 'status-success';
} else if (percent >= 75) {
return fullIsBad ? 'status-warn' : 'status-shrug';
} else if (percent > 25 && percent < 75) {
return fullIsBad ? 'status-shrug' : 'status-warn';
} else {
return fullIsBad ? 'status-success' : 'status-fail';
}
}
</script>

<style lang="scss">
Expand Down Expand Up @@ -76,22 +61,13 @@

<td>
<div class="flex-wrapper">
{#each professions as profession}
{@const { amount, percent, tooltip } = getCurrencyData(
$timeStore,
character,
wowthingData.static.currencyById.get(concentrationData[profession.id])
)}
<div
class="concentration {statusClass(
settingsState.value.professions.fullConcentrationIsBad,
percent
)}"
data-tooltip={tooltip}
>
<WowthingImage name={imageStrings[profession.slug]} size={20} border={1} />
<span>{amount}</span>
</div>
{#each professions as profession, index (index)}
<Currency
{character}
currency={wowthingData.static.currencyById.get(concentrationData[profession.id])}
fullIsBad={settingsState.value.professions.fullConcentrationIsBad}
useStatusClass={true}
/>
{/each}
</div>
</td>
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@
import { professionMoxie } from '@/data/professions/moxie';
import { Region } from '@/enums/region';
import { settingsState } from '@/shared/state/settings.svelte';
import { timeState } from '@/shared/state/time.svelte';
import { wowthingData } from '@/shared/stores/data';
import { componentTooltip } from '@/shared/utils/tooltips/component-tooltip.svelte';
import { getCurrencyData } from '@/utils/characters/get-currency-data';
import type { StaticDataProfession } from '@/shared/stores/static/types';
import type { CharacterSubProfession } from '@/types';
import type { CharacterProps } from '@/types/props';

import Currency from '@/shared/components/currencies/Currency.svelte';
import Tooltip from '@/components/tooltips/professions/TooltipProfessions.svelte';
import WowthingImage from '@/shared/components/images/sources/WowthingImage.svelte';

Expand Down Expand Up @@ -43,28 +42,9 @@
let concCurrency = $derived(
wowthingData.static.currencyById.get(concentrationData[profession.id])
);
let concData = $derived(
concCurrency && getCurrencyData(timeState.slowTime, character, concCurrency)
);

let moxieCurrency = $derived(
wowthingData.static.currencyById.get(professionMoxie[profession.id])
);
let moxieData = $derived(
moxieCurrency && getCurrencyData(timeState.slowTime, character, moxieCurrency)
);

function statusClass(fullIsBad: boolean, percent: number) {
if (percent >= 100) {
return fullIsBad ? 'status-fail' : 'status-success';
} else if (percent >= 75) {
return fullIsBad ? 'status-warn' : 'status-shrug';
} else if (percent > 25 && percent < 75) {
return fullIsBad ? 'status-shrug' : 'status-warn';
} else {
return fullIsBad ? 'status-success' : 'status-fail';
}
}
</script>

<style lang="scss">
Expand All @@ -89,17 +69,6 @@
display: flex;
justify-content: space-between;
}
.concentration,
.moxie {
align-items: center;
display: flex;
gap: 0.2rem;
justify-content: space-between;

&:not(:first-child) {
--image-margin-top: 0;
}
}
</style>

<div class="profession" style:--columns={columns} data-id={profession.id}>
Expand Down Expand Up @@ -128,29 +97,14 @@
{#if current}
{#each fields as field (field)}
{#if field === 'concentration' && showConcentration}
{#if concData}
{@const { amount, percent, tooltip } = concData}
{@const status = statusClass(
settingsState.value.professions.fullConcentrationIsBad,
percent
)}
<div class="concentration {status}" data-tooltip={tooltip}>
<WowthingImage name="currency/{concCurrency.id}" size={20} border={1} />
<span>{amount}</span>
</div>
{:else}
<div class="concentration"></div>
{/if}
<Currency
{character}
currency={concCurrency}
fullIsBad={settingsState.value.professions.fullConcentrationIsBad}
useStatusClass={true}
/>
{:else if field === 'moxie' && showMoxie}
{#if moxieData}
{@const { amount, tooltip } = moxieData}
<div class="moxie" data-tooltip={tooltip}>
<WowthingImage name="currency/{moxieCurrency.id}" size={20} border={1} />
<span>{amount}</span>
</div>
{:else}
<div class="moxie"></div>
{/if}
<Currency {character} currency={moxieCurrency} />
{/if}
{/each}
{/if}
Expand Down
49 changes: 49 additions & 0 deletions apps/frontend/shared/components/currencies/Currency.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<script lang="ts">
import { timeState } from '@/shared/state/time.svelte';
import { getCurrencyData } from '@/utils/characters/get-currency-data';
import type { StaticDataCurrency } from '@/shared/stores/static/types';
import type { CharacterProps } from '@/types/props';

import WowthingImage from '@/shared/components/images/sources/WowthingImage.svelte';

type Props = CharacterProps & {
currency: StaticDataCurrency;
fullIsBad?: boolean;
useStatusClass?: boolean;
};
let { character, currency, fullIsBad, useStatusClass }: Props = $props();

let data = $derived(currency && getCurrencyData(timeState.slowTime, character, currency));

function statusClass(percent: number) {
if (percent >= 100) {
return fullIsBad ? 'status-fail' : 'status-success';
} else if (percent >= 75) {
return fullIsBad ? 'status-warn' : 'status-shrug';
} else if (percent > 25 && percent < 75) {
return fullIsBad ? 'status-shrug' : 'status-warn';
} else {
return fullIsBad ? 'status-success' : 'status-fail';
}
}
</script>

<style lang="scss">
.currency {
align-items: center;
display: flex;
gap: 0.2rem;
justify-content: space-between;
}
</style>

{#if data}
{@const { amount, percent, tooltip } = data}
{@const status = useStatusClass ? statusClass(percent) : ''}
<div class="currency {status}" data-tooltip={tooltip}>
<WowthingImage name="currency/{currency.id}" size={20} border={1} />
<span>{amount}</span>
</div>
{:else}
<div class="currency"></div>
{/if}
10 changes: 9 additions & 1 deletion apps/frontend/types/character/character.svelte.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ export class Character implements ContainsItems, HasNameAndRealm {
public lastSeenAddonUnix = $state(0);
public scannedCurrencies: DateTime = $state<DateTime>(undefined);
public scannedCurrenciesUnix = $state(0);
public transferredCurrencies: DateTime = $state<DateTime>(undefined);
public transferredCurrenciesUnix = $state(0);

public quests = $state<CharacterQuests>(undefined);

Expand Down Expand Up @@ -194,6 +196,7 @@ export class Character implements ContainsItems, HasNameAndRealm {
dailyResetUnix: number,
weeklyResetUnix: number,
scannedCurrenciesUnix: number,
transferredCurrenciesUnix: number,

configuration: CharacterConfiguration,

Expand Down Expand Up @@ -252,6 +255,7 @@ export class Character implements ContainsItems, HasNameAndRealm {
this.lastApiUpdateUnix = lastApiUpdateUnix;
this.lastSeenAddonUnix = lastSeenAddonUnix;
this.scannedCurrenciesUnix = scannedCurrenciesUnix;
this.transferredCurrenciesUnix = transferredCurrenciesUnix;

this.configuration = configuration;
this.auras = auras;
Expand Down Expand Up @@ -488,6 +492,10 @@ export class Character implements ContainsItems, HasNameAndRealm {
if (scannedCurrenciesUnix && scannedCurrenciesUnix > Constants.defaultUnixTime) {
this.scannedCurrencies = DateTime.fromSeconds(scannedCurrenciesUnix);
}

if (transferredCurrenciesUnix && transferredCurrenciesUnix > Constants.defaultUnixTime) {
this.transferredCurrencies = DateTime.fromSeconds(transferredCurrenciesUnix);
}
}

hidden = $derived.by(
Expand Down Expand Up @@ -543,7 +551,7 @@ export class Character implements ContainsItems, HasNameAndRealm {

public currencies = $derived.by(() => {
const ret: Record<number, CharacterCurrency> = {};
const now = timeState.slowTime;
const now = timeState.time;

for (const characterCurrency of Object.values(this.currencyObjects)) {
let newCurrency = characterCurrency;
Expand Down
53 changes: 27 additions & 26 deletions apps/web/Converters/ApiUserCharacterConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,35 +40,36 @@ public override void Write(Utf8JsonWriter writer, ApiUserCharacter character, Js
writer.WriteNumberValue(character.DailyReset?.ToUnixTimeSeconds() ?? 0); // 23
writer.WriteNumberValue(character.WeeklyReset?.ToUnixTimeSeconds() ?? 0); // 24
writer.WriteNumberValue(character.ScannedCurrencies?.ToUnixTimeSeconds() ?? 0); // 25
writer.WriteNumberValue(character.TransferredCurrencies?.ToUnixTimeSeconds() ?? 0); // 26

JsonSerializer.Serialize(writer, character.Configuration, options); // 26
JsonSerializer.Serialize(writer, character.Configuration, options); // 27

JsonSerializer.Serialize(writer, character.Auras, options); // 27
JsonSerializer.Serialize(writer, character.EquippedItems, options); // 28
JsonSerializer.Serialize(writer, character.Garrisons, options); // 29
JsonSerializer.Serialize(writer, character.GarrisonTrees, options); // 30
JsonSerializer.Serialize(writer, character.HighestItemLevel, options); // 31
JsonSerializer.Serialize(writer, character.KnownSpells, options); // 32
JsonSerializer.Serialize(writer, character.Lockouts, options); // 33
JsonSerializer.Serialize(writer, character.MythicPlus, options); // 34
JsonSerializer.Serialize(writer, character.MythicPlusAddon, options); // 35
JsonSerializer.Serialize(writer, character.MythicPlusSeasons, options); // 36
JsonSerializer.Serialize(writer, character.Paragons, options); // 37
JsonSerializer.Serialize(writer, character.PatronOrders, options); // 38
JsonSerializer.Serialize(writer, character.Professions, options); // 39
JsonSerializer.Serialize(writer, character.ProfessionCooldowns, options); // 40
JsonSerializer.Serialize(writer, character.ProfessionSpecializations, options); // 41
JsonSerializer.Serialize(writer, character.ProfessionTraits, options); // 42
JsonSerializer.Serialize(writer, character.RaiderIo, options); // 43
JsonSerializer.Serialize(writer, character.Reputations, options); // 44
JsonSerializer.Serialize(writer, character.Shadowlands, options); // 45
JsonSerializer.Serialize(writer, character.Weekly, options); // 46
JsonSerializer.Serialize(writer, character.Auras, options); // 28
JsonSerializer.Serialize(writer, character.EquippedItems, options); // 29
JsonSerializer.Serialize(writer, character.Garrisons, options); // 30
JsonSerializer.Serialize(writer, character.GarrisonTrees, options); // 31
JsonSerializer.Serialize(writer, character.HighestItemLevel, options); // 32
JsonSerializer.Serialize(writer, character.KnownSpells, options); // 33
JsonSerializer.Serialize(writer, character.Lockouts, options); // 34
JsonSerializer.Serialize(writer, character.MythicPlus, options); // 35
JsonSerializer.Serialize(writer, character.MythicPlusAddon, options); // 36
JsonSerializer.Serialize(writer, character.MythicPlusSeasons, options); // 37
JsonSerializer.Serialize(writer, character.Paragons, options); // 38
JsonSerializer.Serialize(writer, character.PatronOrders, options); // 39
JsonSerializer.Serialize(writer, character.Professions, options); // 40
JsonSerializer.Serialize(writer, character.ProfessionCooldowns, options); // 41
JsonSerializer.Serialize(writer, character.ProfessionSpecializations, options); // 42
JsonSerializer.Serialize(writer, character.ProfessionTraits, options); // 43
JsonSerializer.Serialize(writer, character.RaiderIo, options); // 44
JsonSerializer.Serialize(writer, character.Reputations, options); // 45
JsonSerializer.Serialize(writer, character.Shadowlands, options); // 46
JsonSerializer.Serialize(writer, character.Weekly, options); // 47

JsonSerializer.Serialize(writer, character.RawCurrencies, options); // 47
JsonSerializer.Serialize(writer, character.RawItems, options); // 48
JsonSerializer.Serialize(writer, character.RawMythicPlusWeeks, options); // 49
JsonSerializer.Serialize(writer, character.RawSpecializations, options); // 50
JsonSerializer.Serialize(writer, character.RawStatistics, options); // 51
JsonSerializer.Serialize(writer, character.RawCurrencies, options); // 48
JsonSerializer.Serialize(writer, character.RawItems, options); // 49
JsonSerializer.Serialize(writer, character.RawMythicPlusWeeks, options); // 50
JsonSerializer.Serialize(writer, character.RawSpecializations, options); // 51
JsonSerializer.Serialize(writer, character.RawStatistics, options); // 52

writer.WriteEndArray();
}
Expand Down
12 changes: 3 additions & 9 deletions apps/web/Models/Api/User/ApiUserCharacter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public class ApiUserCharacter
public DateTime? DailyReset { get; set; }
public DateTime? WeeklyReset { get; set; }
public DateTime? ScannedCurrencies { get; set; }
public DateTime? TransferredCurrencies { get; set; }
public WowFaction Faction { get; set; }
public WowGender Gender { get; set; }

Expand Down Expand Up @@ -128,15 +129,8 @@ public ApiUserCharacter(
ProfessionCooldowns = character.AddonData?.ProfessionCooldowns;
ProfessionTraits = character.AddonData?.ProfessionTraits;

var currenciesScanned = character.AddonData?.CurrenciesScannedAt;
if (currenciesScanned == null ||
(character.AddonData?.CurrenciesTransferredAt != null &&
character.AddonData?.CurrenciesTransferredAt > currenciesScanned)
)
{
currenciesScanned = character.AddonData?.CurrenciesTransferredAt;
}
ScannedCurrencies = currenciesScanned;
ScannedCurrencies = character.AddonData?.CurrenciesScannedAt;
TransferredCurrencies = character.AddonData?.CurrenciesTransferredAt;

Professions = character.Professions?.Professions;
ProfessionSpecializations = character.Professions?.ProfessionSpecializations ?? new();
Expand Down
Loading