react-native-inapp-inspector 2.3.11 → 2.3.12

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.
@@ -129,6 +129,7 @@ const DebuggingTab = () => {
129
129
  probePorts();
130
130
  }, [probePorts]);
131
131
  const metroBundleUrl = `http://${hostIp}:${selectedPort}/index.bundle?platform=android&dev=true`;
132
+ const directServerUrl = `http://${hostIp}:${selectedPort}`;
132
133
  const apkDownloadUrl = `http://${hostIp}:${selectedPort}/${apkPath}`;
133
134
  const devSettingsHost = `${hostIp}:${selectedPort}`;
134
135
  const currentQrValue = (0, react_1.useMemo)(() => {
@@ -136,8 +137,8 @@ const DebuggingTab = () => {
136
137
  return apkDownloadUrl;
137
138
  if (activeQrTab === 'host')
138
139
  return devSettingsHost;
139
- return metroBundleUrl;
140
- }, [activeQrTab, apkDownloadUrl, devSettingsHost, metroBundleUrl]);
140
+ return directServerUrl;
141
+ }, [activeQrTab, apkDownloadUrl, devSettingsHost, directServerUrl]);
141
142
  const activePortInfo = portsStatus[selectedPort];
142
143
  return (<react_native_1.ScrollView style={styles.container} contentContainerStyle={styles.content} showsVerticalScrollIndicator={false}>
143
144
 
@@ -39,24 +39,27 @@ const react_native_1 = require("react-native");
39
39
  const react_native_svg_1 = __importStar(require("react-native-svg"));
40
40
  const qrGenerator_1 = require("../helpers/qrGenerator");
41
41
  const AppColors_1 = require("../styles/AppColors");
42
- const QRCodeView = ({ value, size = 180, color = AppColors_1.AppColors.primaryBlack, backgroundColor = AppColors_1.AppColors.white, }) => {
43
- const matrix = (0, react_1.useMemo)(() => (0, qrGenerator_1.generateQRMatrix)(value), [value]);
44
- const numCells = matrix.length;
45
- const cellSize = size / numCells;
42
+ const QRCodeView = ({ value, size = 200, color = '#000000', backgroundColor = '#FFFFFF', }) => {
43
+ const matrix = (0, react_1.useMemo)(() => (0, qrGenerator_1.generateQRMatrix)(value || 'http://localhost:8081'), [value]);
44
+ const numCells = matrix.length || 21;
45
+ const margin = 3;
46
+ const totalCells = numCells + margin * 2;
47
+ const cellSize = size / totalCells;
46
48
  return (<react_native_1.View style={[
47
49
  styles.container,
48
50
  {
49
- width: size + 16,
50
- height: size + 16,
51
+ width: size + 20,
52
+ height: size + 20,
51
53
  backgroundColor,
52
54
  },
53
55
  ]}>
54
56
  <react_native_svg_1.default width={size} height={size} viewBox={`0 0 ${size} ${size}`}>
57
+ <react_native_svg_1.Rect width={size} height={size} fill={backgroundColor}/>
55
58
  <react_native_svg_1.G>
56
59
  {matrix.map((row, r) => row.map((cell, c) => {
57
60
  if (!cell)
58
61
  return null;
59
- return (<react_native_svg_1.Rect key={`${r}-${c}`} x={c * cellSize} y={r * cellSize} width={cellSize + 0.2} height={cellSize + 0.2} fill={color}/>);
62
+ return (<react_native_svg_1.Rect key={`${r}-${c}`} x={(c + margin) * cellSize} y={(r + margin) * cellSize} width={cellSize + 0.3} height={cellSize + 0.3} fill={color}/>);
60
63
  }))}
61
64
  </react_native_svg_1.G>
62
65
  </react_native_svg_1.default>
@@ -65,15 +68,15 @@ const QRCodeView = ({ value, size = 180, color = AppColors_1.AppColors.primaryBl
65
68
  exports.QRCodeView = QRCodeView;
66
69
  const styles = react_native_1.StyleSheet.create({
67
70
  container: {
68
- padding: 8,
71
+ padding: 10,
69
72
  borderRadius: 14,
70
73
  alignItems: 'center',
71
74
  justifyContent: 'center',
72
75
  shadowColor: AppColors_1.AppColors.black,
73
- shadowOffset: { width: 0, height: 2 },
74
- shadowOpacity: 0.1,
75
- shadowRadius: 6,
76
- elevation: 3,
76
+ shadowOffset: { width: 0, height: 3 },
77
+ shadowOpacity: 0.15,
78
+ shadowRadius: 8,
79
+ elevation: 4,
77
80
  },
78
81
  });
79
82
  exports.default = exports.QRCodeView;
@@ -1 +1 @@
1
- export declare const LIB_VERSION = "2.3.11";
1
+ export declare const LIB_VERSION = "2.3.12";
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LIB_VERSION = void 0;
4
- exports.LIB_VERSION = '2.3.11';
4
+ exports.LIB_VERSION = '2.3.12';
@@ -1,170 +1,44 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.generateQRMatrix = generateQRMatrix;
7
+ const qrcode_generator_1 = __importDefault(require("qrcode-generator"));
4
8
  function generateQRMatrix(text, ecc = 'M') {
5
9
  try {
6
- return createQRMatrix(text, ecc);
7
- }
8
- catch {
9
- return createFallbackMatrix(text);
10
- }
11
- }
12
- function createQRMatrix(data, ecc) {
13
- const length = data.length;
14
- let version = 1;
15
- if (length > 14)
16
- version = 2;
17
- if (length > 26)
18
- version = 3;
19
- if (length > 42)
20
- version = 4;
21
- if (length > 62)
22
- version = 5;
23
- if (length > 84)
24
- version = 6;
25
- if (length > 106)
26
- version = 7;
27
- if (length > 122)
28
- version = 8;
29
- if (length > 152)
30
- version = 9;
31
- if (length > 180)
32
- version = 10;
33
- const size = version * 4 + 17;
34
- const matrix = Array(size)
35
- .fill(null)
36
- .map(() => Array(size).fill(null));
37
- addFinderPattern(matrix, 0, 0);
38
- addFinderPattern(matrix, size - 7, 0);
39
- addFinderPattern(matrix, 0, size - 7);
40
- for (let i = 8; i < size - 8; i++) {
41
- const val = i % 2 === 0;
42
- if (matrix[6][i] === null)
43
- matrix[6][i] = val;
44
- if (matrix[i][6] === null)
45
- matrix[i][6] = val;
46
- }
47
- if (version >= 2) {
48
- const pos = getAlignmentPositions(version);
49
- for (const r of pos) {
50
- for (const c of pos) {
51
- if (matrix[r][c] === null) {
52
- addAlignmentPattern(matrix, r - 2, c - 2);
53
- }
10
+ const qr = (0, qrcode_generator_1.default)(0, ecc);
11
+ qr.addData(text);
12
+ qr.make();
13
+ const count = qr.getModuleCount();
14
+ const matrix = [];
15
+ for (let row = 0; row < count; row++) {
16
+ const rowData = [];
17
+ for (let col = 0; col < count; col++) {
18
+ rowData.push(qr.isDark(row, col));
54
19
  }
20
+ matrix.push(rowData);
55
21
  }
56
- }
57
- const bits = [];
58
- bits.push(false, true, false, false);
59
- for (let i = 7; i >= 0; i--) {
60
- bits.push(((length >> i) & 1) === 1);
61
- }
62
- for (let i = 0; i < length; i++) {
63
- const code = data.charCodeAt(i);
64
- for (let b = 7; b >= 0; b--) {
65
- bits.push(((code >> b) & 1) === 1);
66
- }
67
- }
68
- for (let i = 0; i < 4 && bits.length % 8 !== 0; i++) {
69
- bits.push(false);
70
- }
71
- while (bits.length % 8 !== 0) {
72
- bits.push(false);
73
- }
74
- const padBytes = [0xec, 0x11];
75
- let padIdx = 0;
76
- const totalDataBits = size * size * 0.6;
77
- while (bits.length < totalDataBits) {
78
- const b = padBytes[padIdx % 2];
79
- padIdx++;
80
- for (let bit = 7; bit >= 0; bit--) {
81
- bits.push(((b >> bit) & 1) === 1);
82
- }
83
- }
84
- let bitIdx = 0;
85
- let upwards = true;
86
- for (let col = size - 1; col > 0; col -= 2) {
87
- if (col === 6)
88
- col--;
89
- const rows = upwards
90
- ? Array.from({ length: size }, (_, i) => size - 1 - i)
91
- : Array.from({ length: size }, (_, i) => i);
92
- for (const row of rows) {
93
- for (const c of [col, col - 1]) {
94
- if (matrix[row][c] === null) {
95
- const bit = bitIdx < bits.length ? bits[bitIdx++] : false;
96
- const mask = (row + c) % 2 === 0;
97
- matrix[row][c] = bit !== mask;
22
+ return matrix;
23
+ }
24
+ catch (err) {
25
+ try {
26
+ const qr = (0, qrcode_generator_1.default)(10, ecc);
27
+ qr.addData(text);
28
+ qr.make();
29
+ const count = qr.getModuleCount();
30
+ const matrix = [];
31
+ for (let row = 0; row < count; row++) {
32
+ const rowData = [];
33
+ for (let col = 0; col < count; col++) {
34
+ rowData.push(qr.isDark(row, col));
98
35
  }
36
+ matrix.push(rowData);
99
37
  }
38
+ return matrix;
100
39
  }
101
- upwards = !upwards;
102
- }
103
- return matrix.map(row => row.map(cell => cell ?? false));
104
- }
105
- function addFinderPattern(matrix, row, col) {
106
- for (let r = -1; r <= 7; r++) {
107
- for (let c = -1; c <= 7; c++) {
108
- const mr = row + r;
109
- const mc = col + c;
110
- if (mr >= 0 && mr < matrix.length && mc >= 0 && mc < matrix.length) {
111
- if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||
112
- (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||
113
- (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {
114
- matrix[mr][mc] = true;
115
- }
116
- else if (r >= 0 && r <= 6 && c >= 0 && c <= 6) {
117
- matrix[mr][mc] = false;
118
- }
119
- else {
120
- matrix[mr][mc] = false;
121
- }
122
- }
40
+ catch {
41
+ return [];
123
42
  }
124
43
  }
125
44
  }
126
- function addAlignmentPattern(matrix, row, col) {
127
- for (let r = 0; r < 5; r++) {
128
- for (let c = 0; c < 5; c++) {
129
- const isOuter = r === 0 || r === 4 || c === 0 || c === 4;
130
- const isCenter = r === 2 && c === 2;
131
- matrix[row + r][col + c] = isOuter || isCenter;
132
- }
133
- }
134
- }
135
- function getAlignmentPositions(version) {
136
- if (version === 1)
137
- return [];
138
- if (version === 2)
139
- return [6, 18];
140
- if (version === 3)
141
- return [6, 22];
142
- if (version === 4)
143
- return [6, 26];
144
- if (version === 5)
145
- return [6, 30];
146
- if (version === 6)
147
- return [6, 34];
148
- if (version === 7)
149
- return [6, 22, 38];
150
- if (version === 8)
151
- return [6, 24, 42];
152
- if (version === 9)
153
- return [6, 26, 46];
154
- return [6, 28, 50];
155
- }
156
- function createFallbackMatrix(text) {
157
- const size = 25;
158
- const matrix = Array(size)
159
- .fill(false)
160
- .map(() => Array(size).fill(false));
161
- addFinderPattern(matrix, 0, 0);
162
- addFinderPattern(matrix, size - 7, 0);
163
- addFinderPattern(matrix, 0, size - 7);
164
- for (let i = 0; i < text.length; i++) {
165
- const r = (i * 3) % (size - 10) + 8;
166
- const c = (i * 7) % (size - 10) + 8;
167
- matrix[r][c] = true;
168
- }
169
- return matrix;
170
- }
@@ -90,6 +90,7 @@ export const DebuggingTab = () => {
90
90
  probePorts();
91
91
  }, [probePorts]);
92
92
  const metroBundleUrl = `http://${hostIp}:${selectedPort}/index.bundle?platform=android&dev=true`;
93
+ const directServerUrl = `http://${hostIp}:${selectedPort}`;
93
94
  const apkDownloadUrl = `http://${hostIp}:${selectedPort}/${apkPath}`;
94
95
  const devSettingsHost = `${hostIp}:${selectedPort}`;
95
96
  const currentQrValue = useMemo(() => {
@@ -97,8 +98,8 @@ export const DebuggingTab = () => {
97
98
  return apkDownloadUrl;
98
99
  if (activeQrTab === 'host')
99
100
  return devSettingsHost;
100
- return metroBundleUrl;
101
- }, [activeQrTab, apkDownloadUrl, devSettingsHost, metroBundleUrl]);
101
+ return directServerUrl;
102
+ }, [activeQrTab, apkDownloadUrl, devSettingsHost, directServerUrl]);
102
103
  const activePortInfo = portsStatus[selectedPort];
103
104
  return (<ScrollView style={styles.container} contentContainerStyle={styles.content} showsVerticalScrollIndicator={false}>
104
105
 
@@ -3,24 +3,27 @@ import { View, StyleSheet } from 'react-native';
3
3
  import Svg, { Rect, G } from 'react-native-svg';
4
4
  import { generateQRMatrix } from '../helpers/qrGenerator';
5
5
  import { AppColors } from '../styles/AppColors';
6
- export const QRCodeView = ({ value, size = 180, color = AppColors.primaryBlack, backgroundColor = AppColors.white, }) => {
7
- const matrix = useMemo(() => generateQRMatrix(value), [value]);
8
- const numCells = matrix.length;
9
- const cellSize = size / numCells;
6
+ export const QRCodeView = ({ value, size = 200, color = '#000000', backgroundColor = '#FFFFFF', }) => {
7
+ const matrix = useMemo(() => generateQRMatrix(value || 'http://localhost:8081'), [value]);
8
+ const numCells = matrix.length || 21;
9
+ const margin = 3;
10
+ const totalCells = numCells + margin * 2;
11
+ const cellSize = size / totalCells;
10
12
  return (<View style={[
11
13
  styles.container,
12
14
  {
13
- width: size + 16,
14
- height: size + 16,
15
+ width: size + 20,
16
+ height: size + 20,
15
17
  backgroundColor,
16
18
  },
17
19
  ]}>
18
20
  <Svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>
21
+ <Rect width={size} height={size} fill={backgroundColor}/>
19
22
  <G>
20
23
  {matrix.map((row, r) => row.map((cell, c) => {
21
24
  if (!cell)
22
25
  return null;
23
- return (<Rect key={`${r}-${c}`} x={c * cellSize} y={r * cellSize} width={cellSize + 0.2} height={cellSize + 0.2} fill={color}/>);
26
+ return (<Rect key={`${r}-${c}`} x={(c + margin) * cellSize} y={(r + margin) * cellSize} width={cellSize + 0.3} height={cellSize + 0.3} fill={color}/>);
24
27
  }))}
25
28
  </G>
26
29
  </Svg>
@@ -28,15 +31,15 @@ export const QRCodeView = ({ value, size = 180, color = AppColors.primaryBlack,
28
31
  };
29
32
  const styles = StyleSheet.create({
30
33
  container: {
31
- padding: 8,
34
+ padding: 10,
32
35
  borderRadius: 14,
33
36
  alignItems: 'center',
34
37
  justifyContent: 'center',
35
38
  shadowColor: AppColors.black,
36
- shadowOffset: { width: 0, height: 2 },
37
- shadowOpacity: 0.1,
38
- shadowRadius: 6,
39
- elevation: 3,
39
+ shadowOffset: { width: 0, height: 3 },
40
+ shadowOpacity: 0.15,
41
+ shadowRadius: 8,
42
+ elevation: 4,
40
43
  },
41
44
  });
42
45
  export default QRCodeView;
@@ -1 +1 @@
1
- export declare const LIB_VERSION = "2.3.11";
1
+ export declare const LIB_VERSION = "2.3.12";
@@ -1 +1 @@
1
- export const LIB_VERSION = '2.3.11';
1
+ export const LIB_VERSION = '2.3.12';
@@ -1,167 +1,38 @@
1
+ import qrcode from 'qrcode-generator';
1
2
  export function generateQRMatrix(text, ecc = 'M') {
2
3
  try {
3
- return createQRMatrix(text, ecc);
4
- }
5
- catch {
6
- return createFallbackMatrix(text);
7
- }
8
- }
9
- function createQRMatrix(data, ecc) {
10
- const length = data.length;
11
- let version = 1;
12
- if (length > 14)
13
- version = 2;
14
- if (length > 26)
15
- version = 3;
16
- if (length > 42)
17
- version = 4;
18
- if (length > 62)
19
- version = 5;
20
- if (length > 84)
21
- version = 6;
22
- if (length > 106)
23
- version = 7;
24
- if (length > 122)
25
- version = 8;
26
- if (length > 152)
27
- version = 9;
28
- if (length > 180)
29
- version = 10;
30
- const size = version * 4 + 17;
31
- const matrix = Array(size)
32
- .fill(null)
33
- .map(() => Array(size).fill(null));
34
- addFinderPattern(matrix, 0, 0);
35
- addFinderPattern(matrix, size - 7, 0);
36
- addFinderPattern(matrix, 0, size - 7);
37
- for (let i = 8; i < size - 8; i++) {
38
- const val = i % 2 === 0;
39
- if (matrix[6][i] === null)
40
- matrix[6][i] = val;
41
- if (matrix[i][6] === null)
42
- matrix[i][6] = val;
43
- }
44
- if (version >= 2) {
45
- const pos = getAlignmentPositions(version);
46
- for (const r of pos) {
47
- for (const c of pos) {
48
- if (matrix[r][c] === null) {
49
- addAlignmentPattern(matrix, r - 2, c - 2);
50
- }
4
+ const qr = qrcode(0, ecc);
5
+ qr.addData(text);
6
+ qr.make();
7
+ const count = qr.getModuleCount();
8
+ const matrix = [];
9
+ for (let row = 0; row < count; row++) {
10
+ const rowData = [];
11
+ for (let col = 0; col < count; col++) {
12
+ rowData.push(qr.isDark(row, col));
51
13
  }
14
+ matrix.push(rowData);
52
15
  }
53
- }
54
- const bits = [];
55
- bits.push(false, true, false, false);
56
- for (let i = 7; i >= 0; i--) {
57
- bits.push(((length >> i) & 1) === 1);
58
- }
59
- for (let i = 0; i < length; i++) {
60
- const code = data.charCodeAt(i);
61
- for (let b = 7; b >= 0; b--) {
62
- bits.push(((code >> b) & 1) === 1);
63
- }
64
- }
65
- for (let i = 0; i < 4 && bits.length % 8 !== 0; i++) {
66
- bits.push(false);
67
- }
68
- while (bits.length % 8 !== 0) {
69
- bits.push(false);
70
- }
71
- const padBytes = [0xec, 0x11];
72
- let padIdx = 0;
73
- const totalDataBits = size * size * 0.6;
74
- while (bits.length < totalDataBits) {
75
- const b = padBytes[padIdx % 2];
76
- padIdx++;
77
- for (let bit = 7; bit >= 0; bit--) {
78
- bits.push(((b >> bit) & 1) === 1);
79
- }
80
- }
81
- let bitIdx = 0;
82
- let upwards = true;
83
- for (let col = size - 1; col > 0; col -= 2) {
84
- if (col === 6)
85
- col--;
86
- const rows = upwards
87
- ? Array.from({ length: size }, (_, i) => size - 1 - i)
88
- : Array.from({ length: size }, (_, i) => i);
89
- for (const row of rows) {
90
- for (const c of [col, col - 1]) {
91
- if (matrix[row][c] === null) {
92
- const bit = bitIdx < bits.length ? bits[bitIdx++] : false;
93
- const mask = (row + c) % 2 === 0;
94
- matrix[row][c] = bit !== mask;
16
+ return matrix;
17
+ }
18
+ catch (err) {
19
+ try {
20
+ const qr = qrcode(10, ecc);
21
+ qr.addData(text);
22
+ qr.make();
23
+ const count = qr.getModuleCount();
24
+ const matrix = [];
25
+ for (let row = 0; row < count; row++) {
26
+ const rowData = [];
27
+ for (let col = 0; col < count; col++) {
28
+ rowData.push(qr.isDark(row, col));
95
29
  }
30
+ matrix.push(rowData);
96
31
  }
32
+ return matrix;
97
33
  }
98
- upwards = !upwards;
99
- }
100
- return matrix.map(row => row.map(cell => cell ?? false));
101
- }
102
- function addFinderPattern(matrix, row, col) {
103
- for (let r = -1; r <= 7; r++) {
104
- for (let c = -1; c <= 7; c++) {
105
- const mr = row + r;
106
- const mc = col + c;
107
- if (mr >= 0 && mr < matrix.length && mc >= 0 && mc < matrix.length) {
108
- if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||
109
- (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||
110
- (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {
111
- matrix[mr][mc] = true;
112
- }
113
- else if (r >= 0 && r <= 6 && c >= 0 && c <= 6) {
114
- matrix[mr][mc] = false;
115
- }
116
- else {
117
- matrix[mr][mc] = false;
118
- }
119
- }
34
+ catch {
35
+ return [];
120
36
  }
121
37
  }
122
38
  }
123
- function addAlignmentPattern(matrix, row, col) {
124
- for (let r = 0; r < 5; r++) {
125
- for (let c = 0; c < 5; c++) {
126
- const isOuter = r === 0 || r === 4 || c === 0 || c === 4;
127
- const isCenter = r === 2 && c === 2;
128
- matrix[row + r][col + c] = isOuter || isCenter;
129
- }
130
- }
131
- }
132
- function getAlignmentPositions(version) {
133
- if (version === 1)
134
- return [];
135
- if (version === 2)
136
- return [6, 18];
137
- if (version === 3)
138
- return [6, 22];
139
- if (version === 4)
140
- return [6, 26];
141
- if (version === 5)
142
- return [6, 30];
143
- if (version === 6)
144
- return [6, 34];
145
- if (version === 7)
146
- return [6, 22, 38];
147
- if (version === 8)
148
- return [6, 24, 42];
149
- if (version === 9)
150
- return [6, 26, 46];
151
- return [6, 28, 50];
152
- }
153
- function createFallbackMatrix(text) {
154
- const size = 25;
155
- const matrix = Array(size)
156
- .fill(false)
157
- .map(() => Array(size).fill(false));
158
- addFinderPattern(matrix, 0, 0);
159
- addFinderPattern(matrix, size - 7, 0);
160
- addFinderPattern(matrix, 0, size - 7);
161
- for (let i = 0; i < text.length; i++) {
162
- const r = (i * 3) % (size - 10) + 8;
163
- const c = (i * 7) % (size - 10) + 8;
164
- matrix[r][c] = true;
165
- }
166
- return matrix;
167
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-inapp-inspector",
3
- "version": "2.3.11",
3
+ "version": "2.3.12",
4
4
  "description": "The zero-config, all-in-one in-app debugger for React Native & Expo. Inspect Network (fetch/axios), Console logs, Stack Traces, Redux State, Firebase Analytics, and JS Bundle size directly on device.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -174,6 +174,8 @@
174
174
  "typescript": "5.8.3"
175
175
  },
176
176
  "dependencies": {
177
- "@react-native-clipboard/clipboard": "1.16.3"
177
+ "@react-native-clipboard/clipboard": "1.16.3",
178
+ "@types/qrcode-generator": "^0.0.16",
179
+ "qrcode-generator": "^2.0.4"
178
180
  }
179
181
  }
@@ -137,14 +137,15 @@ export const DebuggingTab: React.FC = () => {
137
137
 
138
138
  // Construct target URLs for QR codes
139
139
  const metroBundleUrl = `http://${hostIp}:${selectedPort}/index.bundle?platform=android&dev=true`;
140
+ const directServerUrl = `http://${hostIp}:${selectedPort}`;
140
141
  const apkDownloadUrl = `http://${hostIp}:${selectedPort}/${apkPath}`;
141
142
  const devSettingsHost = `${hostIp}:${selectedPort}`;
142
143
 
143
144
  const currentQrValue = useMemo(() => {
144
145
  if (activeQrTab === 'apk') return apkDownloadUrl;
145
146
  if (activeQrTab === 'host') return devSettingsHost;
146
- return metroBundleUrl;
147
- }, [activeQrTab, apkDownloadUrl, devSettingsHost, metroBundleUrl]);
147
+ return directServerUrl;
148
+ }, [activeQrTab, apkDownloadUrl, devSettingsHost, directServerUrl]);
148
149
 
149
150
  const activePortInfo = portsStatus[selectedPort];
150
151
 
@@ -13,25 +13,29 @@ interface QRCodeViewProps {
13
13
 
14
14
  export const QRCodeView: React.FC<QRCodeViewProps> = ({
15
15
  value,
16
- size = 180,
17
- color = AppColors.primaryBlack,
18
- backgroundColor = AppColors.white,
16
+ size = 200,
17
+ color = '#000000',
18
+ backgroundColor = '#FFFFFF',
19
19
  }) => {
20
- const matrix = useMemo(() => generateQRMatrix(value), [value]);
21
- const numCells = matrix.length;
22
- const cellSize = size / numCells;
20
+ const matrix = useMemo(() => generateQRMatrix(value || 'http://localhost:8081'), [value]);
21
+ const numCells = matrix.length || 21;
22
+ // Add a 3-module quiet zone (white border) required by QR scanners
23
+ const margin = 3;
24
+ const totalCells = numCells + margin * 2;
25
+ const cellSize = size / totalCells;
23
26
 
24
27
  return (
25
28
  <View
26
29
  style={[
27
30
  styles.container,
28
31
  {
29
- width: size + 16,
30
- height: size + 16,
32
+ width: size + 20,
33
+ height: size + 20,
31
34
  backgroundColor,
32
35
  },
33
36
  ]}>
34
37
  <Svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>
38
+ <Rect width={size} height={size} fill={backgroundColor} />
35
39
  <G>
36
40
  {matrix.map((row, r) =>
37
41
  row.map((cell, c) => {
@@ -39,10 +43,10 @@ export const QRCodeView: React.FC<QRCodeViewProps> = ({
39
43
  return (
40
44
  <Rect
41
45
  key={`${r}-${c}`}
42
- x={c * cellSize}
43
- y={r * cellSize}
44
- width={cellSize + 0.2}
45
- height={cellSize + 0.2}
46
+ x={(c + margin) * cellSize}
47
+ y={(r + margin) * cellSize}
48
+ width={cellSize + 0.3}
49
+ height={cellSize + 0.3}
46
50
  fill={color}
47
51
  />
48
52
  );
@@ -56,15 +60,15 @@ export const QRCodeView: React.FC<QRCodeViewProps> = ({
56
60
 
57
61
  const styles = StyleSheet.create({
58
62
  container: {
59
- padding: 8,
63
+ padding: 10,
60
64
  borderRadius: 14,
61
65
  alignItems: 'center',
62
66
  justifyContent: 'center',
63
67
  shadowColor: AppColors.black,
64
- shadowOffset: {width: 0, height: 2},
65
- shadowOpacity: 0.1,
66
- shadowRadius: 6,
67
- elevation: 3,
68
+ shadowOffset: {width: 0, height: 3},
69
+ shadowOpacity: 0.15,
70
+ shadowRadius: 8,
71
+ elevation: 4,
68
72
  },
69
73
  });
70
74
 
@@ -1,3 +1,3 @@
1
1
  // AUTO-GENERATED FILE — do not edit by hand.
2
2
  // Regenerated from package.json on every build by scripts/gen-version.js.
3
- export const LIB_VERSION = '2.3.11';
3
+ export const LIB_VERSION = '2.3.12';
@@ -1,184 +1,49 @@
1
1
  /**
2
- * Compact Pure TypeScript QR Code Matrix Generator
3
- * Generates standard QR Code 2D boolean matrices for rendering with react-native-svg
2
+ * ISO/IEC 18004 Standard QR Code Matrix Generator
3
+ * Uses industry-standard qrcode-generator with full Reed-Solomon Error Correction
4
+ * and BCH format encoding for 100% instant phone camera / Google Lens recognition.
4
5
  */
6
+ import qrcode from 'qrcode-generator';
5
7
 
6
- // Error correction levels: L (7%), M (15%), Q (25%), H (30%)
7
8
  export type QRECC = 'L' | 'M' | 'Q' | 'H';
8
9
 
9
- // QR Code generation helper (using compact byte-mode QR encoder)
10
10
  export function generateQRMatrix(text: string, ecc: QRECC = 'M'): boolean[][] {
11
11
  try {
12
- return createQRMatrix(text, ecc);
13
- } catch {
14
- // Fallback: create a structured matrix pattern if text is excessively long
15
- return createFallbackMatrix(text);
16
- }
17
- }
18
-
19
- // ─── Simple & Robust QR Code Matrix Generator Implementation ──────────────────
20
-
21
- function createQRMatrix(data: string, ecc: QRECC): boolean[][] {
22
- const length = data.length;
23
- // Choose minimum version based on data length
24
- let version = 1;
25
- if (length > 14) version = 2;
26
- if (length > 26) version = 3;
27
- if (length > 42) version = 4;
28
- if (length > 62) version = 5;
29
- if (length > 84) version = 6;
30
- if (length > 106) version = 7;
31
- if (length > 122) version = 8;
32
- if (length > 152) version = 9;
33
- if (length > 180) version = 10;
34
-
35
- const size = version * 4 + 17;
36
- const matrix: (boolean | null)[][] = Array(size)
37
- .fill(null)
38
- .map(() => Array(size).fill(null));
39
-
40
- // 1. Position finder patterns (top-left, top-right, bottom-left)
41
- addFinderPattern(matrix, 0, 0);
42
- addFinderPattern(matrix, size - 7, 0);
43
- addFinderPattern(matrix, 0, size - 7);
44
-
45
- // 2. Timing patterns (horizontal and vertical alternating lines)
46
- for (let i = 8; i < size - 8; i++) {
47
- const val = i % 2 === 0;
48
- if (matrix[6][i] === null) matrix[6][i] = val;
49
- if (matrix[i][6] === null) matrix[i][6] = val;
50
- }
51
-
52
- // 3. Alignment patterns for version >= 2
53
- if (version >= 2) {
54
- const pos = getAlignmentPositions(version);
55
- for (const r of pos) {
56
- for (const c of pos) {
57
- if (matrix[r][c] === null) {
58
- addAlignmentPattern(matrix, r - 2, c - 2);
59
- }
12
+ // Type 0 = auto detect smallest valid QR version
13
+ const qr = qrcode(0, ecc);
14
+ qr.addData(text);
15
+ qr.make();
16
+
17
+ const count = qr.getModuleCount();
18
+ const matrix: boolean[][] = [];
19
+
20
+ for (let row = 0; row < count; row++) {
21
+ const rowData: boolean[] = [];
22
+ for (let col = 0; col < count; col++) {
23
+ rowData.push(qr.isDark(row, col));
60
24
  }
25
+ matrix.push(rowData);
61
26
  }
62
- }
63
27
 
64
- // 4. Encode data bytes into bit stream
65
- const bits: boolean[] = [];
66
- // Mode indicator: 0100 (8-bit byte mode)
67
- bits.push(false, true, false, false);
68
- // Character count indicator (8 bits for version 1-9)
69
- for (let i = 7; i >= 0; i--) {
70
- bits.push(((length >> i) & 1) === 1);
71
- }
72
- // Data bits
73
- for (let i = 0; i < length; i++) {
74
- const code = data.charCodeAt(i);
75
- for (let b = 7; b >= 0; b--) {
76
- bits.push(((code >> b) & 1) === 1);
77
- }
78
- }
79
- // Terminator
80
- for (let i = 0; i < 4 && bits.length % 8 !== 0; i++) {
81
- bits.push(false);
82
- }
83
- while (bits.length % 8 !== 0) {
84
- bits.push(false);
85
- }
86
-
87
- // Add padding bytes (0xEC, 0x11)
88
- const padBytes = [0xec, 0x11];
89
- let padIdx = 0;
90
- const totalDataBits = size * size * 0.6; // approx capacity
91
- while (bits.length < totalDataBits) {
92
- const b = padBytes[padIdx % 2];
93
- padIdx++;
94
- for (let bit = 7; bit >= 0; bit--) {
95
- bits.push(((b >> bit) & 1) === 1);
96
- }
97
- }
98
-
99
- // 5. Place data bits in matrix (right to left, zig-zag)
100
- let bitIdx = 0;
101
- let upwards = true;
102
- for (let col = size - 1; col > 0; col -= 2) {
103
- if (col === 6) col--; // Skip vertical timing column
104
- const rows = upwards
105
- ? Array.from({length: size}, (_, i) => size - 1 - i)
106
- : Array.from({length: size}, (_, i) => i);
107
-
108
- for (const row of rows) {
109
- for (const c of [col, col - 1]) {
110
- if (matrix[row][c] === null) {
111
- const bit = bitIdx < bits.length ? bits[bitIdx++] : false;
112
- // Apply mask pattern 0 ((row + col) % 2 === 0)
113
- const mask = (row + c) % 2 === 0;
114
- matrix[row][c] = bit !== mask;
115
- }
116
- }
117
- }
118
- upwards = !upwards;
119
- }
120
-
121
- // Replace remaining nulls with false
122
- return matrix.map(row => row.map(cell => cell ?? false));
123
- }
124
-
125
- function addFinderPattern(matrix: (boolean | null)[][], row: number, col: number) {
126
- for (let r = -1; r <= 7; r++) {
127
- for (let c = -1; c <= 7; c++) {
128
- const mr = row + r;
129
- const mc = col + c;
130
- if (mr >= 0 && mr < matrix.length && mc >= 0 && mc < matrix.length) {
131
- if (
132
- (r >= 0 && r <= 6 && (c === 0 || c === 6)) ||
133
- (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||
134
- (r >= 2 && r <= 4 && c >= 2 && c <= 4)
135
- ) {
136
- matrix[mr][mc] = true;
137
- } else if (r >= 0 && r <= 6 && c >= 0 && c <= 6) {
138
- matrix[mr][mc] = false;
139
- } else {
140
- matrix[mr][mc] = false; // separator
28
+ return matrix;
29
+ } catch (err) {
30
+ // Fallback: higher version if auto-detect fails
31
+ try {
32
+ const qr = qrcode(10, ecc);
33
+ qr.addData(text);
34
+ qr.make();
35
+ const count = qr.getModuleCount();
36
+ const matrix: boolean[][] = [];
37
+ for (let row = 0; row < count; row++) {
38
+ const rowData: boolean[] = [];
39
+ for (let col = 0; col < count; col++) {
40
+ rowData.push(qr.isDark(row, col));
141
41
  }
42
+ matrix.push(rowData);
142
43
  }
44
+ return matrix;
45
+ } catch {
46
+ return [];
143
47
  }
144
48
  }
145
49
  }
146
-
147
- function addAlignmentPattern(matrix: (boolean | null)[][], row: number, col: number) {
148
- for (let r = 0; r < 5; r++) {
149
- for (let c = 0; c < 5; c++) {
150
- const isOuter = r === 0 || r === 4 || c === 0 || c === 4;
151
- const isCenter = r === 2 && c === 2;
152
- matrix[row + r][col + c] = isOuter || isCenter;
153
- }
154
- }
155
- }
156
-
157
- function getAlignmentPositions(version: number): number[] {
158
- if (version === 1) return [];
159
- if (version === 2) return [6, 18];
160
- if (version === 3) return [6, 22];
161
- if (version === 4) return [6, 26];
162
- if (version === 5) return [6, 30];
163
- if (version === 6) return [6, 34];
164
- if (version === 7) return [6, 22, 38];
165
- if (version === 8) return [6, 24, 42];
166
- if (version === 9) return [6, 26, 46];
167
- return [6, 28, 50];
168
- }
169
-
170
- function createFallbackMatrix(text: string): boolean[][] {
171
- const size = 25;
172
- const matrix: boolean[][] = Array(size)
173
- .fill(false)
174
- .map(() => Array(size).fill(false));
175
- addFinderPattern(matrix as any, 0, 0);
176
- addFinderPattern(matrix as any, size - 7, 0);
177
- addFinderPattern(matrix as any, 0, size - 7);
178
- for (let i = 0; i < text.length; i++) {
179
- const r = (i * 3) % (size - 10) + 8;
180
- const c = (i * 7) % (size - 10) + 8;
181
- matrix[r][c] = true;
182
- }
183
- return matrix;
184
- }