- 4 API services: structures, ranks, nodes, commissions - 30+ React Query hooks in useMlm.ts - My network/dashboard hooks for user experience - Tree visualization support hooks Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
95 lines
2.5 KiB
TypeScript
95 lines
2.5 KiB
TypeScript
import api from '../api';
|
|
|
|
// ─────────────────────────────────────────────
|
|
// Types
|
|
// ─────────────────────────────────────────────
|
|
|
|
export interface RankRequirements {
|
|
personalVolume?: number;
|
|
groupVolume?: number;
|
|
directReferrals?: number;
|
|
activeLegs?: number;
|
|
rankInLegs?: {
|
|
rankLevel: number;
|
|
count: number;
|
|
};
|
|
}
|
|
|
|
export interface RankBenefits {
|
|
discount?: number;
|
|
access?: string[];
|
|
features?: string[];
|
|
}
|
|
|
|
export interface Rank {
|
|
id: string;
|
|
tenantId: string;
|
|
structureId: string;
|
|
name: string;
|
|
level: number;
|
|
badgeUrl: string | null;
|
|
color: string | null;
|
|
requirements: RankRequirements;
|
|
bonusRate: number | null;
|
|
benefits: RankBenefits;
|
|
isActive: boolean;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
}
|
|
|
|
export interface CreateRankDto {
|
|
structureId: string;
|
|
name: string;
|
|
level: number;
|
|
badgeUrl?: string;
|
|
color?: string;
|
|
requirements?: RankRequirements;
|
|
bonusRate?: number;
|
|
benefits?: RankBenefits;
|
|
isActive?: boolean;
|
|
}
|
|
|
|
export type UpdateRankDto = Partial<CreateRankDto>;
|
|
|
|
export interface RankFilters {
|
|
structureId?: string;
|
|
isActive?: boolean;
|
|
}
|
|
|
|
// ─────────────────────────────────────────────
|
|
// API Service
|
|
// ─────────────────────────────────────────────
|
|
|
|
export const ranksApi = {
|
|
list: async (params?: RankFilters): Promise<Rank[]> => {
|
|
const response = await api.get<Rank[]>('/mlm/ranks', { params });
|
|
return response.data;
|
|
},
|
|
|
|
get: async (id: string): Promise<Rank> => {
|
|
const response = await api.get<Rank>(`/mlm/ranks/${id}`);
|
|
return response.data;
|
|
},
|
|
|
|
create: async (data: CreateRankDto): Promise<Rank> => {
|
|
const response = await api.post<Rank>('/mlm/ranks', data);
|
|
return response.data;
|
|
},
|
|
|
|
update: async (id: string, data: UpdateRankDto): Promise<Rank> => {
|
|
const response = await api.patch<Rank>(`/mlm/ranks/${id}`, data);
|
|
return response.data;
|
|
},
|
|
|
|
delete: async (id: string): Promise<void> => {
|
|
await api.delete(`/mlm/ranks/${id}`);
|
|
},
|
|
|
|
evaluate: async (structureId: string): Promise<number> => {
|
|
const response = await api.post<number>('/mlm/ranks/evaluate', null, {
|
|
params: { structureId },
|
|
});
|
|
return response.data;
|
|
},
|
|
};
|