等待后端更新接口
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user