react-native-debug-toolkit 3.2.1 → 3.2.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 (66) hide show
  1. package/README.md +13 -2
  2. package/README.zh-CN.md +13 -2
  3. package/android/build.gradle +34 -0
  4. package/android/src/main/AndroidManifest.xml +1 -0
  5. package/android/src/main/java/com/reactnativedebugtoolkit/DebugToolkitDevConnectModule.java +70 -0
  6. package/android/src/main/java/com/reactnativedebugtoolkit/ReactNativeDebugToolkitPackage.java +25 -0
  7. package/ios/DebugToolkitDevConnect.mm +67 -0
  8. package/lib/commonjs/features/devConnect/DevConnectQrScanner.js +18 -7
  9. package/lib/commonjs/features/devConnect/DevConnectQrScanner.js.map +1 -1
  10. package/lib/commonjs/features/devConnect/DevConnectTab.js +232 -161
  11. package/lib/commonjs/features/devConnect/DevConnectTab.js.map +1 -1
  12. package/lib/commonjs/features/devConnect/devConnectPreferences.js +35 -5
  13. package/lib/commonjs/features/devConnect/devConnectPreferences.js.map +1 -1
  14. package/lib/commonjs/features/devConnect/devConnectUtils.js +99 -15
  15. package/lib/commonjs/features/devConnect/devConnectUtils.js.map +1 -1
  16. package/lib/commonjs/features/devConnect/index.js +39 -2
  17. package/lib/commonjs/features/devConnect/index.js.map +1 -1
  18. package/lib/commonjs/features/devConnect/nativeDevConnect.js +110 -0
  19. package/lib/commonjs/features/devConnect/nativeDevConnect.js.map +1 -0
  20. package/lib/commonjs/features/devConnect/platformDetect.js +7 -11
  21. package/lib/commonjs/features/devConnect/platformDetect.js.map +1 -1
  22. package/lib/commonjs/utils/debugPreferences.js +43 -6
  23. package/lib/commonjs/utils/debugPreferences.js.map +1 -1
  24. package/lib/module/features/devConnect/DevConnectQrScanner.js +18 -7
  25. package/lib/module/features/devConnect/DevConnectQrScanner.js.map +1 -1
  26. package/lib/module/features/devConnect/DevConnectTab.js +235 -164
  27. package/lib/module/features/devConnect/DevConnectTab.js.map +1 -1
  28. package/lib/module/features/devConnect/devConnectPreferences.js +33 -6
  29. package/lib/module/features/devConnect/devConnectPreferences.js.map +1 -1
  30. package/lib/module/features/devConnect/devConnectUtils.js +94 -15
  31. package/lib/module/features/devConnect/devConnectUtils.js.map +1 -1
  32. package/lib/module/features/devConnect/index.js +11 -3
  33. package/lib/module/features/devConnect/index.js.map +1 -1
  34. package/lib/module/features/devConnect/nativeDevConnect.js +104 -0
  35. package/lib/module/features/devConnect/nativeDevConnect.js.map +1 -0
  36. package/lib/module/features/devConnect/platformDetect.js +8 -12
  37. package/lib/module/features/devConnect/platformDetect.js.map +1 -1
  38. package/lib/module/utils/debugPreferences.js +43 -6
  39. package/lib/module/utils/debugPreferences.js.map +1 -1
  40. package/lib/typescript/src/features/devConnect/DevConnectQrScanner.d.ts +3 -2
  41. package/lib/typescript/src/features/devConnect/DevConnectQrScanner.d.ts.map +1 -1
  42. package/lib/typescript/src/features/devConnect/DevConnectTab.d.ts.map +1 -1
  43. package/lib/typescript/src/features/devConnect/devConnectPreferences.d.ts +6 -0
  44. package/lib/typescript/src/features/devConnect/devConnectPreferences.d.ts.map +1 -1
  45. package/lib/typescript/src/features/devConnect/devConnectUtils.d.ts +18 -1
  46. package/lib/typescript/src/features/devConnect/devConnectUtils.d.ts.map +1 -1
  47. package/lib/typescript/src/features/devConnect/index.d.ts +2 -2
  48. package/lib/typescript/src/features/devConnect/index.d.ts.map +1 -1
  49. package/lib/typescript/src/features/devConnect/nativeDevConnect.d.ts +17 -0
  50. package/lib/typescript/src/features/devConnect/nativeDevConnect.d.ts.map +1 -0
  51. package/lib/typescript/src/features/devConnect/platformDetect.d.ts.map +1 -1
  52. package/lib/typescript/src/features/devConnect/types.d.ts +3 -0
  53. package/lib/typescript/src/features/devConnect/types.d.ts.map +1 -1
  54. package/lib/typescript/src/utils/debugPreferences.d.ts +2 -0
  55. package/lib/typescript/src/utils/debugPreferences.d.ts.map +1 -1
  56. package/package.json +4 -1
  57. package/react-native-debug-toolkit.podspec +18 -0
  58. package/src/features/devConnect/DevConnectQrScanner.tsx +20 -9
  59. package/src/features/devConnect/DevConnectTab.tsx +227 -105
  60. package/src/features/devConnect/devConnectPreferences.ts +50 -5
  61. package/src/features/devConnect/devConnectUtils.ts +122 -15
  62. package/src/features/devConnect/index.ts +13 -0
  63. package/src/features/devConnect/nativeDevConnect.ts +128 -0
  64. package/src/features/devConnect/platformDetect.ts +8 -13
  65. package/src/features/devConnect/types.ts +3 -0
  66. package/src/utils/debugPreferences.ts +49 -4
@@ -1 +1 @@
1
- {"version":3,"names":["React","Component","useCallback","useEffect","useRef","useState","Modal","Pressable","StyleSheet","Text","TouchableOpacity","View","Colors","getScannerModule","parseMetroQrPayload","jsx","_jsx","jsxs","_jsxs","CameraErrorBoundary","state","hasError","getDerivedStateFromError","componentDidCatch","error","console","warn","message","props","onCameraError","render","children","DevConnectQrScanner","visible","onClose","onScanHost","scannedRef","setError","cameraFailed","setCameraFailed","scanner","current","handleScanned","rawValue","parsed","computerHost","handleCameraKitRead","event","nativeEvent","codeStringValue","handleExpoScanned","result","value","handleCameraError","_msg","animationType","onRequestClose","style","styles","container","kind","CameraKit","Camera","camera","cameraType","CameraType","Back","scanBarcode","onReadCode","showFrame","laserColor","primary","frameColor","allowedBarcodeTypes","ExpoCamera","onBarCodeScanned","barCodeScannerSettings","barCodeTypes","cameraFallback","cameraFallbackText","cameraFallbackHint","footer","hint","closeButton","onPress","activeOpacity","closeButtonText","topClose","topCloseText","create","flex","backgroundColor","justifyContent","alignItems","padding","fontSize","color","fontWeight","marginBottom","textAlign","surface","textSecondary","paddingVertical","borderRadius","position","top","right","paddingHorizontal"],"sourceRoot":"../../../../src","sources":["features/devConnect/DevConnectQrScanner.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","Component","useCallback","useEffect","useRef","useState","Modal","Pressable","StyleSheet","Text","TouchableOpacity","View","Colors","getScannerModule","parseMetroQrPayload","jsx","_jsx","jsxs","_jsxs","CameraErrorBoundary","state","hasError","getDerivedStateFromError","componentDidCatch","error","console","warn","message","props","onCameraError","render","children","DevConnectQrScanner","visible","onClose","onScanTarget","scannedRef","setError","cameraFailed","setCameraFailed","scanner","current","handleScanned","rawValue","parsed","computerHost","metroPort","handleCameraKitRead","event","nativeEvent","codeStringValue","handleExpoScanned","result","value","handleCameraError","_msg","animationType","onRequestClose","style","styles","container","kind","CameraKit","Camera","camera","cameraType","CameraType","Back","scanBarcode","onReadCode","showFrame","laserColor","primary","frameColor","allowedBarcodeTypes","ExpoCamera","onBarCodeScanned","barCodeScannerSettings","barCodeTypes","cameraFallback","cameraFallbackText","cameraFallbackHint","footer","hint","closeButton","onPress","activeOpacity","closeButtonText","topClose","topCloseText","create","flex","backgroundColor","justifyContent","alignItems","padding","fontSize","color","fontWeight","marginBottom","textAlign","surface","textSecondary","paddingVertical","borderRadius","position","top","right","paddingHorizontal"],"sourceRoot":"../../../../src","sources":["features/devConnect/DevConnectQrScanner.tsx"],"mappings":"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","ignoreList":[]}
@@ -3,46 +3,85 @@
3
3
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { KeyboardAvoidingView, Platform, ScrollView, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native';
5
5
  import { Colors } from '../../ui/theme/colors';
6
- import { copyToComputer } from '../../utils/copyToComputer';
7
6
  import { buildDeviceDaemonEndpoint, daemonClient, getDefaultDaemonEndpoint, normalizeDaemonSettings } from '../../utils/DaemonClient';
8
- import { buildMetroUrls, normalizeComputerHost } from './devConnectUtils';
9
- import { saveComputerHost } from './devConnectPreferences';
7
+ import { DEFAULT_DAEMON_PORT, DEFAULT_METRO_PORT, buildDaemonDeviceHost, buildMetroTarget, buildMetroUrls, normalizeComputerHost, normalizePort, parseComputerTarget } from './devConnectUtils';
8
+ import { saveComputerTarget, saveDaemonPort, saveMetroPort } from './devConnectPreferences';
9
+ import { applyMetroBundle, resetMetroBundle } from './nativeDevConnect';
10
10
  import { DevConnectQrScanner } from './DevConnectQrScanner';
11
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
11
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
12
12
  const CONNECTION_TIMEOUT_MS = 2000;
13
- const METRO_PORT = '8081';
13
+ function getSimulatorMetroHost() {
14
+ return Platform.OS === 'android' ? '10.0.2.2' : 'localhost';
15
+ }
16
+ function describeMetroFailure(result) {
17
+ if (result.reason === 'native_unavailable') {
18
+ return 'Native DevConnect not installed. Rebuild app after installing native module.';
19
+ }
20
+ if (result.reason === 'metro_unreachable') {
21
+ return result.error ? `Metro not reachable: ${result.error}` : 'Metro not reachable. Start Metro on that port.';
22
+ }
23
+ if (result.reason === 'fetch_unavailable') {
24
+ return 'Cannot check Metro because fetch is unavailable.';
25
+ }
26
+ if (result.reason === 'invalid_target') {
27
+ return 'Enter a valid computer IP and Metro port.';
28
+ }
29
+ return result.error ? `Metro switch failed: ${result.error}` : 'Metro switch failed.';
30
+ }
14
31
  export function DevConnectTab({
15
32
  snapshot
16
33
  }) {
17
34
  const inputRef = useRef(null);
18
35
  const [computerHost, setComputerHost] = useState(snapshot.computerHost);
36
+ const [metroPort, setMetroPort] = useState(snapshot.metroPort);
37
+ const [daemonPort, setDaemonPort] = useState(snapshot.daemonPort);
19
38
  const [streaming, setStreaming] = useState(snapshot.streaming);
20
39
  const [syncState, setSyncState] = useState(snapshot.streaming ? 'running' : 'idle');
21
40
  const [message, setMessage] = useState(null);
22
41
  const [sending, setSending] = useState(false);
42
+ const [metroBusy, setMetroBusy] = useState(false);
23
43
  const [qrVisible, setQrVisible] = useState(false);
24
44
  const isSim = snapshot.isSimulator;
25
45
  useEffect(() => {
26
46
  setComputerHost(snapshot.computerHost);
47
+ setMetroPort(snapshot.metroPort);
48
+ setDaemonPort(snapshot.daemonPort);
27
49
  setStreaming(snapshot.streaming);
28
50
  setSyncState(snapshot.streaming ? 'running' : 'idle');
29
- }, [snapshot.computerHost, snapshot.streaming]);
30
- const metroUrls = useMemo(() => isSim ? {
31
- expUrl: `exp://localhost:${METRO_PORT}`,
32
- httpUrl: `http://localhost:${METRO_PORT}`
33
- } : buildMetroUrls(computerHost), [isSim, computerHost]);
51
+ }, [snapshot.computerHost, snapshot.daemonPort, snapshot.metroPort, snapshot.streaming]);
52
+ const metroHost = isSim ? getSimulatorMetroHost() : computerHost;
53
+ const metroTarget = useMemo(() => buildMetroTarget(metroHost, metroPort), [metroHost, metroPort]);
54
+ const metroUrls = useMemo(() => buildMetroUrls(metroHost, metroPort), [metroHost, metroPort]);
34
55
  const handleHostChange = useCallback(value => {
35
56
  setComputerHost(value);
36
- const normalized = normalizeComputerHost(value);
37
- if (normalized) {
38
- saveComputerHost(normalized).catch(() => {});
57
+ const target = parseComputerTarget(value);
58
+ if (target) {
59
+ setMetroPort(target.metroPort);
60
+ saveComputerTarget(value).catch(() => {});
39
61
  }
40
62
  setSyncState(prev => prev === 'failed' ? 'idle' : prev);
41
63
  setMessage(null);
42
64
  }, []);
43
- const handleQrHost = useCallback(host => {
44
- setComputerHost(host);
45
- saveComputerHost(host).catch(() => {});
65
+ const handleMetroPortChange = useCallback(value => {
66
+ setMetroPort(value);
67
+ const normalized = normalizePort(value);
68
+ if (normalized) {
69
+ saveMetroPort(normalized).catch(() => {});
70
+ }
71
+ setMessage(null);
72
+ }, []);
73
+ const handleDaemonPortChange = useCallback(value => {
74
+ setDaemonPort(value);
75
+ const normalized = normalizePort(value);
76
+ if (normalized) {
77
+ saveDaemonPort(normalized).catch(() => {});
78
+ }
79
+ setMessage(null);
80
+ }, []);
81
+ const handleQrTarget = useCallback(target => {
82
+ setComputerHost(target.computerHost);
83
+ setMetroPort(target.metroPort);
84
+ saveComputerTarget(`${target.computerHost}:${target.metroPort}`).catch(() => {});
46
85
  setMessage('Computer IP updated from QR code.');
47
86
  }, []);
48
87
  const validateSettings = useCallback(() => {
@@ -50,24 +89,30 @@ export function DevConnectTab({
50
89
  setMessage('Enter your computer IP first.');
51
90
  return false;
52
91
  }
92
+ if (!normalizePort(daemonPort)) {
93
+ setMessage('Enter a valid desktop logs port.');
94
+ return false;
95
+ }
53
96
  return true;
54
- }, [computerHost, isSim]);
97
+ }, [computerHost, daemonPort, isSim]);
55
98
  const configureDaemon = useCallback(() => {
56
99
  const normalizedHost = isSim ? '' : normalizeComputerHost(computerHost) ?? '';
100
+ const normalizedDaemonPort = normalizePort(daemonPort) ?? DEFAULT_DAEMON_PORT;
101
+ const deviceHost = isSim ? '' : buildDaemonDeviceHost(normalizedHost, normalizedDaemonPort);
57
102
  const settings = {
58
103
  mode: isSim ? 'simulator' : 'device',
59
104
  endpoint: '',
60
- deviceHost: normalizedHost,
105
+ deviceHost,
61
106
  token: ''
62
107
  };
63
108
  daemonClient.configure(settings);
64
109
  const normalized = normalizeDaemonSettings(settings);
65
- const endpoint = normalized.endpoint || (isSim ? getDefaultDaemonEndpoint() : buildDeviceDaemonEndpoint(normalizedHost));
110
+ const endpoint = normalized.endpoint || (isSim ? getDefaultDaemonEndpoint() : buildDeviceDaemonEndpoint(deviceHost));
66
111
  return {
67
112
  ...normalized,
68
113
  endpoint
69
114
  };
70
- }, [computerHost, isSim]);
115
+ }, [computerHost, daemonPort, isSim]);
71
116
  const toggleLiveSync = useCallback(async () => {
72
117
  if (streaming) {
73
118
  daemonClient.disconnect();
@@ -77,7 +122,9 @@ export function DevConnectTab({
77
122
  setMessage(null);
78
123
  return;
79
124
  }
80
- if (!validateSettings()) return;
125
+ if (!validateSettings()) {
126
+ return;
127
+ }
81
128
  const daemonOptions = configureDaemon();
82
129
  setMessage('Checking desktop connection...');
83
130
  setSyncState('checking');
@@ -115,7 +162,9 @@ export function DevConnectTab({
115
162
  setStreaming(true);
116
163
  }, [configureDaemon, streaming, validateSettings]);
117
164
  const sendOnce = useCallback(async () => {
118
- if (!validateSettings()) return;
165
+ if (!validateSettings()) {
166
+ return;
167
+ }
119
168
  const daemonOptions = configureDaemon();
120
169
  setSending(true);
121
170
  setMessage('Checking desktop connection...');
@@ -143,17 +192,51 @@ export function DevConnectTab({
143
192
  setSending(false);
144
193
  }
145
194
  }, [configureDaemon, validateSettings]);
146
- const messageTimerRef = useRef();
147
- const copyUrl = useCallback((label, url) => {
148
- copyToComputer(url, {
149
- label
150
- });
151
- setMessage('Copied to computer output.');
152
- clearTimeout(messageTimerRef.current);
153
- messageTimerRef.current = setTimeout(() => setMessage(null), 1500);
154
- }, []);
155
- useEffect(() => () => clearTimeout(messageTimerRef.current), []);
156
- const canConnect = isSim || Boolean(normalizeComputerHost(computerHost));
195
+ const applyRemoteBundle = useCallback(async () => {
196
+ if (!metroTarget) {
197
+ setMessage('Enter a valid computer IP and Metro port.');
198
+ return;
199
+ }
200
+ if (!snapshot.nativeMetroAvailable) {
201
+ setMessage(describeMetroFailure({
202
+ reason: 'native_unavailable'
203
+ }));
204
+ return;
205
+ }
206
+ setMetroBusy(true);
207
+ setMessage('Checking Metro...');
208
+ try {
209
+ const result = await applyMetroBundle(metroTarget.host, metroTarget.port);
210
+ if (result.ok) {
211
+ setMessage(`Using Metro at ${result.hostPort}. Reloading...`);
212
+ } else {
213
+ setMessage(describeMetroFailure(result));
214
+ }
215
+ } finally {
216
+ setMetroBusy(false);
217
+ }
218
+ }, [metroTarget, snapshot.nativeMetroAvailable]);
219
+ const resetRemoteBundle = useCallback(async () => {
220
+ if (!snapshot.nativeMetroAvailable) {
221
+ setMessage(describeMetroFailure({
222
+ reason: 'native_unavailable'
223
+ }));
224
+ return;
225
+ }
226
+ setMetroBusy(true);
227
+ try {
228
+ const result = await resetMetroBundle();
229
+ if (result.ok) {
230
+ setMessage('Metro host reset. Reloading...');
231
+ } else {
232
+ setMessage(describeMetroFailure(result));
233
+ }
234
+ } finally {
235
+ setMetroBusy(false);
236
+ }
237
+ }, [snapshot.nativeMetroAvailable]);
238
+ const canConnect = isSim || Boolean(normalizeComputerHost(computerHost)) && Boolean(normalizePort(daemonPort));
239
+ const canUseMetro = Boolean(metroTarget) && snapshot.nativeMetroAvailable && !metroBusy;
157
240
  const busy = sending || syncState === 'checking';
158
241
  return /*#__PURE__*/_jsxs(KeyboardAvoidingView, {
159
242
  style: styles.container,
@@ -164,9 +247,9 @@ export function DevConnectTab({
164
247
  contentContainerStyle: styles.scrollContent,
165
248
  children: [isSim ? /*#__PURE__*/_jsx(View, {
166
249
  style: styles.badge,
167
- children: /*#__PURE__*/_jsx(Text, {
250
+ children: /*#__PURE__*/_jsxs(Text, {
168
251
  style: styles.badgeText,
169
- children: "Simulator \u2014 using localhost"
252
+ children: ["Simulator/emulator - using ", getSimulatorMetroHost()]
170
253
  })
171
254
  }) : /*#__PURE__*/_jsxs(View, {
172
255
  style: styles.section,
@@ -199,6 +282,47 @@ export function DevConnectTab({
199
282
  })
200
283
  }) : null]
201
284
  })]
285
+ }), /*#__PURE__*/_jsxs(View, {
286
+ style: styles.section,
287
+ children: [/*#__PURE__*/_jsx(Text, {
288
+ style: styles.label,
289
+ children: "Ports"
290
+ }), /*#__PURE__*/_jsxs(View, {
291
+ style: styles.portRow,
292
+ children: [/*#__PURE__*/_jsxs(View, {
293
+ style: styles.portField,
294
+ children: [/*#__PURE__*/_jsx(Text, {
295
+ style: styles.portLabel,
296
+ children: "Metro"
297
+ }), /*#__PURE__*/_jsx(TextInput, {
298
+ style: styles.portInput,
299
+ value: metroPort,
300
+ onChangeText: handleMetroPortChange,
301
+ placeholder: DEFAULT_METRO_PORT,
302
+ placeholderTextColor: Colors.textLight,
303
+ autoCapitalize: "none",
304
+ autoCorrect: false,
305
+ keyboardType: "number-pad",
306
+ returnKeyType: "done"
307
+ })]
308
+ }), /*#__PURE__*/_jsxs(View, {
309
+ style: styles.portField,
310
+ children: [/*#__PURE__*/_jsx(Text, {
311
+ style: styles.portLabel,
312
+ children: "Logs"
313
+ }), /*#__PURE__*/_jsx(TextInput, {
314
+ style: styles.portInput,
315
+ value: daemonPort,
316
+ onChangeText: handleDaemonPortChange,
317
+ placeholder: DEFAULT_DAEMON_PORT,
318
+ placeholderTextColor: Colors.textLight,
319
+ autoCapitalize: "none",
320
+ autoCorrect: false,
321
+ keyboardType: "number-pad",
322
+ returnKeyType: "done"
323
+ })]
324
+ })]
325
+ })]
202
326
  }), /*#__PURE__*/_jsxs(View, {
203
327
  style: styles.actions,
204
328
  children: [/*#__PURE__*/_jsx(TouchableOpacity, {
@@ -230,99 +354,66 @@ export function DevConnectTab({
230
354
  children: "Remote JS Bundle"
231
355
  }), /*#__PURE__*/_jsx(Text, {
232
356
  style: styles.sectionDesc,
233
- children: "Load JavaScript from your computer instead of the bundled file. Requires app restart."
357
+ children: "Apply this Metro host to React Native dev settings and reload the app."
234
358
  }), !metroUrls ? /*#__PURE__*/_jsx(View, {
235
359
  style: styles.stepCard,
236
360
  children: /*#__PURE__*/_jsx(Text, {
237
361
  style: styles.stepHint,
238
- children: "Enter your computer IP above to get started."
362
+ children: "Enter your computer IP and Metro port to get started."
239
363
  })
240
- }) : /*#__PURE__*/_jsxs(_Fragment, {
364
+ }) : /*#__PURE__*/_jsxs(View, {
365
+ style: styles.stepCard,
241
366
  children: [/*#__PURE__*/_jsxs(View, {
242
- style: styles.stepCard,
243
- children: [/*#__PURE__*/_jsxs(View, {
244
- style: styles.stepHeader,
245
- children: [/*#__PURE__*/_jsx(Text, {
246
- style: styles.stepNumber,
247
- children: "1"
248
- }), /*#__PURE__*/_jsx(Text, {
249
- style: styles.stepTitle,
250
- children: "Copy bundle URL"
251
- })]
367
+ style: styles.urlRow,
368
+ children: [/*#__PURE__*/_jsx(Text, {
369
+ style: styles.urlLabel,
370
+ children: "HTTP"
252
371
  }), /*#__PURE__*/_jsx(Text, {
253
- style: styles.stepDesc,
254
- children: "Use this URL as your remote JS bundle location:"
255
- }), /*#__PURE__*/_jsxs(View, {
256
- style: styles.urlRow,
257
- children: [/*#__PURE__*/_jsx(Text, {
258
- style: styles.urlText,
259
- numberOfLines: 1,
260
- children: metroUrls.httpUrl
261
- }), /*#__PURE__*/_jsx(TouchableOpacity, {
262
- style: styles.copyButton,
263
- onPress: () => copyUrl('Metro URL', metroUrls.httpUrl),
264
- activeOpacity: 0.7,
265
- children: /*#__PURE__*/_jsx(Text, {
266
- style: styles.copyButtonText,
267
- children: "Copy"
268
- })
269
- })]
270
- }), /*#__PURE__*/_jsxs(View, {
271
- style: styles.urlRow,
272
- children: [/*#__PURE__*/_jsx(Text, {
273
- style: styles.urlLabel,
274
- children: "Expo"
275
- }), /*#__PURE__*/_jsx(Text, {
276
- style: styles.urlText,
277
- numberOfLines: 1,
278
- children: metroUrls.expUrl
279
- }), /*#__PURE__*/_jsx(TouchableOpacity, {
280
- style: styles.copyButton,
281
- onPress: () => copyUrl('Expo URL', metroUrls.expUrl),
282
- activeOpacity: 0.7,
283
- children: /*#__PURE__*/_jsx(Text, {
284
- style: styles.copyButtonText,
285
- children: "Copy"
286
- })
287
- })]
372
+ style: styles.urlText,
373
+ numberOfLines: 1,
374
+ children: metroUrls.httpUrl
288
375
  })]
289
376
  }), /*#__PURE__*/_jsxs(View, {
290
- style: styles.stepCard,
291
- children: [/*#__PURE__*/_jsxs(View, {
292
- style: styles.stepHeader,
293
- children: [/*#__PURE__*/_jsx(Text, {
294
- style: styles.stepNumber,
295
- children: "2"
296
- }), /*#__PURE__*/_jsx(Text, {
297
- style: styles.stepTitle,
298
- children: "Configure remote debugging"
299
- })]
377
+ style: styles.urlRow,
378
+ children: [/*#__PURE__*/_jsx(Text, {
379
+ style: styles.urlLabel,
380
+ children: "Expo"
300
381
  }), /*#__PURE__*/_jsx(Text, {
301
- style: styles.stepDesc,
302
- children: isSim ? 'Simulator uses localhost automatically. Enable remote debugging in Dev Menu.' : 'In Dev Menu, set the bundle URL to the copied address.'
303
- })]
304
- }), /*#__PURE__*/_jsxs(View, {
305
- style: styles.stepCard,
306
- children: [/*#__PURE__*/_jsxs(View, {
307
- style: styles.stepHeader,
308
- children: [/*#__PURE__*/_jsx(Text, {
309
- style: styles.stepNumber,
310
- children: "3"
311
- }), /*#__PURE__*/_jsx(Text, {
312
- style: styles.stepTitle,
313
- children: "Restart the app"
314
- })]
315
- }), /*#__PURE__*/_jsx(Text, {
316
- style: styles.stepDesc,
317
- children: "Close and reopen the app to load from Metro. Make sure Metro is running on your computer."
382
+ style: styles.urlText,
383
+ numberOfLines: 1,
384
+ children: metroUrls.expUrl
318
385
  })]
319
386
  })]
320
- })]
387
+ }), /*#__PURE__*/_jsxs(View, {
388
+ style: styles.actions,
389
+ children: [/*#__PURE__*/_jsx(TouchableOpacity, {
390
+ style: [styles.primaryButton, !canUseMetro && styles.buttonDisabled],
391
+ onPress: applyRemoteBundle,
392
+ disabled: !canUseMetro,
393
+ activeOpacity: 0.75,
394
+ children: /*#__PURE__*/_jsx(Text, {
395
+ style: styles.primaryButtonText,
396
+ children: metroBusy ? 'Checking...' : 'Use Metro Bundle'
397
+ })
398
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
399
+ style: [styles.secondaryButton, (!snapshot.nativeMetroAvailable || metroBusy) && styles.buttonDisabled],
400
+ onPress: resetRemoteBundle,
401
+ disabled: !snapshot.nativeMetroAvailable || metroBusy,
402
+ activeOpacity: 0.75,
403
+ children: /*#__PURE__*/_jsx(Text, {
404
+ style: styles.secondaryButtonText,
405
+ children: "Reset"
406
+ })
407
+ })]
408
+ }), !snapshot.nativeMetroAvailable ? /*#__PURE__*/_jsx(Text, {
409
+ style: styles.hint,
410
+ children: "Native DevConnect requires pod install / Gradle sync and app rebuild."
411
+ }) : null]
321
412
  })]
322
413
  }), /*#__PURE__*/_jsx(DevConnectQrScanner, {
323
414
  visible: qrVisible,
324
415
  onClose: () => setQrVisible(false),
325
- onScanHost: handleQrHost
416
+ onScanTarget: handleQrTarget
326
417
  })]
327
418
  });
328
419
  }
@@ -403,6 +494,29 @@ const styles = StyleSheet.create({
403
494
  fontSize: 13,
404
495
  fontWeight: '600'
405
496
  },
497
+ portRow: {
498
+ flexDirection: 'row',
499
+ gap: 10
500
+ },
501
+ portField: {
502
+ flex: 1
503
+ },
504
+ portLabel: {
505
+ fontSize: 11,
506
+ color: Colors.textSecondary,
507
+ marginBottom: 4
508
+ },
509
+ portInput: {
510
+ backgroundColor: Colors.surface,
511
+ borderWidth: 1,
512
+ borderColor: Colors.border,
513
+ borderRadius: 8,
514
+ paddingHorizontal: 12,
515
+ paddingVertical: 9,
516
+ fontSize: 13,
517
+ color: Colors.text,
518
+ fontFamily: 'Courier'
519
+ },
406
520
  actions: {
407
521
  flexDirection: 'row',
408
522
  gap: 10,
@@ -448,7 +562,8 @@ const styles = StyleSheet.create({
448
562
  },
449
563
  hint: {
450
564
  fontSize: 12,
451
- color: Colors.textLight
565
+ color: Colors.textLight,
566
+ lineHeight: 17
452
567
  },
453
568
  stepCard: {
454
569
  backgroundColor: Colors.surface,
@@ -463,36 +578,8 @@ const styles = StyleSheet.create({
463
578
  color: Colors.textSecondary,
464
579
  lineHeight: 17
465
580
  },
466
- stepHeader: {
467
- flexDirection: 'row',
468
- alignItems: 'center',
469
- marginBottom: 4
470
- },
471
- stepNumber: {
472
- width: 20,
473
- height: 20,
474
- borderRadius: 10,
475
- backgroundColor: Colors.primary,
476
- color: '#fff',
477
- fontSize: 11,
478
- fontWeight: '700',
479
- textAlign: 'center',
480
- lineHeight: 20,
481
- marginRight: 8,
482
- overflow: 'hidden'
483
- },
484
- stepTitle: {
485
- fontSize: 13,
486
- fontWeight: '600',
487
- color: Colors.text
488
- },
489
- stepDesc: {
490
- fontSize: 12,
491
- color: Colors.textSecondary,
492
- lineHeight: 17,
493
- marginBottom: 8
494
- },
495
581
  urlLabel: {
582
+ minWidth: 40,
496
583
  fontSize: 10,
497
584
  fontWeight: '600',
498
585
  color: Colors.primary,
@@ -500,37 +587,21 @@ const styles = StyleSheet.create({
500
587
  paddingHorizontal: 6,
501
588
  paddingVertical: 2,
502
589
  borderRadius: 4,
503
- marginRight: 6
590
+ marginRight: 8,
591
+ textAlign: 'center'
504
592
  },
505
593
  urlRow: {
506
594
  flexDirection: 'row',
507
595
  alignItems: 'center',
508
- backgroundColor: Colors.surface,
509
- borderWidth: 1,
510
- borderColor: Colors.border,
511
- borderRadius: 8,
512
- paddingLeft: 12,
513
- paddingRight: 4,
514
- paddingVertical: 4,
515
- marginBottom: 8
596
+ borderBottomWidth: StyleSheet.hairlineWidth,
597
+ borderBottomColor: Colors.border,
598
+ paddingVertical: 7
516
599
  },
517
600
  urlText: {
518
601
  flex: 1,
519
602
  fontSize: 13,
520
603
  fontFamily: 'Courier',
521
- color: Colors.text,
522
- paddingVertical: 6
523
- },
524
- copyButton: {
525
- paddingHorizontal: 12,
526
- paddingVertical: 8,
527
- borderRadius: 6,
528
- backgroundColor: Colors.primary
529
- },
530
- copyButtonText: {
531
- color: '#fff',
532
- fontSize: 12,
533
- fontWeight: '600'
604
+ color: Colors.text
534
605
  }
535
606
  });
536
607
  //# sourceMappingURL=DevConnectTab.js.map