feat: add Referrals tab to admin user detail page

- New Рефералы tab with three sections:
  - Referred By: shows who referred this user, assign/remove referrer
  - Stats grid: total referrals, earnings, commission, referral code
  - Referrals list: all referred users with navigate and remove buttons
- User search with debounce for assigning referrer
- Shows warning when selected user already has a referrer
- API methods: assignReferrer, removeReferrer, removeReferral
- i18n translations for all 4 locales (en, ru, zh, fa)
This commit is contained in:
Fringg
2026-03-29 03:43:47 +03:00
parent 3e6c0212a6
commit e32663f291
6 changed files with 444 additions and 6 deletions

View File

@@ -536,6 +536,34 @@ export const adminUsersApi = {
return response.data;
},
// Assign a referrer to this user
assignReferrer: async (
userId: number,
referrerId: number,
): Promise<{ success: boolean; message: string }> => {
const response = await apiClient.post(`/cabinet/admin/users/${userId}/assign-referrer`, {
referrer_id: referrerId,
});
return response.data;
},
// Remove this user's referrer
removeReferrer: async (userId: number): Promise<{ success: boolean; message: string }> => {
const response = await apiClient.delete(`/cabinet/admin/users/${userId}/referrer`);
return response.data;
},
// Remove a specific referral from this user's list
removeReferral: async (
userId: number,
referralUserId: number,
): Promise<{ success: boolean; message: string }> => {
const response = await apiClient.delete(
`/cabinet/admin/users/${userId}/referrals/${referralUserId}`,
);
return response.data;
},
// Get referrals
getReferrals: async (userId: number, offset = 0, limit = 50): Promise<UsersListResponse> => {
const response = await apiClient.get(`/cabinet/admin/users/${userId}/referrals`, {