Add an appraisal compare-by-location page #17
Notifications
Due Date
No due date set.
Blocks
Depends on
You do not have permission to read 2 dependencies
Reference: eveal/gemory#17
Reference in New Issue
Block a user
Summary
Add a page that appraises the same items across multiple market locations side by side, so you can compare what a pile is worth at several stations at once. Locations are chosen by the user via a search-backed select (mammon's universe location search), not a fixed trade-hub list.
Flow: parse once, then appraise per location
Rather than posting the raw text to a paste-appraisal endpoint once per location, gemory should:
POST /market/types/paste(parseStacks, mammon #40) → a list ofmarketTypeId+quantitystacks.findTypes/getMarketTypes(already cached insrc/market/type/MarketType.ts) — gives name,volume, etc.GET /market/prices?types=…&locationId=…(currentPrices, mammon #38), one call per selected location.Why parse client-side first (not one paste-appraise per location):
Location selection: search-backed, not a hardcoded hub list
Do not ship a fixed Jita/Amarr/Dodixie/Rens/Hek enum. The user picks the locations to compare through a search select backed by mammon's universe location search (mammon #41), which is already exposed on the generated client:
searchLocations(name, limit?)→GET /universe/locations— type-ahead search returningMarketLocationResponse(id= station/market-location id,name,systemName,regionName, …). Feeds the select's options as the user types.resolveLocation(id)→ resolve a single location by id (e.g. to rehydrate a selection).UI: a multi-select of locations where each entry is added via a debounced search input hitting
searchLocations. The selected locations become the compare columns. TheidfromMarketLocationResponseis exactly thelocationIdcurrentPrices/pastePricesexpect — no id-shape translation needed (that was the whole point of resolving via universe rather than mapping region ids by hand).An empty selection can default to Jita (mammon defaults to Jita when
locationIdis omitted), but there is no baked-in hub list beyond that fallback.Proposed design
/market(e.g./market/appraisal/compare) +routeNamesentry, or a tab on the base appraisal page (gemory #16).useAppraisalStore(itsRegionalMarketCacheis per-location, keyed bylocationId) so re-comparing the same locations doesn't re-fetch.Watch out: location representation
mammon's
locationIdis a station/market-location id (e.g. Jita 4-4 =60003760), which is exactly whatMarketLocationResponse.idfromsearchLocationsreturns — so the search-backed select hands the right id straight through. The store must be location-keyed (bylocationId), not region-keyed; the earlierjitaId = 10000002(The Forge region) key was a mismatch and should be dropped.Acceptance criteria
/market/types/paste), then appraises the structured type list per selected location (locationId).searchLocations(/universe/locations) — no hardcoded hub list.locationId(station id), not region id.npm run buildpasses.Depends on
mammon #40 (
/market/types/paste) + #38 (per-location pricing) + #41 (universe location search) + the client regen (gemory #15). Base appraisal page (gemory #16) optional if this is a standalone route.