fix: keep stock previews current and clarify member access
This commit is contained in:
+16
-16
@@ -4258,7 +4258,7 @@ async function showStockPreview(code, trigger) {
|
||||
document.body.classList.toggle("stock-preview-open", mobile);
|
||||
requestAnimationFrame(repositionStockPreview);
|
||||
|
||||
const cacheKey = `${code}:${elements.tradeDate.value}`;
|
||||
const cacheKey = `${code}:latest`;
|
||||
const cached = stockPreviewCache.get(cacheKey);
|
||||
if (cached && cached.expiresAt > Date.now()) {
|
||||
renderStockPreview(cached.payload);
|
||||
@@ -4268,9 +4268,8 @@ async function showStockPreview(code, trigger) {
|
||||
stockPreviewAbortController?.abort();
|
||||
stockPreviewAbortController = new AbortController();
|
||||
try {
|
||||
const query = new URLSearchParams({ trade_date: elements.tradeDate.value });
|
||||
const payload = await apiRequest(
|
||||
`/api/stock/${encodeURIComponent(code)}/preview?${query}`,
|
||||
`/api/stock/${encodeURIComponent(code)}/preview`,
|
||||
"GET",
|
||||
null,
|
||||
{ signal: stockPreviewAbortController.signal },
|
||||
@@ -4291,11 +4290,10 @@ function renderStockPreviewLoading() {
|
||||
setText("stockPreviewCode", state.stockPreviewCode || "--");
|
||||
setText("stockPreviewName", fallback.name || "正在加载");
|
||||
setText("stockPreviewSector", fallback.sector || "--");
|
||||
setText("stockPreviewPrice", meaningfulNumber(fallback.price) ? formatNumber(fallback.price, 2) : "--");
|
||||
const change = number(fallback.change);
|
||||
setText("stockPreviewChange", meaningfulNumber(fallback.change) ? `${signed(change)}%` : "--");
|
||||
document.querySelector("#stockPreviewChange").className = changeClass(change);
|
||||
setText("stockPreviewDate", elements.tradeDate.value);
|
||||
setText("stockPreviewPrice", "--");
|
||||
setText("stockPreviewChange", "--");
|
||||
document.querySelector("#stockPreviewChange").className = "";
|
||||
setText("stockPreviewDate", "最新行情");
|
||||
setText("stockPreviewSource", "正在读取行情");
|
||||
setText("stockPreviewSummary", "等待行情数据");
|
||||
document.querySelector("#stockPreviewLoading").hidden = false;
|
||||
@@ -4306,15 +4304,15 @@ function renderStockPreview(payload) {
|
||||
state.stockPreviewPayload = payload;
|
||||
const fallback = state.stockPreviewFallback || {};
|
||||
const stock = payload.stock || {};
|
||||
const price = stock.price ?? fallback.price;
|
||||
const change = stock.change ?? fallback.change;
|
||||
const price = stock.price;
|
||||
const change = stock.change;
|
||||
setText("stockPreviewCode", stock.code || state.stockPreviewCode);
|
||||
setText("stockPreviewName", stock.name && stock.name !== "--" ? stock.name : fallback.name || "--");
|
||||
setText("stockPreviewSector", stock.industry && stock.industry !== "其他" ? stock.industry : fallback.sector || "其他");
|
||||
setText("stockPreviewPrice", meaningfulNumber(price) ? formatNumber(price, 2) : "--");
|
||||
setText("stockPreviewChange", meaningfulNumber(change) ? `${signed(change)}%` : "--");
|
||||
document.querySelector("#stockPreviewChange").className = changeClass(change);
|
||||
setText("stockPreviewDate", payload.meta?.trade_date || elements.tradeDate.value);
|
||||
setText("stockPreviewDate", payload.meta?.trade_date || "最新行情");
|
||||
document.querySelector("#stockPreviewLoading").hidden = true;
|
||||
const intradayAvailable = (payload.intraday || []).length > 0;
|
||||
const source = payload.meta?.realtime ? "盘中行情" : "日 K 行情";
|
||||
@@ -4513,8 +4511,7 @@ function renderAlerts() {
|
||||
|
||||
async function openReviewAssistant() {
|
||||
if (!hasMemberAccess()) {
|
||||
showToast("复盘助手仅对会员开放");
|
||||
openSettings("membership");
|
||||
openSettings("membership", "复盘助手仅对会员开放");
|
||||
return;
|
||||
}
|
||||
toggleHeaderCommandMenu(false);
|
||||
@@ -5191,10 +5188,13 @@ function selectAccountPanel(panel) {
|
||||
return selected;
|
||||
}
|
||||
|
||||
async function openSettings(panel = "profile") {
|
||||
selectAccountPanel(panel);
|
||||
async function openSettings(panel = "profile", accessNotice = "") {
|
||||
const selectedPanel = selectAccountPanel(panel);
|
||||
toggleAccountDropdown(false);
|
||||
toggleHeaderCommandMenu(false);
|
||||
const membershipNotice = document.querySelector("#membershipAccessNotice");
|
||||
membershipNotice.textContent = accessNotice;
|
||||
membershipNotice.hidden = selectedPanel !== "membership" || !accessNotice;
|
||||
const status = document.querySelector("#connectionStatus");
|
||||
status.className = "connection-status";
|
||||
status.textContent = "正在读取账号状态";
|
||||
@@ -5220,7 +5220,7 @@ async function openSettings(panel = "profile") {
|
||||
? `${membership.plan || "会员"}${membership.expires_at ? ` · 有效至 ${membershipDateDisplay(membership.expires_at, true)}` : " · 长期有效"}`
|
||||
: membership.is_admin
|
||||
? "管理员拥有智能功能管理权限,但不会因此显示为已开通会员。"
|
||||
: "开通会员后可使用智能选股、问师、问天等智能功能。");
|
||||
: "开通会员后可使用智能选股、问师、问天、复盘助手等智能功能。");
|
||||
setText("membershipQuotaHint", `会员默认每日智能分析额度 ${number(access.daily_limit)} 次,由管理员统一设置。`);
|
||||
setText("membershipUsage", membership.active
|
||||
? `今日已用 ${number(access.used_today)} 次`
|
||||
|
||||
Reference in New Issue
Block a user