Files
bedolaga-cabinet/src/api/referralNetwork.ts
Fringg db76cd0c64 feat: multi-select scope for referral network graph
Replace single-select scope with multi-select supporting multiple
campaigns, partners, and users simultaneously. Chips UI with remove
buttons, clear-all, sorted query keys for cache stability.
2026-03-20 02:31:11 +03:00

52 lines
1.7 KiB
TypeScript

import apiClient from './client';
import type {
NetworkGraphData,
NetworkUserDetail,
NetworkCampaignDetail,
NetworkSearchResult,
ScopeOptionsData,
ScopeSelection,
} from '@/types/referralNetwork';
export const referralNetworkApi = {
getScopeOptions: async (): Promise<ScopeOptionsData> => {
const response = await apiClient.get('/cabinet/admin/referral-network/scope-options');
return response.data;
},
getScopedGraph: async (selections: ScopeSelection[]): Promise<NetworkGraphData> => {
const campaignIds = selections.filter((s) => s.type === 'campaign').map((s) => s.id);
const partnerIds = selections.filter((s) => s.type === 'partner').map((s) => s.id);
const userIds = selections.filter((s) => s.type === 'user').map((s) => s.id);
const response = await apiClient.get('/cabinet/admin/referral-network/scoped', {
params: {
campaign_ids: campaignIds,
partner_ids: partnerIds,
user_ids: userIds,
},
paramsSerializer: {
indexes: null,
},
});
return response.data;
},
getUserDetail: async (userId: number): Promise<NetworkUserDetail> => {
const response = await apiClient.get(`/cabinet/admin/referral-network/user/${userId}`);
return response.data;
},
getCampaignDetail: async (campaignId: number): Promise<NetworkCampaignDetail> => {
const response = await apiClient.get(`/cabinet/admin/referral-network/campaign/${campaignId}`);
return response.data;
},
search: async (query: string): Promise<NetworkSearchResult> => {
const response = await apiClient.get('/cabinet/admin/referral-network/search', {
params: { q: query },
});
return response.data;
},
};