等待后端更新接口
This commit is contained in:
+82
-22
@@ -119,6 +119,20 @@
|
||||
};
|
||||
}
|
||||
|
||||
function normalizeGenealogyOptions(data) {
|
||||
if (!Array.isArray(data)) return [];
|
||||
return data.map(normalizeGenealogyOption).filter(Boolean);
|
||||
}
|
||||
|
||||
function resolveContextGenealogyId(options, contextId) {
|
||||
var normalizedContextId = normalizeId(contextId);
|
||||
|
||||
if (!normalizedContextId || !Array.isArray(options)) return '';
|
||||
return options.some(function (option) {
|
||||
return option.genealogyId === normalizedContextId;
|
||||
}) ? normalizedContextId : '';
|
||||
}
|
||||
|
||||
function buildVipOrderBody(values) {
|
||||
var source = values || {};
|
||||
var body = {};
|
||||
@@ -214,7 +228,7 @@
|
||||
}
|
||||
|
||||
function renderGenealogyOptions(data) {
|
||||
var items = Array.isArray(data) ? data.map(normalizeGenealogyOption).filter(Boolean) : [];
|
||||
var items = normalizeGenealogyOptions(data);
|
||||
|
||||
return '<option value="">不关联具体家谱</option>' + items.map(function (item) {
|
||||
return '<option value="' + escapeHtml(item.genealogyId) + '">' +
|
||||
@@ -271,6 +285,9 @@
|
||||
var api = root.GenealogyApi && root.GenealogyApi.defaultClient;
|
||||
var packages = [];
|
||||
var selectedPackageId = '';
|
||||
var contextGenealogyId = root.ProfileUI && typeof root.ProfileUI.getGenealogyId === 'function'
|
||||
? root.ProfileUI.getGenealogyId()
|
||||
: '';
|
||||
var writePending = false;
|
||||
|
||||
if (!page) return;
|
||||
@@ -280,20 +297,52 @@
|
||||
}
|
||||
if (!packageList || !selectedText || !genealogySelect || !form || !orderList ||
|
||||
!api.vipPackages || !api.genealogiesMine || !api.vipOrders || !api.createVipOrder) {
|
||||
if (status) status.textContent = '会员服务接口初始化失败,请刷新后重试';
|
||||
setListState(packageList, 'error', '会员套餐服务初始化失败,请刷新后重试。');
|
||||
setListState(orderList, 'error', '会员订单服务初始化失败,请刷新后重试。');
|
||||
setStatus('error', '会员服务接口初始化失败,请刷新后重试。');
|
||||
return;
|
||||
}
|
||||
|
||||
function setStatus(message) {
|
||||
if (status) status.textContent = message;
|
||||
function setApiState(target, type, message) {
|
||||
if (!target) return;
|
||||
if (root.ProfileUI && root.ProfileUI.setApiState && type) {
|
||||
root.ProfileUI.setApiState(target, type, message);
|
||||
return;
|
||||
}
|
||||
target.textContent = message || '';
|
||||
}
|
||||
|
||||
function setStatus(type, message) {
|
||||
setApiState(status, type, message);
|
||||
}
|
||||
|
||||
function setListState(target, type, message) {
|
||||
setApiState(target, type, message);
|
||||
}
|
||||
|
||||
function setPendingButton(button, pending, label) {
|
||||
if (!button) return;
|
||||
if (!button.dataset.defaultLabel) button.dataset.defaultLabel = button.textContent;
|
||||
button.disabled = pending;
|
||||
button.textContent = pending ? label : button.dataset.defaultLabel;
|
||||
}
|
||||
|
||||
function renderPackages() {
|
||||
if (!packages.length) {
|
||||
setListState(packageList, 'empty', '当前没有可用会员套餐。');
|
||||
return;
|
||||
}
|
||||
packageList.innerHTML = renderVipPackages(packages, selectedPackageId);
|
||||
}
|
||||
|
||||
function renderOrders(orders) {
|
||||
orderList.innerHTML = renderVipOrders(orders);
|
||||
var items = normalizeVipOrders(orders);
|
||||
|
||||
if (!items.length) {
|
||||
setListState(orderList, 'empty', '当前没有会员订单。');
|
||||
return;
|
||||
}
|
||||
orderList.innerHTML = renderVipOrders(items);
|
||||
}
|
||||
|
||||
async function loadOrders() {
|
||||
@@ -302,21 +351,30 @@
|
||||
return orders;
|
||||
}
|
||||
|
||||
setListState(packageList, 'loading', '正在读取会员套餐…');
|
||||
setListState(orderList, 'loading', '正在读取会员订单…');
|
||||
setStatus('loading', '正在读取会员服务…');
|
||||
try {
|
||||
var initial = await Promise.all([api.vipPackages(), api.genealogiesMine(), api.vipOrders()]);
|
||||
var genealogyOptions = normalizeGenealogyOptions(initial[1]);
|
||||
var selectedContextGenealogyId = resolveContextGenealogyId(genealogyOptions, contextGenealogyId);
|
||||
|
||||
packages = normalizeVipPackages(initial[0]);
|
||||
renderPackages();
|
||||
genealogySelect.innerHTML = renderGenealogyOptions(initial[1]);
|
||||
genealogySelect.innerHTML = renderGenealogyOptions(genealogyOptions);
|
||||
if (selectedContextGenealogyId) genealogySelect.value = selectedContextGenealogyId;
|
||||
renderOrders(initial[2]);
|
||||
setStatus(packages.length ? '请选择会员套餐' : '当前没有可用会员套餐');
|
||||
setStatus('', packages.length
|
||||
? (selectedContextGenealogyId ? '已关联当前家谱,请选择会员套餐' : '请选择会员套餐')
|
||||
: '当前没有可用会员套餐');
|
||||
} catch (error) {
|
||||
if (shouldRedirectToLogin(api, error)) {
|
||||
redirectToLogin(api);
|
||||
return;
|
||||
}
|
||||
packageList.innerHTML = '<div class="api-empty">会员套餐读取失败,请稍后重试</div>';
|
||||
orderList.innerHTML = '<div class="api-empty">会员订单读取失败,请稍后重试</div>';
|
||||
setStatus(error.message || '会员服务读取失败,请稍后重试');
|
||||
setListState(packageList, 'error', '会员套餐读取失败,请稍后重试。');
|
||||
setListState(orderList, 'error', '会员订单读取失败,请稍后重试。');
|
||||
setStatus('error', error.message || '会员服务读取失败,请稍后重试。');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -332,25 +390,25 @@
|
||||
selectedPackageId = selected.packageId;
|
||||
selectedText.textContent = '已选择:' + selected.packageName + '(¥' + selected.price + ')';
|
||||
renderPackages();
|
||||
setStatus('可以创建会员订单');
|
||||
setStatus('', '可以创建会员订单');
|
||||
});
|
||||
|
||||
if (refresh) {
|
||||
refresh.addEventListener('click', async function () {
|
||||
if (writePending) return;
|
||||
refresh.disabled = true;
|
||||
setStatus('正在刷新订单…');
|
||||
setPendingButton(refresh, true, '正在刷新…');
|
||||
setStatus('loading', '正在刷新会员订单…');
|
||||
try {
|
||||
await loadOrders();
|
||||
setStatus('会员订单已刷新');
|
||||
setStatus('', '会员订单已刷新');
|
||||
} catch (error) {
|
||||
if (shouldRedirectToLogin(api, error)) {
|
||||
redirectToLogin(api);
|
||||
return;
|
||||
}
|
||||
setStatus(error.message || '会员订单刷新失败,请稍后重试');
|
||||
setStatus('error', error.message || '会员订单刷新失败,请稍后重试。');
|
||||
} finally {
|
||||
refresh.disabled = false;
|
||||
setPendingButton(refresh, false, '正在刷新…');
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -370,13 +428,13 @@
|
||||
});
|
||||
validation = validateVipOrderBody(body);
|
||||
if (validation) {
|
||||
setStatus(validation);
|
||||
setStatus('error', validation);
|
||||
return;
|
||||
}
|
||||
|
||||
writePending = true;
|
||||
if (submit) submit.disabled = true;
|
||||
setStatus('正在创建会员订单…');
|
||||
setPendingButton(submit, true, '正在创建订单…');
|
||||
setStatus('loading', '正在创建会员订单…');
|
||||
try {
|
||||
created = normalizeVipOrder(await api.createVipOrder(body));
|
||||
if (!created) throw new Error('创建响应缺少有效会员订单信息');
|
||||
@@ -384,16 +442,16 @@
|
||||
verified = refreshed.find(function (item) { return item.orderId === created.orderId; });
|
||||
if (!verified) throw new Error('订单已提交,但重新读取未找到对应记录');
|
||||
renderOrders(refreshed);
|
||||
setStatus('订单已创建;当前 PC 暂未开放在线支付');
|
||||
setStatus('', '订单已创建;当前 PC 暂未开放在线支付。');
|
||||
} catch (error) {
|
||||
if (shouldRedirectToLogin(api, error)) {
|
||||
redirectToLogin(api);
|
||||
return;
|
||||
}
|
||||
setStatus(error.message || '会员订单创建失败,请稍后重试');
|
||||
setStatus('error', error.message || '会员订单创建失败,请稍后重试。');
|
||||
} finally {
|
||||
writePending = false;
|
||||
if (submit) submit.disabled = false;
|
||||
setPendingButton(submit, false, '正在创建订单…');
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -402,6 +460,8 @@
|
||||
normalizeVipPackage: normalizeVipPackage,
|
||||
normalizeVipPackages: normalizeVipPackages,
|
||||
normalizeGenealogyOption: normalizeGenealogyOption,
|
||||
normalizeGenealogyOptions: normalizeGenealogyOptions,
|
||||
resolveContextGenealogyId: resolveContextGenealogyId,
|
||||
buildVipOrderBody: buildVipOrderBody,
|
||||
validateVipOrderBody: validateVipOrderBody,
|
||||
normalizeVipOrder: normalizeVipOrder,
|
||||
|
||||
Reference in New Issue
Block a user