labelCategoryService.ts 4.67 KB
import { createApiClient } from "../lib/apiClient";
import { serializeButtonAppearanceForApi } from "../lib/categoryButtonAppearance";
import type {
  LabelCategoryCreateInput,
  LabelCategoryDto,
  LabelCategoryGetListInput,
  LabelCategoryUpdateInput,
  PagedResultDto,
} from "../types/labelCategory";

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

const PATH = "/label-category";

function normalizeLabelCategoryDto(raw: unknown): LabelCategoryDto {
  const r = (raw && typeof raw === "object" ? raw : {}) as Record<string, unknown>;
  const noRaw = r.noOfLabels ?? r.NoOfLabels;
  const noOfLabels =
    typeof noRaw === "number" && Number.isFinite(noRaw)
      ? noRaw
      : typeof noRaw === "string" && noRaw.trim() !== "" && Number.isFinite(Number(noRaw))
        ? Number(noRaw)
        : null;
  const orderRaw = r.orderNum ?? r.OrderNum;
  const orderNum =
    typeof orderRaw === "number" && Number.isFinite(orderRaw)
      ? orderRaw
      : typeof orderRaw === "string" && orderRaw.trim() !== "" && Number.isFinite(Number(orderRaw))
        ? Number(orderRaw)
        : null;
  return { ...(r as object), id: String(r.id ?? r.Id ?? ""), noOfLabels, orderNum } as LabelCategoryDto;
}

export async function getLabelCategories(input: LabelCategoryGetListInput, signal?: AbortSignal): Promise<PagedResultDto<LabelCategoryDto>> {
  const res = await api.requestJson<PagedResultDto<LabelCategoryDto> & { items?: unknown[]; Items?: unknown[] }>({
    path: PATH,
    method: "GET",
    query: {
      SkipCount: input.skipCount,
      MaxResultCount: input.maxResultCount,
      Sorting: input.sorting,
      Keyword: input.keyword,
      State: input.state,
      GroupId: input.groupId,
      LocationId: input.locationId,
    },
    signal,
  });
  const itemsRaw = res.items ?? res.Items ?? [];
  const items = (Array.isArray(itemsRaw) ? itemsRaw : []).map((x) => normalizeLabelCategoryDto(x));
  return { ...res, items, totalCount: res.totalCount ?? (res as { TotalCount?: number }).TotalCount ?? items.length };
}

export async function getLabelCategory(id: string, signal?: AbortSignal): Promise<LabelCategoryDto> {
  return api.requestJson<LabelCategoryDto>({
    path: `${PATH}/${encodeURIComponent(id)}`,
    method: "GET",
    signal,
  });
}

export async function createLabelCategory(input: LabelCategoryCreateInput): Promise<LabelCategoryDto> {
  return api.requestJson<LabelCategoryDto>({
    path: PATH,
    method: "POST",
    body: {
      categoryCode: String(input.categoryCode ?? "").trim() || null,
      categoryName: input.categoryName,
      categoryPhotoUrl: input.categoryPhotoUrl,
      displayText: (input.displayText ?? "").trim() || null,
      buttonBgColor: (input.buttonBgColor ?? "").trim() || null,
      buttonImageUrl: (input.buttonImageUrl ?? "").trim() || null,
      buttonAppearance: serializeButtonAppearanceForApi(input.buttonAppearance),
      buttonStyleJson: (input.buttonStyleJson ?? "").trim() || null,
      state: input.state ?? true,
      orderNum: input.orderNum,
      availabilityType: String(input.availabilityType ?? "ALL").trim().toUpperCase() || "ALL",
      locationIds:
        Array.isArray(input.locationIds) && input.locationIds.length
          ? [...new Set(input.locationIds.map((x) => String(x).trim()).filter(Boolean))]
          : null,
    },
  });
}

export async function updateLabelCategory(id: string, input: LabelCategoryUpdateInput): Promise<LabelCategoryDto> {
  return api.requestJson<LabelCategoryDto>({
    path: `${PATH}/${encodeURIComponent(id)}`,
    method: "PUT",
    body: {
      categoryCode: String(input.categoryCode ?? "").trim() || null,
      categoryName: input.categoryName,
      categoryPhotoUrl: input.categoryPhotoUrl,
      displayText: (input.displayText ?? "").trim() || null,
      buttonBgColor: (input.buttonBgColor ?? "").trim() || null,
      buttonImageUrl: (input.buttonImageUrl ?? "").trim() || null,
      buttonAppearance: serializeButtonAppearanceForApi(input.buttonAppearance),
      buttonStyleJson: (input.buttonStyleJson ?? "").trim() || null,
      state: input.state ?? true,
      orderNum: input.orderNum,
      availabilityType: String(input.availabilityType ?? "ALL").trim().toUpperCase() || "ALL",
      locationIds:
        Array.isArray(input.locationIds) && input.locationIds.length
          ? [...new Set(input.locationIds.map((x) => String(x).trim()).filter(Boolean))]
          : null,
    },
  });
}

export async function deleteLabelCategory(id: string): Promise<void> {
  await api.requestJson<unknown>({
    path: `${PATH}/${encodeURIComponent(id)}`,
    method: "DELETE",
  });
}