team-member.ts 2.99 KB
import type {
  TeamMemberCreateInput,
  TeamMemberDto,
  TeamMemberGetListQuery,
  TeamMemberUpdateInput,
} from './account-types';
import type { FlPagedResult } from './types';

import { requestClient } from '#/api/request';

const PATH = '/team-member';

function toPhoneNumber(v: string | number | null | undefined): number | null {
  if (v === null || v === undefined || v === '') {
    return null;
  }
  const s = String(v).trim();
  if (!s) {
    return null;
  }
  return Number(s.replace(/\D/g, '')) || 0;
}

function scopeIdsForApi(ids: string[] | undefined): string[] | undefined {
  const list = [
    ...new Set((ids ?? []).map((x) => String(x).trim()).filter(Boolean)),
  ];
  return list.length ? list : undefined;
}

function buildCreatePayload(input: TeamMemberCreateInput) {
  const phoneVal =
    input.phone != null && input.phone !== ''
      ? toPhoneNumber(String(input.phone))
      : null;
  const partnerId = (input.partnerId ?? '').trim() || undefined;
  const regionIds = scopeIdsForApi(input.regionIds);
  return {
    fullName: input.fullName,
    userName: input.userName,
    password: input.password,
    email: input.email ?? null,
    phone: phoneVal,
    roleId: input.roleId,
    partnerId,
    partnerIds: partnerId ? [partnerId] : undefined,
    regionIds,
    groupIds: regionIds,
    locationIds: input.locationIds,
    locations: input.locationIds,
    state: input.state,
  };
}

function buildUpdatePayload(input: TeamMemberUpdateInput) {
  const phoneVal =
    input.phone != null && input.phone !== ''
      ? toPhoneNumber(String(input.phone))
      : null;
  const partnerId = (input.partnerId ?? '').trim() || undefined;
  const regionIds = scopeIdsForApi(input.regionIds);
  const payload: Record<string, unknown> = {
    fullName: input.fullName,
    userName: input.userName,
    email: input.email ?? null,
    phone: phoneVal,
    roleId: input.roleId,
    partnerId,
    partnerIds: partnerId ? [partnerId] : undefined,
    regionIds,
    groupIds: regionIds,
    locationIds: input.locationIds,
    locations: input.locationIds,
    state: input.state,
  };
  if (input.password) {
    payload.password = input.password;
  }
  return payload;
}

export function teamMemberList(params?: TeamMemberGetListQuery) {
  return requestClient.get<FlPagedResult<TeamMemberDto>>(PATH, {
    params,
    errorMessageMode: 'message',
  });
}

export function teamMemberInfo(id: string) {
  return requestClient.get<TeamMemberDto>(
    `${PATH}/${encodeURIComponent(id)}`,
    { errorMessageMode: 'message' },
  );
}

export function teamMemberAdd(data: TeamMemberCreateInput) {
  return requestClient.postWithMsg<TeamMemberDto>(
    PATH,
    buildCreatePayload(data),
  );
}

export function teamMemberUpdate(id: string, data: TeamMemberUpdateInput) {
  return requestClient.putWithMsg<TeamMemberDto>(
    `${PATH}/${encodeURIComponent(id)}`,
    buildUpdatePayload(data),
  );
}

export function teamMemberRemove(id: string) {
  return requestClient.deleteWithMsg<void>(
    `${PATH}/${encodeURIComponent(id)}`,
  );
}