react-native-debug-toolkit 2.3.0 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +115 -97
  2. package/README.zh-CN.md +113 -95
  3. package/bin/debug-toolkit.js +114 -0
  4. package/lib/commonjs/core/initialize.js +5 -0
  5. package/lib/commonjs/core/initialize.js.map +1 -1
  6. package/lib/commonjs/features/network/index.js +28 -2
  7. package/lib/commonjs/features/network/index.js.map +1 -1
  8. package/lib/commonjs/features/network/networkInterceptor.js +14 -6
  9. package/lib/commonjs/features/network/networkInterceptor.js.map +1 -1
  10. package/lib/commonjs/index.js +56 -0
  11. package/lib/commonjs/index.js.map +1 -1
  12. package/lib/commonjs/ui/panel/DebugPanel.js +25 -0
  13. package/lib/commonjs/ui/panel/DebugPanel.js.map +1 -1
  14. package/lib/commonjs/ui/panel/FloatPanelView.js +15 -62
  15. package/lib/commonjs/ui/panel/FloatPanelView.js.map +1 -1
  16. package/lib/commonjs/ui/panel/StreamingSettingsModal.js +495 -0
  17. package/lib/commonjs/ui/panel/StreamingSettingsModal.js.map +1 -0
  18. package/lib/commonjs/ui/panel/useTabAnimation.js +71 -0
  19. package/lib/commonjs/ui/panel/useTabAnimation.js.map +1 -0
  20. package/lib/commonjs/utils/DaemonClient.js +721 -0
  21. package/lib/commonjs/utils/DaemonClient.js.map +1 -0
  22. package/lib/commonjs/utils/createPersistedObservableStore.js +23 -3
  23. package/lib/commonjs/utils/createPersistedObservableStore.js.map +1 -1
  24. package/lib/commonjs/utils/deviceReport.js +132 -0
  25. package/lib/commonjs/utils/deviceReport.js.map +1 -0
  26. package/lib/module/core/initialize.js +6 -0
  27. package/lib/module/core/initialize.js.map +1 -1
  28. package/lib/module/features/network/index.js +25 -1
  29. package/lib/module/features/network/index.js.map +1 -1
  30. package/lib/module/features/network/networkInterceptor.js +14 -6
  31. package/lib/module/features/network/networkInterceptor.js.map +1 -1
  32. package/lib/module/index.js +3 -0
  33. package/lib/module/index.js.map +1 -1
  34. package/lib/module/ui/panel/DebugPanel.js +26 -1
  35. package/lib/module/ui/panel/DebugPanel.js.map +1 -1
  36. package/lib/module/ui/panel/FloatPanelView.js +16 -63
  37. package/lib/module/ui/panel/FloatPanelView.js.map +1 -1
  38. package/lib/module/ui/panel/StreamingSettingsModal.js +490 -0
  39. package/lib/module/ui/panel/StreamingSettingsModal.js.map +1 -0
  40. package/lib/module/ui/panel/useTabAnimation.js +67 -0
  41. package/lib/module/ui/panel/useTabAnimation.js.map +1 -0
  42. package/lib/module/utils/DaemonClient.js +703 -0
  43. package/lib/module/utils/DaemonClient.js.map +1 -0
  44. package/lib/module/utils/createPersistedObservableStore.js +23 -3
  45. package/lib/module/utils/createPersistedObservableStore.js.map +1 -1
  46. package/lib/module/utils/deviceReport.js +128 -0
  47. package/lib/module/utils/deviceReport.js.map +1 -0
  48. package/lib/typescript/src/core/initialize.d.ts.map +1 -1
  49. package/lib/typescript/src/features/network/index.d.ts +2 -0
  50. package/lib/typescript/src/features/network/index.d.ts.map +1 -1
  51. package/lib/typescript/src/features/network/networkInterceptor.d.ts +1 -1
  52. package/lib/typescript/src/features/network/networkInterceptor.d.ts.map +1 -1
  53. package/lib/typescript/src/index.d.ts +5 -0
  54. package/lib/typescript/src/index.d.ts.map +1 -1
  55. package/lib/typescript/src/ui/panel/DebugPanel.d.ts.map +1 -1
  56. package/lib/typescript/src/ui/panel/FloatPanelView.d.ts.map +1 -1
  57. package/lib/typescript/src/ui/panel/StreamingSettingsModal.d.ts +8 -0
  58. package/lib/typescript/src/ui/panel/StreamingSettingsModal.d.ts.map +1 -0
  59. package/lib/typescript/src/ui/panel/useTabAnimation.d.ts +14 -0
  60. package/lib/typescript/src/ui/panel/useTabAnimation.d.ts.map +1 -0
  61. package/lib/typescript/src/utils/DaemonClient.d.ts +141 -0
  62. package/lib/typescript/src/utils/DaemonClient.d.ts.map +1 -0
  63. package/lib/typescript/src/utils/createPersistedObservableStore.d.ts +2 -1
  64. package/lib/typescript/src/utils/createPersistedObservableStore.d.ts.map +1 -1
  65. package/lib/typescript/src/utils/deviceReport.d.ts +18 -0
  66. package/lib/typescript/src/utils/deviceReport.d.ts.map +1 -0
  67. package/node/daemon/src/cli.js +82 -0
  68. package/node/daemon/src/console/console.html +1662 -0
  69. package/node/daemon/src/console/index.js +47 -0
  70. package/node/daemon/src/constants.js +38 -0
  71. package/node/daemon/src/index.js +11 -0
  72. package/node/daemon/src/server.js +447 -0
  73. package/node/daemon/src/store.js +187 -0
  74. package/node/mcp/src/cli.js +31 -0
  75. package/node/mcp/src/constants.js +13 -0
  76. package/node/mcp/src/daemonClient.js +132 -0
  77. package/node/mcp/src/httpClient.js +49 -0
  78. package/node/mcp/src/index.js +15 -0
  79. package/node/mcp/src/logs.js +96 -0
  80. package/node/mcp/src/server.js +144 -0
  81. package/node/mcp/src/tools.js +84 -0
  82. package/package.json +8 -3
  83. package/src/core/initialize.ts +8 -0
  84. package/src/features/network/index.ts +30 -3
  85. package/src/features/network/networkInterceptor.ts +19 -6
  86. package/src/index.ts +22 -0
  87. package/src/ui/panel/DebugPanel.tsx +23 -1
  88. package/src/ui/panel/FloatPanelView.tsx +10 -68
  89. package/src/ui/panel/StreamingSettingsModal.tsx +528 -0
  90. package/src/ui/panel/useTabAnimation.ts +77 -0
  91. package/src/utils/DaemonClient.ts +887 -0
  92. package/src/utils/createPersistedObservableStore.ts +16 -3
  93. package/src/utils/deviceReport.ts +203 -0
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
 
3
3
  import React, { Component, useCallback, useEffect, useRef, useState } from 'react';
4
- import { View, Text, StyleSheet, Animated, PanResponder, Easing } from 'react-native';
4
+ import { View, Text, StyleSheet, Animated } from 'react-native';
5
5
  import { getPreference, setPreference, KEYS } from '../../utils/debugPreferences';
6
6
  import { FloatIcon } from '../floating/FloatIcon';
7
7
  import { DebugPanel } from './DebugPanel';
8
8
  import { FeatureTabBar } from './FeatureTabBar';
9
+ import { useTabAnimation } from './useTabAnimation';
9
10
 
10
11
  // ─── Error Boundary ────────────────────────────────────
11
12
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -52,32 +53,19 @@ export function FloatPanelView({
52
53
  mounted = false;
53
54
  };
54
55
  }, []);
55
-
56
- // Content slide animation
57
- const contentOpacity = useRef(new Animated.Value(1)).current;
58
- const contentTranslateX = useRef(new Animated.Value(0)).current;
59
- const isSwitchingTab = useRef(false);
60
-
61
- // Refs to avoid stale closures in PanResponder
62
- const activeTabRef = useRef(0);
63
- activeTabRef.current = activeTab;
64
- const featuresLengthRef = useRef(features.length);
65
- featuresLengthRef.current = features.length;
66
- const switchTabRef = useRef(() => {});
67
-
68
- // Swipe-to-switch responder
69
- const swipeResponder = useRef(PanResponder.create({
70
- onStartShouldSetPanResponder: () => false,
71
- onMoveShouldSetPanResponder: (_, gs) => {
72
- if (isSwitchingTab.current) return false;
73
- return Math.abs(gs.dx) > 25 && Math.abs(gs.dx) > Math.abs(gs.dy) * 2.5;
74
- },
75
- onPanResponderRelease: (_, gs) => {
76
- const tab = activeTabRef.current;
77
- if (gs.dx < -40 && tab < featuresLengthRef.current - 1) switchTabRef.current(tab + 1);else if (gs.dx > 40 && tab > 0) switchTabRef.current(tab - 1);
78
- },
79
- onPanResponderTerminationRequest: () => true
80
- })).current;
56
+ const {
57
+ contentOpacity,
58
+ contentTranslateX,
59
+ panHandlers,
60
+ switchTab
61
+ } = useTabAnimation({
62
+ activeTab,
63
+ tabCount: features.length,
64
+ onTabChange: useCallback(index => {
65
+ setActiveTab(index);
66
+ setPreference(KEYS.lastTab, String(index));
67
+ }, [])
68
+ });
81
69
 
82
70
  // Feature subscription → re-render on data changes
83
71
  const [, setTick] = useState(0);
@@ -103,41 +91,6 @@ export function FloatPanelView({
103
91
  }
104
92
  }, [features.length, activeTab]);
105
93
 
106
- // Tab switching with content animation
107
- const switchTab = useCallback(index => {
108
- if (isSwitchingTab.current || index === activeTabRef.current) return;
109
- isSwitchingTab.current = true;
110
- const direction = index > activeTabRef.current ? 1 : -1;
111
- Animated.parallel([Animated.timing(contentOpacity, {
112
- toValue: 0,
113
- duration: 80,
114
- useNativeDriver: true
115
- }), Animated.timing(contentTranslateX, {
116
- toValue: -direction * 40,
117
- duration: 80,
118
- useNativeDriver: true
119
- })]).start(() => {
120
- setActiveTab(index);
121
- setPreference(KEYS.lastTab, String(index));
122
- contentTranslateX.setValue(direction * 40);
123
- Animated.parallel([Animated.timing(contentOpacity, {
124
- toValue: 1,
125
- duration: 150,
126
- useNativeDriver: true
127
- }), Animated.timing(contentTranslateX, {
128
- toValue: 0,
129
- duration: 200,
130
- easing: Easing.out(Easing.cubic),
131
- useNativeDriver: true
132
- })]).start(() => {
133
- isSwitchingTab.current = false;
134
- });
135
- });
136
- }, [contentOpacity, contentTranslateX]);
137
-
138
- // Keep ref in sync
139
- switchTabRef.current = switchTab;
140
-
141
94
  // Badge (first feature that returns one)
142
95
  const envBadge = features.map(f => f.badge?.()).find(b => b != null) ?? null;
143
96
  const tabs = features.map(f => ({
@@ -195,7 +148,7 @@ export function FloatPanelView({
195
148
  translateX: contentTranslateX
196
149
  }]
197
150
  }],
198
- ...swipeResponder.panHandlers,
151
+ ...panHandlers,
199
152
  children: renderFeatureContent()
200
153
  })]
201
154
  })]
@@ -1 +1 @@
1
- {"version":3,"names":["React","Component","useCallback","useEffect","useRef","useState","View","Text","StyleSheet","Animated","PanResponder","Easing","getPreference","setPreference","KEYS","FloatIcon","DebugPanel","FeatureTabBar","jsx","_jsx","jsxs","_jsxs","DebugErrorBoundary","state","hasError","getDerivedStateFromError","componentDidCatch","error","info","console","componentStack","props","onError","render","children","FloatPanelView","features","panelOpen","onOpenPanel","onClosePanel","onClearAll","activeTab","setActiveTab","tabLoaded","mounted","lastTab","then","val","idx","parseInt","isNaN","current","contentOpacity","Value","contentTranslateX","isSwitchingTab","activeTabRef","featuresLengthRef","length","switchTabRef","swipeResponder","create","onStartShouldSetPanResponder","onMoveShouldSetPanResponder","_","gs","Math","abs","dx","dy","onPanResponderRelease","tab","onPanResponderTerminationRequest","setTick","refreshQueued","scheduleRefresh","requestAnimationFrame","t","unsubs","map","f","subscribe","filter","u","forEach","switchTab","index","direction","parallel","timing","toValue","duration","useNativeDriver","start","String","setValue","easing","out","cubic","envBadge","badge","find","b","tabs","label","id","name","renderFeatureContent","style","styles","emptyText","feature","snapshot","getSnapshot","TabComponent","renderContent","genericContent","jsonContent","JSON","stringify","container","pointerEvents","visible","onPress","onClose","activeIndex","onSelectTab","contentContainer","opacity","transform","translateX","panHandlers","position","top","left","right","bottom","zIndex","flex","padding","textAlign","color","fontSize","fontFamily"],"sourceRoot":"../../../../src","sources":["ui/panel/FloatPanelView.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","Component","useCallback","useEffect","useRef","useState","View","Text","StyleSheet","Animated","getPreference","setPreference","KEYS","FloatIcon","DebugPanel","FeatureTabBar","useTabAnimation","jsx","_jsx","jsxs","_jsxs","DebugErrorBoundary","state","hasError","getDerivedStateFromError","componentDidCatch","error","info","console","componentStack","props","onError","render","children","FloatPanelView","features","panelOpen","onOpenPanel","onClosePanel","onClearAll","activeTab","setActiveTab","tabLoaded","mounted","lastTab","then","val","idx","parseInt","isNaN","current","contentOpacity","contentTranslateX","panHandlers","switchTab","tabCount","length","onTabChange","index","String","setTick","refreshQueued","scheduleRefresh","requestAnimationFrame","t","unsubs","map","f","subscribe","filter","u","forEach","envBadge","badge","find","b","tabs","label","id","name","renderFeatureContent","style","styles","emptyText","feature","snapshot","getSnapshot","TabComponent","renderContent","genericContent","jsonContent","JSON","stringify","container","pointerEvents","visible","onPress","onClose","activeIndex","onSelectTab","contentContainer","opacity","transform","translateX","create","position","top","left","right","bottom","zIndex","flex","padding","textAlign","color","fontSize","fontFamily"],"sourceRoot":"../../../../src","sources":["ui/panel/FloatPanelView.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,490 @@
1
+ "use strict";
2
+
3
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
4
+ import { KeyboardAvoidingView, Modal, Platform, ScrollView, View, Text, TextInput, TouchableOpacity, StyleSheet, Pressable } from 'react-native';
5
+ import { Colors } from '../theme/colors';
6
+ import { daemonClient, buildDeviceDaemonEndpoint, normalizeDaemonSettings, getDefaultDaemonEndpoint } from '../../utils/DaemonClient';
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ const CONNECTION_TIMEOUT_MS = 2000;
9
+ function formatConnectionFailure() {
10
+ return 'Cannot reach desktop. Try /health in phone browser.';
11
+ }
12
+ export function StreamingSettingsModal({
13
+ visible,
14
+ onClose
15
+ }) {
16
+ const inputRef = useRef(null);
17
+ const [mode, setMode] = useState('simulator');
18
+ const [deviceHost, setDeviceHost] = useState('');
19
+ const [streaming, setStreaming] = useState(daemonClient.isConnected());
20
+ const [syncState, setSyncState] = useState(daemonClient.isConnected() ? 'running' : 'idle');
21
+ const [message, setMessage] = useState(null);
22
+ const [sending, setSending] = useState(false);
23
+ const handleDeviceHostChange = useCallback(value => {
24
+ setDeviceHost(value);
25
+ if (syncState === 'failed') {
26
+ setSyncState('idle');
27
+ }
28
+ setMessage(null);
29
+ }, [syncState]);
30
+ const detectDeviceHost = useCallback(async () => {
31
+ setMessage('Enter your Mac IP, or open /health on the phone browser to verify reachability.');
32
+ }, []);
33
+ useEffect(() => {
34
+ if (visible) {
35
+ const settings = daemonClient.getSettings();
36
+ setMode(settings.mode);
37
+ setDeviceHost(settings.deviceHost);
38
+ }
39
+ }, [visible]);
40
+ useEffect(() => {
41
+ const active = daemonClient.isConnected();
42
+ setStreaming(active);
43
+ setSyncState(active ? 'running' : 'idle');
44
+ }, [visible]);
45
+ const getSettings = useCallback(() => ({
46
+ mode,
47
+ endpoint: '',
48
+ deviceHost,
49
+ token: ''
50
+ }), [deviceHost, mode]);
51
+ const validateSettings = useCallback(() => {
52
+ if (mode === 'device' && !deviceHost.trim()) {
53
+ setMessage('Enter your Mac IP first.');
54
+ return false;
55
+ }
56
+ return true;
57
+ }, [deviceHost, mode]);
58
+ const handleModeChange = useCallback(nextMode => {
59
+ setMode(nextMode);
60
+ }, []);
61
+ const toggleLiveSync = useCallback(async () => {
62
+ if (streaming) {
63
+ daemonClient.disconnect();
64
+ daemonClient.setStreamingEnabled(false);
65
+ setStreaming(false);
66
+ setSyncState('idle');
67
+ setMessage(null);
68
+ return;
69
+ }
70
+ if (!validateSettings()) {
71
+ return;
72
+ }
73
+ const settings = getSettings();
74
+ const daemonOptions = normalizeDaemonSettings(settings);
75
+ setMessage('Checking desktop connection...');
76
+ setSyncState('connecting');
77
+ daemonClient.configure(settings);
78
+ const connection = await daemonClient.checkConnection({
79
+ ...daemonOptions,
80
+ timeoutMs: CONNECTION_TIMEOUT_MS
81
+ });
82
+ if (!connection.ok) {
83
+ setStreaming(false);
84
+ setSyncState('failed');
85
+ setMessage(formatConnectionFailure());
86
+ return;
87
+ }
88
+ daemonClient.setStreamingEnabled(true);
89
+ daemonClient.connect({
90
+ ...daemonOptions,
91
+ timeoutMs: 3000,
92
+ onStatus: status => {
93
+ if (status.state === 'connected') {
94
+ setSyncState('connected');
95
+ setMessage(null);
96
+ } else if (status.state === 'retrying') {
97
+ setSyncState('retrying');
98
+ setMessage('Desktop not reachable. Retrying...');
99
+ } else if (status.state === 'failed') {
100
+ setStreaming(false);
101
+ setSyncState('failed');
102
+ setMessage(status.reason === 'auth' ? 'Desktop token rejected.' : 'Desktop not reachable after multiple retries.');
103
+ } else {
104
+ setSyncState('connecting');
105
+ }
106
+ }
107
+ });
108
+ setStreaming(true);
109
+ }, [getSettings, streaming, validateSettings]);
110
+ const sendOnce = useCallback(async () => {
111
+ if (!validateSettings()) {
112
+ return;
113
+ }
114
+ const settings = getSettings();
115
+ const daemonOptions = normalizeDaemonSettings(settings);
116
+ setSending(true);
117
+ setMessage('Checking desktop connection...');
118
+ daemonClient.configure(settings);
119
+ try {
120
+ const connection = await daemonClient.checkConnection({
121
+ ...daemonOptions,
122
+ timeoutMs: CONNECTION_TIMEOUT_MS
123
+ });
124
+ if (!connection.ok) {
125
+ setMessage(formatConnectionFailure());
126
+ return;
127
+ }
128
+ setMessage('Sending logs...');
129
+ const result = await daemonClient.reportOnce({
130
+ ...daemonOptions,
131
+ timeoutMs: 2000
132
+ });
133
+ if (result.ok) {
134
+ const totalLogs = Object.values(result.logCount ?? {}).reduce((total, count) => total + count, 0);
135
+ setMessage(`Sent ${totalLogs} logs.`);
136
+ } else {
137
+ setMessage(result.error ? `Send failed: ${result.error}` : 'Send failed.');
138
+ }
139
+ } finally {
140
+ setSending(false);
141
+ }
142
+ }, [getSettings, validateSettings]);
143
+ const target = mode === 'device' ? buildDeviceDaemonEndpoint(deviceHost) || 'Enter Mac IP' : getDefaultDaemonEndpoint();
144
+ const canConnect = mode === 'simulator' || Boolean(deviceHost.trim());
145
+ const connecting = !streaming && syncState === 'connecting';
146
+ const busy = sending || connecting;
147
+ const statusTitle = sending ? 'Checking' : connecting ? 'Checking' : streaming && syncState === 'connected' ? 'Live sync connected' : streaming && syncState === 'retrying' ? 'Retrying desktop sync' : syncState === 'failed' ? 'Failed' : streaming ? 'Live sync running' : mode === 'device' && !deviceHost.trim() ? 'Enter Mac IP' : 'Ready';
148
+ return /*#__PURE__*/_jsx(Modal, {
149
+ visible: visible,
150
+ transparent: true,
151
+ animationType: "fade",
152
+ onRequestClose: onClose,
153
+ children: /*#__PURE__*/_jsx(KeyboardAvoidingView, {
154
+ style: styles.keyboardAvoiding,
155
+ behavior: Platform.OS === 'ios' ? 'padding' : undefined,
156
+ children: /*#__PURE__*/_jsx(Pressable, {
157
+ style: styles.backdrop,
158
+ onPress: onClose,
159
+ children: /*#__PURE__*/_jsxs(Pressable, {
160
+ style: styles.sheet,
161
+ onPress: e => e.stopPropagation(),
162
+ children: [/*#__PURE__*/_jsx(View, {
163
+ style: styles.handle
164
+ }), /*#__PURE__*/_jsxs(View, {
165
+ style: styles.header,
166
+ children: [/*#__PURE__*/_jsx(Text, {
167
+ style: styles.title,
168
+ children: "Desktop Logs"
169
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
170
+ onPress: onClose,
171
+ style: styles.closeButton,
172
+ activeOpacity: 0.7,
173
+ children: /*#__PURE__*/_jsx(Text, {
174
+ style: styles.closeButtonText,
175
+ children: "Close"
176
+ })
177
+ })]
178
+ }), /*#__PURE__*/_jsxs(ScrollView, {
179
+ keyboardShouldPersistTaps: "handled",
180
+ showsVerticalScrollIndicator: false,
181
+ contentContainerStyle: styles.scrollContent,
182
+ children: [/*#__PURE__*/_jsxs(View, {
183
+ style: styles.statusCard,
184
+ children: [/*#__PURE__*/_jsx(View, {
185
+ style: [styles.statusDot, streaming ? styles.dotActive : styles.dotInactive]
186
+ }), /*#__PURE__*/_jsxs(View, {
187
+ style: styles.statusCopy,
188
+ children: [/*#__PURE__*/_jsx(Text, {
189
+ style: styles.statusTitle,
190
+ children: statusTitle
191
+ }), /*#__PURE__*/_jsx(Text, {
192
+ style: styles.statusTarget,
193
+ numberOfLines: 1,
194
+ children: target
195
+ })]
196
+ })]
197
+ }), /*#__PURE__*/_jsxs(View, {
198
+ style: styles.section,
199
+ children: [/*#__PURE__*/_jsx(Text, {
200
+ style: styles.label,
201
+ children: "Connection"
202
+ }), /*#__PURE__*/_jsxs(View, {
203
+ style: styles.segment,
204
+ children: [/*#__PURE__*/_jsx(TouchableOpacity, {
205
+ style: [styles.segmentButton, mode === 'simulator' && styles.segmentButtonActive],
206
+ onPress: () => handleModeChange('simulator'),
207
+ disabled: streaming,
208
+ activeOpacity: 0.7,
209
+ children: /*#__PURE__*/_jsx(Text, {
210
+ style: [styles.segmentText, mode === 'simulator' && styles.segmentTextActive],
211
+ children: "Simulator"
212
+ })
213
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
214
+ style: [styles.segmentButton, mode === 'device' && styles.segmentButtonActive],
215
+ onPress: () => handleModeChange('device'),
216
+ disabled: streaming,
217
+ activeOpacity: 0.7,
218
+ children: /*#__PURE__*/_jsx(Text, {
219
+ style: [styles.segmentText, mode === 'device' && styles.segmentTextActive],
220
+ children: "Real device"
221
+ })
222
+ })]
223
+ })]
224
+ }), mode === 'device' ? /*#__PURE__*/_jsx(View, {
225
+ style: styles.section,
226
+ children: /*#__PURE__*/_jsxs(View, {
227
+ style: styles.inputRow,
228
+ children: [/*#__PURE__*/_jsx(Text, {
229
+ style: styles.inputLabel,
230
+ children: "Mac IP"
231
+ }), /*#__PURE__*/_jsx(TextInput, {
232
+ ref: inputRef,
233
+ style: styles.input,
234
+ value: deviceHost,
235
+ onChangeText: handleDeviceHostChange,
236
+ placeholder: "192.168.1.10",
237
+ placeholderTextColor: Colors.textLight,
238
+ autoCapitalize: "none",
239
+ autoCorrect: false,
240
+ keyboardType: "numbers-and-punctuation",
241
+ returnKeyType: "done",
242
+ onSubmitEditing: () => inputRef.current?.blur(),
243
+ editable: !streaming
244
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
245
+ style: [styles.detectButton, (streaming || busy) && styles.buttonDisabled],
246
+ onPress: detectDeviceHost,
247
+ disabled: streaming || busy,
248
+ activeOpacity: 0.7,
249
+ children: /*#__PURE__*/_jsx(Text, {
250
+ style: styles.detectButtonText,
251
+ children: "?"
252
+ })
253
+ })]
254
+ })
255
+ }) : null, message ? /*#__PURE__*/_jsx(Text, {
256
+ style: styles.message,
257
+ children: message
258
+ }) : null, /*#__PURE__*/_jsxs(View, {
259
+ style: styles.actions,
260
+ children: [/*#__PURE__*/_jsx(TouchableOpacity, {
261
+ style: [styles.primaryButton, (!canConnect || busy) && styles.buttonDisabled],
262
+ onPress: toggleLiveSync,
263
+ disabled: !canConnect || busy,
264
+ activeOpacity: 0.75,
265
+ children: /*#__PURE__*/_jsx(Text, {
266
+ style: styles.primaryButtonText,
267
+ children: streaming ? 'Stop Live Sync' : busy ? 'Checking...' : 'Start Live Sync'
268
+ })
269
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
270
+ style: [styles.secondaryButton, (!canConnect || busy) && styles.buttonDisabled],
271
+ onPress: sendOnce,
272
+ disabled: !canConnect || busy,
273
+ activeOpacity: 0.75,
274
+ children: /*#__PURE__*/_jsx(Text, {
275
+ style: styles.secondaryButtonText,
276
+ children: sending ? 'Sending...' : 'Send Once'
277
+ })
278
+ })]
279
+ })]
280
+ })]
281
+ })
282
+ })
283
+ })
284
+ });
285
+ }
286
+ const styles = StyleSheet.create({
287
+ keyboardAvoiding: {
288
+ flex: 1
289
+ },
290
+ backdrop: {
291
+ flex: 1,
292
+ backgroundColor: 'rgba(0,0,0,0.4)',
293
+ justifyContent: 'flex-end'
294
+ },
295
+ sheet: {
296
+ backgroundColor: Colors.surface,
297
+ borderTopLeftRadius: 20,
298
+ borderTopRightRadius: 20,
299
+ paddingHorizontal: 20,
300
+ paddingTop: 12,
301
+ paddingBottom: 20,
302
+ maxHeight: '82%'
303
+ },
304
+ handle: {
305
+ width: 40,
306
+ height: 4,
307
+ borderRadius: 2,
308
+ backgroundColor: Colors.textLight,
309
+ alignSelf: 'center',
310
+ marginBottom: 16
311
+ },
312
+ header: {
313
+ flexDirection: 'row',
314
+ alignItems: 'center',
315
+ justifyContent: 'space-between',
316
+ marginBottom: 14
317
+ },
318
+ title: {
319
+ fontSize: 18,
320
+ fontWeight: '600',
321
+ color: Colors.text
322
+ },
323
+ closeButton: {
324
+ paddingHorizontal: 4,
325
+ paddingVertical: 4
326
+ },
327
+ closeButtonText: {
328
+ fontSize: 14,
329
+ fontWeight: '500',
330
+ color: Colors.primary
331
+ },
332
+ scrollContent: {
333
+ paddingBottom: 4
334
+ },
335
+ statusCard: {
336
+ flexDirection: 'row',
337
+ alignItems: 'center',
338
+ gap: 10,
339
+ padding: 12,
340
+ borderRadius: 8,
341
+ backgroundColor: Colors.background,
342
+ borderWidth: 1,
343
+ borderColor: Colors.border,
344
+ marginBottom: 16
345
+ },
346
+ statusCopy: {
347
+ flex: 1
348
+ },
349
+ statusTitle: {
350
+ fontSize: 14,
351
+ fontWeight: '600',
352
+ color: Colors.text
353
+ },
354
+ statusTarget: {
355
+ marginTop: 2,
356
+ fontSize: 12,
357
+ color: Colors.textLight,
358
+ fontFamily: 'Courier'
359
+ },
360
+ section: {
361
+ marginBottom: 14
362
+ },
363
+ label: {
364
+ fontSize: 13,
365
+ fontWeight: '500',
366
+ color: Colors.textSecondary,
367
+ marginBottom: 6
368
+ },
369
+ segment: {
370
+ flexDirection: 'row',
371
+ padding: 3,
372
+ borderRadius: 10,
373
+ backgroundColor: Colors.background,
374
+ borderWidth: 1,
375
+ borderColor: Colors.border
376
+ },
377
+ segmentButton: {
378
+ flex: 1,
379
+ alignItems: 'center',
380
+ paddingVertical: 9,
381
+ borderRadius: 7
382
+ },
383
+ segmentButtonActive: {
384
+ backgroundColor: Colors.surface,
385
+ borderWidth: 1,
386
+ borderColor: Colors.primary
387
+ },
388
+ segmentText: {
389
+ fontSize: 13,
390
+ fontWeight: '500',
391
+ color: Colors.textSecondary
392
+ },
393
+ segmentTextActive: {
394
+ color: Colors.primary,
395
+ fontWeight: '600'
396
+ },
397
+ inputRow: {
398
+ flexDirection: 'row',
399
+ alignItems: 'center',
400
+ gap: 8
401
+ },
402
+ inputLabel: {
403
+ width: 50,
404
+ fontSize: 13,
405
+ fontWeight: '600',
406
+ color: Colors.textSecondary
407
+ },
408
+ input: {
409
+ flex: 1,
410
+ backgroundColor: Colors.background,
411
+ borderWidth: 1,
412
+ borderColor: Colors.border,
413
+ borderRadius: 8,
414
+ paddingHorizontal: 12,
415
+ paddingVertical: 10,
416
+ fontSize: 14,
417
+ color: Colors.text,
418
+ fontFamily: 'Courier'
419
+ },
420
+ detectButton: {
421
+ minWidth: 68,
422
+ alignItems: 'center',
423
+ justifyContent: 'center',
424
+ paddingHorizontal: 10,
425
+ paddingVertical: 10,
426
+ borderRadius: 8,
427
+ backgroundColor: Colors.surface,
428
+ borderWidth: 1,
429
+ borderColor: Colors.primary
430
+ },
431
+ detectButtonText: {
432
+ color: Colors.primary,
433
+ fontSize: 13,
434
+ fontWeight: '600'
435
+ },
436
+ statusDot: {
437
+ width: 8,
438
+ height: 8,
439
+ borderRadius: 4
440
+ },
441
+ dotActive: {
442
+ backgroundColor: Colors.success
443
+ },
444
+ dotInactive: {
445
+ backgroundColor: Colors.textLight
446
+ },
447
+ message: {
448
+ fontSize: 12,
449
+ lineHeight: 17,
450
+ color: Colors.textSecondary,
451
+ marginBottom: 12
452
+ },
453
+ actions: {
454
+ flexDirection: 'row',
455
+ gap: 10,
456
+ marginTop: 4
457
+ },
458
+ primaryButton: {
459
+ flex: 1,
460
+ alignItems: 'center',
461
+ justifyContent: 'center',
462
+ paddingVertical: 11,
463
+ borderRadius: 10,
464
+ backgroundColor: Colors.primary
465
+ },
466
+ primaryButtonText: {
467
+ color: '#fff',
468
+ fontSize: 14,
469
+ fontWeight: '600'
470
+ },
471
+ secondaryButton: {
472
+ flex: 1,
473
+ alignItems: 'center',
474
+ justifyContent: 'center',
475
+ paddingVertical: 11,
476
+ borderRadius: 10,
477
+ backgroundColor: Colors.background,
478
+ borderWidth: 1,
479
+ borderColor: Colors.border
480
+ },
481
+ secondaryButtonText: {
482
+ color: Colors.primary,
483
+ fontSize: 14,
484
+ fontWeight: '600'
485
+ },
486
+ buttonDisabled: {
487
+ opacity: 0.5
488
+ }
489
+ });
490
+ //# sourceMappingURL=StreamingSettingsModal.js.map