import { defineStore } from "pinia"; import type { Data, LookupActionInfo } from "../../types/basic"; import { Cache, md5 } from "fastball-mobile-common"; import { loadLookupAction } from "../api/component"; const LOOKUP_DATA_STORE_KEY = 'lookupData'; interface LookupMapping { [key: string | number]: Data } interface LookupDisplayMapping { [key: string | number]: any } interface LookupData { items?: Data[] mappings?: LookupMapping lookupMappings?: LookupDisplayMapping } interface LookupCache { lookupData?: LookupData loadingPromise?: Promise } export const lookupStore = defineStore(LOOKUP_DATA_STORE_KEY, () => { const cache = new Cache() const getLookupData = async (actionInfo: LookupActionInfo, data?: Data) => { const cacheKey = actionInfo.lookupKey + (data ? md5(data) : '') let lookupResult = cache.get(cacheKey) if (lookupResult) { if (lookupResult.loadingPromise) { return lookupResult.loadingPromise } return lookupResult.lookupData } const loadingPromise = loadLookupAction(actionInfo, data) .then(items => { const mappings: LookupMapping = {} const lookupMappings: LookupDisplayMapping = {} items.map(item => { const value = item[actionInfo.valueField] as string | number const display = item[actionInfo.labelField] if (value) { mappings[value] = item lookupMappings[value] = display } }) const lookupData: LookupData = { items, mappings, lookupMappings } lookupResult = { lookupData } cache.set(cacheKey, lookupResult, 5) return lookupData }) .catch(err => { cache.remove(cacheKey) throw err }) lookupResult = { loadingPromise } cache.set(cacheKey, lookupResult, 5) return loadingPromise } return { getLookupData } })