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.
- package/README.md +441 -0
- package/android/build/.transforms/9bdecbc31aaf57a08a337d36d73153ec/results.bin +1 -0
- package/android/build/.transforms/9bdecbc31aaf57a08a337d36d73153ec/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/bc167481fd58833142c92ba32b0fc3e3/results.bin +1 -0
- package/android/build/.transforms/bc167481fd58833142c92ba32b0fc3e3/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/generated/source/buildConfig/debug/com/pinmi/react/printer/BuildConfig.java +10 -0
- package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeBLEPrinterSpec.java +70 -0
- package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeNetPrinterSpec.java +70 -0
- package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeUSBPrinterSpec.java +62 -0
- package/android/build/generated/source/codegen/jni/CMakeLists.txt +46 -0
- package/android/build/generated/source/codegen/jni/RNThermalReceiptPrinterSpec-generated.cpp +190 -0
- package/android/build/generated/source/codegen/jni/RNThermalReceiptPrinterSpec.h +49 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ComponentDescriptors.h +22 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/EventEmitters.cpp +18 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/EventEmitters.h +19 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/Props.cpp +21 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/Props.h +20 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/RNThermalReceiptPrinterSpecJSI-generated.cpp +205 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/RNThermalReceiptPrinterSpecJSI.h +355 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ShadowNodes.cpp +19 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ShadowNodes.h +25 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/States.cpp +18 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/States.h +23 -0
- package/android/build/generated/source/codegen/schema.json +514 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +13 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +18 -0
- package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +5 -0
- package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +1 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
- package/android/build/intermediates/compile_symbol_list/debug/R.txt +1 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml +4 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
- package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/BuildConfig.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeBLEPrinterSpec.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeNetPrinterSpec.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeUSBPrinterSpec.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNBLEPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNNetPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNPrinterPackage.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNUSBPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterAdapter$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterDeviceId.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter$2.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterDeviceId.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterDeviceId.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter$2.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterDeviceId.class +0 -0
- package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +3 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +23 -0
- package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +13 -0
- package/android/build/intermediates/navigation_json/debug/navigation.json +1 -0
- package/android/build/intermediates/packaged_res/debug/values/values.xml +4 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +2 -0
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +37 -0
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build.gradle +30 -0
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +6 -0
- package/android/gradlew +160 -0
- package/android/gradlew.bat +90 -0
- package/android/src/androidTest/java/com/pinmi/react/printer/ExampleInstrumentedTest.java +26 -0
- package/android/src/main/AndroidManifest.xml +10 -0
- package/android/src/main/java/com/pinmi/react/printer/RNBLEPrinterModule.java +91 -0
- package/android/src/main/java/com/pinmi/react/printer/RNNetPrinterModule.java +95 -0
- package/android/src/main/java/com/pinmi/react/printer/RNPrinterModule.java +24 -0
- package/android/src/main/java/com/pinmi/react/printer/RNPrinterPackage.java +57 -0
- package/android/src/main/java/com/pinmi/react/printer/RNUSBPrinterModule.java +79 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterAdapter.java +391 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterDevice.java +33 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterDeviceId.java +38 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterAdapter.java +433 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterDevice.java +30 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterDeviceId.java +48 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterAdapter.java +29 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterDevice.java +17 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterDeviceId.java +8 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterAdapter.java +468 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterDevice.java +41 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterDeviceId.java +49 -0
- package/android/src/main/res/values/strings.xml +3 -0
- package/android/src/test/java/com/pinmi/react/printer/ExampleUnitTest.java +17 -0
- package/dist/NativeBLEPrinter.d.ts +15 -0
- package/dist/NativeBLEPrinter.d.ts.map +1 -0
- package/dist/NativeBLEPrinter.js +3 -0
- package/dist/NativeBLEPrinter.js.map +1 -0
- package/dist/NativeNetPrinter.d.ts +15 -0
- package/dist/NativeNetPrinter.d.ts.map +1 -0
- package/dist/NativeNetPrinter.js +3 -0
- package/dist/NativeNetPrinter.js.map +1 -0
- package/dist/NativeUSBPrinter.d.ts +13 -0
- package/dist/NativeUSBPrinter.d.ts.map +1 -0
- package/dist/NativeUSBPrinter.js +3 -0
- package/dist/NativeUSBPrinter.js.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/EPToolkit.d.ts +9 -0
- package/dist/utils/EPToolkit.d.ts.map +1 -0
- package/dist/utils/EPToolkit.js +161 -0
- package/dist/utils/EPToolkit.js.map +1 -0
- package/dist/utils/buffer-helper.d.ts +12 -0
- package/dist/utils/buffer-helper.d.ts.map +1 -0
- package/dist/utils/buffer-helper.js +32 -0
- package/dist/utils/buffer-helper.js.map +1 -0
- package/ios/PrinterSDK/PrinterSDK.h +74 -0
- package/ios/PrinterSDK/libPrinterSDK.a +0 -0
- package/ios/RNBLEPrinter.h +24 -0
- package/ios/RNBLEPrinter.mm +251 -0
- package/ios/RNNetPrinter.h +25 -0
- package/ios/RNNetPrinter.mm +306 -0
- package/ios/RNThermalReceiptPrinter.xcodeproj/project.pbxproj +294 -0
- package/ios/RNThermalReceiptPrinter.xcworkspace/contents.xcworkspacedata +9 -0
- package/ios/RNUSBPrinter.h +19 -0
- package/ios/RNUSBPrinter.mm +80 -0
- package/package.json +70 -0
- package/react-native-earl-thermal-printer.podspec +22 -0
- package/src/NativeBLEPrinter.ts +16 -0
- package/src/NativeNetPrinter.ts +16 -0
- package/src/NativeUSBPrinter.ts +14 -0
- package/src/index.ts +160 -0
- package/src/utils/EPToolkit.ts +193 -0
- 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 @@
|
|
|
1
|
+
o/classes
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
o/classes
|
|
Binary file
|
package/android/build/generated/source/buildConfig/debug/com/pinmi/react/printer/BuildConfig.java
ADDED
|
@@ -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
|
+
)
|