locationSupportService.ts 3.94 KB
import { ApiError, createApiClient } from "../lib/apiClient";
import type {
  LocationSupportCreateInput,
  LocationSupportDto,
  LocationSupportUpdateInput,
} from "../types/locationSupport";

const api = createApiClient({
  getToken: () => {
    try {
      return localStorage.getItem("access_token") ?? localStorage.getItem("token") ?? null;
    } catch {
      return null;
    }
  },
});

function normalizeSupportGetPayload(raw: unknown): LocationSupportDto | null {
  if (raw == null) return null;
  if (typeof raw !== "object") return null;
  const o = raw as Record<string, unknown>;
  const id = o.id != null ? String(o.id).trim() : "";
  const supportPhone = String(o.supportPhone ?? "").trim();
  const supportEmail = String(o.supportEmail ?? "").trim();
  if (!id && !supportPhone && !supportEmail) return null;
  return {
    id,
    locationId: o.locationId != null ? String(o.locationId) : null,
    locationName: o.locationName != null ? String(o.locationName) : null,
    supportPhone,
    supportEmail,
  };
}

export async function getLocationSupportByLocationId(
  locationId: string,
  signal?: AbortSignal,
): Promise<LocationSupportDto | null> {
  const id = (locationId ?? "").trim();
  if (!id) return null;
  return api.requestJson<LocationSupportDto | null>({
    path: "/location-support/by-location-id",
    method: "GET",
    query: { locationId: id },
    signal,
  });
}

function normalizeFirstSupportRecord(raw: unknown): LocationSupportDto | null {
  if (!raw) return null;
  if (Array.isArray(raw)) {
    const first = raw[0] as LocationSupportDto | undefined;
    return first ?? null;
  }
  if (typeof raw === "object") {
    const o = raw as Record<string, unknown>;
    if (Array.isArray(o.items)) {
      const first = o.items[0] as LocationSupportDto | undefined;
      return first ?? null;
    }
    if ("supportPhone" in o || "supportEmail" in o) {
      return o as LocationSupportDto;
    }
  }
  return null;
}

/** 兼容旧分页列表拉首条(若后端仍提供列表接口) */
export async function getGlobalLocationSupportFromList(signal?: AbortSignal): Promise<LocationSupportDto | null> {
  const raw = await api.requestJson<unknown>({
    path: "/location-support",
    method: "GET",
    query: {
      SkipCount: 1,
      MaxResultCount: 1,
    },
    signal,
  });
  return normalizeFirstSupportRecord(raw);
}

/**
 * 接口 6:全局 Support(GET `/api/app/location-support/support`)
 * 若路由未部署(404),回退到列表首条。
 */
export async function getGlobalLocationSupport(signal?: AbortSignal): Promise<LocationSupportDto | null> {
  try {
    const raw = await api.requestJson<unknown>({
      path: "/location-support/support",
      method: "GET",
      signal,
    });
    return normalizeSupportGetPayload(raw);
  } catch (e) {
    if (e instanceof ApiError && e.status === 404) {
      try {
        return await getGlobalLocationSupportFromList(signal);
      } catch (e2) {
        if (e2 instanceof ApiError && e2.status === 404) return null;
        throw e2;
      }
    }
    throw e;
  }
}

export async function createLocationSupport(input: LocationSupportCreateInput): Promise<LocationSupportDto> {
  const saved = await api.requestJson<unknown>({
    path: "/location-support",
    method: "POST",
    body: {
      supportPhone: input.supportPhone,
      supportEmail: input.supportEmail,
    },
  });
  const normalized = normalizeSupportGetPayload(saved);
  if (normalized) return normalized;
  return saved as LocationSupportDto;
}

export async function updateLocationSupport(
  id: string,
  input: LocationSupportUpdateInput,
): Promise<LocationSupportDto> {
  const saved = await api.requestJson<unknown>({
    path: `/location-support/${encodeURIComponent(id)}`,
    method: "PUT",
    body: {
      supportPhone: input.supportPhone,
      supportEmail: input.supportEmail,
    },
  });
  const normalized = normalizeSupportGetPayload(saved);
  if (normalized) return normalized;
  return saved as LocationSupportDto;
}