Implement consistent Return to Rotation UX across all sites

This update provides a unified, predictable inactivity prompt behavior
regardless of how the user navigated to a page.

Changes:
- Added userInteractedWithCurrentSite flag to track user touch on each site
- Modified markActivity() to set flag when user interacts (tap, swipe, scroll)
- Modified attachView() to clear flag when site changes
- Updated inactivity check to use interaction flag instead of navigation mode

New Behavior (Consistent UX):

 Scenario A: Auto-rotation to recipe → user taps → prompt after timeout
   - Site auto-rotates to recipe page
   - User taps screen to scroll/interact
   - userInteractedWithCurrentSite = true
   - After 2 min idle → prompt appears
   - User can extend time or return to rotation

 Scenario B: User swiping through photos every 30 seconds
   - Each swipe resets inactivity timer via markActivity()
   - No prompt appears (user is actively interacting)
   - Prompt only appears after they stop swiping for timeout period

 Scenario C: Sites auto-rotating with no user interaction
   - userInteractedWithCurrentSite = false on each site
   - No prompt appears
   - Rotation continues normally

Technical Details:
- Single-finger swipes (in-page content): Reset timer via markActivity()
- Two-finger swipes (tab navigation): Also sets manualNavigationMode
- Both types of interaction trigger the flag
- Flag cleared on every site change (auto or manual)
- If manual swipe, markActivity() re-sets it immediately

Use Cases:
- Recipe viewing: User can interact with page, get timeout prompt, extend time
- Photo browsing: Continuous swiping prevents timeout
- Digital signage: No interaction = no prompt = smooth rotation
- MagicMirror modules: Single-finger swipes keep resetting timer

This provides the consistent UX requested where ANY user interaction
on ANY site enables the inactivity prompt logic.
This commit is contained in:
Claude
2025-11-16 21:44:36 +00:00
parent 785c74b0d1
commit 4cc1646738
+27 -7
View File
@@ -15,7 +15,12 @@
# * Button changed from "🏠 Return to home now" to "🔄 Return to rotation"
# * If not on home page: returns to home page, then starts rotation
# * If on home page: just starts the rotation
# * Allows time extensions even on home screen (e.g., viewing recipes)
# - Consistent inactivity prompt UX across ALL sites
# * Prompt appears on ANY site where user has interacted (tap, swipe, scroll)
# * Auto-rotation to recipe → user taps → prompt appears after timeout ✅
# * User swiping through photos → keeps resetting timer, no prompt ✅
# * Auto-rotation with no interaction → no prompt, keeps rotating ✅
# * Works on home page, timed sites, and manual sites consistently
# - Fixed site edit menu not returning to configuration menu
# * Edit site URL flow now completes properly
# - Time extension features work correctly
@@ -3505,6 +3510,7 @@ let keyboardLastUsed=0;
let inactivityExtensionUntil=0;
let manualNavigationMode=false;
let programmaticNavigation=false;
let userInteractedWithCurrentSite=false; // v0.9.8: Track if user touched current site
let mediaIsPlaying=false;
let userRecentlyActive=false;
@@ -3568,15 +3574,22 @@ function loadConfig(){
function markActivity(){
const now=Date.now();
const timeSinceLastActivity=now-lastUserInteraction;
if(timeSinceLastActivity>5000){
console.log('[ACTIVITY] User interaction detected');
}
lastUserInteraction=now;
userRecentlyActive=true;
lastLockoutCheck=now; // Reset lockout timer on activity
// v0.9.8: Mark that user has interacted with this site
// This triggers inactivity prompt logic for ANY site (not just manual/home)
if(!userInteractedWithCurrentSite){
console.log('[ACTIVITY] 🖐️ User touched this site - inactivity timer active');
userInteractedWithCurrentSite=true;
}
if(promptWindow&&!promptWindow.isDestroyed()){
console.log('[ACTIVITY] Closing inactivity prompt');
promptWindow.close();
@@ -3800,15 +3813,17 @@ function startMasterTimer(){
}
}
// 7. INACTIVITY CHECK (works on ALL pages including home!)
// 7. INACTIVITY CHECK (works on ALL pages where user has interacted!)
if(homeTabIndex>=0&&!showingHidden){
const homeViewIdx=getHomeViewIndex();
const currentTabIdx=viewIndexToTabIndex(currentIndex);
const isOnHomePage=(homeViewIdx>=0&&currentIndex===homeViewIdx);
// v0.9.8: Show inactivity prompt on ALL pages (including home)
// This allows users to extend time even when viewing recipes, etc.
if(manualNavigationMode||isOnHomePage){
// v0.9.8: Show inactivity prompt on ANY site where user has interacted
// - Auto-rotates to recipe → user taps → prompt appears after timeout
// - User keeps swiping through photos → keeps resetting, no prompt
// - No user interaction → no prompt, just keeps rotating
if(userInteractedWithCurrentSite){
const idleTime=now-lastUserInteraction;
// CRITICAL FIX: Use absolute time check for extensions
@@ -3930,6 +3945,11 @@ function attachView(i){
views[i].webContents.focus();
siteStartTime=Date.now();
// v0.9.8: Clear interaction flag when site changes
// Will be set back to true if user manually swiped here (markActivity called after)
// Will stay false if auto-rotated (no user interaction yet)
userInteractedWithCurrentSite=false;
}
function nextTab(){