fix(phase3): subscription leak, image mime type validation
- Ledger store: add stopSubscription() to properly clean up realtime subscriptions, matching asset store pattern - LedgerList: call stopSubscription on unmount - Assets migration: restrict image upload to image/* mime types (C3 updateRule is a known tradeoff — PocketBase lacks field-level permissions, frontend enforces edit restrictions instead) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,7 @@ export const useLedgerStore = defineStore('ledger', () => {
|
||||
const loading = ref(false)
|
||||
const summary = ref({ totalIncome: 0, totalExpense: 0, balance: 0 })
|
||||
const currentMonth = ref(new Date().toISOString().slice(0, 7))
|
||||
let unsubFn: (() => Promise<void> | void) | null = null
|
||||
|
||||
// 加载账目列表和汇总
|
||||
async function loadLedgers(groupId: string, month?: string) {
|
||||
@@ -78,12 +79,19 @@ export const useLedgerStore = defineStore('ledger', () => {
|
||||
|
||||
// 订阅实时更新
|
||||
async function startSubscription(groupId: string) {
|
||||
await subscribeLedgers(groupId, () => {
|
||||
// 收到变更后重新加载当前月份的数据
|
||||
stopSubscription()
|
||||
unsubFn = await subscribeLedgers(groupId, () => {
|
||||
loadLedgers(groupId)
|
||||
})
|
||||
}
|
||||
|
||||
function stopSubscription() {
|
||||
if (unsubFn) {
|
||||
unsubFn()
|
||||
unsubFn = null
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
ledgers,
|
||||
loading,
|
||||
@@ -94,6 +102,7 @@ export const useLedgerStore = defineStore('ledger', () => {
|
||||
addLedger,
|
||||
editLedger,
|
||||
removeLedger,
|
||||
startSubscription
|
||||
startSubscription,
|
||||
stopSubscription
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user