app-config-gateway.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { get } from '@/core/http/http-client'
  2. import { STORAGE } from '@/core/constants/storage-keys'
  3. import appSettings from '@/core/config/app-settings'
  4. const ROUTE_APP_CONFIG = '/wanlshop/common/getAppConfig'
  5. const ROUTE_APP_LOGO = '/wanlshop/common/getAppLogo'
  6. /** @param {unknown} raw */
  7. export function unwrapAppConfigPayload(raw) {
  8. if (!raw || typeof raw !== 'object') return null
  9. if (raw.appConfig && typeof raw.appConfig === 'object') return raw.appConfig
  10. if (raw.data && typeof raw.data === 'object') {
  11. if (raw.data.appConfig && typeof raw.data.appConfig === 'object') {
  12. return raw.data.appConfig
  13. }
  14. return raw.data
  15. }
  16. return raw
  17. }
  18. export function resolveRequestLocale() {
  19. const saved = uni.getStorageSync(STORAGE.language)
  20. let locale = saved || uni.getLocale() || 'zh-Hant'
  21. if (locale === 'auto') locale = uni.getLocale() || 'zh-Hant'
  22. return String(locale).trim() || 'zh-Hant'
  23. }
  24. /**
  25. * @param {{ lang?: string, version?: string }} [opts]
  26. */
  27. export async function fetchAppConfig(opts = {}) {
  28. const lang = opts.lang || resolveRequestLocale()
  29. const version = opts.version || appSettings.versionName || ''
  30. const { data, raw } = await get(ROUTE_APP_CONFIG, { lang, version })
  31. const cfg = unwrapAppConfigPayload(data != null ? data : raw)
  32. return cfg && typeof cfg === 'object' ? cfg : null
  33. }
  34. export function readCachedAppConfig() {
  35. try {
  36. const cached = uni.getStorageSync(STORAGE.appConfig)
  37. return cached && typeof cached === 'object' ? cached : null
  38. } catch (_) {
  39. return null
  40. }
  41. }
  42. export function persistAppConfig(config) {
  43. if (!config || typeof config !== 'object') return
  44. uni.setStorageSync(STORAGE.appConfig, config)
  45. }
  46. /** @returns {Promise<{ logo: string, name: string, email: string }>} */
  47. export async function fetchAppBrand() {
  48. const { data, raw } = await get(ROUTE_APP_LOGO)
  49. const payload = unwrapAppConfigPayload(data != null ? data : raw)
  50. if (!payload || typeof payload !== 'object') {
  51. return { logo: '', name: '', email: '' }
  52. }
  53. return {
  54. logo: String(payload.logo || '').trim(),
  55. name: String(payload.name || '').trim(),
  56. email: String(payload.email || payload.mail || '').trim()
  57. }
  58. }
  59. /** @returns {Promise<string>} 相对路径,如 /uploads/xxx.png */
  60. export async function fetchAppLogo() {
  61. const brand = await fetchAppBrand()
  62. return brand.logo
  63. }