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.
- package/dist/commonjs/components/Inspector/DebuggingTab.js +3 -2
- package/dist/commonjs/components/QRCodeView.js +15 -12
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/helpers/qrGenerator.js +31 -157
- package/dist/esm/components/Inspector/DebuggingTab.js +3 -2
- package/dist/esm/components/QRCodeView.js +15 -12
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/helpers/qrGenerator.js +28 -157
- package/package.json +4 -2
- package/src/components/Inspector/DebuggingTab.tsx +3 -2
- package/src/components/QRCodeView.tsx +21 -17
- package/src/constants/version.ts +1 -1
- package/src/helpers/qrGenerator.ts +34 -169
|
@@ -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
|
|
140
|
-
}, [activeQrTab, apkDownloadUrl, devSettingsHost,
|
|
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 =
|
|
43
|
-
const matrix = (0, react_1.useMemo)(() => (0, qrGenerator_1.generateQRMatrix)(value), [value]);
|
|
44
|
-
const numCells = matrix.length;
|
|
45
|
-
const
|
|
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 +
|
|
50
|
-
height: size +
|
|
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.
|
|
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:
|
|
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:
|
|
74
|
-
shadowOpacity: 0.
|
|
75
|
-
shadowRadius:
|
|
76
|
-
elevation:
|
|
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.
|
|
1
|
+
export declare const 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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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
|
|
101
|
-
}, [activeQrTab, apkDownloadUrl, devSettingsHost,
|
|
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 =
|
|
7
|
-
const matrix = useMemo(() => generateQRMatrix(value), [value]);
|
|
8
|
-
const numCells = matrix.length;
|
|
9
|
-
const
|
|
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 +
|
|
14
|
-
height: size +
|
|
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.
|
|
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:
|
|
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:
|
|
37
|
-
shadowOpacity: 0.
|
|
38
|
-
shadowRadius:
|
|
39
|
-
elevation:
|
|
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.
|
|
1
|
+
export declare const LIB_VERSION = "2.3.12";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const LIB_VERSION = '2.3.
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
147
|
-
}, [activeQrTab, apkDownloadUrl, devSettingsHost,
|
|
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 =
|
|
17
|
-
color =
|
|
18
|
-
backgroundColor =
|
|
16
|
+
size = 200,
|
|
17
|
+
color = '#000000',
|
|
18
|
+
backgroundColor = '#FFFFFF',
|
|
19
19
|
}) => {
|
|
20
|
-
const matrix = useMemo(() => generateQRMatrix(value), [value]);
|
|
21
|
-
const numCells = matrix.length;
|
|
22
|
-
|
|
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 +
|
|
30
|
-
height: size +
|
|
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.
|
|
45
|
-
height={cellSize + 0.
|
|
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:
|
|
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:
|
|
65
|
-
shadowOpacity: 0.
|
|
66
|
-
shadowRadius:
|
|
67
|
-
elevation:
|
|
68
|
+
shadowOffset: {width: 0, height: 3},
|
|
69
|
+
shadowOpacity: 0.15,
|
|
70
|
+
shadowRadius: 8,
|
|
71
|
+
elevation: 4,
|
|
68
72
|
},
|
|
69
73
|
});
|
|
70
74
|
|
package/src/constants/version.ts
CHANGED
|
@@ -1,184 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
}
|