等待后端更新接口

This commit is contained in:
2026-08-03 16:49:26 +08:00
parent ac5823547a
commit 5b79893650
131 changed files with 5324 additions and 1392 deletions
+109 -23
View File
@@ -13,11 +13,25 @@
})(typeof globalThis !== 'undefined' ? globalThis : window, function (root) {
'use strict';
function normalizeTargetPage(value) {
var target = String(value || '');
var hashIndex = target.indexOf('#');
var hash = hashIndex < 0 ? '' : target.slice(hashIndex);
var parts;
var params;
if (hashIndex >= 0) target = target.slice(0, hashIndex);
parts = target.split('?');
if (!/^profile-[a-z-]+\.html$/.test(parts[0])) return 'profile-family-home.html';
params = new URLSearchParams(parts[1] || '');
params.delete('genealogyId');
return parts[0] + (params.toString() ? '?' + params.toString() : '') + hash;
}
function getTargetPage(search) {
var params = new URLSearchParams(String(search === undefined && root.location ? root.location.search : search || '').replace(/^\?/, ''));
var target = params.get('next') || '';
return /^profile-[a-z-]+\.html$/.test(target) ? target : 'profile-family-home.html';
return normalizeTargetPage(params.get('next'));
}
function buildStatus(quota) {
@@ -142,16 +156,57 @@
return values;
}
function setCreateStatus(message) {
function getApiStateType(error) {
return Number(error && (error.status || error.code)) === 403 ? 'forbidden' : 'error';
}
function setCreateStatus(message, type) {
var status = root.document && root.document.querySelector('[data-genealogy-create-status]');
if (status) status.textContent = message || '';
if (!status) return;
if (!message) {
status.innerHTML = '';
return;
}
if (root.ProfileUI && root.ProfileUI.setApiState) {
root.ProfileUI.setApiState(status, type || 'error', message);
return;
}
status.textContent = message;
}
function setEntryStatus(message, type) {
var status = root.document && root.document.querySelector('[data-genealogy-entry-status]');
if (!status) return;
if (!message) {
status.innerHTML = '';
return;
}
if (type && root.ProfileUI && root.ProfileUI.setApiState) {
root.ProfileUI.setApiState(status, type, message);
return;
}
status.textContent = message;
}
function setGenealogyListState(container, type, message) {
if (!container) return;
if (root.ProfileUI && root.ProfileUI.setApiState) {
root.ProfileUI.setApiState(container, type, message);
return;
}
container.textContent = message;
}
function setCreatePending(pending) {
var button = root.document && root.document.querySelector('[data-genealogy-create-submit]');
if (button) button.disabled = Boolean(pending);
if (!button) return;
if (!button.dataset.defaultLabel) button.dataset.defaultLabel = button.textContent;
button.disabled = Boolean(pending);
button.textContent = pending ? '正在创建…' : button.dataset.defaultLabel;
button.setAttribute('aria-busy', pending ? 'true' : 'false');
}
async function initGenealogyCreatePage() {
@@ -166,22 +221,24 @@
redirectToLogin(api);
return;
}
setCreateStatus('正在读取创建额度…', 'loading');
try {
quota = await api.genealogyQuota();
if (quotaElement) quotaElement.textContent = buildStatus(quota) || '当前额度信息不可用';
if (!canCreateGenealogy(quota)) {
setCreateStatus('当前没有可用的家谱创建额度');
setCreatePending(true);
setCreateStatus('当前没有可用的家谱创建额度', 'empty');
form.querySelector('[data-genealogy-create-submit]').disabled = true;
return;
}
setCreateStatus('');
} catch (error) {
if (shouldRedirectToLogin(api, error)) {
redirectToLogin(api);
return;
}
if (quotaElement) quotaElement.textContent = '家谱额度读取失败';
setCreateStatus(error.message || '无法读取家谱创建额度');
setCreatePending(true);
setCreateStatus(error.message || '无法读取家谱创建额度', getApiStateType(error));
form.querySelector('[data-genealogy-create-submit]').disabled = true;
return;
}
if (form.__genealogyCreateBound) return;
@@ -197,13 +254,13 @@
body = buildGenealogyCreateBody(getFormValues(form));
validation = validateGenealogyCreateBody(body);
if (validation) {
setCreateStatus(validation);
setCreateStatus(validation, 'error');
return;
}
delete body.invalidCoverOssId;
writePending = true;
setCreatePending(true);
setCreateStatus('正在创建家谱…');
setCreateStatus('正在创建家谱…', 'loading');
try {
created = normalizeCreatedGenealogy(await api.createGenealogy(body));
if (!created) throw new Error('创建响应缺少有效家谱信息');
@@ -218,7 +275,7 @@
redirectToLogin(api);
return;
}
setCreateStatus(error.message || '创建家谱失败,请稍后重试');
setCreateStatus(error.message || '创建家谱失败,请稍后重试', getApiStateType(error));
} finally {
writePending = false;
setCreatePending(false);
@@ -246,19 +303,28 @@
}
function buildEntryUrl(genealogyId, target) {
var params = new URLSearchParams();
var normalizedTarget = normalizeTargetPage(target);
var parts = normalizedTarget.split('#');
var pathAndQuery = parts[0];
var hash = parts.length > 1 ? '#' + parts.slice(1).join('#') : '';
var pathParts = pathAndQuery.split('?');
var params = new URLSearchParams(pathParts[1] || '');
params.set('genealogyId', String(genealogyId));
return (target || 'profile-family-home.html') + '?' + params.toString();
return pathParts[0] + '?' + params.toString() + hash;
}
function renderGenealogies(container, data, target) {
var items = Array.isArray(data) ? data.map(normalizeGenealogy).filter(Boolean) : [];
if (!container) return;
if (!container) return items;
if (!Array.isArray(data) || (data.length && !items.length)) {
setGenealogyListState(container, 'error', '家谱响应字段不完整,请联系后端核对。');
return [];
}
if (!items.length) {
container.innerHTML = '<div class="api-empty">当前账号还没有可进入的家谱</div>';
return;
setGenealogyListState(container, 'empty', '当前账号还没有可进入的家谱');
return [];
}
container.innerHTML = items.map(function (item) {
var meta = [
@@ -274,6 +340,7 @@
'<div><h3>' + escapeHtml(item.genealogyName) + '</h3><p>' + escapeHtml(meta) +
'</p></div><span class="pill">' + (item.canManage ? '管理并进入' : '进入家谱') + '</span></a>';
}).join('');
return items;
}
async function init() {
@@ -293,24 +360,43 @@
return;
}
if (!api || !api.genealogyQuota || !api.genealogiesMine) {
status.textContent = '家谱入口接口初始化失败,请刷新后重试。';
setEntryStatus('家谱入口接口初始化失败,请刷新后重试。', 'error');
setGenealogyListState(container, 'error', '家谱列表接口初始化失败,请刷新后重试。');
return;
}
setGenealogyListState(container, 'loading', '正在读取我的家谱…');
setEntryStatus('正在读取家谱额度…', 'loading');
try {
result = await Promise.all([api.genealogiesMine(), api.genealogyQuota()]);
renderGenealogies(container, result[0], target);
status.textContent = buildStatus(result[1]);
result = await api.genealogiesMine();
renderGenealogies(container, result, target);
} catch (error) {
if (shouldRedirectToLogin(api, error)) {
redirectToLogin(api);
return;
}
status.textContent = '无法读取我的家谱,请稍后重试。';
setGenealogyListState(
container,
getApiStateType(error),
getApiStateType(error) === 'forbidden' ? '当前账号无权查看我的家谱。' : '无法读取我的家谱,请稍后重试。'
);
}
try {
result = await api.genealogyQuota();
setEntryStatus(buildStatus(result));
} catch (error) {
if (shouldRedirectToLogin(api, error)) {
redirectToLogin(api);
return;
}
setEntryStatus(
getApiStateType(error) === 'forbidden' ? '当前账号无权读取家谱额度。' : '家谱额度读取失败,请稍后重试。',
getApiStateType(error)
);
}
}
return {
normalizeTargetPage: normalizeTargetPage,
getTargetPage: getTargetPage,
buildStatus: buildStatus,
buildGenealogyCreateBody: buildGenealogyCreateBody,