feat: add remote device settings portal and Pi hot reload

- add /settings/device portal page and portal device-config GET endpoint
- add portal navigation and client-side device settings editor UI
- hot-reload Account/Car display config after local saves and server syncs
- document portal workflow and Phase 25.5b completion
- add runtime reload tests for account, car, and sync callback

Co-authored-by: Copilot <[email protected]>
This commit is contained in:
Mathieu Moran
2026-08-10 17:34:22 -04:00
co-authored by Copilot
parent c4ccc3efb9
commit 585da18225
12 changed files with 383 additions and 22 deletions
+9 -4
View File
@@ -17,6 +17,7 @@ from . import app_network, app_sql
_SYNC_THREAD = None
_SYNC_STOP = False
_SYNC_CONFIG_VERSION = 0 # Track last-synced version to detect changes
_RELOAD_CALLBACK = None
def _has_internet():
@@ -44,6 +45,12 @@ def start_sync():
_SYNC_THREAD.start()
def register_reload_callback(callback):
"""Register a callback invoked after synced config is written locally."""
global _RELOAD_CALLBACK
_RELOAD_CALLBACK = callback
def stop_sync():
"""Stop background device config sync thread."""
global _SYNC_STOP
@@ -112,10 +119,8 @@ def _store_synced_config(config):
def _on_config_changed():
"""Called when config changes and needs to be reloaded by app."""
# This is a signal for future hot-reload implementation
# For now, config is automatically read from database on each request
# A full reload would require restarting the app or using a signal handler
pass
if _RELOAD_CALLBACK is not None:
_RELOAD_CALLBACK()
def is_sync_enabled():