Files
no-copy-frontend/src/app/actions/referralsActions.ts
T

437 lines
8.4 KiB
TypeScript
Raw Normal View History

'use server'
import { getSessionData } from '@/app/actions/session';
2026-02-24 17:22:01 +07:00
import { API_BASE_URL, bankCardFormSchema } from '@/app/actions/definitions';
export async function fetchReferralsLevels() {
const token = await getSessionData('token');
try {
const response = await fetch(`${API_BASE_URL}/api/v1/data`, {
method: 'POST',
body: JSON.stringify({
version: 1,
msg_id: 30003,
message_body: {
action: 'levels',
}
}),
headers: {
'Content-Type': 'application/json',
2026-06-01 14:48:13 +07:00
'Accept': 'application/json',
'Authorization': `Bearer ${token}`
}
});
if (response.ok) {
let parsed = await response.json();
if (parsed.message_code === 0) {
2026-02-09 13:11:25 +07:00
return {
referrals: parsed.message_body,
error: null
}
} else {
throw parsed;
}
} else {
throw (`${response.status}`);
}
} catch (error) {
return {
2026-02-09 13:11:25 +07:00
referrals: [],
error: error
}
}
}
export async function fetchReferralUserStats() {
const token = await getSessionData('token');
try {
const response = await fetch(`${API_BASE_URL}/api/v1/data`, {
method: 'POST',
body: JSON.stringify({
version: 1,
msg_id: 30003,
message_body: {
action: 'userStats',
}
}),
headers: {
'Content-Type': 'application/json',
2026-06-01 14:48:13 +07:00
'Accept': 'application/json',
'Authorization': `Bearer ${token}`
}
});
if (response.ok) {
let parsed = await response.json();
if (parsed.message_code === 0) {
return parsed.message_body;
} else {
throw parsed;
}
} else {
throw (`${response.status}`);
}
} catch (error) {
return {
error: error
}
}
}
export async function fetchReferralInvitees() {
const token = await getSessionData('token');
try {
const response = await fetch(`${API_BASE_URL}/api/v1/data`, {
method: 'POST',
body: JSON.stringify({
version: 1,
msg_id: 30003,
message_body: {
action: 'invitees',
pageSize: 100,
pageNumber: 0
}
}),
headers: {
'Content-Type': 'application/json',
2026-06-01 14:48:13 +07:00
'Accept': 'application/json',
'Authorization': `Bearer ${token}`
}
});
if (response.ok) {
let parsed = await response.json();
if (parsed.message_code === 0) {
return parsed.message_body;
} else {
throw parsed;
}
} else {
throw (`${response.status}`);
}
} catch (error) {
return {
error: error
}
}
}
export async function referralRefill() {
const token = await getSessionData('token');
try {
const response = await fetch(`${API_BASE_URL}/api/v1/data`, {
method: 'POST',
body: JSON.stringify({
version: 1,
msg_id: 30003,
message_body: {
action: 'refill',
2026-02-24 11:05:00 +07:00
amount: 2000,
}
}),
headers: {
'Content-Type': 'application/json',
2026-06-01 14:48:13 +07:00
'Accept': 'application/json',
'Authorization': `Bearer ${token}`
}
});
if (response.ok) {
let parsed = await response.json();
if (parsed.message_code === 0) {
return parsed.message_body;
} else {
throw parsed;
}
} else {
throw (`${response.status}`);
}
} catch (error) {
return {
error: error
}
}
2026-02-24 17:22:01 +07:00
}
2026-02-25 18:17:08 +07:00
export interface PayoutMethods {
cardNumber: string,
id: number,
type: string,
displayName: string,
maskedDetails: string,
default: boolean,
verified: boolean
}
export async function getPayoutMethods(): Promise<{
methods: PayoutMethods[],
error: string | null
}> {
const token = await getSessionData('token');
try {
const response = await fetch(`${API_BASE_URL}/api/payouts/user/payout-methods`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': `Bearer ${token}`,
}
});
if (response.ok) {
const parsed = await response.json();
return {
methods: parsed,
error: null
};
} else {
throw 'error';
}
} catch (error) {
return {
methods: [],
error: 'error'
};
}
}
2026-02-24 17:22:01 +07:00
export async function getUserPayments() {
const token = await getSessionData('token');
try {
const response = await fetch(`${API_BASE_URL}/api/payouts/requests`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': `Bearer ${token}`,
}
});
if (response.ok) {
const parsed = await response.json();
2026-02-25 12:53:18 +07:00
return {
payments: parsed,
error: null
};
2026-02-24 17:22:01 +07:00
} else {
2026-02-25 12:53:18 +07:00
throw 'error';
2026-02-24 17:22:01 +07:00
}
} catch (error) {
2026-02-25 12:53:18 +07:00
return {
payments: [],
error: 'error'
};
2026-02-24 17:22:01 +07:00
}
}
export type PayoutMethodFormState = {
previousState: {
bankCard?: string | undefined;
paymentsType?: 'bank-card' | 'bank-transfer' | 'on-account-balance';
} | undefined,
2026-02-26 11:49:32 +07:00
success?: boolean,
2026-02-24 17:41:50 +07:00
error: Record<string, string | null> | null
2026-02-24 17:22:01 +07:00
};
export async function addPayoutMethod(
state: PayoutMethodFormState | undefined,
formData: FormData,
): Promise<PayoutMethodFormState> {
const token = await getSessionData('token');
2026-02-25 18:17:08 +07:00
console.log('addPayoutMethod');
2026-02-24 17:22:01 +07:00
const bankCard = formData.get('bankCard') as string || '';
const paymentsType = formData.get('paymentsType') as 'bank-card' | 'bank-transfer' | 'on-account-balance';
const validatedFields = bankCardFormSchema.safeParse({
bankCard
});
if (!validatedFields.success) {
const errors: Record<string, string> = {}
JSON.parse(validatedFields.error.message).forEach((obj: {
message: string,
path: string
}) => {
if (errors[obj.path[0]]) {
errors[obj.path[0]] = `${errors[obj.path[0]]} ${obj.message}`;
} else {
errors[obj.path[0]] = obj.message;
}
});
return {
previousState: {
bankCard
},
2026-02-26 11:49:32 +07:00
success: false,
2026-02-24 17:22:01 +07:00
error: errors
};
}
try {
const { bankCard } = validatedFields.data;
const response = await fetch(`${API_BASE_URL}/api/payouts/payout-method/card`, {
method: 'POST',
body: JSON.stringify({
"cardNumber": bankCard.replaceAll(' ', '')
}),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': `Bearer ${token}`,
}
});
console.log(response);
if (response.ok) {
const parsed = await response.json();
console.log(parsed);
return {
previousState: {
bankCard,
paymentsType
},
2026-02-26 11:49:32 +07:00
success: true,
2026-02-24 17:22:01 +07:00
error: null
};
} else {
throw 'error-save';
}
} catch (error: unknown) {
const errors: Record<string, string> = {};
errors['server'] = 'error-save'
if (error) {
const typedError = error as any;
}
return {
previousState: {
bankCard,
paymentsType
},
2026-02-26 11:49:32 +07:00
success: false,
2026-02-24 17:22:01 +07:00
error: errors
};
}
2026-02-25 18:17:08 +07:00
}
export type PayoutRequest = {
previousState: {
amount?: string | undefined;
} | undefined,
error: string | null
};
export async function createPayoutRequest(
state: PayoutRequest | undefined,
formData: FormData,
): Promise<PayoutRequest> {
const token = await getSessionData('token');
const amount = formData.get('amount') as string || '';
const payoutMethodId = formData.get('payoutMethodId') as string || '';
2026-04-09 14:34:48 +07:00
console.log('createPayoutRequest');
2026-02-25 18:17:08 +07:00
try {
const response = await fetch(`${API_BASE_URL}/api/payouts/create-request`, {
method: 'POST',
body: JSON.stringify({
"amount": amount,
"payoutMethodId": payoutMethodId
}),
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`,
}
});
if (response.status === 400) {
const responseText = await response.text();
throw JSON.parse(responseText)?.message;
}
2026-04-02 11:29:15 +07:00
if (response.status === 409) {
2026-04-09 14:34:48 +07:00
const responseText = await response.text();
if (responseText.includes('Not have money for payout')) {
throw 'insufficient-funds-to-receive-payment'
}
2026-04-09 14:45:20 +07:00
if (responseText.includes('Not found payout method')) {
throw 'not-found-payout-method'
}
2026-04-02 11:29:15 +07:00
}
2026-02-25 18:17:08 +07:00
if (response.ok) {
const parsed = await response.json();
console.log(parsed);
return {
previousState: {
amount
},
error: null
};
} else {
2026-03-20 12:24:01 +07:00
throw 'payment-error';
2026-02-25 18:17:08 +07:00
}
} catch (error: unknown) {
if (error) {
2026-03-20 12:24:01 +07:00
let typedError: string;
switch (error) {
case 'Sum of pay is required':
typedError = 'sum-of-pay-is-required';
break;
case 'Min sum for pay 1000':
typedError = 'min-sum-for-payout-1000';
break;
2026-04-02 11:29:15 +07:00
case 'insufficient-funds-to-receive-payment':
typedError = 'insufficient-funds-to-receive-payment';
break;
2026-04-09 14:45:20 +07:00
case 'not-found-payout-method':
typedError = 'not-found-payout-method';
break
2026-03-20 12:24:01 +07:00
default:
typedError = 'payment-error';
}
2026-02-25 18:17:08 +07:00
return {
previousState: {
amount
},
error: typedError
};
}
return {
previousState: {
amount
},
2026-03-20 12:24:01 +07:00
error: 'payment-error'
2026-02-25 18:17:08 +07:00
};
}
}