react-native-earl-thermal-printer 1.0.0

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 (140) hide show
  1. package/README.md +441 -0
  2. package/android/build/.transforms/9bdecbc31aaf57a08a337d36d73153ec/results.bin +1 -0
  3. package/android/build/.transforms/9bdecbc31aaf57a08a337d36d73153ec/transformed/classes/classes_dex/classes.dex +0 -0
  4. package/android/build/.transforms/bc167481fd58833142c92ba32b0fc3e3/results.bin +1 -0
  5. package/android/build/.transforms/bc167481fd58833142c92ba32b0fc3e3/transformed/classes/classes_dex/classes.dex +0 -0
  6. package/android/build/generated/source/buildConfig/debug/com/pinmi/react/printer/BuildConfig.java +10 -0
  7. package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeBLEPrinterSpec.java +70 -0
  8. package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeNetPrinterSpec.java +70 -0
  9. package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeUSBPrinterSpec.java +62 -0
  10. package/android/build/generated/source/codegen/jni/CMakeLists.txt +46 -0
  11. package/android/build/generated/source/codegen/jni/RNThermalReceiptPrinterSpec-generated.cpp +190 -0
  12. package/android/build/generated/source/codegen/jni/RNThermalReceiptPrinterSpec.h +49 -0
  13. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ComponentDescriptors.h +22 -0
  14. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/EventEmitters.cpp +18 -0
  15. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/EventEmitters.h +19 -0
  16. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/Props.cpp +21 -0
  17. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/Props.h +20 -0
  18. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/RNThermalReceiptPrinterSpecJSI-generated.cpp +205 -0
  19. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/RNThermalReceiptPrinterSpecJSI.h +355 -0
  20. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ShadowNodes.cpp +19 -0
  21. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ShadowNodes.h +25 -0
  22. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/States.cpp +18 -0
  23. package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/States.h +23 -0
  24. package/android/build/generated/source/codegen/schema.json +514 -0
  25. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +13 -0
  26. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +18 -0
  27. package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +5 -0
  28. package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +1 -0
  29. package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
  30. package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
  31. package/android/build/intermediates/compile_symbol_list/debug/R.txt +1 -0
  32. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
  33. package/android/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml +4 -0
  34. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  35. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  36. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  37. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
  38. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/BuildConfig.class +0 -0
  39. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeBLEPrinterSpec.class +0 -0
  40. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeNetPrinterSpec.class +0 -0
  41. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeUSBPrinterSpec.class +0 -0
  42. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNBLEPrinterModule.class +0 -0
  43. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNNetPrinterModule.class +0 -0
  44. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNPrinterModule.class +0 -0
  45. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNPrinterPackage.class +0 -0
  46. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNUSBPrinterModule.class +0 -0
  47. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterAdapter$1.class +0 -0
  48. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterAdapter.class +0 -0
  49. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterDevice.class +0 -0
  50. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterDeviceId.class +0 -0
  51. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter$1.class +0 -0
  52. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter$2.class +0 -0
  53. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter.class +0 -0
  54. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterDevice.class +0 -0
  55. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterDeviceId.class +0 -0
  56. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterAdapter.class +0 -0
  57. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterDevice.class +0 -0
  58. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterDeviceId.class +0 -0
  59. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter$1.class +0 -0
  60. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter$2.class +0 -0
  61. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter.class +0 -0
  62. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterDevice.class +0 -0
  63. package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterDeviceId.class +0 -0
  64. package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +3 -0
  65. package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +23 -0
  66. package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +13 -0
  67. package/android/build/intermediates/navigation_json/debug/navigation.json +1 -0
  68. package/android/build/intermediates/packaged_res/debug/values/values.xml +4 -0
  69. package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
  70. package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +2 -0
  71. package/android/build/outputs/logs/manifest-merger-debug-report.txt +37 -0
  72. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  73. package/android/build.gradle +30 -0
  74. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  75. package/android/gradle/wrapper/gradle-wrapper.properties +6 -0
  76. package/android/gradlew +160 -0
  77. package/android/gradlew.bat +90 -0
  78. package/android/src/androidTest/java/com/pinmi/react/printer/ExampleInstrumentedTest.java +26 -0
  79. package/android/src/main/AndroidManifest.xml +10 -0
  80. package/android/src/main/java/com/pinmi/react/printer/RNBLEPrinterModule.java +91 -0
  81. package/android/src/main/java/com/pinmi/react/printer/RNNetPrinterModule.java +95 -0
  82. package/android/src/main/java/com/pinmi/react/printer/RNPrinterModule.java +24 -0
  83. package/android/src/main/java/com/pinmi/react/printer/RNPrinterPackage.java +57 -0
  84. package/android/src/main/java/com/pinmi/react/printer/RNUSBPrinterModule.java +79 -0
  85. package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterAdapter.java +391 -0
  86. package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterDevice.java +33 -0
  87. package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterDeviceId.java +38 -0
  88. package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterAdapter.java +433 -0
  89. package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterDevice.java +30 -0
  90. package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterDeviceId.java +48 -0
  91. package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterAdapter.java +29 -0
  92. package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterDevice.java +17 -0
  93. package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterDeviceId.java +8 -0
  94. package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterAdapter.java +468 -0
  95. package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterDevice.java +41 -0
  96. package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterDeviceId.java +49 -0
  97. package/android/src/main/res/values/strings.xml +3 -0
  98. package/android/src/test/java/com/pinmi/react/printer/ExampleUnitTest.java +17 -0
  99. package/dist/NativeBLEPrinter.d.ts +15 -0
  100. package/dist/NativeBLEPrinter.d.ts.map +1 -0
  101. package/dist/NativeBLEPrinter.js +3 -0
  102. package/dist/NativeBLEPrinter.js.map +1 -0
  103. package/dist/NativeNetPrinter.d.ts +15 -0
  104. package/dist/NativeNetPrinter.d.ts.map +1 -0
  105. package/dist/NativeNetPrinter.js +3 -0
  106. package/dist/NativeNetPrinter.js.map +1 -0
  107. package/dist/NativeUSBPrinter.d.ts +13 -0
  108. package/dist/NativeUSBPrinter.d.ts.map +1 -0
  109. package/dist/NativeUSBPrinter.js +3 -0
  110. package/dist/NativeUSBPrinter.js.map +1 -0
  111. package/dist/index.d.ts +59 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +58 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/utils/EPToolkit.d.ts +9 -0
  116. package/dist/utils/EPToolkit.d.ts.map +1 -0
  117. package/dist/utils/EPToolkit.js +161 -0
  118. package/dist/utils/EPToolkit.js.map +1 -0
  119. package/dist/utils/buffer-helper.d.ts +12 -0
  120. package/dist/utils/buffer-helper.d.ts.map +1 -0
  121. package/dist/utils/buffer-helper.js +32 -0
  122. package/dist/utils/buffer-helper.js.map +1 -0
  123. package/ios/PrinterSDK/PrinterSDK.h +74 -0
  124. package/ios/PrinterSDK/libPrinterSDK.a +0 -0
  125. package/ios/RNBLEPrinter.h +24 -0
  126. package/ios/RNBLEPrinter.mm +251 -0
  127. package/ios/RNNetPrinter.h +25 -0
  128. package/ios/RNNetPrinter.mm +306 -0
  129. package/ios/RNThermalReceiptPrinter.xcodeproj/project.pbxproj +294 -0
  130. package/ios/RNThermalReceiptPrinter.xcworkspace/contents.xcworkspacedata +9 -0
  131. package/ios/RNUSBPrinter.h +19 -0
  132. package/ios/RNUSBPrinter.mm +80 -0
  133. package/package.json +70 -0
  134. package/react-native-earl-thermal-printer.podspec +22 -0
  135. package/src/NativeBLEPrinter.ts +16 -0
  136. package/src/NativeNetPrinter.ts +16 -0
  137. package/src/NativeUSBPrinter.ts +14 -0
  138. package/src/index.ts +160 -0
  139. package/src/utils/EPToolkit.ts +193 -0
  140. package/src/utils/buffer-helper.ts +42 -0
package/README.md ADDED
@@ -0,0 +1,441 @@
1
+ # react-native-earl-thermal-printer
2
+
3
+ A React Native library for USB, Bluetooth (BLE), and Network (TCP/IP) thermal receipt printers.
4
+
5
+ A modern, high-performance thermal printer library for React Native. Built with the New Architecture (TurboModules) for synchronous communication, zero legacy bridge overhead, and Android 12+ Bluetooth compliance.
6
+
7
+ Built for the **React Native New Architecture** (TurboModules / Codegen). Supports Android and iOS.
8
+
9
+ ---
10
+
11
+ ## Requirements
12
+
13
+ | Platform | Minimum Version |
14
+ | ------------ | ------------------ |
15
+ | React Native | >= 0.73 |
16
+ | React | >= 18 |
17
+ | Android SDK | 23 (compileSdk 34) |
18
+ | iOS | 13.4+ |
19
+
20
+ ## Installation
21
+
22
+ ```bash
23
+ npm install react-native-earl-thermal-printer
24
+ # or
25
+ yarn add react-native-earl-thermal-printer
26
+ ```
27
+
28
+ ### iOS
29
+
30
+ ```bash
31
+ cd ios && pod install
32
+ ```
33
+
34
+ ### Android
35
+
36
+ No additional steps — the library auto-links via the React Native Gradle plugin.
37
+
38
+ ---
39
+
40
+ ## Printer Support Matrix
41
+
42
+ | Feature | Android | iOS |
43
+ | -------------------- | :-----: | :----------------------------: |
44
+ | USB Printer | Yes | No (returns `ERR_UNSUPPORTED`) |
45
+ | BLE Printer | Yes | Yes |
46
+ | Net Printer | Yes | Yes |
47
+ | Print Text (ESC/POS) | Yes | Yes |
48
+ | Print Image | Yes | Yes |
49
+ | Print QR Code | Yes | Yes |
50
+
51
+ ---
52
+
53
+ ## Quick Start
54
+
55
+ ```tsx
56
+ import {
57
+ USBPrinter,
58
+ BLEPrinter,
59
+ NetPrinter,
60
+ NetPrinterEventEmitter,
61
+ RN_THERMAL_RECEIPT_PRINTER_EVENTS,
62
+ } from "react-native-earl-thermal-printer";
63
+ ```
64
+
65
+ ### USB Printer (Android only)
66
+
67
+ ```tsx
68
+ await USBPrinter.init();
69
+ const devices = await USBPrinter.getDeviceList();
70
+ await USBPrinter.connectPrinter(devices[0].vendor_id, devices[0].product_id);
71
+ await USBPrinter.printText("Hello from USB!\n");
72
+ await USBPrinter.printBill("Receipt line\n");
73
+ USBPrinter.closeConn();
74
+ ```
75
+
76
+ ### BLE Printer
77
+
78
+ ```tsx
79
+ await BLEPrinter.init();
80
+ const devices = await BLEPrinter.getDeviceList();
81
+ await BLEPrinter.connectPrinter(devices[0].inner_mac_address);
82
+ await BLEPrinter.printText("Hello from BLE!\n");
83
+ await BLEPrinter.printBill("Receipt line\n");
84
+ BLEPrinter.closeConn();
85
+ ```
86
+
87
+ ### Net Printer
88
+
89
+ ```tsx
90
+ await NetPrinter.init();
91
+
92
+ // Listen for discovered printers on the local subnet
93
+ NetPrinterEventEmitter.addListener(
94
+ RN_THERMAL_RECEIPT_PRINTER_EVENTS.EVENT_NET_PRINTER_SCANNED_SUCCESS,
95
+ (printers) => console.log("Found:", printers),
96
+ );
97
+
98
+ const devices = await NetPrinter.getDeviceList();
99
+ await NetPrinter.connectPrinter("192.168.1.100", 9100);
100
+ await NetPrinter.printText("Hello from Network!\n");
101
+ await NetPrinter.printBill("Receipt line\n");
102
+ NetPrinter.closeConn();
103
+ ```
104
+
105
+ ---
106
+
107
+ ## API Reference
108
+
109
+ All three printer objects (`USBPrinter`, `BLEPrinter`, `NetPrinter`) share the same high-level interface:
110
+
111
+ ### `init(): Promise<string>`
112
+
113
+ Initialize the printer module. **Must be called before any other method.**
114
+
115
+ ### `getDeviceList(): Promise<IUSBPrinter[] | IBLEPrinter[] | INetPrinter[]>`
116
+
117
+ Scan for available printers and return a list of discovered devices.
118
+
119
+ ### `connectPrinter(...): Promise<object>`
120
+
121
+ Connect to a printer.
122
+
123
+ | Printer | Parameters |
124
+ | ------- | ------------------------------------- |
125
+ | USB | `vendorId: number, productId: number` |
126
+ | BLE | `innerMacAddress: string` |
127
+ | Net | `host: string, port: number` |
128
+
129
+ ### `printText(text: string, opts?: PrinterOptions): Promise<void>`
130
+
131
+ Print a text string using ESC/POS encoding. Supports formatting tags (see below).
132
+
133
+ ### `printBill(text: string, opts?: PrinterOptions): Promise<void>`
134
+
135
+ Same as `printText` but defaults `beep`, `cut`, and `tailingLine` to `true`.
136
+
137
+ ### `printImage(imageUrl: string): Promise<void>`
138
+
139
+ Print an image from a URL.
140
+
141
+ ### `printQrCode(qrCode: string): Promise<void>`
142
+
143
+ Print a QR code.
144
+
145
+ ### `closeConn(): void`
146
+
147
+ Disconnect from the printer.
148
+
149
+ ---
150
+
151
+ ## PrinterOptions
152
+
153
+ ```ts
154
+ interface PrinterOptions {
155
+ beep?: boolean; // Beep after printing (default: false)
156
+ cut?: boolean; // Cut paper after printing (default: false)
157
+ tailingLine?: boolean; // Add trailing blank lines (default: false)
158
+ encoding?: string; // Text encoding (default: "UTF8")
159
+ }
160
+ ```
161
+
162
+ ---
163
+
164
+ ## ESC/POS Formatting Tags
165
+
166
+ The text helpers (`printText`, `printBill`) support inline formatting tags:
167
+
168
+ | Tag | Description |
169
+ | -------------- | ---------------------- |
170
+ | `<B>...</B>` | **Bold** |
171
+ | `<C>...</C>` | Center-aligned |
172
+ | `<D>...</D>` | Double-width |
173
+ | `<DB>...</DB>` | Double-width bold |
174
+ | `<M>...</M>` | Medium (double-height) |
175
+
176
+ Example:
177
+
178
+ ```tsx
179
+ await NetPrinter.printBill(
180
+ "<C><B>MY STORE</B></C>\n" +
181
+ "================================\n" +
182
+ "Item 1 $5.00\n" +
183
+ "Item 2 $3.50\n" +
184
+ "================================\n" +
185
+ "<B>TOTAL $8.50</B>\n",
186
+ );
187
+ ```
188
+
189
+ ---
190
+
191
+ ## Interfaces
192
+
193
+ ```ts
194
+ interface IUSBPrinter {
195
+ device_name: string;
196
+ device_id: number;
197
+ vendor_id: number;
198
+ product_id: number;
199
+ }
200
+
201
+ interface IBLEPrinter {
202
+ device_name: string;
203
+ inner_mac_address: string;
204
+ }
205
+
206
+ interface INetPrinter {
207
+ device_name: string;
208
+ host: string;
209
+ port: number;
210
+ }
211
+ ```
212
+
213
+ ---
214
+
215
+ ## Events
216
+
217
+ Net printer scanning emits events via `NetPrinterEventEmitter`:
218
+
219
+ | Event | Enum | Payload |
220
+ | ----------------- | ----------------------------------- | --------------- |
221
+ | `scannerResolved` | `EVENT_NET_PRINTER_SCANNED_SUCCESS` | `INetPrinter[]` |
222
+ | `scannerRunning` | `EVENT_NET_PRINTER_SCANNING` | `boolean` |
223
+
224
+ ```tsx
225
+ import {
226
+ NetPrinterEventEmitter,
227
+ RN_THERMAL_RECEIPT_PRINTER_EVENTS,
228
+ } from "react-native-earl-thermal-printer";
229
+
230
+ NetPrinterEventEmitter.addListener(
231
+ RN_THERMAL_RECEIPT_PRINTER_EVENTS.EVENT_NET_PRINTER_SCANNED_SUCCESS,
232
+ (printers) => {
233
+ console.log("Discovered printers:", printers);
234
+ },
235
+ );
236
+
237
+ NetPrinterEventEmitter.addListener(
238
+ RN_THERMAL_RECEIPT_PRINTER_EVENTS.EVENT_NET_PRINTER_SCANNING,
239
+ (isScanning) => {
240
+ console.log("Scanning:", isScanning);
241
+ },
242
+ );
243
+ ```
244
+
245
+ ---
246
+
247
+ ## Android Permissions
248
+
249
+ Add these permissions to your `AndroidManifest.xml`:
250
+
251
+ ```xml
252
+ <!-- USB -->
253
+ <uses-feature android:name="android.hardware.usb.host" android:required="false" />
254
+
255
+ <!-- Bluetooth -->
256
+ <uses-permission android:name="android.permission.BLUETOOTH" />
257
+ <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
258
+ <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
259
+ <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
260
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
261
+
262
+ <!-- Network -->
263
+ <uses-permission android:name="android.permission.INTERNET" />
264
+ ```
265
+
266
+ ---
267
+
268
+ ## Example
269
+
270
+ ```tsx
271
+ import React, { useEffect, useState } from "react";
272
+ import {
273
+ Alert,
274
+ Button,
275
+ FlatList,
276
+ PermissionsAndroid,
277
+ Platform,
278
+ StyleSheet,
279
+ Text,
280
+ TouchableOpacity,
281
+ View,
282
+ } from "react-native";
283
+ import { BLEPrinter, IBLEPrinter } from "react-native-earl-thermal-printer";
284
+
285
+ export default function ThermalPrinterTest() {
286
+ const [printers, setPrinters] = useState<IBLEPrinter[]>([]);
287
+ const [currentPrinter, setCurrentPrinter] = useState<IBLEPrinter | null>(
288
+ null,
289
+ );
290
+
291
+ useEffect(() => {
292
+ BLEPrinter.init()
293
+ .then(() => {
294
+ console.log("Printer initialized");
295
+ })
296
+ .catch((err) => {
297
+ console.warn("Init failed:", err);
298
+ });
299
+ }, []);
300
+
301
+ const requestPermissions = async () => {
302
+ if (Platform.OS === "android") {
303
+ try {
304
+ const granted = await PermissionsAndroid.requestMultiple([
305
+ PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN,
306
+ PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT,
307
+ PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
308
+ ]);
309
+ if (
310
+ granted["android.permission.BLUETOOTH_CONNECT"] ===
311
+ PermissionsAndroid.RESULTS.GRANTED
312
+ ) {
313
+ scanDevices();
314
+ } else {
315
+ Alert.alert("Permission denied");
316
+ }
317
+ } catch (err) {
318
+ console.warn(err);
319
+ }
320
+ } else {
321
+ scanDevices();
322
+ }
323
+ };
324
+
325
+ const scanDevices = () => {
326
+ BLEPrinter.getDeviceList()
327
+ .then(setPrinters)
328
+ .catch((err) => Alert.alert("Scan Failed", String(err)));
329
+ };
330
+
331
+ const connectPrinter = (printer: IBLEPrinter) => {
332
+ BLEPrinter.connectPrinter(printer.inner_mac_address)
333
+ .then((connected) => {
334
+ setCurrentPrinter(connected);
335
+ Alert.alert(
336
+ "Connected",
337
+ `Connected to ${connected.device_name}`,
338
+ );
339
+ })
340
+ .catch((err) => Alert.alert("Connection Failed", String(err)));
341
+ };
342
+
343
+ const printTicket = async () => {
344
+ if (!currentPrinter) {
345
+ Alert.alert("No Printer", "Please connect to a printer first.");
346
+ return;
347
+ }
348
+
349
+ try {
350
+ // To print a QR code:
351
+ await BLEPrinter.printQrCode("ZAM-OC-0001");
352
+ // Print formatted receipt text (beeps + cuts automatically)
353
+ const bill =
354
+ "--------------------------------\n" +
355
+ "Item 1 $10.00\n" +
356
+ "Item 2 $20.00\n" +
357
+ "--------------------------------\n" +
358
+ "<B>TOTAL $30.00</B>\n\n\n";
359
+
360
+ await BLEPrinter.printBill(bill);
361
+
362
+ // To print an image from URL:
363
+ // await BLEPrinter.printImage(
364
+ // "https://images.unsplash.com/photo-1771258052747-52e19364185f?q=80&w=765&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
365
+ // );
366
+ } catch (err) {
367
+ console.warn("Print error:", err);
368
+ Alert.alert("Print Error", String(err));
369
+ }
370
+ };
371
+
372
+ return (
373
+ <View style={styles.container}>
374
+ <Button title="Scan for Printers" onPress={requestPermissions} />
375
+
376
+ <FlatList
377
+ data={printers}
378
+ keyExtractor={(item) => item.inner_mac_address}
379
+ renderItem={({ item }) => (
380
+ <TouchableOpacity
381
+ style={styles.deviceItem}
382
+ onPress={() => connectPrinter(item)}
383
+ >
384
+ <Text>{item.device_name || "Unknown Device"}</Text>
385
+ <Text style={styles.subText}>
386
+ {item.inner_mac_address}
387
+ </Text>
388
+ </TouchableOpacity>
389
+ )}
390
+ style={{ maxHeight: 200, marginVertical: 20 }}
391
+ />
392
+
393
+ <View style={styles.printArea}>
394
+ <Text style={{ marginBottom: 10 }}>
395
+ Status:{" "}
396
+ {currentPrinter
397
+ ? `Connected to ${currentPrinter.device_name}`
398
+ : "Disconnected"}
399
+ </Text>
400
+ <Button
401
+ title="Print Test Receipt"
402
+ onPress={printTicket}
403
+ disabled={!currentPrinter}
404
+ />
405
+ </View>
406
+ </View>
407
+ );
408
+ }
409
+
410
+ const styles = StyleSheet.create({
411
+ container: { flex: 1, padding: 40, paddingTop: 60 },
412
+ deviceItem: { padding: 10, borderBottomWidth: 1, borderColor: "#ccc" },
413
+ subText: { fontSize: 10, color: "#666" },
414
+ printArea: { marginTop: 20, alignItems: "center" },
415
+ });
416
+ ```
417
+
418
+ ---
419
+
420
+ ## New Architecture
421
+
422
+ This library is built for the React Native **New Architecture** using TurboModules and Codegen. It requires:
423
+
424
+ - React Native **>= 0.73**
425
+ - New Architecture **enabled** in your app
426
+
427
+ The library ships codegen specs in `src/Native*.ts`. The native code is generated automatically during the build.
428
+
429
+ ---
430
+
431
+ ## Author
432
+
433
+ **Ordovez, Earl Romeo**
434
+
435
+ ## License
436
+
437
+ ISC
438
+
439
+ ## Funding
440
+
441
+ If you find this library useful, consider [sponsoring on GitHub](https://github.com/sponsors/Swif7ify).
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Automatically generated file. DO NOT MODIFY
3
+ */
4
+ package com.pinmi.react.printer;
5
+
6
+ public final class BuildConfig {
7
+ public static final boolean DEBUG = Boolean.parseBoolean("true");
8
+ public static final String LIBRARY_PACKAGE_NAME = "com.pinmi.react.printer";
9
+ public static final String BUILD_TYPE = "debug";
10
+ }
@@ -0,0 +1,70 @@
1
+
2
+ /**
3
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
4
+ *
5
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
6
+ * once the code is regenerated.
7
+ *
8
+ * @generated by codegen project: GenerateModuleJavaSpec.js
9
+ *
10
+ * @nolint
11
+ */
12
+
13
+ package com.pinmi.react.printer;
14
+
15
+ import com.facebook.proguard.annotations.DoNotStrip;
16
+ import com.facebook.react.bridge.Promise;
17
+ import com.facebook.react.bridge.ReactApplicationContext;
18
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
19
+ import com.facebook.react.bridge.ReactMethod;
20
+ import com.facebook.react.turbomodule.core.interfaces.TurboModule;
21
+ import javax.annotation.Nonnull;
22
+
23
+ public abstract class NativeBLEPrinterSpec extends ReactContextBaseJavaModule implements TurboModule {
24
+ public static final String NAME = "RNBLEPrinter";
25
+
26
+ public NativeBLEPrinterSpec(ReactApplicationContext reactContext) {
27
+ super(reactContext);
28
+ }
29
+
30
+ @Override
31
+ public @Nonnull String getName() {
32
+ return NAME;
33
+ }
34
+
35
+ @ReactMethod
36
+ @DoNotStrip
37
+ public abstract void init(Promise promise);
38
+
39
+ @ReactMethod
40
+ @DoNotStrip
41
+ public abstract void getDeviceList(Promise promise);
42
+
43
+ @ReactMethod
44
+ @DoNotStrip
45
+ public abstract void connectPrinter(String innerAddress, Promise promise);
46
+
47
+ @ReactMethod
48
+ @DoNotStrip
49
+ public abstract void closeConn();
50
+
51
+ @ReactMethod
52
+ @DoNotStrip
53
+ public abstract void printRawData(String base64Data, Promise promise);
54
+
55
+ @ReactMethod
56
+ @DoNotStrip
57
+ public abstract void printImageData(String imageUrl, Promise promise);
58
+
59
+ @ReactMethod
60
+ @DoNotStrip
61
+ public abstract void printQrCode(String qrCode, Promise promise);
62
+
63
+ @ReactMethod
64
+ @DoNotStrip
65
+ public abstract void addListener(String eventName);
66
+
67
+ @ReactMethod
68
+ @DoNotStrip
69
+ public abstract void removeListeners(double count);
70
+ }
@@ -0,0 +1,70 @@
1
+
2
+ /**
3
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
4
+ *
5
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
6
+ * once the code is regenerated.
7
+ *
8
+ * @generated by codegen project: GenerateModuleJavaSpec.js
9
+ *
10
+ * @nolint
11
+ */
12
+
13
+ package com.pinmi.react.printer;
14
+
15
+ import com.facebook.proguard.annotations.DoNotStrip;
16
+ import com.facebook.react.bridge.Promise;
17
+ import com.facebook.react.bridge.ReactApplicationContext;
18
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
19
+ import com.facebook.react.bridge.ReactMethod;
20
+ import com.facebook.react.turbomodule.core.interfaces.TurboModule;
21
+ import javax.annotation.Nonnull;
22
+
23
+ public abstract class NativeNetPrinterSpec extends ReactContextBaseJavaModule implements TurboModule {
24
+ public static final String NAME = "RNNetPrinter";
25
+
26
+ public NativeNetPrinterSpec(ReactApplicationContext reactContext) {
27
+ super(reactContext);
28
+ }
29
+
30
+ @Override
31
+ public @Nonnull String getName() {
32
+ return NAME;
33
+ }
34
+
35
+ @ReactMethod
36
+ @DoNotStrip
37
+ public abstract void init(Promise promise);
38
+
39
+ @ReactMethod
40
+ @DoNotStrip
41
+ public abstract void getDeviceList(Promise promise);
42
+
43
+ @ReactMethod
44
+ @DoNotStrip
45
+ public abstract void connectPrinter(String host, double port, Promise promise);
46
+
47
+ @ReactMethod
48
+ @DoNotStrip
49
+ public abstract void closeConn();
50
+
51
+ @ReactMethod
52
+ @DoNotStrip
53
+ public abstract void printRawData(String base64Data, Promise promise);
54
+
55
+ @ReactMethod
56
+ @DoNotStrip
57
+ public abstract void printImageData(String imageUrl, Promise promise);
58
+
59
+ @ReactMethod
60
+ @DoNotStrip
61
+ public abstract void printQrCode(String qrCode, Promise promise);
62
+
63
+ @ReactMethod
64
+ @DoNotStrip
65
+ public abstract void addListener(String eventName);
66
+
67
+ @ReactMethod
68
+ @DoNotStrip
69
+ public abstract void removeListeners(double count);
70
+ }
@@ -0,0 +1,62 @@
1
+
2
+ /**
3
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
4
+ *
5
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
6
+ * once the code is regenerated.
7
+ *
8
+ * @generated by codegen project: GenerateModuleJavaSpec.js
9
+ *
10
+ * @nolint
11
+ */
12
+
13
+ package com.pinmi.react.printer;
14
+
15
+ import com.facebook.proguard.annotations.DoNotStrip;
16
+ import com.facebook.react.bridge.Promise;
17
+ import com.facebook.react.bridge.ReactApplicationContext;
18
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
19
+ import com.facebook.react.bridge.ReactMethod;
20
+ import com.facebook.react.turbomodule.core.interfaces.TurboModule;
21
+ import javax.annotation.Nonnull;
22
+
23
+ public abstract class NativeUSBPrinterSpec extends ReactContextBaseJavaModule implements TurboModule {
24
+ public static final String NAME = "RNUSBPrinter";
25
+
26
+ public NativeUSBPrinterSpec(ReactApplicationContext reactContext) {
27
+ super(reactContext);
28
+ }
29
+
30
+ @Override
31
+ public @Nonnull String getName() {
32
+ return NAME;
33
+ }
34
+
35
+ @ReactMethod
36
+ @DoNotStrip
37
+ public abstract void init(Promise promise);
38
+
39
+ @ReactMethod
40
+ @DoNotStrip
41
+ public abstract void getDeviceList(Promise promise);
42
+
43
+ @ReactMethod
44
+ @DoNotStrip
45
+ public abstract void connectPrinter(double vendorId, double productId, Promise promise);
46
+
47
+ @ReactMethod
48
+ @DoNotStrip
49
+ public abstract void closeConn();
50
+
51
+ @ReactMethod
52
+ @DoNotStrip
53
+ public abstract void printRawData(String base64Data, Promise promise);
54
+
55
+ @ReactMethod
56
+ @DoNotStrip
57
+ public abstract void printImageData(String imageUrl, Promise promise);
58
+
59
+ @ReactMethod
60
+ @DoNotStrip
61
+ public abstract void printQrCode(String qrCode, Promise promise);
62
+ }
@@ -0,0 +1,46 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the MIT license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
6
+ cmake_minimum_required(VERSION 3.13)
7
+ set(CMAKE_VERBOSE_MAKEFILE on)
8
+
9
+ file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNThermalReceiptPrinterSpec/*.cpp)
10
+
11
+ add_library(
12
+ react_codegen_RNThermalReceiptPrinterSpec
13
+ SHARED
14
+ ${react_codegen_SRCS}
15
+ )
16
+
17
+ target_include_directories(react_codegen_RNThermalReceiptPrinterSpec PUBLIC . react/renderer/components/RNThermalReceiptPrinterSpec)
18
+
19
+ target_link_libraries(
20
+ react_codegen_RNThermalReceiptPrinterSpec
21
+ fbjni
22
+ folly_runtime
23
+ glog
24
+ jsi
25
+ react_codegen_rncore
26
+ react_debug
27
+ react_nativemodule_core
28
+ react_render_core
29
+ react_render_debug
30
+ react_render_graphics
31
+ react_render_imagemanager
32
+ rrc_image
33
+ rrc_view
34
+ turbomodulejsijni
35
+ yoga
36
+ )
37
+
38
+ target_compile_options(
39
+ react_codegen_RNThermalReceiptPrinterSpec
40
+ PRIVATE
41
+ -DLOG_TAG=\"ReactNative\"
42
+ -fexceptions
43
+ -frtti
44
+ -std=c++20
45
+ -Wall
46
+ )