新增订单概况并优化自动刷新和错误提示

This commit is contained in:
songxinnuo
2026-11-03 17:39:15 +08:00
parent 92684bffb2
commit efb2e5b4b4
12 changed files with 407 additions and 44 deletions
+14 -7
View File
@@ -9,7 +9,7 @@ var CustomerLogin = {
const cancel=document.getElementById('customer-cancel');
const error=document.getElementById('customer-error');
const accounts=['customer-account','customer-account-mobile'].map(id=>document.getElementById(id)).filter(Boolean);
let user, pending=null, opener=null, busy=false, version=0;
let user, pending=null, opener=null, busy=false, version=0, resumePending=false;
overlay.hidden=true;
function status(message){ error.textContent=message || ''; error.hidden=!message; }
function render(){
@@ -26,14 +26,14 @@ var CustomerLogin = {
username.placeholder=options.text('customerUsernamePlaceholder');
password.placeholder=options.text('customerPasswordPlaceholder');
}
function update(next){
function update(next, refreshOrders){
const previous=user;
user=next;
render();
if(options.onChange && (previous === undefined || (previous && previous.id) !== (user && user.id))){
options.onChange(user,previous);
}
if(options.onSession) options.onSession(user);
if(options.onSession) options.onSession(user,Boolean(refreshOrders));
}
async function request(path, data){
const controller=new AbortController();
@@ -49,12 +49,12 @@ var CustomerLogin = {
return result;
}finally{ clearTimeout(timer); }
}
async function refresh(){
async function refresh(refreshOrders){
if(busy) return;
const token=++version;
try{
const result=await request('/api/customer/session');
if(token === version) update(result.authenticated && result.user ? result.user : null);
if(token === version) update(result.authenticated && result.user ? result.user : null,refreshOrders);
}catch(error){} // Query endpoints still enforce login if status cannot refresh.
}
function restoreFocus(){
@@ -121,8 +121,15 @@ var CustomerLogin = {
finally{ if(token === version) setBusy(false); }
}
accounts.forEach(account=>{account.onclick=activateAccount;});
window.addEventListener('focus',refresh);
document.addEventListener('visibilitychange',function(){ if(!document.hidden) refresh(); });
async function resume(){
// Browsers often emit both events for one return to the page.
if(document.hidden || resumePending) return;
resumePending=true;
try{ await refresh(true); }
finally{ resumePending=false; }
}
window.addEventListener('focus',resume);
document.addEventListener('visibilitychange',resume);
render();
return {open:open,refresh:refresh,render:render,require:async function(resume){
if(busy) return;