fix(pwa): show install prompt only once
This commit is contained in:
@@ -4,30 +4,41 @@
|
||||
* AppStorage 完整实现(基于 unstorage 抽象)
|
||||
*
|
||||
* 对齐 Dart 端 `AppStorage`(lib/data/services/storage/app_storage.dart):
|
||||
* - PWA 对话框每日展示 / PWA 事件每日上报 / app-info 每日上报
|
||||
* - 内部用 `yyyy-MM-dd` 字符串比对实现"每日一次"语义
|
||||
* - PWA 对话框一次性展示 / PWA 事件每日上报 / app-info 每日上报
|
||||
*
|
||||
* 注意:Dart 端是 `static class` 没有接口,本 TS 版本同样保持静态方法风格。
|
||||
* 通过 SpAsyncUtil 静态类访问底层存储(浏览器 localStorage / SSR memory 自动切换)。
|
||||
*
|
||||
* 语义:
|
||||
* - `canXxx(today)` 返回 `true` 当且仅当"自上次记录以来日期变了"
|
||||
* (即 stored !== today)。首次调用(key 不存在)也返回 `true`。
|
||||
* - `recordXxx(today)` 写入 todayString,后续 `canXxx` 在同一天返回 `false`。
|
||||
* PWA 对话框使用布尔标记;每日上报类方法仍使用 `yyyy-MM-dd` 字符串比对。
|
||||
*/
|
||||
|
||||
import { Result, type Result as ResultT, SpAsyncUtil } from "@/utils";
|
||||
import { StorageKeys } from "../storage_keys";
|
||||
|
||||
const LEGACY_PWA_DIALOG_SHOWN_KEYS = [
|
||||
"cozsweet:lastPwaDialogShown",
|
||||
"last_pwa_dialog_shown",
|
||||
];
|
||||
|
||||
export class AppStorage {
|
||||
// ---- PWA install dialog ----
|
||||
|
||||
static async canShowPwaDialog(todayString: string): Promise<ResultT<boolean>> {
|
||||
return AppStorage.canReportKey(StorageKeys.lastPwaDialogShown, todayString);
|
||||
static async canShowPwaDialog(): Promise<ResultT<boolean>> {
|
||||
const shownResult = await SpAsyncUtil.getBool(StorageKeys.pwaDialogShown);
|
||||
if (!shownResult.success) return shownResult;
|
||||
if (shownResult.data === true) return Result.ok(false);
|
||||
|
||||
for (const key of LEGACY_PWA_DIALOG_SHOWN_KEYS) {
|
||||
const legacyResult = await SpAsyncUtil.getString(key);
|
||||
if (!legacyResult.success) return legacyResult;
|
||||
if (legacyResult.data !== null) return Result.ok(false);
|
||||
}
|
||||
|
||||
return Result.ok(true);
|
||||
}
|
||||
|
||||
static recordPwaDialogShown(todayString: string): Promise<ResultT<void>> {
|
||||
return SpAsyncUtil.setString(StorageKeys.lastPwaDialogShown, todayString);
|
||||
static recordPwaDialogShown(): Promise<ResultT<void>> {
|
||||
return SpAsyncUtil.setBool(StorageKeys.pwaDialogShown, true);
|
||||
}
|
||||
|
||||
// ---- external browser dialog ----
|
||||
|
||||
@@ -28,7 +28,7 @@ export const StorageKeys = {
|
||||
pendingChatUnlock: "pending_chat_unlock",
|
||||
|
||||
// pwa / app info
|
||||
lastPwaDialogShown: "last_pwa_dialog_shown",
|
||||
pwaDialogShown: "pwa_dialog_shown",
|
||||
lastExternalBrowserDialogShown: "last_external_browser_dialog_shown",
|
||||
lastPwaEventReported: "last_pwa_event_reported",
|
||||
lastAppInfoReported: "last_app_info_reported",
|
||||
|
||||
Reference in New Issue
Block a user