197 lines
6.9 KiB
JavaScript
197 lines
6.9 KiB
JavaScript
(function () {
|
|
'use strict';
|
|
|
|
function query() {
|
|
return new URLSearchParams(window.location.search || '');
|
|
}
|
|
|
|
function commandID(prefix) {
|
|
var random =
|
|
window.crypto && window.crypto.randomUUID
|
|
? window.crypto.randomUUID()
|
|
: Date.now() + '-' + Math.random().toString(16).slice(2);
|
|
return prefix + ':' + random;
|
|
}
|
|
|
|
function normalizeBalance(value) {
|
|
value = value || {};
|
|
return {
|
|
available: Number(
|
|
value.available_amount || value.availableAmount || 0
|
|
),
|
|
frozen: Number(value.frozen_amount || value.frozenAmount || 0),
|
|
displayUSD: String(value.display_usd || value.displayUSD || '0.00'),
|
|
};
|
|
}
|
|
|
|
function normalizeSeller(value) {
|
|
value = value || {};
|
|
return {
|
|
userId: String(value.user_id || value.userId || ''),
|
|
displayUserId: String(
|
|
value.display_user_id || value.displayUserId || ''
|
|
),
|
|
nickname: String(value.nickname || ''),
|
|
avatar: String(value.avatar || ''),
|
|
sortOrder: Number(value.sort_order || value.sortOrder || 0),
|
|
pointAmount: Number(value.point_amount || value.pointAmount || 0),
|
|
sellerCoinAmount: Number(
|
|
value.seller_coin_amount || value.sellerCoinAmount || 0
|
|
),
|
|
serviceCountries:
|
|
value.service_country_codes || value.serviceCountryCodes || [],
|
|
};
|
|
}
|
|
|
|
function normalizeTransaction(value) {
|
|
value = value || {};
|
|
return {
|
|
id: String(value.transaction_id || value.transactionId || ''),
|
|
bizType: String(value.biz_type || value.bizType || ''),
|
|
availableDelta: Number(
|
|
value.available_delta || value.availableDelta || 0
|
|
),
|
|
counterpartyUserId: String(
|
|
value.counterparty_user_id || value.counterpartyUserId || ''
|
|
),
|
|
createdAtMS: Number(value.created_at_ms || value.createdAtMs || 0),
|
|
};
|
|
}
|
|
|
|
function normalizeOverview(value) {
|
|
value = value || {};
|
|
var address = value.withdraw_address || value.withdrawAddress || {};
|
|
return {
|
|
balance: normalizeBalance(value.balance),
|
|
pointsPerUSD: Number(
|
|
value.points_per_usd || value.pointsPerUSD || 0
|
|
),
|
|
feeBPS: Number(value.fee_bps || value.feeBPS || 0),
|
|
minimumPoints: Number(
|
|
value.minimum_points || value.minimumPoints || 0
|
|
),
|
|
policyInstance: String(
|
|
value.policy_instance_code || value.policyInstance || ''
|
|
),
|
|
address: String(
|
|
address.usdt_trc20_address || address.usdtTRC20Address || ''
|
|
),
|
|
sellers: (value.coin_sellers || value.coinSellers || [])
|
|
.map(normalizeSeller)
|
|
.filter(function (item) {
|
|
return (
|
|
item.userId &&
|
|
item.pointAmount > 0 &&
|
|
item.sellerCoinAmount > 0
|
|
);
|
|
}),
|
|
};
|
|
}
|
|
|
|
function normalizeHistory(value) {
|
|
var items = Array.isArray(value)
|
|
? value
|
|
: (value && (value.transactions || value.items)) || [];
|
|
return items.map(normalizeTransaction);
|
|
}
|
|
|
|
function mockData() {
|
|
return {
|
|
balance: {
|
|
available: 5152051511212,
|
|
frozen: 0,
|
|
displayUSD: '51520515.11',
|
|
},
|
|
pointsPerUSD: 100000,
|
|
feeBPS: 500,
|
|
minimumPoints: 1000000,
|
|
policyInstance: 'fami-guild-demo',
|
|
address: '',
|
|
sellers: [
|
|
{
|
|
userId: '34343',
|
|
displayUserId: '34343',
|
|
nickname: 'Coin Seller One',
|
|
avatar: '',
|
|
sortOrder: 1,
|
|
pointAmount: 100000,
|
|
sellerCoinAmount: 92000,
|
|
serviceCountries: ['SA', 'TR'],
|
|
},
|
|
{
|
|
userId: '34344',
|
|
displayUserId: '34344',
|
|
nickname: 'Coin Seller Two',
|
|
avatar: '',
|
|
sortOrder: 2,
|
|
pointAmount: 100000,
|
|
sellerCoinAmount: 90000,
|
|
serviceCountries: [],
|
|
},
|
|
],
|
|
history: [
|
|
{
|
|
id: 'demo-1',
|
|
bizType: 'point_transfer_to_coin_seller',
|
|
availableDelta: -1000000,
|
|
counterpartyUserId: '34343',
|
|
createdAtMS: Date.now() - 3600000,
|
|
},
|
|
],
|
|
};
|
|
}
|
|
|
|
function load() {
|
|
if (query().get('mock') === '1') return Promise.resolve(mockData());
|
|
var api = window.HyAppAPI && window.HyAppAPI.pointWallet;
|
|
if (!api)
|
|
return Promise.reject(new Error('point_wallet_api_unavailable'));
|
|
return Promise.all([
|
|
api.overview(),
|
|
api.history(30).catch(function () {
|
|
// 流水故障不应遮住余额和提现入口;页面会单独提示历史暂不可用。
|
|
return null;
|
|
}),
|
|
]).then(function (results) {
|
|
var data = normalizeOverview(results[0]);
|
|
data.history = normalizeHistory(results[1]);
|
|
data.historyUnavailable = results[1] === null;
|
|
return data;
|
|
});
|
|
}
|
|
|
|
function transferToCoinSeller(sellerUserID, pointAmount) {
|
|
if (query().get('mock') === '1') return Promise.resolve({});
|
|
return window.HyAppAPI.pointWallet.transferToCoinSeller({
|
|
command_id: commandID('fami-point-coin-seller'),
|
|
seller_user_id: String(sellerUserID || ''),
|
|
point_amount: Number(pointAmount || 0),
|
|
});
|
|
}
|
|
|
|
function withdrawUSDT(pointAmount, address) {
|
|
if (query().get('mock') === '1') return Promise.resolve({});
|
|
return window.HyAppAPI.pointWallet.withdrawUSDT({
|
|
command_id: commandID('fami-point-usdt'),
|
|
gross_point_amount: Number(pointAmount || 0),
|
|
usdt_trc20_address: String(address || '').trim(),
|
|
});
|
|
}
|
|
|
|
function saveAddress(address) {
|
|
if (query().get('mock') === '1') return Promise.resolve({});
|
|
// 地址写入继续复用通用工资钱包用户资料接口;资金冻结仍只由 POINT 提现接口完成。
|
|
return window.HyAppAPI.salaryWallet.saveWithdrawAddress({
|
|
usdt_trc20_address: String(address || '').trim(),
|
|
});
|
|
}
|
|
|
|
window.HyGuild = window.HyGuild || {};
|
|
window.HyGuild.wallet = {
|
|
load: load,
|
|
saveAddress: saveAddress,
|
|
transferToCoinSeller: transferToCoinSeller,
|
|
withdrawUSDT: withdrawUSDT,
|
|
};
|
|
})();
|