File size: 3,040 Bytes
3a08226
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// 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;
}