Skip to content

Commit 36c9e0a

Browse files
authored
Merge pull request #1739 from ThingEngineering/main
Deploy
2 parents 01deb8a + fe78164 commit 36c9e0a

6 files changed

Lines changed: 104 additions & 122 deletions

File tree

apps/frontend/components/home/table/row/HomeTableRowProfessionConcentration.svelte

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@
22
import sortBy from 'lodash/sortBy';
33
44
import { Constants } from '@/data/constants';
5-
import { imageStrings } from '@/data/icons';
65
import { expansionProfessionConcentration } from '@/data/professions/cooldowns';
76
import { settingsState } from '@/shared/state/settings.svelte';
87
import { wowthingData } from '@/shared/stores/data';
9-
import { timeStore } from '@/shared/stores/time';
10-
import { getCurrencyData } from '@/utils/characters/get-currency-data';
118
import { getProfessionSortKey } from '@/utils/professions';
129
import type { CharacterProps } from '@/types/props';
1310
14-
import WowthingImage from '@/shared/components/images/sources/WowthingImage.svelte';
11+
import Currency from '@/shared/components/currencies/Currency.svelte';
1512
1613
type Props = CharacterProps & { expansion: number };
1714
let { character, expansion }: Props = $props();
@@ -33,18 +30,6 @@
3330
(prof) => getProfessionSortKey(prof)
3431
)
3532
);
36-
37-
function statusClass(fullIsBad: boolean, percent: number) {
38-
if (percent >= 100) {
39-
return fullIsBad ? 'status-fail' : 'status-success';
40-
} else if (percent >= 75) {
41-
return fullIsBad ? 'status-warn' : 'status-shrug';
42-
} else if (percent > 25 && percent < 75) {
43-
return fullIsBad ? 'status-shrug' : 'status-warn';
44-
} else {
45-
return fullIsBad ? 'status-success' : 'status-fail';
46-
}
47-
}
4833
</script>
4934

5035
<style lang="scss">
@@ -76,22 +61,13 @@
7661

7762
<td>
7863
<div class="flex-wrapper">
79-
{#each professions as profession}
80-
{@const { amount, percent, tooltip } = getCurrencyData(
81-
$timeStore,
82-
character,
83-
wowthingData.static.currencyById.get(concentrationData[profession.id])
84-
)}
85-
<div
86-
class="concentration {statusClass(
87-
settingsState.value.professions.fullConcentrationIsBad,
88-
percent
89-
)}"
90-
data-tooltip={tooltip}
91-
>
92-
<WowthingImage name={imageStrings[profession.slug]} size={20} border={1} />
93-
<span>{amount}</span>
94-
</div>
64+
{#each professions as profession, index (index)}
65+
<Currency
66+
{character}
67+
currency={wowthingData.static.currencyById.get(concentrationData[profession.id])}
68+
fullIsBad={settingsState.value.professions.fullConcentrationIsBad}
69+
useStatusClass={true}
70+
/>
9571
{/each}
9672
</div>
9773
</td>

apps/frontend/components/home/table/row/HomeTableRowProfessionsV2Profession.svelte

Lines changed: 8 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55
import { professionMoxie } from '@/data/professions/moxie';
66
import { Region } from '@/enums/region';
77
import { settingsState } from '@/shared/state/settings.svelte';
8-
import { timeState } from '@/shared/state/time.svelte';
98
import { wowthingData } from '@/shared/stores/data';
109
import { componentTooltip } from '@/shared/utils/tooltips/component-tooltip.svelte';
11-
import { getCurrencyData } from '@/utils/characters/get-currency-data';
1210
import type { StaticDataProfession } from '@/shared/stores/static/types';
1311
import type { CharacterSubProfession } from '@/types';
1412
import type { CharacterProps } from '@/types/props';
1513
14+
import Currency from '@/shared/components/currencies/Currency.svelte';
1615
import Tooltip from '@/components/tooltips/professions/TooltipProfessions.svelte';
1716
import WowthingImage from '@/shared/components/images/sources/WowthingImage.svelte';
1817
@@ -43,28 +42,9 @@
4342
let concCurrency = $derived(
4443
wowthingData.static.currencyById.get(concentrationData[profession.id])
4544
);
46-
let concData = $derived(
47-
concCurrency && getCurrencyData(timeState.slowTime, character, concCurrency)
48-
);
49-
5045
let moxieCurrency = $derived(
5146
wowthingData.static.currencyById.get(professionMoxie[profession.id])
5247
);
53-
let moxieData = $derived(
54-
moxieCurrency && getCurrencyData(timeState.slowTime, character, moxieCurrency)
55-
);
56-
57-
function statusClass(fullIsBad: boolean, percent: number) {
58-
if (percent >= 100) {
59-
return fullIsBad ? 'status-fail' : 'status-success';
60-
} else if (percent >= 75) {
61-
return fullIsBad ? 'status-warn' : 'status-shrug';
62-
} else if (percent > 25 && percent < 75) {
63-
return fullIsBad ? 'status-shrug' : 'status-warn';
64-
} else {
65-
return fullIsBad ? 'status-success' : 'status-fail';
66-
}
67-
}
6848
</script>
6949

7050
<style lang="scss">
@@ -89,17 +69,6 @@
8969
display: flex;
9070
justify-content: space-between;
9171
}
92-
.concentration,
93-
.moxie {
94-
align-items: center;
95-
display: flex;
96-
gap: 0.2rem;
97-
justify-content: space-between;
98-
99-
&:not(:first-child) {
100-
--image-margin-top: 0;
101-
}
102-
}
10372
</style>
10473

10574
<div class="profession" style:--columns={columns} data-id={profession.id}>
@@ -128,29 +97,14 @@
12897
{#if current}
12998
{#each fields as field (field)}
13099
{#if field === 'concentration' && showConcentration}
131-
{#if concData}
132-
{@const { amount, percent, tooltip } = concData}
133-
{@const status = statusClass(
134-
settingsState.value.professions.fullConcentrationIsBad,
135-
percent
136-
)}
137-
<div class="concentration {status}" data-tooltip={tooltip}>
138-
<WowthingImage name="currency/{concCurrency.id}" size={20} border={1} />
139-
<span>{amount}</span>
140-
</div>
141-
{:else}
142-
<div class="concentration"></div>
143-
{/if}
100+
<Currency
101+
{character}
102+
currency={concCurrency}
103+
fullIsBad={settingsState.value.professions.fullConcentrationIsBad}
104+
useStatusClass={true}
105+
/>
144106
{:else if field === 'moxie' && showMoxie}
145-
{#if moxieData}
146-
{@const { amount, tooltip } = moxieData}
147-
<div class="moxie" data-tooltip={tooltip}>
148-
<WowthingImage name="currency/{moxieCurrency.id}" size={20} border={1} />
149-
<span>{amount}</span>
150-
</div>
151-
{:else}
152-
<div class="moxie"></div>
153-
{/if}
107+
<Currency {character} currency={moxieCurrency} />
154108
{/if}
155109
{/each}
156110
{/if}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<script lang="ts">
2+
import { timeState } from '@/shared/state/time.svelte';
3+
import { getCurrencyData } from '@/utils/characters/get-currency-data';
4+
import type { StaticDataCurrency } from '@/shared/stores/static/types';
5+
import type { CharacterProps } from '@/types/props';
6+
7+
import WowthingImage from '@/shared/components/images/sources/WowthingImage.svelte';
8+
9+
type Props = CharacterProps & {
10+
currency: StaticDataCurrency;
11+
fullIsBad?: boolean;
12+
useStatusClass?: boolean;
13+
};
14+
let { character, currency, fullIsBad, useStatusClass }: Props = $props();
15+
16+
let data = $derived(currency && getCurrencyData(timeState.slowTime, character, currency));
17+
18+
function statusClass(percent: number) {
19+
if (percent >= 100) {
20+
return fullIsBad ? 'status-fail' : 'status-success';
21+
} else if (percent >= 75) {
22+
return fullIsBad ? 'status-warn' : 'status-shrug';
23+
} else if (percent > 25 && percent < 75) {
24+
return fullIsBad ? 'status-shrug' : 'status-warn';
25+
} else {
26+
return fullIsBad ? 'status-success' : 'status-fail';
27+
}
28+
}
29+
</script>
30+
31+
<style lang="scss">
32+
.currency {
33+
align-items: center;
34+
display: flex;
35+
gap: 0.2rem;
36+
justify-content: space-between;
37+
}
38+
</style>
39+
40+
{#if data}
41+
{@const { amount, percent, tooltip } = data}
42+
{@const status = useStatusClass ? statusClass(percent) : ''}
43+
<div class="currency {status}" data-tooltip={tooltip}>
44+
<WowthingImage name="currency/{currency.id}" size={20} border={1} />
45+
<span>{amount}</span>
46+
</div>
47+
{:else}
48+
<div class="currency"></div>
49+
{/if}

apps/frontend/types/character/character.svelte.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ export class Character implements ContainsItems, HasNameAndRealm {
125125
public lastSeenAddonUnix = $state(0);
126126
public scannedCurrencies: DateTime = $state<DateTime>(undefined);
127127
public scannedCurrenciesUnix = $state(0);
128+
public transferredCurrencies: DateTime = $state<DateTime>(undefined);
129+
public transferredCurrenciesUnix = $state(0);
128130

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

@@ -194,6 +196,7 @@ export class Character implements ContainsItems, HasNameAndRealm {
194196
dailyResetUnix: number,
195197
weeklyResetUnix: number,
196198
scannedCurrenciesUnix: number,
199+
transferredCurrenciesUnix: number,
197200

198201
configuration: CharacterConfiguration,
199202

@@ -252,6 +255,7 @@ export class Character implements ContainsItems, HasNameAndRealm {
252255
this.lastApiUpdateUnix = lastApiUpdateUnix;
253256
this.lastSeenAddonUnix = lastSeenAddonUnix;
254257
this.scannedCurrenciesUnix = scannedCurrenciesUnix;
258+
this.transferredCurrenciesUnix = transferredCurrenciesUnix;
255259

256260
this.configuration = configuration;
257261
this.auras = auras;
@@ -488,6 +492,10 @@ export class Character implements ContainsItems, HasNameAndRealm {
488492
if (scannedCurrenciesUnix && scannedCurrenciesUnix > Constants.defaultUnixTime) {
489493
this.scannedCurrencies = DateTime.fromSeconds(scannedCurrenciesUnix);
490494
}
495+
496+
if (transferredCurrenciesUnix && transferredCurrenciesUnix > Constants.defaultUnixTime) {
497+
this.transferredCurrencies = DateTime.fromSeconds(transferredCurrenciesUnix);
498+
}
491499
}
492500

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

544552
public currencies = $derived.by(() => {
545553
const ret: Record<number, CharacterCurrency> = {};
546-
const now = timeState.slowTime;
554+
const now = timeState.time;
547555

548556
for (const characterCurrency of Object.values(this.currencyObjects)) {
549557
let newCurrency = characterCurrency;

apps/web/Converters/ApiUserCharacterConverter.cs

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -40,35 +40,36 @@ public override void Write(Utf8JsonWriter writer, ApiUserCharacter character, Js
4040
writer.WriteNumberValue(character.DailyReset?.ToUnixTimeSeconds() ?? 0); // 23
4141
writer.WriteNumberValue(character.WeeklyReset?.ToUnixTimeSeconds() ?? 0); // 24
4242
writer.WriteNumberValue(character.ScannedCurrencies?.ToUnixTimeSeconds() ?? 0); // 25
43+
writer.WriteNumberValue(character.TransferredCurrencies?.ToUnixTimeSeconds() ?? 0); // 26
4344

44-
JsonSerializer.Serialize(writer, character.Configuration, options); // 26
45+
JsonSerializer.Serialize(writer, character.Configuration, options); // 27
4546

46-
JsonSerializer.Serialize(writer, character.Auras, options); // 27
47-
JsonSerializer.Serialize(writer, character.EquippedItems, options); // 28
48-
JsonSerializer.Serialize(writer, character.Garrisons, options); // 29
49-
JsonSerializer.Serialize(writer, character.GarrisonTrees, options); // 30
50-
JsonSerializer.Serialize(writer, character.HighestItemLevel, options); // 31
51-
JsonSerializer.Serialize(writer, character.KnownSpells, options); // 32
52-
JsonSerializer.Serialize(writer, character.Lockouts, options); // 33
53-
JsonSerializer.Serialize(writer, character.MythicPlus, options); // 34
54-
JsonSerializer.Serialize(writer, character.MythicPlusAddon, options); // 35
55-
JsonSerializer.Serialize(writer, character.MythicPlusSeasons, options); // 36
56-
JsonSerializer.Serialize(writer, character.Paragons, options); // 37
57-
JsonSerializer.Serialize(writer, character.PatronOrders, options); // 38
58-
JsonSerializer.Serialize(writer, character.Professions, options); // 39
59-
JsonSerializer.Serialize(writer, character.ProfessionCooldowns, options); // 40
60-
JsonSerializer.Serialize(writer, character.ProfessionSpecializations, options); // 41
61-
JsonSerializer.Serialize(writer, character.ProfessionTraits, options); // 42
62-
JsonSerializer.Serialize(writer, character.RaiderIo, options); // 43
63-
JsonSerializer.Serialize(writer, character.Reputations, options); // 44
64-
JsonSerializer.Serialize(writer, character.Shadowlands, options); // 45
65-
JsonSerializer.Serialize(writer, character.Weekly, options); // 46
47+
JsonSerializer.Serialize(writer, character.Auras, options); // 28
48+
JsonSerializer.Serialize(writer, character.EquippedItems, options); // 29
49+
JsonSerializer.Serialize(writer, character.Garrisons, options); // 30
50+
JsonSerializer.Serialize(writer, character.GarrisonTrees, options); // 31
51+
JsonSerializer.Serialize(writer, character.HighestItemLevel, options); // 32
52+
JsonSerializer.Serialize(writer, character.KnownSpells, options); // 33
53+
JsonSerializer.Serialize(writer, character.Lockouts, options); // 34
54+
JsonSerializer.Serialize(writer, character.MythicPlus, options); // 35
55+
JsonSerializer.Serialize(writer, character.MythicPlusAddon, options); // 36
56+
JsonSerializer.Serialize(writer, character.MythicPlusSeasons, options); // 37
57+
JsonSerializer.Serialize(writer, character.Paragons, options); // 38
58+
JsonSerializer.Serialize(writer, character.PatronOrders, options); // 39
59+
JsonSerializer.Serialize(writer, character.Professions, options); // 40
60+
JsonSerializer.Serialize(writer, character.ProfessionCooldowns, options); // 41
61+
JsonSerializer.Serialize(writer, character.ProfessionSpecializations, options); // 42
62+
JsonSerializer.Serialize(writer, character.ProfessionTraits, options); // 43
63+
JsonSerializer.Serialize(writer, character.RaiderIo, options); // 44
64+
JsonSerializer.Serialize(writer, character.Reputations, options); // 45
65+
JsonSerializer.Serialize(writer, character.Shadowlands, options); // 46
66+
JsonSerializer.Serialize(writer, character.Weekly, options); // 47
6667

67-
JsonSerializer.Serialize(writer, character.RawCurrencies, options); // 47
68-
JsonSerializer.Serialize(writer, character.RawItems, options); // 48
69-
JsonSerializer.Serialize(writer, character.RawMythicPlusWeeks, options); // 49
70-
JsonSerializer.Serialize(writer, character.RawSpecializations, options); // 50
71-
JsonSerializer.Serialize(writer, character.RawStatistics, options); // 51
68+
JsonSerializer.Serialize(writer, character.RawCurrencies, options); // 48
69+
JsonSerializer.Serialize(writer, character.RawItems, options); // 49
70+
JsonSerializer.Serialize(writer, character.RawMythicPlusWeeks, options); // 50
71+
JsonSerializer.Serialize(writer, character.RawSpecializations, options); // 51
72+
JsonSerializer.Serialize(writer, character.RawStatistics, options); // 52
7273

7374
writer.WriteEndArray();
7475
}

apps/web/Models/Api/User/ApiUserCharacter.cs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class ApiUserCharacter
3333
public DateTime? DailyReset { get; set; }
3434
public DateTime? WeeklyReset { get; set; }
3535
public DateTime? ScannedCurrencies { get; set; }
36+
public DateTime? TransferredCurrencies { get; set; }
3637
public WowFaction Faction { get; set; }
3738
public WowGender Gender { get; set; }
3839

@@ -128,15 +129,8 @@ public ApiUserCharacter(
128129
ProfessionCooldowns = character.AddonData?.ProfessionCooldowns;
129130
ProfessionTraits = character.AddonData?.ProfessionTraits;
130131

131-
var currenciesScanned = character.AddonData?.CurrenciesScannedAt;
132-
if (currenciesScanned == null ||
133-
(character.AddonData?.CurrenciesTransferredAt != null &&
134-
character.AddonData?.CurrenciesTransferredAt > currenciesScanned)
135-
)
136-
{
137-
currenciesScanned = character.AddonData?.CurrenciesTransferredAt;
138-
}
139-
ScannedCurrencies = currenciesScanned;
132+
ScannedCurrencies = character.AddonData?.CurrenciesScannedAt;
133+
TransferredCurrencies = character.AddonData?.CurrenciesTransferredAt;
140134

141135
Professions = character.Professions?.Professions;
142136
ProfessionSpecializations = character.Professions?.ProfessionSpecializations ?? new();

0 commit comments

Comments
 (0)