mirror of
https://github.com/SECTL/SecScore.git
synced 2026-07-19 19:04:23 +08:00
修复加减分后频繁弹出远端本地冲突选择
This commit is contained in:
+26
-3
@@ -61,6 +61,7 @@ function MainContent(): React.JSX.Element {
|
|||||||
const [syncApplyLoading, setSyncApplyLoading] = useState(false)
|
const [syncApplyLoading, setSyncApplyLoading] = useState(false)
|
||||||
const syncCheckingRef = useRef(false)
|
const syncCheckingRef = useRef(false)
|
||||||
const syncApplyLoadingRef = useRef(false)
|
const syncApplyLoadingRef = useRef(false)
|
||||||
|
const lastLocalMutationAtRef = useRef(0)
|
||||||
|
|
||||||
const activeMenu = useMemo(() => {
|
const activeMenu = useMemo(() => {
|
||||||
const p = location.pathname
|
const p = location.pathname
|
||||||
@@ -112,7 +113,9 @@ function MainContent(): React.JSX.Element {
|
|||||||
messageApi.success(
|
messageApi.success(
|
||||||
res.data.message || `同步完成(同步 ${res.data.synced_records} 条,解决冲突 ${res.data.resolved_conflicts} 条)`
|
res.data.message || `同步完成(同步 ${res.data.synced_records} 条,解决冲突 ${res.data.resolved_conflicts} 条)`
|
||||||
)
|
)
|
||||||
window.dispatchEvent(new CustomEvent("ss:data-updated", { detail: { category: "all" } }))
|
window.dispatchEvent(
|
||||||
|
new CustomEvent("ss:data-updated", { detail: { category: "all", source: "sync" } })
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
messageApi.error(res?.data?.message || res?.message || "同步失败")
|
messageApi.error(res?.data?.message || res?.message || "同步失败")
|
||||||
}
|
}
|
||||||
@@ -148,6 +151,20 @@ function MainContent(): React.JSX.Element {
|
|||||||
|
|
||||||
const conflicts = previewRes.data.conflicts || []
|
const conflicts = previewRes.data.conflicts || []
|
||||||
if (conflicts.length > 0) {
|
if (conflicts.length > 0) {
|
||||||
|
const recentLocalMutation = Date.now() - lastLocalMutationAtRef.current < 15000
|
||||||
|
if (recentLocalMutation) {
|
||||||
|
const autoApplyRes = await api.dbSyncApply("keep_local")
|
||||||
|
if (
|
||||||
|
autoApplyRes?.success &&
|
||||||
|
autoApplyRes?.data?.success &&
|
||||||
|
autoApplyRes?.data?.synced_records > 0
|
||||||
|
) {
|
||||||
|
window.dispatchEvent(
|
||||||
|
new CustomEvent("ss:data-updated", { detail: { category: "all", source: "sync" } })
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
setSyncConflicts(conflicts)
|
setSyncConflicts(conflicts)
|
||||||
setSyncConflictVisible(true)
|
setSyncConflictVisible(true)
|
||||||
return
|
return
|
||||||
@@ -155,7 +172,9 @@ function MainContent(): React.JSX.Element {
|
|||||||
|
|
||||||
const applyRes = await api.dbSyncApply("keep_local")
|
const applyRes = await api.dbSyncApply("keep_local")
|
||||||
if (applyRes?.success && applyRes?.data?.success && applyRes?.data?.synced_records > 0) {
|
if (applyRes?.success && applyRes?.data?.success && applyRes?.data?.synced_records > 0) {
|
||||||
window.dispatchEvent(new CustomEvent("ss:data-updated", { detail: { category: "all" } }))
|
window.dispatchEvent(
|
||||||
|
new CustomEvent("ss:data-updated", { detail: { category: "all", source: "sync" } })
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Auto sync failed:", error)
|
console.error("Auto sync failed:", error)
|
||||||
@@ -166,7 +185,11 @@ function MainContent(): React.JSX.Element {
|
|||||||
|
|
||||||
checkAndSync()
|
checkAndSync()
|
||||||
const timer = window.setInterval(checkAndSync, 30000)
|
const timer = window.setInterval(checkAndSync, 30000)
|
||||||
const onDataUpdated = () => {
|
const onDataUpdated = (e: Event) => {
|
||||||
|
const customEvent = e as CustomEvent<{ source?: string }>
|
||||||
|
if (customEvent?.detail?.source !== "sync") {
|
||||||
|
lastLocalMutationAtRef.current = Date.now()
|
||||||
|
}
|
||||||
window.setTimeout(() => {
|
window.setTimeout(() => {
|
||||||
checkAndSync().catch(() => void 0)
|
checkAndSync().catch(() => void 0)
|
||||||
}, 1200)
|
}, 1200)
|
||||||
|
|||||||
Reference in New Issue
Block a user