feat(离线): 界面离线可看 —— GET 响应本地缓存 + 同步凭证持久化 (离线不清库) + 左上角离线徽标 (与 Windows 外壳分支同源)
This commit is contained in:
@@ -3,17 +3,33 @@
|
||||
// Web SDK 无需基类, 实现 fetchCredentials / uploadData 两个方法即可
|
||||
import { api, getToken } from '../../api/client.js'
|
||||
|
||||
// 上次成功的同步凭证: 离线时复用, 避免 SDK 因"凭证不可用"清空本地库
|
||||
const CRED_KEY = 'iboard_ps_cred'
|
||||
|
||||
export class IBoardConnector {
|
||||
async fetchCredentials() {
|
||||
// 未登录: 返回 null 让 SDK 保持断开 (登录后由页面触发 connect)
|
||||
if (!getToken()) return null
|
||||
const { token, endpoint } = await api('/powersync/token', { method: 'POST' })
|
||||
// VITE_POWERSYNC_URL: 打包端 (Tauri 外壳等) 可覆盖服务端下发的同步地址
|
||||
return { endpoint: import.meta.env.VITE_POWERSYNC_URL || endpoint || '', token }
|
||||
try {
|
||||
const { token, endpoint } = await api('/powersync/token', { method: 'POST' })
|
||||
// VITE_POWERSYNC_URL: 打包端 (Tauri 外壳等) 可覆盖服务端下发的同步地址
|
||||
const ep = import.meta.env.VITE_POWERSYNC_URL || endpoint || ''
|
||||
if (ep && token) {
|
||||
try { localStorage.setItem(CRED_KEY, JSON.stringify({ endpoint: ep, token, ts: Date.now() })) } catch { /* ignore */ }
|
||||
}
|
||||
return { endpoint: ep, token }
|
||||
} catch {
|
||||
// 离线 / 服务不可达: 复用上次凭证 (本地库数据继续可读, 联网后自动恢复同步)
|
||||
try {
|
||||
const cached = JSON.parse(localStorage.getItem(CRED_KEY) || 'null')
|
||||
if (cached?.endpoint && cached?.token) return { endpoint: cached.endpoint, token: cached.token }
|
||||
} catch { /* ignore */ }
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
async invalidateCredentials() {
|
||||
// 凭证不缓存, 每次向业务后端现取
|
||||
// 交给 SDK: 下次 fetchCredentials 会重新尝试取新凭证 (离线时回退缓存)
|
||||
}
|
||||
|
||||
async uploadData(database) {
|
||||
|
||||
Reference in New Issue
Block a user