/** * OmniCard AI (CRMmp) - 移动微官网离线 LocalStorage 极速预加载 Composable * 严格遵循 UTS 强类型规范与 AGENTS.md 准则 */ import { CardPortalDetail } from '../../common/types.uts'; export interface CachedPortalData { version: string; timestamp: number; ttlMs: number; slug: string; data: CardPortalDetail; } export const PORTAL_CACHE_PREFIX = 'omni_portal_cache_'; export const DEFAULT_PORTAL_CACHE_TTL_MS: number = 86400000; export const PORTAL_CACHE_VERSION = '1.0.0'; export function getPortalCacheKey(slug: string): string { return `${PORTAL_CACHE_PREFIX}${slug}`; } /** * 校验缓存时效与完整性(默认24小时) */ export function isCacheValid(cache: CachedPortalData | null): boolean { if (cache == null) { return false; } if (cache.version !== PORTAL_CACHE_VERSION) { return false; } if (cache.data == null || cache.data.id == null) { return false; } const now = Date.now(); const age = now - cache.timestamp; if (age < 0 || age > cache.ttlMs) { return false; } return true; } /** * 秒级从本地 Storage 读取名片快照 */ export function getCachedPortal(slug: string): CachedPortalData | null { if (slug == null || slug.trim() === '') { return null; } const key = getPortalCacheKey(slug.trim()); try { const raw = uni.getStorageSync(key) as string; if (raw == null || raw.trim() === '') { return null; } const parsed = JSON.parse(raw) as CachedPortalData; if (parsed == null || typeof parsed !== 'object') { return null; } if ( parsed.version == null || parsed.timestamp == null || parsed.ttlMs == null || parsed.data == null || parsed.data.id == null ) { return null; } return parsed; } catch (_e) { return null; } } /** * 写入缓存快照带时间戳、版本与 TTL */ export function setCachedPortal( slug: string, data: CardPortalDetail, ttlMs?: number ): boolean { if (slug == null || slug.trim() === '' || data == null || data.id == null) { return false; } const effectiveTtlMs = ttlMs != null && ttlMs > 0 ? ttlMs : DEFAULT_PORTAL_CACHE_TTL_MS; const cacheObj: CachedPortalData = { version: PORTAL_CACHE_VERSION, timestamp: Date.now(), ttlMs: effectiveTtlMs, slug: slug.trim(), data: data, }; try { const key = getPortalCacheKey(slug.trim()); uni.setStorageSync(key, JSON.stringify(cacheObj)); return true; } catch (_e) { return false; } } /** * 清除指定名片本地缓存 */ export function clearCachedPortal(slug: string): void { if (slug == null || slug.trim() === '') { return; } try { uni.removeStorageSync(getPortalCacheKey(slug.trim())); } catch (_e) {} }