Skip to content

Commit de1079c

Browse files
authored
Merge pull request #9756 from robojumper/filter-silver-items
Add Hide Silver items toggle to Vendors page
2 parents 5534f55 + 30c1471 commit de1079c

File tree

7 files changed

+63
-24
lines changed

7 files changed

+63
-24
lines changed

config/i18n.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,6 +1281,7 @@
12811281
"Collections": "Collections",
12821282
"Engram": "Reward Engram",
12831283
"FilterToUnacquired": "Only show uncollected items",
1284+
"HideSilverItems": "Hide Silver items",
12841285
"NoItems": "This Vendor is currently not offering any items.",
12851286
"Vendors": "Vendors",
12861287
"RefreshTime": "Inventory refreshes in:"

docs/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
## Next
22

33
* You can choose between a number of different themes for DIM's interface in settings.
4+
* The Vendors page now has a toggle to hide all items sold for Silver.
45

56
## 7.82.1 <span class="changelog-date">(2023-08-22)</span>
67

src/app/search/d2-known-values.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,9 @@ export const pinnacleSources = [
193193
73143230, // InventoryItem "Pinnacle Gear"
194194
];
195195

196+
/** The premium Eververse currency */
197+
export const silverItemHash = 3147280338; // InventoryItem "Silver"
198+
196199
// For loadout mods obliterated from the defs, we instead return this def
197200
export const deprecatedPlaceholderArmorModHash = 3947616002; // InventoryItem "Deprecated Armor Mod"
198201

src/app/settings/initial-settings.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface Settings extends DimApiSettings {
99
loIncludeVendorItems: boolean;
1010
theme: string;
1111
sortRecordProgression: boolean;
12+
vendorsHideSilverItems: boolean;
1213
}
1314

1415
export const initialSettingsState: Settings = {
@@ -17,4 +18,5 @@ export const initialSettingsState: Settings = {
1718
language: defaultLanguage(),
1819
theme: 'default',
1920
sortRecordProgression: false,
21+
vendorsHideSilverItems: false,
2022
};

src/app/vendors/Vendors.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { useLoadStores } from 'app/inventory/store/hooks';
66
import { getCurrentStore } from 'app/inventory/stores-helpers';
77
import { useD2Definitions } from 'app/manifest/selectors';
88
import { searchFilterSelector } from 'app/search/search-filter';
9+
import { useSetting } from 'app/settings/hooks';
910
import ErrorPanel from 'app/shell/ErrorPanel';
1011
import { querySelector, useIsPhonePortrait } from 'app/shell/selectors';
1112
import { usePageTitle } from 'app/utils/hooks';
@@ -22,6 +23,7 @@ import styles from './Vendors.m.scss';
2223
import VendorsMenu from './VendorsMenu';
2324
import {
2425
D2VendorGroup,
26+
filterVendorGroupsToNoSilver,
2527
filterVendorGroupsToSearch,
2628
filterVendorGroupsToUnacquired,
2729
} from './d2-vendors';
@@ -45,6 +47,7 @@ export default function Vendors({ account }: { account: DestinyAccount }) {
4547
usePageTitle(t('Vendors.Vendors'));
4648

4749
const [filterToUnacquired, setFilterToUnacquired] = useState(false);
50+
const [hideSilverItems, setHideSilverItems] = useSetting('vendorsHideSilverItems');
4851

4952
// once the page is loaded, user can select this
5053
const [userSelectedStoreId, setUserSelectedStoreId] = useState<string>();
@@ -103,6 +106,9 @@ export default function Vendors({ account }: { account: DestinyAccount }) {
103106
if (vendorGroups && filterToUnacquired) {
104107
vendorGroups = filterVendorGroupsToUnacquired(vendorGroups, ownedItemHashes);
105108
}
109+
if (vendorGroups && hideSilverItems) {
110+
vendorGroups = filterVendorGroupsToNoSilver(vendorGroups);
111+
}
106112
if (vendorGroups && searchQuery.length) {
107113
vendorGroups = filterVendorGroupsToSearch(vendorGroups, searchQuery, filterItems);
108114
}
@@ -126,6 +132,13 @@ export default function Vendors({ account }: { account: DestinyAccount }) {
126132
>
127133
{t('Vendors.FilterToUnacquired')}
128134
</CheckButton>
135+
<CheckButton
136+
name="vendorsHideSilverItems"
137+
checked={hideSilverItems}
138+
onChange={setHideSilverItems}
139+
>
140+
{t('Vendors.HideSilverItems')}
141+
</CheckButton>
129142
</div>
130143
)}
131144
{!isPhonePortrait && vendorGroups && <VendorsMenu groups={vendorGroups} />}

src/app/vendors/d2-vendors.ts

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { D2ManifestDefinitions } from 'app/destiny2/d2-definitions';
22
import { ItemCreationContext } from 'app/inventory/store/d2-item-factory';
3-
import { VENDORS } from 'app/search/d2-known-values';
3+
import { VENDORS, silverItemHash } from 'app/search/d2-known-values';
44
import { ItemFilter } from 'app/search/filter-types';
55
import { compareBy } from 'app/utils/comparators';
66
import { filterMap } from 'app/utils/util';
@@ -189,46 +189,64 @@ function getVendorItems(
189189
}
190190
}
191191

192-
export function filterVendorGroupsToUnacquired(
192+
function filterVendorGroups(
193193
vendorGroups: readonly D2VendorGroup[],
194-
ownedItemHashes: Set<number>
194+
predicate: (item: VendorItem, vendor: D2Vendor) => boolean | null | undefined
195195
) {
196196
return vendorGroups
197197
.map((group) => ({
198198
...group,
199199
vendors: group.vendors
200200
.map((vendor) => ({
201201
...vendor,
202-
items: vendor.items.filter(
203-
({ item, collectibleState }) =>
204-
item &&
205-
(collectibleState !== undefined
206-
? collectibleState & DestinyCollectibleState.NotAcquired
207-
: item.itemCategoryHashes.includes(ItemCategoryHashes.Mods_Mod) &&
208-
!ownedItemHashes.has(item.hash))
209-
),
202+
items: vendor.items.filter((item) => predicate(item, vendor)),
210203
}))
211204
.filter((v) => v.items.length),
212205
}))
213206
.filter((g) => g.vendors.length);
214207
}
215208

209+
export function filterVendorGroupsToUnacquired(
210+
vendorGroups: readonly D2VendorGroup[],
211+
ownedItemHashes: Set<number>
212+
) {
213+
return filterVendorGroups(
214+
vendorGroups,
215+
({ item, collectibleState }) =>
216+
item &&
217+
(collectibleState !== undefined
218+
? (collectibleState & DestinyCollectibleState.NotAcquired) !== 0
219+
: item.itemCategoryHashes.includes(ItemCategoryHashes.Mods_Mod) &&
220+
!ownedItemHashes.has(item.hash))
221+
);
222+
}
223+
224+
export function filterVendorGroupsToNoSilver(vendorGroups: readonly D2VendorGroup[]) {
225+
return filterVendorGroups(vendorGroups, ({ costs, displayCategoryIndex }, vendor) => {
226+
if (costs.some((c) => c.itemHash === silverItemHash)) {
227+
return false;
228+
}
229+
const categoryIdentifier =
230+
displayCategoryIndex !== undefined &&
231+
displayCategoryIndex >= 0 &&
232+
vendor.def.displayCategories[displayCategoryIndex].identifier;
233+
return !(
234+
categoryIdentifier &&
235+
(categoryIdentifier.startsWith('categories.campaigns') ||
236+
categoryIdentifier.startsWith('categories.featured.carousel'))
237+
);
238+
});
239+
}
240+
216241
export function filterVendorGroupsToSearch(
217242
vendorGroups: readonly D2VendorGroup[],
218243
searchQuery: string,
219244
filterItems: ItemFilter
220245
) {
221-
return vendorGroups
222-
.map((group) => ({
223-
...group,
224-
vendors: group.vendors
225-
.map((vendor) => ({
226-
...vendor,
227-
items: vendor.def.displayProperties.name.toLowerCase().includes(searchQuery.toLowerCase())
228-
? vendor.items
229-
: vendor.items.filter(({ item }) => item && filterItems(item)),
230-
}))
231-
.filter((v) => v.items.length),
232-
}))
233-
.filter((g) => g.vendors.length);
246+
return filterVendorGroups(
247+
vendorGroups,
248+
({ item }, vendor) =>
249+
vendor.def.displayProperties.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
250+
(item && filterItems(item))
251+
);
234252
}

src/locale/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,6 +1270,7 @@
12701270
"Collections": "Collections",
12711271
"Engram": "Reward Engram",
12721272
"FilterToUnacquired": "Only show uncollected items",
1273+
"HideSilverItems": "Hide Silver items",
12731274
"NoItems": "This Vendor is currently not offering any items.",
12741275
"RefreshTime": "Inventory refreshes in:",
12751276
"Vendors": "Vendors"

0 commit comments

Comments
 (0)