- Dispose Monaco editor instances on dialog close to prevent cycle leak
- Replace gcTime: Infinity with finite TTLs and evict orphaned subscription queryKeys
- Add missing useEffect cleanup for timers, move setTimeout out of useMemo
- Add 10s startup grace period before TUN auto-disable logic activates;
service IPC may not be ready when the frontend first queries, causing
a transient isServiceOk=false that incorrectly persists
- Replace placeholderData (which set isLoading=false with stale data)
with a proper isStartingUp guard; query now polls every 2s during
startup to catch service readiness quickly
- Add 'getSystemState' to refresh-verge-config invalidation keys to
fix key mismatch that prevented event-driven refetches from working
Replace swr with @tanstack/react-query v5 across all hooks, providers,
and components. Introduce singleton QueryClient, WS subscription pattern
via useQuery+useEffect, and enforce component-layer cache access contract.
Preserve SWR cache in onConnected to avoid replacing accumulated logs
with kernel buffer on reconnect. Add KeepAlive for the logs page so
its DOM stays mounted across route changes, removing the visible blank
window when navigating back.
Add leading-edge throttle to useMihomoWsSubscription, reduce SWR retry
aggressiveness, and increase WebSocket reconnect delay to prevent event
storms when switching profiles under poor network conditions.
- use-system-state: convert module-level `disablingTunMode` to useRef
to isolate state per hook instance, fix no-op clearTimeout, add
proper effect cleanup
- use-profiles: convert forEach to for..of so selectNodeForGroup is
properly awaited, remove fire-and-forget setTimeout around mutate
- use-clash: add useLockFn to patchInfo for concurrency safety
- Remove unused `dns_settings_enabled` localStorage writes in
setting-clash.tsx — state is sourced from verge config, these
writes were never read anywhere.
- Replace hardcoded `'last_check_update'` localStorage read in
system-info-card.tsx with exported `readLastCheckTime()` from
the useUpdate hook, keeping the key in a single source of truth.
The settings page "Check for updates" did not update the homepage
"last check update time" because each page managed the timestamp
independently. Centralizes the timestamp in the useUpdate hook
via SWR + localStorage so both pages share a single data source.
Closes https://github.com/clash-verge-rev/clash-verge-rev/issues/6605#issuecomment-4147144987
The profile-update-completed event handler was missing a mutate('getProfiles')
call, causing the "X time ago" display to show stale timestamps after
backend timer auto-updates.
* fix(proxy): resolve system proxy toggle stuck and state desync (#6614)
Backend: replace hand-rolled AtomicBool lock in update_sysproxy() with
tokio::sync::Mutex so concurrent calls wait instead of being silently
dropped, ensuring the latest config is always applied.
Move blocking OS calls (networksetup on macOS) to spawn_blocking so
they no longer stall the tokio worker thread pool.
Frontend: release SwitchRow pendingRef in .finally() so the UI always
re-syncs with the actual OS proxy state, and rollback checked on error.
Closes#6614
* fix(changelog): add note for macOS proxy toggle freeze issue
The onCheckUpdate handler never persisted the timestamp to localStorage
or dispatched it to component state, so clicking "Last Check Update"
would report the result but leave the displayed time stale.
* chore(deps): update npm dependencies to v8
* build(vite)!: migrate to Vite 8, switch to Oxc-based @vitejs/plugin-react, and clean up legacy compatibility config
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Slinetrac <realakayuki@gmail.com>
* fix: displays rule lineNo instead of index in rule page (#6230)
* fix(rules): derive line numbers in view model without mutating shared rules
* doc: update changelog
---------
Co-authored-by: Slinetrac <realakayuki@gmail.com>
* refactor: replace handle::Handle::get_window() with WindowManager::get_main_window() in multiple files
* refactor: enhance WindowManager to return window state alongside the main window instance
* refactor: update useProfiles and ProfilePage to support profile overrides and improve patchProfilesConfig return type
* refactor: enhance handle_success to check main window existence before notifying profile changes
* refactor: simplify get_main_window_with_state by using pattern matching and improve window state handling
* refactor: fix window activation by removing unnecessary reference in activate_existing_main_window
* refactor: remove redundant macOS conditional for window_manager import