mirror of
https://github.com/Kvan7/Exiled-Exchange-2.git
synced 2025-12-06 16:15:42 +00:00
Fixes error and adds basic price check (#37)
* bump for updating branding * Bugfix/testing-potential-fix (#31) * removes the problem * sdfhgdf * change to no-referrer-when-downgrade * Start of fixes for price check (#36) * feat: Adds new trade web api Adds types for trade api * fix lint * push edits * Add basic items to items.ndjson * Added images from old items files * Fix armor values * WOOO * bump version
This commit is contained in:
@@ -28,6 +28,15 @@
|
|||||||
"editor.insertSpaces": true,
|
"editor.insertSpaces": true,
|
||||||
"conventionalCommits.scopes": [
|
"conventionalCommits.scopes": [
|
||||||
"Update to 2"
|
"Update to 2"
|
||||||
|
],
|
||||||
|
"cSpell.words": [
|
||||||
|
"edps",
|
||||||
|
"ilvl",
|
||||||
|
"nonunique",
|
||||||
|
"onlineleague",
|
||||||
|
"pdps",
|
||||||
|
"uniquefoil",
|
||||||
|
"WAYSTONE"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
11302
main/package-lock.json
generated
11302
main/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,38 +1,38 @@
|
|||||||
{
|
{
|
||||||
"name": "exiled-exchange-2",
|
"name": "exiled-exchange-2",
|
||||||
"version": "0.0.11",
|
"version": "0.0.12",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "node build/script.mjs",
|
"dev": "node build/script.mjs",
|
||||||
"build": "tsc --noEmit && node build/script.mjs --prod",
|
"build": "tsc --noEmit && node build/script.mjs --prod",
|
||||||
"package": "electron-builder build",
|
"package": "electron-builder build",
|
||||||
"lint": "eslint src",
|
"lint": "eslint src",
|
||||||
"fix": "eslint src --fix"
|
"fix": "eslint src --fix"
|
||||||
},
|
},
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Garrett Parker"
|
"name": "Garrett Parker"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Kvan7/exiled-exchange-2.git"
|
"url": "https://github.com/Kvan7/exiled-exchange-2.git"
|
||||||
},
|
},
|
||||||
"main": "dist/main.js",
|
"main": "dist/main.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"electron-overlay-window": "3.3.0",
|
"electron-overlay-window": "3.3.0",
|
||||||
"uiohook-napi": "1.5.x"
|
"uiohook-napi": "1.5.x"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/ini": "^4.1.0",
|
"@types/ini": "^4.1.0",
|
||||||
"@types/node": "20.x.x",
|
"@types/node": "20.x.x",
|
||||||
"@types/ws": "^8.5.3",
|
"@types/ws": "^8.5.3",
|
||||||
"@wokwi/bmp-ts": "^3.0.0",
|
"@wokwi/bmp-ts": "^3.0.0",
|
||||||
"comlink": "^4.3.1",
|
"comlink": "^4.3.1",
|
||||||
"electron": "33.2.1",
|
"electron": "33.2.1",
|
||||||
"electron-builder": "25.1.8",
|
"electron-builder": "25.1.8",
|
||||||
"electron-updater": "^6.3.0",
|
"electron-updater": "^6.3.0",
|
||||||
"esbuild": "^0.24.0",
|
"esbuild": "^0.24.0",
|
||||||
"ini": "^5.0.0",
|
"ini": "^5.0.0",
|
||||||
"typescript": "5.6.x",
|
"typescript": "5.6.x",
|
||||||
"ws": "^8.16.0"
|
"ws": "^8.16.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,7 +36,8 @@ export class HttpProxy {
|
|||||||
...req.headers,
|
...req.headers,
|
||||||
'user-agent': app.userAgentFallback
|
'user-agent': app.userAgentFallback
|
||||||
},
|
},
|
||||||
useSessionCookies: true
|
useSessionCookies: true,
|
||||||
|
referrerPolicy: 'no-referrer-when-downgrade'
|
||||||
})
|
})
|
||||||
proxyReq.addListener('response', (proxyRes) => {
|
proxyReq.addListener('response', (proxyRes) => {
|
||||||
const resHeaders = { ...proxyRes.headers }
|
const resHeaders = { ...proxyRes.headers }
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
"elemental_dps": "Elemental DPS: {0}",
|
"elemental_dps": "Elemental DPS: {0}",
|
||||||
"crit": "Critical Strike Chance: {0}%",
|
"crit": "Critical Strike Chance: {0}%",
|
||||||
"aps": "Attacks per Second: {0}",
|
"aps": "Attacks per Second: {0}",
|
||||||
|
"spirit": "Spirit: {0}",
|
||||||
"has_empty_modifier": "1 Empty or Crafted Modifier",
|
"has_empty_modifier": "1 Empty or Crafted Modifier",
|
||||||
"has_empty_affix": "Any",
|
"has_empty_affix": "Any",
|
||||||
"has_empty_prefix": "Prefix",
|
"has_empty_prefix": "Prefix",
|
||||||
@@ -63,6 +64,8 @@
|
|||||||
"white_sockets": "White: {0}",
|
"white_sockets": "White: {0}",
|
||||||
"quality": "Quality: {0}",
|
"quality": "Quality: {0}",
|
||||||
"gem_level": "Level: {0}",
|
"gem_level": "Level: {0}",
|
||||||
|
"gem_sockets": "Sockets: {0}",
|
||||||
|
"rune_sockets": "Sockets: {0}",
|
||||||
"sentinel_charge": "Charge: {0}",
|
"sentinel_charge": "Charge: {0}",
|
||||||
"find_in_stash": "Find in Stash",
|
"find_in_stash": "Find in Stash",
|
||||||
"parse_error": "An error occurred while parsing the item",
|
"parse_error": "An error occurred while parsing the item",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
BIN
renderer/public/images/404.png
Normal file
BIN
renderer/public/images/404.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 344 B |
@@ -48,6 +48,9 @@ export enum ItemCategory {
|
|||||||
Tincture = 'Tincture',
|
Tincture = 'Tincture',
|
||||||
Charm = 'Charm',
|
Charm = 'Charm',
|
||||||
Crossbow = 'Crossbow',
|
Crossbow = 'Crossbow',
|
||||||
|
SkillGem = 'Skill Gem',
|
||||||
|
SupportGem = 'Support Gem',
|
||||||
|
MetaGem = 'Meta Gem',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const WEAPON_ONE_HANDED_MELEE = new Set([
|
export const WEAPON_ONE_HANDED_MELEE = new Set([
|
||||||
@@ -76,6 +79,7 @@ export const WEAPONE_TWO_HANDED_MELEE = new Set([
|
|||||||
export const WEAPON = new Set([
|
export const WEAPON = new Set([
|
||||||
ItemCategory.FishingRod,
|
ItemCategory.FishingRod,
|
||||||
ItemCategory.Bow,
|
ItemCategory.Bow,
|
||||||
|
ItemCategory.Crossbow,
|
||||||
...WEAPON_ONE_HANDED,
|
...WEAPON_ONE_HANDED,
|
||||||
...WEAPONE_TWO_HANDED_MELEE
|
...WEAPONE_TWO_HANDED_MELEE
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
:class="$style.starredItem"
|
:class="$style.starredItem"
|
||||||
@click="starredItemClick($event, item)">
|
@click="starredItemClick($event, item)">
|
||||||
<ItemQuickPrice
|
<ItemQuickPrice
|
||||||
:item-img="item.info.icon"
|
:item-img="item.info.icon === '%NOT_FOUND%' || item.info.icon === '' ? '/images/404.png' : item.info.icon"
|
||||||
:price="item.price"
|
:price="item.price"
|
||||||
currency-text
|
currency-text
|
||||||
></ItemQuickPrice>
|
></ItemQuickPrice>
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
<price-prediction v-if="showPredictedPrice" class="mb-4" :item="item" />
|
<price-prediction v-if="showPredictedPrice" class="mb-4" :item="item" />
|
||||||
<price-trend v-else :item="item" :filters="itemFilters" />
|
<price-trend v-else :item="item" :filters="itemFilters" />
|
||||||
<filters-block ref="filtersComponent" :filters="itemFilters" :stats="itemStats" :item="item" :presets="presets"
|
<filters-block ref="filtersComponent" :filters="itemFilters" :stats="itemStats" :item="item" :presets="presets"
|
||||||
@preset="selectPreset" @submit="doSearch = true" />
|
@preset="selectPreset" @submit="doSearch = true" />
|
||||||
<trade-listing v-if="tradeAPI === 'trade' && doSearch" ref="tradeService" :filters="itemFilters" :stats="itemStats"
|
<trade-listing v-if="tradeAPI === 'trade' && doSearch" ref="tradeService" :filters="itemFilters" :stats="itemStats"
|
||||||
:item="item" />
|
:item="item" />
|
||||||
<trade-bulk v-if="tradeAPI === 'bulk' && doSearch" ref="tradeService" :filters="itemFilters" :item="item" />
|
<trade-bulk v-if="tradeAPI === 'bulk' && doSearch" ref="tradeService" :filters="itemFilters" :item="item" />
|
||||||
<div v-if="!doSearch" class="flex justify-between items-center">
|
<div v-if="!doSearch" class="flex justify-between items-center">
|
||||||
<div class="flex w-40" @mouseenter="handleSearchMouseenter">
|
<div class="flex w-40" @mouseenter="handleSearchMouseenter">
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
>
|
>
|
||||||
<template #item>
|
<template #item>
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<img v-for="icon in result.icons" class="w-8 h-8" :src="icon">
|
<img v-for="icon in result.icons" class="w-8 h-8" :src="icon === '%NOT_FOUND%' || icon === '' ? '/images/404.png' : icon">
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</item-quick-price>
|
</item-quick-price>
|
||||||
|
|||||||
@@ -48,6 +48,19 @@
|
|||||||
: t('filters.selected_none')"
|
: t('filters.selected_none')"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- Warning that many stats may not work -->
|
||||||
|
<div v-if="!statsVisibility.disabled && hasStats" class="mb-4 text-center bg-teal-800 rounded-xl" :class="(presets.length > 1) ? 'mt-1' : 'mt-4'" >
|
||||||
|
Not all stats may load (WIP)
|
||||||
|
</div>
|
||||||
|
<!-- Handled parse error -->
|
||||||
|
<div v-if="!hasStats && item.rarity !== undefined && item.rarity !== 'Normal'" class="mb-4 text-center bg-purple-800 rounded-xl" :class="(presets.length > 1) ? 'mt-1' : 'mt-4'" >
|
||||||
|
For some reason this item's stats did not parse. <br/> It likely has a mod that is not supported yet. <br/>(Potentially new or changed wording from poe1)
|
||||||
|
</div>
|
||||||
|
<!-- Warning that bulk exchange does not work -->
|
||||||
|
<div v-if="!hasStats && item.category === 'Currency'" class="mb-4 text-center bg-teal-900 rounded-xl" :class="(presets.length > 1) ? 'mt-1' : 'mt-4'" >
|
||||||
|
Bulk exchange rates are not implemented yet
|
||||||
|
</div>
|
||||||
|
|
||||||
<div v-if="!statsVisibility.disabled && hasStats" class="mb-4" :class="(presets.length > 1) ? 'mt-1' : 'mt-4'">
|
<div v-if="!statsVisibility.disabled && hasStats" class="mb-4" :class="(presets.length > 1) ? 'mt-1' : 'mt-4'">
|
||||||
<div class="flex" v-if="presets.length > 1">
|
<div class="flex" v-if="presets.length > 1">
|
||||||
<div class="w-5 border-b border-gray-700" />
|
<div class="w-5 border-b border-gray-700" />
|
||||||
@@ -134,6 +147,8 @@ export default defineComponent({
|
|||||||
statsVisibility.disabled = false
|
statsVisibility.disabled = false
|
||||||
})
|
})
|
||||||
|
|
||||||
|
console.log(props.item)
|
||||||
|
|
||||||
const showUnknownMods = computed(() =>
|
const showUnknownMods = computed(() =>
|
||||||
props.item.unknownModifiers.length &&
|
props.item.unknownModifiers.length &&
|
||||||
props.item.category !== ItemCategory.Sentinel &&
|
props.item.category !== ItemCategory.Sentinel &&
|
||||||
|
|||||||
@@ -116,7 +116,8 @@ export const INTERNAL_TRADE_IDS = [
|
|||||||
'item.elemental_dps',
|
'item.elemental_dps',
|
||||||
'item.crit',
|
'item.crit',
|
||||||
'item.aps',
|
'item.aps',
|
||||||
'item.has_empty_modifier'
|
'item.has_empty_modifier',
|
||||||
|
'item.spirit'
|
||||||
] as const
|
] as const
|
||||||
|
|
||||||
export type InternalTradeId = typeof INTERNAL_TRADE_IDS[number]
|
export type InternalTradeId = typeof INTERNAL_TRADE_IDS[number]
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<div class="flex items-center pb-4">
|
<div class="flex items-center pb-4">
|
||||||
<item-quick-price class="flex-1 text-base justify-center"
|
<item-quick-price class="flex-1 text-base justify-center"
|
||||||
:price="price"
|
:price="price"
|
||||||
:item-img="item.info.icon"
|
:item-img="item.info.icon === '%NOT_FOUND%' || item.info.icon === '' ? '/images/404.png' : item.info.icon"
|
||||||
:item-base="item.info"
|
:item-base="item.info"
|
||||||
approx
|
approx
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
:class="{ 'bg-gray-700': item.highlight }" class="rounded px-1">
|
:class="{ 'bg-gray-700': item.highlight }" class="rounded px-1">
|
||||||
<item-quick-price currency-text fraction class="text-base"
|
<item-quick-price currency-text fraction class="text-base"
|
||||||
:price="item.price"
|
:price="item.price"
|
||||||
:item-img="item.icon" />
|
:item-img="item.icon === '%NOT_FOUND%' || item.icon === '' ? '/images/404.png' : item.icon" />
|
||||||
<div class="text-left text-gray-600 mb-1 whitespace-nowrap overflow-hidden">{{ item.name }}</div>
|
<div class="text-left text-gray-600 mb-1 whitespace-nowrap overflow-hidden">{{ item.name }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
<div v-for="item in result.items" :key="item.name">
|
<div v-for="item in result.items" :key="item.name">
|
||||||
<item-quick-price currency-text fraction class="text-base"
|
<item-quick-price currency-text fraction class="text-base"
|
||||||
:price="item.price"
|
:price="item.price"
|
||||||
:item-img="item.icon" />
|
:item-img="item.icon === '%NOT_FOUND%' || item.icon === '' ? '/images/404.png' : item.icon" />
|
||||||
<div class="text-left text-gray-600 mb-1 whitespace-nowrap overflow-hidden">{{ item.name }}</div>
|
<div class="text-left text-gray-600 mb-1 whitespace-nowrap overflow-hidden">{{ item.name }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ export type TradeResponse<T> = (T & { error?: null }) | {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function apiToSatisfySearch (item: ParsedItem, stats: StatFilter[], filters: ItemFilters): 'trade' | 'bulk' {
|
export function apiToSatisfySearch (item: ParsedItem, stats: StatFilter[], filters: ItemFilters): 'trade' | 'bulk' {
|
||||||
|
console.log('item', item, 'filter', filters, 'stats', stats)
|
||||||
if (stats.some(s => !s.disabled)) {
|
if (stats.some(s => !s.disabled)) {
|
||||||
return 'trade'
|
return 'trade'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ItemInfluence, ItemCategory, ParsedItem, ItemRarity } from '@/parser'
|
import { ItemCategory, ParsedItem, ItemRarity } from '@/parser'
|
||||||
import {
|
import {
|
||||||
ItemFilters,
|
ItemFilters,
|
||||||
StatFilter,
|
StatFilter,
|
||||||
@@ -60,7 +60,11 @@ export const CATEGORY_TO_TRADE_ID = new Map([
|
|||||||
[ItemCategory.Trinket, 'accessory.trinket'],
|
[ItemCategory.Trinket, 'accessory.trinket'],
|
||||||
[ItemCategory.SanctumRelic, 'sanctum.relic'],
|
[ItemCategory.SanctumRelic, 'sanctum.relic'],
|
||||||
[ItemCategory.Tincture, 'tincture'],
|
[ItemCategory.Tincture, 'tincture'],
|
||||||
[ItemCategory.Charm, 'azmeri.charm']
|
[ItemCategory.Charm, 'azmeri.charm'],
|
||||||
|
[ItemCategory.Crossbow, 'weapon.crossbow'],
|
||||||
|
[ItemCategory.SkillGem, 'gem.activegem'],
|
||||||
|
[ItemCategory.SupportGem, 'gem.supportgem'],
|
||||||
|
[ItemCategory.MetaGem, 'gem.metagem']
|
||||||
])
|
])
|
||||||
|
|
||||||
const TOTAL_MODS_TEXT = {
|
const TOTAL_MODS_TEXT = {
|
||||||
@@ -77,14 +81,14 @@ const TOTAL_MODS_TEXT = {
|
|||||||
TOTAL_MODIFIERS: ['# Modifiers', '# Prefix Modifiers', '# Suffix Modifiers']
|
TOTAL_MODIFIERS: ['# Modifiers', '# Prefix Modifiers', '# Suffix Modifiers']
|
||||||
}
|
}
|
||||||
|
|
||||||
const INFLUENCE_PSEUDO_TEXT = {
|
// const INFLUENCE_PSEUDO_TEXT = {
|
||||||
[ItemInfluence.Shaper]: 'Has Shaper Influence',
|
// [ItemInfluence.Shaper]: 'Has Shaper Influence',
|
||||||
[ItemInfluence.Crusader]: 'Has Crusader Influence',
|
// [ItemInfluence.Crusader]: 'Has Crusader Influence',
|
||||||
[ItemInfluence.Hunter]: 'Has Hunter Influence',
|
// [ItemInfluence.Hunter]: 'Has Hunter Influence',
|
||||||
[ItemInfluence.Elder]: 'Has Elder Influence',
|
// [ItemInfluence.Elder]: 'Has Elder Influence',
|
||||||
[ItemInfluence.Redeemer]: 'Has Redeemer Influence',
|
// [ItemInfluence.Redeemer]: 'Has Redeemer Influence',
|
||||||
[ItemInfluence.Warlord]: 'Has Warlord Influence'
|
// [ItemInfluence.Warlord]: 'Has Warlord Influence'
|
||||||
}
|
// }
|
||||||
|
|
||||||
interface FilterBoolean {
|
interface FilterBoolean {
|
||||||
option?: 'true' | 'false'
|
option?: 'true' | 'false'
|
||||||
@@ -123,72 +127,64 @@ interface TradeRequest {
|
|||||||
category?: {
|
category?: {
|
||||||
option?: string
|
option?: string
|
||||||
}
|
}
|
||||||
|
ilvl?: FilterRange
|
||||||
|
quality?: FilterRange
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
socket_filters?: {
|
equipment_filters?: {
|
||||||
filters: {
|
filters: {
|
||||||
links?: FilterRange
|
// Attacks per Second
|
||||||
sockets?: {
|
aps?: FilterRange
|
||||||
w?: number
|
// Armor Rating
|
||||||
}
|
ar?: FilterRange
|
||||||
|
// Block
|
||||||
|
block?: FilterRange
|
||||||
|
// Critical Strike Chance
|
||||||
|
crit?: FilterRange
|
||||||
|
// Damage (not used)
|
||||||
|
// damage?: FilterRange
|
||||||
|
// Damage per Second
|
||||||
|
dps?: FilterRange
|
||||||
|
// Elemental Damage per Second
|
||||||
|
edps?: FilterRange
|
||||||
|
// Energy Shield
|
||||||
|
es?: FilterRange
|
||||||
|
// Evasion Rating
|
||||||
|
ev?: FilterRange
|
||||||
|
// Physical Damage per Second
|
||||||
|
pdps?: FilterRange
|
||||||
|
// Rune Slots
|
||||||
|
rune_sockets?: FilterRange
|
||||||
|
// Spirit
|
||||||
|
spirit?: FilterRange
|
||||||
|
}
|
||||||
|
}
|
||||||
|
req_filters?: {
|
||||||
|
filters: {
|
||||||
|
dex?: FilterRange
|
||||||
|
int?: FilterRange
|
||||||
|
lvl?: FilterRange
|
||||||
|
str?: FilterRange
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// WILL PROBABLY BE REMOVED SOON
|
||||||
|
map_filters?: {
|
||||||
|
filters: {
|
||||||
|
map_bonus?: FilterRange
|
||||||
|
map_tier?: FilterRange
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
misc_filters?: {
|
misc_filters?: {
|
||||||
filters: {
|
filters: {
|
||||||
ilvl?: FilterRange
|
alternate_art?: FilterBoolean
|
||||||
quality?: FilterRange
|
|
||||||
gem_level?: FilterRange
|
|
||||||
corrupted?: FilterBoolean
|
|
||||||
fractured_item?: FilterBoolean
|
|
||||||
mirrored?: FilterBoolean
|
|
||||||
identified?: FilterBoolean
|
|
||||||
stack_size?: FilterRange
|
|
||||||
}
|
|
||||||
}
|
|
||||||
armour_filters?: {
|
|
||||||
filters: {
|
|
||||||
ar?: FilterRange
|
|
||||||
es?: FilterRange
|
|
||||||
ev?: FilterRange
|
|
||||||
ward?: FilterRange
|
|
||||||
block?: FilterRange
|
|
||||||
base_defence_percentile?: FilterRange
|
|
||||||
}
|
|
||||||
}
|
|
||||||
weapon_filters?: {
|
|
||||||
filters: {
|
|
||||||
dps?: FilterRange
|
|
||||||
pdps?: FilterRange
|
|
||||||
edps?: FilterRange
|
|
||||||
crit?: FilterRange
|
|
||||||
aps?: FilterRange
|
|
||||||
}
|
|
||||||
}
|
|
||||||
map_filters?: {
|
|
||||||
filters: {
|
|
||||||
map_tier?: FilterRange
|
|
||||||
map_blighted?: FilterBoolean
|
|
||||||
map_uberblighted?: FilterBoolean
|
|
||||||
area_level?: FilterRange
|
area_level?: FilterRange
|
||||||
}
|
corrupted?: FilterBoolean
|
||||||
}
|
gem_level?: FilterRange
|
||||||
heist_filters?: {
|
gem_sockets?: FilterRange
|
||||||
filters: {
|
identified?: FilterBoolean
|
||||||
heist_wings?: FilterRange
|
mirrored?: FilterBoolean
|
||||||
heist_agility?: FilterRange
|
sanctum_gold?: FilterRange
|
||||||
heist_brute_force?: FilterRange
|
unidentified_tier?: FilterRange
|
||||||
heist_counter_thaumaturgy?: FilterRange
|
|
||||||
heist_deception?: FilterRange
|
|
||||||
heist_demolition?: FilterRange
|
|
||||||
heist_engineering?: FilterRange
|
|
||||||
heist_lockpicking?: FilterRange
|
|
||||||
heist_perception?: FilterRange
|
|
||||||
heist_trap_disarmament?: FilterRange
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sentinel_filters?: {
|
|
||||||
filters: {
|
|
||||||
sentinel_durability?: FilterRange
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
trade_filters?: {
|
trade_filters?: {
|
||||||
@@ -320,6 +316,16 @@ export function createTradeRequest (
|
|||||||
query.type = nameToQuery(activeSearch.baseType, filters)
|
query.type = nameToQuery(activeSearch.baseType, filters)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TYPE FILTERS
|
||||||
|
if (activeSearch.category) {
|
||||||
|
const id = CATEGORY_TO_TRADE_ID.get(activeSearch.category)
|
||||||
|
if (id) {
|
||||||
|
propSet(query.filters, 'type_filters.filters.category.option', id)
|
||||||
|
} else {
|
||||||
|
throw new Error(`Invalid category: ${activeSearch.category}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (filters.foil && !filters.foil.disabled) {
|
if (filters.foil && !filters.foil.disabled) {
|
||||||
propSet(query.filters, 'type_filters.filters.rarity.option', 'uniquefoil')
|
propSet(query.filters, 'type_filters.filters.rarity.option', 'uniquefoil')
|
||||||
} else if (filters.rarity) {
|
} else if (filters.rarity) {
|
||||||
@@ -330,15 +336,65 @@ export function createTradeRequest (
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (activeSearch.category) {
|
if (filters.itemLevel && !filters.itemLevel.disabled) {
|
||||||
const id = CATEGORY_TO_TRADE_ID.get(activeSearch.category)
|
propSet(
|
||||||
if (id) {
|
query.filters,
|
||||||
propSet(query.filters, 'type_filters.filters.category.option', id)
|
'type_filters.filters.ilvl.min',
|
||||||
} else {
|
filters.itemLevel.value
|
||||||
throw new Error(`Invalid category: ${activeSearch.category}`)
|
)
|
||||||
|
if (filters.itemLevel.max) {
|
||||||
|
propSet(
|
||||||
|
query.filters,
|
||||||
|
'type_filters.filters.ilvl.max',
|
||||||
|
filters.itemLevel.max
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (filters.quality && !filters.quality.disabled) {
|
||||||
|
propSet(
|
||||||
|
query.filters,
|
||||||
|
'type_filters.filters.quality.min',
|
||||||
|
filters.quality.value
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EQUIPMENT FILTERS
|
||||||
|
|
||||||
|
// REQ FILTERS
|
||||||
|
|
||||||
|
// MAP (WAYSTONE) FILTERS
|
||||||
|
|
||||||
|
if (filters.mapTier && !filters.mapTier.disabled) {
|
||||||
|
propSet(
|
||||||
|
query.filters,
|
||||||
|
'map_filters.filters.map_tier.min',
|
||||||
|
filters.mapTier.value
|
||||||
|
)
|
||||||
|
propSet(
|
||||||
|
query.filters,
|
||||||
|
'map_filters.filters.map_tier.max',
|
||||||
|
filters.mapTier.value
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MISC FILTERS
|
||||||
|
if (filters.gemLevel && !filters.gemLevel.disabled) {
|
||||||
|
propSet(
|
||||||
|
query.filters,
|
||||||
|
'misc_filters.filters.gem_level.min',
|
||||||
|
filters.gemLevel.value
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filters.unidentified && !filters.unidentified.disabled) {
|
||||||
|
propSet(
|
||||||
|
query.filters,
|
||||||
|
'misc_filters.filters.identified.option',
|
||||||
|
String(false)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (filters.corrupted?.value === false || filters.corrupted?.exact) {
|
if (filters.corrupted?.value === false || filters.corrupted?.exact) {
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
@@ -346,13 +402,7 @@ export function createTradeRequest (
|
|||||||
String(filters.corrupted.value)
|
String(filters.corrupted.value)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (filters.fractured?.value === false) {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'misc_filters.filters.fractured_item.option',
|
|
||||||
String(false)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
if (filters.mirrored) {
|
if (filters.mirrored) {
|
||||||
if (filters.mirrored.disabled) {
|
if (filters.mirrored.disabled) {
|
||||||
propSet(
|
propSet(
|
||||||
@@ -373,121 +423,9 @@ export function createTradeRequest (
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filters.gemLevel && !filters.gemLevel.disabled) {
|
// TRADE FILTERS
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'misc_filters.filters.gem_level.min',
|
|
||||||
filters.gemLevel.value
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.quality && !filters.quality.disabled) {
|
// BREAK ==============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'misc_filters.filters.quality.min',
|
|
||||||
filters.quality.value
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.itemLevel && !filters.itemLevel.disabled) {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'misc_filters.filters.ilvl.min',
|
|
||||||
filters.itemLevel.value
|
|
||||||
)
|
|
||||||
if (filters.itemLevel.max) {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'misc_filters.filters.ilvl.max',
|
|
||||||
filters.itemLevel.max
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.stackSize && !filters.stackSize.disabled) {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'misc_filters.filters.stack_size.min',
|
|
||||||
filters.stackSize.value
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.linkedSockets && !filters.linkedSockets.disabled) {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'socket_filters.filters.links.min',
|
|
||||||
filters.linkedSockets.value
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.whiteSockets && !filters.whiteSockets.disabled) {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'socket_filters.filters.sockets.w',
|
|
||||||
filters.whiteSockets.value
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.mapTier && !filters.mapTier.disabled) {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'map_filters.filters.map_tier.min',
|
|
||||||
filters.mapTier.value
|
|
||||||
)
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'map_filters.filters.map_tier.max',
|
|
||||||
filters.mapTier.value
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.mapBlighted) {
|
|
||||||
if (filters.mapBlighted.value === 'Blighted') {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'map_filters.filters.map_blighted.option',
|
|
||||||
String(true)
|
|
||||||
)
|
|
||||||
} else if (filters.mapBlighted.value === 'Blight-ravaged') {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'map_filters.filters.map_uberblighted.option',
|
|
||||||
String(true)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.unidentified && !filters.unidentified.disabled) {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'misc_filters.filters.identified.option',
|
|
||||||
String(false)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.areaLevel && !filters.areaLevel.disabled) {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'map_filters.filters.area_level.min',
|
|
||||||
filters.areaLevel.value
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.heistWingsRevealed && !filters.heistWingsRevealed.disabled) {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'heist_filters.filters.heist_wings.min',
|
|
||||||
filters.heistWingsRevealed.value
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.sentinelCharge && !filters.sentinelCharge.disabled) {
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'sentinel_filters.filters.sentinel_durability.min',
|
|
||||||
filters.sentinelCharge.value
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const stat of stats) {
|
for (const stat of stats) {
|
||||||
if (stat.tradeId[0] === 'item.has_empty_modifier') {
|
if (stat.tradeId[0] === 'item.has_empty_modifier') {
|
||||||
@@ -557,135 +495,135 @@ export function createTradeRequest (
|
|||||||
|
|
||||||
const input = stat.roll!
|
const input = stat.roll!
|
||||||
switch (stat.tradeId[0] as InternalTradeId) {
|
switch (stat.tradeId[0] as InternalTradeId) {
|
||||||
case 'item.base_percentile':
|
// case 'item.base_percentile':
|
||||||
propSet(
|
// propSet(
|
||||||
query.filters,
|
// query.filters,
|
||||||
'armour_filters.filters.base_defence_percentile.min',
|
// 'equipment_filters.filters.base_defence_percentile.min',
|
||||||
typeof input.min === 'number' ? input.min : undefined
|
// typeof input.min === 'number' ? input.min : undefined
|
||||||
)
|
// )
|
||||||
propSet(
|
// propSet(
|
||||||
query.filters,
|
// query.filters,
|
||||||
'armour_filters.filters.base_defence_percentile.max',
|
// 'equipment_filters.filters.base_defence_percentile.max',
|
||||||
typeof input.max === 'number' ? input.max : undefined
|
// typeof input.max === 'number' ? input.max : undefined
|
||||||
)
|
// )
|
||||||
break
|
// break
|
||||||
case 'item.armour':
|
case 'item.armour':
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'armour_filters.filters.ar.min',
|
'equipment_filters.filters.ar.min',
|
||||||
typeof input.min === 'number' ? input.min : undefined
|
typeof input.min === 'number' ? input.min : undefined
|
||||||
)
|
)
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'armour_filters.filters.ar.max',
|
'equipment_filters.filters.ar.max',
|
||||||
typeof input.max === 'number' ? input.max : undefined
|
typeof input.max === 'number' ? input.max : undefined
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
case 'item.evasion_rating':
|
case 'item.evasion_rating':
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'armour_filters.filters.ev.min',
|
'equipment_filters.filters.ev.min',
|
||||||
typeof input.min === 'number' ? input.min : undefined
|
typeof input.min === 'number' ? input.min : undefined
|
||||||
)
|
)
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'armour_filters.filters.ev.max',
|
'equipment_filters.filters.ev.max',
|
||||||
typeof input.max === 'number' ? input.max : undefined
|
typeof input.max === 'number' ? input.max : undefined
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
case 'item.energy_shield':
|
case 'item.energy_shield':
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'armour_filters.filters.es.min',
|
'equipment_filters.filters.es.min',
|
||||||
typeof input.min === 'number' ? input.min : undefined
|
typeof input.min === 'number' ? input.min : undefined
|
||||||
)
|
)
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'armour_filters.filters.es.max',
|
'equipment_filters.filters.es.max',
|
||||||
typeof input.max === 'number' ? input.max : undefined
|
|
||||||
)
|
|
||||||
break
|
|
||||||
case 'item.ward':
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'armour_filters.filters.ward.min',
|
|
||||||
typeof input.min === 'number' ? input.min : undefined
|
|
||||||
)
|
|
||||||
propSet(
|
|
||||||
query.filters,
|
|
||||||
'armour_filters.filters.ward.max',
|
|
||||||
typeof input.max === 'number' ? input.max : undefined
|
typeof input.max === 'number' ? input.max : undefined
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
case 'item.block':
|
case 'item.block':
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'armour_filters.filters.block.min',
|
'equipment_filters.filters.block.min',
|
||||||
typeof input.min === 'number' ? input.min : undefined
|
typeof input.min === 'number' ? input.min : undefined
|
||||||
)
|
)
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'armour_filters.filters.block.max',
|
'equipment_filters.filters.block.max',
|
||||||
typeof input.max === 'number' ? input.max : undefined
|
typeof input.max === 'number' ? input.max : undefined
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
case 'item.total_dps':
|
case 'item.total_dps':
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'weapon_filters.filters.dps.min',
|
'equipment_filters.filters.dps.min',
|
||||||
typeof input.min === 'number' ? input.min : undefined
|
typeof input.min === 'number' ? input.min : undefined
|
||||||
)
|
)
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'weapon_filters.filters.dps.max',
|
'equipment_filters.filters.dps.max',
|
||||||
typeof input.max === 'number' ? input.max : undefined
|
typeof input.max === 'number' ? input.max : undefined
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
case 'item.physical_dps':
|
case 'item.physical_dps':
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'weapon_filters.filters.pdps.min',
|
'equipment_filters.filters.pdps.min',
|
||||||
typeof input.min === 'number' ? input.min : undefined
|
typeof input.min === 'number' ? input.min : undefined
|
||||||
)
|
)
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'weapon_filters.filters.pdps.max',
|
'equipment_filters.filters.pdps.max',
|
||||||
typeof input.max === 'number' ? input.max : undefined
|
typeof input.max === 'number' ? input.max : undefined
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
case 'item.elemental_dps':
|
case 'item.elemental_dps':
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'weapon_filters.filters.edps.min',
|
'equipment_filters.filters.edps.min',
|
||||||
typeof input.min === 'number' ? input.min : undefined
|
typeof input.min === 'number' ? input.min : undefined
|
||||||
)
|
)
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'weapon_filters.filters.edps.max',
|
'equipment_filters.filters.edps.max',
|
||||||
typeof input.max === 'number' ? input.max : undefined
|
typeof input.max === 'number' ? input.max : undefined
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
case 'item.crit':
|
case 'item.crit':
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'weapon_filters.filters.crit.min',
|
'equipment_filters.filters.crit.min',
|
||||||
typeof input.min === 'number' ? input.min : undefined
|
typeof input.min === 'number' ? input.min : undefined
|
||||||
)
|
)
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'weapon_filters.filters.crit.max',
|
'equipment_filters.filters.crit.max',
|
||||||
typeof input.max === 'number' ? input.max : undefined
|
typeof input.max === 'number' ? input.max : undefined
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
case 'item.aps':
|
case 'item.aps':
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'weapon_filters.filters.aps.min',
|
'equipment_filters.filters.aps.min',
|
||||||
typeof input.min === 'number' ? input.min : undefined
|
typeof input.min === 'number' ? input.min : undefined
|
||||||
)
|
)
|
||||||
propSet(
|
propSet(
|
||||||
query.filters,
|
query.filters,
|
||||||
'weapon_filters.filters.aps.max',
|
'equipment_filters.filters.aps.max',
|
||||||
|
typeof input.max === 'number' ? input.max : undefined
|
||||||
|
)
|
||||||
|
break
|
||||||
|
case 'item.spirit':
|
||||||
|
propSet(
|
||||||
|
query.filters,
|
||||||
|
'equipment_filters.filters.spirit.min',
|
||||||
|
typeof input.min === 'number' ? input.min : undefined
|
||||||
|
)
|
||||||
|
propSet(
|
||||||
|
query.filters,
|
||||||
|
'equipment_filters.filters.spirit.max',
|
||||||
typeof input.max === 'number' ? input.max : undefined
|
typeof input.max === 'number' ? input.max : undefined
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
@@ -695,33 +633,33 @@ export function createTradeRequest (
|
|||||||
stats = stats.filter(
|
stats = stats.filter(
|
||||||
(stat) => !INTERNAL_TRADE_IDS.includes(stat.tradeId[0] as any)
|
(stat) => !INTERNAL_TRADE_IDS.includes(stat.tradeId[0] as any)
|
||||||
)
|
)
|
||||||
if (filters.veiled) {
|
// if (filters.veiled) {
|
||||||
for (const statRef of filters.veiled.statRefs) {
|
// for (const statRef of filters.veiled.statRefs) {
|
||||||
stats.push({
|
// stats.push({
|
||||||
disabled: filters.veiled.disabled,
|
// disabled: filters.veiled.disabled,
|
||||||
statRef: undefined!,
|
// statRef: undefined!,
|
||||||
text: undefined!,
|
// text: undefined!,
|
||||||
tag: undefined!,
|
// tag: undefined!,
|
||||||
sources: undefined!,
|
// sources: undefined!,
|
||||||
tradeId: STAT_BY_REF(statRef)!.trade.ids[ModifierType.Veiled]
|
// tradeId: STAT_BY_REF(statRef)!.trade.ids[ModifierType.Veiled]
|
||||||
})
|
// })
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (filters.influences) {
|
// if (filters.influences) {
|
||||||
for (const influence of filters.influences) {
|
// for (const influence of filters.influences) {
|
||||||
stats.push({
|
// stats.push({
|
||||||
disabled: influence.disabled,
|
// disabled: influence.disabled,
|
||||||
statRef: undefined!,
|
// statRef: undefined!,
|
||||||
text: undefined!,
|
// text: undefined!,
|
||||||
tag: undefined!,
|
// tag: undefined!,
|
||||||
sources: undefined!,
|
// sources: undefined!,
|
||||||
tradeId: STAT_BY_REF(INFLUENCE_PSEUDO_TEXT[influence.value])!.trade.ids[
|
// tradeId: STAT_BY_REF(INFLUENCE_PSEUDO_TEXT[influence.value])!.trade.ids[
|
||||||
ModifierType.Pseudo
|
// ModifierType.Pseudo
|
||||||
]
|
// ]
|
||||||
})
|
// })
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
const qAnd = query.stats[0]
|
const qAnd = query.stats[0]
|
||||||
for (const stat of stats) {
|
for (const stat of stats) {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<item-quick-price class="flex-1 text-base justify-center"
|
<item-quick-price class="flex-1 text-base justify-center"
|
||||||
:price="trend.price"
|
:price="trend.price"
|
||||||
:fraction="filters.stackSize != null"
|
:fraction="filters.stackSize != null"
|
||||||
:item-img="item.info.icon"
|
:item-img="item.info.icon === '%NOT_FOUND%' || item.info.icon === '' ? '/images/404.png' : item.info.icon"
|
||||||
:item-base="item.info"
|
:item-base="item.info"
|
||||||
>
|
>
|
||||||
<template #item v-if="isValuableBasetype">
|
<template #item v-if="isValuableBasetype">
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
<div v-else-if="!item.info.craftable" class="flex items-center pb-4" style="min-height: 3rem;">
|
<div v-else-if="!item.info.craftable" class="flex items-center pb-4" style="min-height: 3rem;">
|
||||||
<item-quick-price class="flex-1 text-base justify-center"
|
<item-quick-price class="flex-1 text-base justify-center"
|
||||||
currency-text
|
currency-text
|
||||||
:item-img="item.info.icon"
|
:item-img="item.info.icon === '%NOT_FOUND%' || item.info.icon === '' ? '/images/404.png' : item.info.icon"
|
||||||
:item-base="item.info" />
|
:item-base="item.info" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<div class="grid grid-cols-2 gap-2 overflow-auto pb-4 px-4">
|
<div class="grid grid-cols-2 gap-2 overflow-auto pb-4 px-4">
|
||||||
<div v-for="item in identifiedVariants" :key="item.name" class="flex">
|
<div v-for="item in identifiedVariants" :key="item.name" class="flex">
|
||||||
<button @click="select(item)" class="bg-gray-700 rounded flex gap-x-3 items-center p-2 w-full">
|
<button @click="select(item)" class="bg-gray-700 rounded flex gap-x-3 items-center p-2 w-full">
|
||||||
<img :src="item.icon" class="w-12" />
|
<img :src="item.icon === '%NOT_FOUND%' || item.icon === '' ? '/images/404.png' : item.icon" class="w-12" />
|
||||||
<div class="leading-tight text-left">{{ item.name }}</div>
|
<div class="leading-tight text-left">{{ item.name }}</div>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user