// Gesture Worker - Processes touch gestures off main thread const GESTURE_THRESHOLD = 50; const VELOCITY_THRESHOLD = 0.5; let gestureState = { startX: 0, startY: 0, startTime: 0, lastX: 0, lastY: 0, isTracking: false }; self.addEventListener('message', (e) => { const { type, event } = e.data; switch (type) { case 'TOUCH_START': handleTouchStart(event); break; case 'TOUCH_MOVE': handleTouchMove(event); break; case 'TOUCH_END': const gesture = handleTouchEnd(event); if (gesture) { self.postMessage({ type: 'GESTURE_DETECTED', gesture }); } break; } }); function handleTouchStart(event) { gestureState = { startX: event.x, startY: event.y, startTime: event.time, lastX: event.x, lastY: event.y, isTracking: true }; } function handleTouchMove(event) { if (!gestureState.isTracking) return; gestureState.lastX = event.x; gestureState.lastY = event.y; // Calculate current delta for live feedback const deltaX = event.x - gestureState.startX; const deltaY = event.y - gestureState.startY; self.postMessage({ type: 'GESTURE_PROGRESS', deltaX, deltaY, progress: Math.min(Math.abs(deltaY) / 300, 1) }); } function handleTouchEnd(event) { if (!gestureState.isTracking) return null; gestureState.isTracking = false; const deltaX = event.x - gestureState.startX; const deltaY = event.y - gestureState.startY; const deltaTime = event.time - gestureState.startTime; const velocityX = deltaX / deltaTime; const velocityY = deltaY / deltaTime; // Detect gesture type if (Math.abs(deltaY) > Math.abs(deltaX)) { // Vertical gesture if (Math.abs(deltaY) > GESTURE_THRESHOLD && Math.abs(velocityY) > VELOCITY_THRESHOLD) { if (deltaY < 0) { return { type: 'SWIPE_UP', velocity: velocityY, distance: Math.abs(deltaY) }; } else { return { type: 'SWIPE_DOWN', velocity: velocityY, distance: Math.abs(deltaY) }; } } // Edge swipe detection if (gestureState.startY < 50 && deltaY > 100) { return { type: 'STATUS_PULL' }; } if (gestureState.startY > (self.innerHeight - 50) && deltaY < -100) { return { type: 'HOME_GESTURE' }; } } else { // Horizontal gesture if (Math.abs(deltaX) > GESTURE_THRESHOLD && Math.abs(velocityX) > VELOCITY_THRESHOLD) { if (deltaX < 0) { return { type: 'SWIPE_LEFT', velocity: velocityX }; } else { return { type: 'SWIPE_RIGHT', velocity: velocityX }; } } // Edge swipe if (gestureState.startX < 20) { return { type: 'BACK_GESTURE' }; } } // Quick settings from top-right if (gestureState.startY < 50 && gestureState.startX > self.innerWidth - 100 && deltaY > 50) { return { type: 'QUICK_SETTINGS' }; } // Notifications from top-left if (gestureState.startY < 50 && gestureState.startX < 100 && deltaY > 50) { return { type: 'NOTIFICATIONS' }; } return null; }