labelMultipleOption.ts 1.58 KB
import { unwrapApiPayload, usAppApiRequest } from '../utils/usAppApiRequest'
import { fetchWithOfflineCache } from '../utils/sqliteSync'

function parseOptionValuesJson(raw: unknown): string[] {
  if (raw == null) return []
  if (Array.isArray(raw)) return raw.map((x) => String(x))
  if (typeof raw === 'string') {
    const t = raw.trim()
    if (!t) return []
    try {
      const p = JSON.parse(t) as unknown
      if (Array.isArray(p)) return p.map((x) => String(x))
    } catch {
      return []
    }
  }
  return []
}

export type LabelMultipleOptionDetail = {
  id: string
  optionName: string
  optionCode: string
  optionValuesJson: string[]
}

/**
 * GET /api/app/label-multiple-option/{id}(与 Web 管理端一致)
 */
export async function fetchLabelMultipleOptionById(id: string): Promise<LabelMultipleOptionDetail | null> {
  const tid = String(id ?? '').trim()
  if (!tid) return null
  return fetchWithOfflineCache('labeling', `multiple-option:${tid}`, async () => {
    const raw = await usAppApiRequest<unknown>({
      path: `/api/app/label-multiple-option/${encodeURIComponent(tid)}`,
      method: 'GET',
      auth: true,
    })
    const d = unwrapApiPayload(raw) as Record<string, unknown>
    if (!d || typeof d !== 'object') return null
    const oid = String(d.id ?? d.Id ?? tid)
    const optionValuesJson = parseOptionValuesJson(d.optionValuesJson ?? d.OptionValuesJson)
    return {
      id: oid,
      optionName: String(d.optionName ?? d.OptionName ?? '').trim() || oid,
      optionCode: String(d.optionCode ?? d.OptionCode ?? '').trim(),
      optionValuesJson,
    }
  })
}